0 Пользователей и 1 Гость просматривают эту тему.
  • 27 Ответов
  • 1017 Просмотров
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Здравствуйте!

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

Тренд

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

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
В классическом варианте это делается в View - здесь должна происходить манипуляция данными.
What? Может имели ввиду Model?
*

SeBun

  • BanMaster
  • 4015
  • 259 / 5
  • @SeBun48
В классическом варианте это делается в View - здесь должна происходить манипуляция данными
Вид предназначен для отображения, а не для манипуляции.

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

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Вот текущий 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

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

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

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

Aleks.Denezh

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


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

и вызывать index.php?option=com_vm3delpics&task=pics.delete
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Здравствуйте.
Спасибо!
Пока перевариваю и разбираюсь ...

Тем временем возник вопрос. Как записать примерно такой запрос на языке 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?
Хотя, простите, вроде работает :)
« Последнее редактирование: 17.06.2017, 14:55:03 от borro »
*

SeBun

  • BanMaster
  • 4015
  • 259 / 5
  • @SeBun48
запрос на языке Joomla

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

где $query содержит строку запроса. И это сработает. А можно (и нужно) использовать методы построения запроса, как делаете вы. Здесь все разжовано и разложено по полочкам, почитайте.
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Здравствуйте! Спасибо!
« Последнее редактирование: 28.06.2017, 16:53:29 от borro »
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Всем здравия!
Я бы даже сделал удаление файлов через контроллер, а работа с базой в модели!
Дошел до этого. Строю путь до файлов следующим образом:
Код
$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

  • Живу я здесь
  • 4974
  • 457 / 20
Указать путь к файлу, а не ссылку.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Указать путь к файлу, а не ссылку.
Спасибо. Стал получать путь как:
Код
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

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
1. Используйте / вместо DS.
2. Должно сработать и без замены. Если не сработает, то str_replace(array('\', '\\'), '/', JPATH_ROOT)
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
1. Используйте / вместо DS.
а это снизит кросплатформенность компонента?
Оказывается в Joomla исчезла константа DS, взамен неё пришла DIRECTORY_SEPARATOR.
*

AlekVolsk

  • Гуру
  • 6915
  • 415 / 4
DIRECTORY_SEPARATOR - это системная константа php, DS - это ее сокращенный псевдоним, существующий в некоторых системах, существовал в ранних версиях J
*

SeBun

  • BanMaster
  • 4015
  • 259 / 5
  • @SeBun48
Оказывается в Joomla исчезла константа DS, взамен неё пришла DIRECTORY_SEPARATOR.
Вообще константа DS считалась устаревшей с Joomla 1.6. Посмотрите, как используется JPath::clean
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
А я не заморачиваюсь на этот счет: просто ставлю "/", его понимают и Linux, и Windows.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Доброго утра! Спасибо всем.

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

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

robert

  • Живу я здесь
  • 4974
  • 457 / 20
1. Необязательно.
2. В принципе, да, но все, что метод делает - это перенаправить вас на другую страницу.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
1. Необязательно.
Но желательно, чтобы это был другой вид?
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Но желательно, чтобы это был другой вид?
Если делаете разово и забыть, делайте как удобно!
Если же есть шанс допила, то если напишите как удобно то скорее всего офигеете от того что внутри )
*

SeBun

  • BanMaster
  • 4015
  • 259 / 5
  • @SeBun48
если напишите как удобно то скорее всего офигеете от того что внутри )
Я думал я один офигиваю, когда смотрю свой старый код.. ))
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

Aleks.Denezh

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

borro

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

robert

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

Aleks.Denezh

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

robert

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

Отправка файлов через ajax в модуль Joomla

Автор hemicide

Ответов: 19
Просмотров: 1053
Последний ответ 11.04.2022, 08:44:33
от sivers
Приём и сохранение файлов в модуле Joomla 3.7

Автор Inoken

Ответов: 5
Просмотров: 880
Последний ответ 06.10.2017, 12:03:15
от Inoken
Форма в xml-файле модуля

Автор vipiusss

Ответов: 2
Просмотров: 816
Последний ответ 24.07.2017, 10:40:16
от vipiusss
Подключение файлов библиотек JavaScript

Автор john.deff

Ответов: 4
Просмотров: 1350
Последний ответ 29.04.2016, 21:39:50
от john.deff
Поле для прикрепления файлов в администраторе

Автор Joker_V

Ответов: 1
Просмотров: 1000
Последний ответ 09.04.2016, 21:17:02
от Joker_V