Форум русской поддержки Joomla!® CMS
28.07.2017, 21:00:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Основной курс по Joomla
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

В каком файле осуществлять удаление файлов?

 (Прочитано 349 раз)
0 Пользователей и 1 Гость смотрят эту тему.
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1269


желаю вам счастья


« : 15.06.2017, 17:19:50 »

Здравствуйте!

Разрабатываю простой компонент, который по клику по нему в админке должен будет удалить файлы в разных директориях и связанные с ними строки в БД. Информация о ненужных файлах первоначально берется из БД в дефолтном view.html.php. Вопрос, в каком файле(ах) компонента правильно делать эти операции? Объясните, пожалуйста.
« Последнее редактирование: 15.06.2017, 18:28:44 от borro » Записан
Тренд
Осваиваюсь на форуме
***

Репутация: +6/-0
Offline Offline

Сообщений: 59


« Ответ #1 : 15.06.2017, 18:22:58 »

Ну сразу как там посылаете базе запрос "DELETE..." следующей строкой сразу unlink.
В классическом варианте это делается в View - здесь должна происходить манипуляция данными.
Но всегда бывают нюансы.
Записан
b2z
Support Team
*****

Репутация: +737/-0
Offline Offline

Пол: Мужской
Сообщений: 7741


Разраблю понемногу


« Ответ #2 : 15.06.2017, 18:24:28 »

В классическом варианте это делается в View - здесь должна происходить манипуляция данными.
What? Может имели ввиду Model?
Записан
SeBun
Практически профи
*******

Репутация: +184/-5
Offline Offline

Пол: Мужской
Сообщений: 3158


@SeBun48


« Ответ #3 : 15.06.2017, 18:32:14 »

В классическом варианте это делается в View - здесь должна происходить манипуляция данными
Вид предназначен для отображения, а не для манипуляции.

ТС, посмотрите еще раз принципы MVC-программирования. На ваш вопрос ответ один - Model. Контроллер - это связующее звено между моделлю и видом. Он получает данные от пользователя, передает их модели, получает обработанный результат и передает его в представление.
Записан
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1269


желаю вам счастья


« Ответ #4 : 15.06.2017, 18:42:24 »

Вот текущий view.html.php дефолтного вида, который вызывается по клику на компонент в админке:
Код:
<?php
defined("_JEXEC") or die();

class Vm3delpicsViewDelete extends JViewLegacy{
protected $data;
public function display($tpl = null){
$this->data = $this->get('Download');
$this->addToolBar();
parent::display($tpl);
}
...
}
?>
В $this->data кладется информация из БД о файлах на удаление
1. Получается, чтобы удалить строки из БД надо после $this->get('Download') написать вызов метода модели вроде:
Код:
$this->get('Delete');
?
2. А как быть с удалением файлов, писать код в этой же public function display()? Это же не дело модели
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +375/-4
Offline Offline

Пол: Мужской
Сообщений: 2814



« Ответ #5 : 15.06.2017, 18:49:26 »

Удалять файлы и данные нужно в модели!
Только не дергают это через вид, это извращение!
Делаете всё это через контроллер!
Я бы даже сделал удаление файлов через контроллер, а работа с базой в модели!

Например вы передаете задачу index.php?option=com_your_component&task=controllerName.delete

В контроллере добавляете метод
publick function delete(){
тут можно стукнуться в модель через: $this->getModel()->getFiles($param1, $param2...); (модель должна иметь имя как и контроллер)
}
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +375/-4
Offline Offline

Пол: Мужской
Сообщений: 2814



« Ответ #6 : 15.06.2017, 18:53:35 »

Более подробный пример
файл controllers/pics.php:
Код
class Vm3delpicsControllerPics extends JControllerLegacy
{
  public function delete(){
     //получаем файлы
     $files = $this->getModel()->getFiles();
     print_r($files);
  }
}
 


файл: models/pics.php
Код
class Vm3delpicsModelPics extends JControllerLegacy
{
  public function getFiles(){
     return ['test.jpg', 'temp.png', 'blablabla.gif'];
  }
}
 

и вызывать index.php?option=com_vm3delpics&task=pics.delete
Записан
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1269


желаю вам счастья


« Ответ #7 : 17.06.2017, 15:31:46 »

Здравствуйте.
Спасибо!
Пока перевариваю и разбираюсь ...

