Новости Joomla

SW JProjects v.2.5.0 - компонент каталога цифровых проектов на Joomla

SW JProjects v.2.5.0 - компонент каталога цифровых проектов на Joomla

👩‍💻 SW JProjects v.2.5.0 - компонент каталога цифровых проектов на Joomla.Компонент - менеджер цифровых проектов для Joomla! CMS. Компонент обеспечивает создание каталога цифровых проектов и предоставляет возможность скачивания, в том числе с использованием лицензионных ключей.👩‍💻 v.2.5.0. Что нового?Схемы структур данных для серверов обновлений. Теперь с SW JProjects вы может создавать сервер обновлений не только для расширений Joomla, но и свои собственные. Например, вам нужно, чтобы структура данных сервера обновлений была другая и формат должен быть, например, не XML, а JSON. Формирование структуры данных для сервера обновлений расширений Joomla вынесено в отдельный плагин. Вы можете создать свой собственный плагин и реализовать в нём нужную вам структуру данных, добавив или наоборот исключив отображаемые данные. Сервер обновлений в компоненте по-прежнему отображает информацию о списке проектов и их версиях, о конкретном проекте и его changelog.Можно выбрать схему данных сервера обновлений глобально для всего компонента, выбрать другую схему данных для категории проектов, а так же выбрать схему в каждом проекте.

Разработчикам в качестве образца можно посмотреть плагин схемы данных для Joomla в составе компонента или же плагин-образец JSON-схемы на GitHub.
Группа плагинов swjprojects. Для нужд компонента создана группа плагинов swjprojects. В частности, в этой группе находится плагин структуры данных Joomla расширений для сервера обновлений.Изменение языковых констант. Изменены некоторые языковые константы в панели администратора. Если вы делали переопределение констант - переопределите их снова.👩‍💻 Joomla 6. Внесены изменения для корректной установки и работы компонента на Joomla 6. Компонент успешно протестирован на Joomla 6-beta2.Минимальная версия Joomla - 5. Подняты минимальные системные требования: Joomla 5.0.0 и PHP 8.1.
- Страница расширения👉 Плагин-образец кастомной JSON-схемы данных для сервера обновлений на GitHub.- GitHub расширения- Документация на GitHub- Joomla Extensions Directory#joomla #расширения

Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод...

Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод...

👩‍💻 Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод triggerEvent(), с помощью которого раньше вызывались события для плагинов. Теперь чтобы в своём коде вызвать событие для плагина и получить от него результаты нужно:- создать объект класса события- передать в него параметры

use Joomla\CMS\Event\AbstractEvent;use Joomla\CMS\Factory;use Joomla\CMS\Plugin\PluginHelper;// Грузим плагины нужных группPluginHelper::importPlugin('system');// Создаём объект события$event = AbstractEvent::create('onAfterInitUniverse', [    'subject' => $this,    'data'    => $data, // какие-то данные    'article' => $article, // ещё материал вдовесок    'product' => $product, // и товаров подвезли]);// Триггерим событиеFactory::getApplication()->getDispatcher()->dispatch(    $event->getName(), // Тут можно строку передать 'onAfterInitUniverse'    $event);// Получаем результаты// В случае с AbstractEvent это может быть не 'result',// а что-то ещё - куда сами отдадите данные.// 2-й аргумент - значение по умолчанию, // если не получены результаты$results = $event->getArgument('result', []);
Плюсы такого подхода - вам не нужно запоминать порядок аргументов и проверять их наличие. Если вы написали свой класс события, то в плагине можно получать аргументы с помощью методов $event->getArticle(), $event->getData(), $event->getProduct() и подобными - реализуете сами под свои нужды. Если такой класс события написали, то создаёте экземпляр своего класса события и укажите его явно в аргументе eventClass
use Joomla\Component\MyComponent\Administrator\Event\MyCoolEvent;$event = MyCoolEvent::create('onAfterInitUniverse', [    'subject'    => $this,    'eventClass' => MyCoolEvent::class, // ваш класс события    'data'       => $data, // какие-то данные    'article'    => $article, // ещё материал вдовесок    'product'    => $product, // и товаров подвезли]);
Ожидаемо, что класс вашего события будет расширять AbsractEvent или другие классы событий Joomla.🙁 Есть неприятный нюанс - нельзя просто так вызывать событие и ничего не передать в аргументы. Аргумент subject обязательный. Но если вы всё-таки не хотите туда ничего передавать - передайте туда пустой stdClass или объект Joomla\registry\Registry.
@joomlafeed#joomla #php #webdev

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

borro

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

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

Тренд

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

b2z

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

SeBun

  • BanMaster
  • 4030
  • 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

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

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

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

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 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
  • 4030
  • 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

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

borro

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

AlekVolsk

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

SeBun

  • BanMaster
  • 4030
  • 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

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

SeBun

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

Aleks.Denezh

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

borro

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

robert

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

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 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
Просмотров: 2108
Последний ответ 11.04.2022, 08:44:33
от sivers
Приём и сохранение файлов в модуле Joomla 3.7

Автор Inoken

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

Автор vipiusss

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

Автор john.deff

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

Автор Joker_V

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