Тем временем возник вопрос. Как записать примерно такой запрос на языке Joomla правильно:
Код:
$db = JFactory::getDbo();
$query = $db->getQuery(TRUE);
$query->select('`virtuemart_media_id`,`file_title`,`file_url`,`published`');
$query->from('#__virtuemart_medias m');
$query->where('file_type = \'product\'
AND NOT EXISTS(SELECT virtuemart_media_id FROM #__virtuemart_product_medias WHERE virtuemart_media_id = m.virtuemart_media_id )');
Здесь похоже я неправильно оформил NOT EXISTS... А как правильно добавить такой EXISTS, используя методы $query?
Хотя, простите, вроде работает Azn
« Последнее редактирование: 17.06.2017, 15:55:03 от borro » Записан
SeBun
Практически профи
*******

Репутация: +184/-5
Offline Offline

Пол: Мужской
Сообщений: 3158


@SeBun48


« Ответ #8 : 17.06.2017, 16:13:08 »

запрос на языке Joomla

Нет такого языка. Есть язык PHP. В Joomla есть свои классы. Один из них - JFactory. В нем вы используете метод getDBO для запроса. Запрос - простая текстовая строка. Можете ее написать целиком и вызвать метод, например так:
Код
$result=$db->setQuery($query);

где $query содержит строку запроса. И это сработает. А можно (и нужно) использовать методы построения запроса, как делаете вы. Здесь все разжовано и разложено по полочкам, почитайте.
Записан
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1269


желаю вам счастья


« Ответ #9 : 19.06.2017, 17:03:28 »

Здравствуйте! Спасибо!
« Последнее редактирование: 28.06.2017, 17:53:29 от borro » Записан
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1269


желаю вам счастья


« Ответ #10 : 29.06.2017, 14:50:04 »

Всем здравия!
Я бы даже сделал удаление файлов через контроллер, а работа с базой в модели!
Дошел до этого. Строю путь до файлов следующим образом:
Код:
$path_url = JUri::root().$value['file_url'];
и получаю например такое в $path_url: "http://localhost/asu170322/images/stories/virtuemart/product/834.jpg"
Пытаюсь удалить файл:
Код:
unlink($path_url);
получаю предупреждение "Warning: unlink(): http does not allow unlinking in ....php", файл не удаляется.
Как построить рабочий путь до удаляемого файла правильно?
Записан
robert
Профи
********

Репутация: +380/-14
Offline Offline

Пол: Мужской
Сообщений: 4167


« Ответ #11 : 29.06.2017, 15:06:55 »

Указать путь к файлу, а не ссылку.
Записан
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1269


желаю вам счастья


« Ответ #12 : 29.06.2017, 16:20:15 »

Указать путь к файлу, а не ссылку.
Спасибо. Стал получать путь как:
Код:
JPATH_ROOT.DS.$value['file_url'];
что стало давать значения вида C:\xampp_new\htdocs\asu170322DSimages/stories/virtuemart/product/834.jpg
Появились вопросы:
1. Почему DS не заменился на слэш?
2. Получается для строки в $value['file_url'] надо придумать интеллектуальную замену слэшей в зависимости от того, в какую сторону направлены слэши в JPATH_ROOT?
Записан
b2z
Support Team
*****

Репутация: +737/-0
Offline Offline

Пол: Мужской
Сообщений: 7741


Разраблю понемногу


« Ответ #13 : 29.06.2017, 16:46:13 »

1. Используйте / вместо DS.
2. Должно сработать и без замены. Если не сработает, то str_replace(array('\', '\\'), '/', JPATH_ROOT)
Записан
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1269


желаю вам счастья


« Ответ #14 : 29.06.2017, 17:18:51 »

1. Используйте / вместо DS.
а это снизит кросплатформенность компонента?
Оказывается в Joomla исчезла константа DS, взамен неё пришла DIRECTORY_SEPARATOR.
Записан
AlekVolsk
Профи
********

Репутация: +339/-4
Offline Offline

Пол: Мужской
Сообщений: 6916



« Ответ #15 : 29.06.2017, 18:31:54 »

DIRECTORY_SEPARATOR - это системная константа php, DS - это ее сокращенный псевдоним, существующий в некоторых системах, существовал в ранних версиях J
Записан
SeBun
Практически профи
*******

Репутация: +184/-5
Offline Offline

Пол: Мужской
Сообщений: 3158


@SeBun48


« Ответ #16 : 30.06.2017, 11:15:46 »

Оказывается в Joomla исчезла константа DS, взамен неё пришла DIRECTORY_SEPARATOR.
Вообще константа DS считалась устаревшей с Joomla 1.6. Посмотрите, как используется JPath::clean
Записан
robert
Профи
********

Репутация: +380/-14
Offline Offline

Пол: Мужской
Сообщений: 4167


« Ответ #17 : 30.06.2017, 11:28:53 »

А я не заморачиваюсь на этот счет: просто ставлю "/", его понимают и Linux, и Windows.
Записан
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1269


желаю вам счастья


« Ответ #18 : 30.06.2017, 12:13:29 »

Доброго утра! Спасибо всем.

Если есть вид, он выводит определенный набор полей из базы данных, которые могут выборочно удаляться. В тулбаре его хочу сделать кнопку, которая должна будет выводить другой набор данных: список файлов в некоторой папке, которые потом можно будет также выборочно удалять.

Вопросы:
1. Эти новые данные должны выводиться другим видом?
2. имени контроллера(в кодировке вида "контроллер.метод"), которое будет зашито в кнопке достаточно будет Joomla, чтобы она переключила вид?
« Последнее редактирование: 30.06.2017, 12:19:28 от borro » Записан
robert
Профи
********

Репутация: +380/-14
Offline Offline

Пол: Мужской
Сообщений: 4167


« Ответ #19 : 30.06.2017, 13:17:56 »

1. Необязательно.
2. В принципе, да, но все, что метод делает - это перенаправить вас на другую страницу.
Записан
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1269


желаю вам счастья


« Ответ #20 : 30.06.2017, 14:06:29 »

1. Необязательно.
Но желательно, чтобы это был другой вид?
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +375/-4
Offline Offline

Пол: Мужской
Сообщений: 2814



« Ответ #21 : 30.06.2017, 16:50:46 »

Но желательно, чтобы это был другой вид?
Если делаете разово и забыть, делайте как удобно!
Если же есть шанс допила, то если напишите как удобно то скорее всего офигеете от того что внутри )
Записан
SeBun
Практически профи
*******

Репутация: +184/-5
Offline Offline

Пол: Мужской
Сообщений: 3158


@SeBun48


« Ответ #22 : 30.06.2017, 17:57:20 »

если напишите как удобно то скорее всего офигеете от того что внутри )
Я думал я один офигиваю, когда смотрю свой старый код.. ))
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +375/-4
Offline Offline

Пол: Мужской
Сообщений: 2814



« Ответ #23 : 30.06.2017, 18:19:40 »

Я думал я один офигиваю, когда смотрю свой старый код.. ))
Я уже не офигеваю, скилуха немного выровнялась, и код уже логичный и легко читаемый, но если открыть код которому лет 5, то первый вопрос: какой довн это писал, потом приходит осознание ))
Записан
borro
Живу я здесь
******

Репутация: +21/-0
Offline Offline

Пол: Мужской
Сообщений: 1269


желаю вам счастья


« Ответ #24 : 30.06.2017, 18:57:08 »

Создаю новый вид, который будет брать данные для вывода на основе информации из файловой системы. Строк с описанием файлов будет выводиться много, надо сделать постраничную пагинацию. Насколько знаю JPagination работает только если данные берутся из базы данных. Как тогда построить пагинацию для данных не из базы данных?
Записан
robert
Профи
********

Репутация: +380/-14
Offline Offline

Пол: Мужской
Сообщений: 4167


« Ответ #25 : 30.06.2017, 21:12:23 »

Как тогда построить пагинацию для данных не из базы данных?
Написать аналогию JPagination. А почему эти данные не записываются в БД?
Я думал я один офигиваю, когда смотрю свой старый код.. ))
Я уже не офигеваю от 2-летнего кода, разве что отсутствие пробелов немного раздражает. Есть проблема другого рода: чтобы допилить старый код, приходится перечитать больше половины файлов, как будто читаю чужой код Sad.
« Последнее редактирование: 30.06.2017, 21:18:51 от robert » Записан
Aleks.Denezh
Практически профи
*******

Репутация: +375/-4
Offline Offline

Пол: Мужской
Сообщений: 2814



« Ответ #26 : 30.06.2017, 22:18:25 »

Написать аналогию JPagination.
Лол. зачем?)
Код
$input = JFactory::getApplication()->input;
$totalPages = 200; //полное количество записей
$itemsOnPage = 10; //сколько записей выводится на странице
$pagination = new JPagination( $totalPages, $input->getInt( 'start', 0 ), $itemsOnPage );
echo  $pagination->getPagesLinks();
Записан
robert
Профи
********

Репутация: +380/-14
Offline Offline

Пол: Мужской
Сообщений: 4167


« Ответ #27 : 30.06.2017, 22:35:32 »

Лол. зачем?)
Код
$input = JFactory::getApplication()->input;
$totalPages = 200; //полное количество записей
$itemsOnPage = 10; //сколько записей выводится на странице
$pagination = new JPagination( $totalPages, $input->getInt( 'start', 0 ), $itemsOnPage );
echo  $pagination->getPagesLinks();
Ух ты, здорово! Написал предыдущий пост, конечно, без должного анализа, но никогда не думал, что JPagination - такая универсальная вещь.
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet