Новости Joomla

Свои типы полей в Joomla.Это большая тема, о которой можно говорить очень много

Свои типы полей в Joomla.Это большая тема, о которой можно говорить очень много

👩‍💻 Свои типы полей в Joomla.Это большая тема, о которой можно говорить очень много. Самое главное, что возможности применения ограничиваются только вашей больной фантазией. Вы строите интерфейс своего модуля или плагина и вам нужно подтянуть данные из сторонней системы (список чего-нибудь по какому-нибудь API), чтобы сохранить выбранный id в Joomla. Или сделать какую-то проверку и в зависимости от неё показать то или иное сообщение пользователю. Для этого подойдут свои пользовательские типы полей. Интерфейс Joomla по большей части описан в XML-файлах. У каждого из них свои параметры. Некоторые не описаны в документации (manual.joomla.org), поэтому самым любопытным будет полезно заглянуть в собственно файлы фреймворка по пути

libraries/src/Form/FormField.php, а так же в
libraries/src/Form/Fields. У каждого класса поля перечислены его специфические свойства, которые можно описывать в XML. А в своём типе поля вы можете устанавливать эти значения программно. В моём модуле WT Quick links под капотом происходят изменения. Теперь для работы (в админке) ему нужен вспомогательный плагин. А в самом модуле нам бы проверить, а не выключен ли он? В Joomla есть тип поля Note - заметка. Его можно использовать для вывода примечаний.

<field type="note"     name="your_note_for_user"     label="Заголовок примечания"     title="Альтернативный способ для заголовка"     description="Текст примечания"     class="col-12 alert alert-info"     heading="h1"     close="true"/>
heading - указывать уровень заголовка.
close - позволяет закрыть это примечание. В классе поля
libraries/src/Form/Field/NoteField.php описана логика вывода. И в принципе оно нам подходит для нашей задачи. Но оно будет выводить сообщение всегда, а нам нужно только тогда, когда плагин отключён.Поэтому берём и создаём свой класс поля, который мы унаследуем от
NoteField. Это значит, что у нас в руках будет весь инструментарий стандартного поля
Note + то, что мы сами добавим. В XML-манифест добавляем наше поле
<field type="systempluginstatus"      name="systempluginstatus"     addfieldprefix="Joomla\Module\Wtquicklinks\Site\Fields"/>
-
type - имя файла и класса,-
addfieldprefix - указываем namespace к нашему классу, может быть любой нам нужный-
name - нельзя полю без имени...Это означает, что Joomla будет использовать класс поля из файла
modules/mod_wt_quick_links/src/Fields/SystempluginstatusField.php.А в классе поля будет написано следующее:
<?php// namespace для атрибута addfieldprefixnamespace Joomla\Module\Wtquicklinks\Site\Fields;// нельзя напрямую обращаться к этому файлуdefined('_JEXEC') or die;// подключаем родительский класс для переопределенияuse Joomla\CMS\Form\Field\NoteField;use Joomla\CMS\Language\Text;use Joomla\CMS\Plugin\PluginHelper;// имя класса и имя файла точь-в-точьclass SystempluginstatusField extends NoteField{     protected $type = 'Systempluginstatus';     protected function getLabel()          {               // если плагин не включён               if(PluginHelper::isEnabled('system','wtquicklinks')) {                    // меняем свойства родительского класса                    $this->class = 'alert alert-danger w-100';                    $this->element['label'] = '⚠️ А-а-а-а!';                    $this->element['description'] = 'Плагин не включён!!';                    // и просто рендерим его с нашими свойствами                    return parent::getLabel();               }          // А иначе всё хорошо, скрываем поле из виду.          $this->parentclass = 'd-none';          return '';     }}
Просто и удобно. И людям приятно, что о них позаботились и рассказали почему что-то не работает.@webtolkru#joomla #php #webdev #разработка

Свои типы полей в Joomla.

Свои типы полей в Joomla.Это большая тема, о которой можно говорить очень много

Это большая тема, о которой можно говорить очень много. Самое главное, что возможности применения ограничиваются только вашей больной фантазией. Вы строите интерфейс своего модуля или плагина и вам нужно подтянуть данные из сторонней системы (список чего-нибудь по какому-нибудь API), чтобы сохранить выбранный id в Joomla. Или сделать какую-то проверку и в зависимости от неё показать то или иное сообщение пользователю. Для этого подойдут свои пользовательские типы полей. Интерфейс Joomla по большей части описан в XML-файлах. У каждого из них свои параметры. Некоторые не описаны в документации (manual.joomla.org), поэтому самым любопытным будет полезно заглянуть в собственно файлы фреймворка по пути

libraries/src/Form/FormField.php, а так же в
libraries/src/Form/Fields. У каждого класса поля перечислены его специфические свойства, которые можно описывать в XML. А в своём типе поля вы можете устанавливать эти значения программно. В моём модуле WT Quick links под капотом происходят изменения. Теперь для работы (в админке) ему нужен вспомогательный плагин. А в самом модуле нам бы проверить, а не выключен ли он? В Joomla есть тип поля Note - заметка. Его можно использовать для вывода примечаний.

<field type="note" name="your_note_for_user" label="Заголовок примечания" title="Альтернативный способ для заголовка" description="Текст примечания" class="col-12 alert alert-info" heading="h1" close="true" />

heading - указывать уровень заголовка.
close - позволяет закрыть это примечание. В классе поля
libraries/src/Form/Field/NoteField.php описана логика вывода. И в принципе оно нам подходит для нашей задачи. Но оно будет выводить сообщение всегда, а нам нужно только тогда, когда плагин отключён. Поэтому берём и создаём свой класс поля, который мы унаследуем от
NoteField. Это значит, что у нас в руках будет весь инструментарий стандартного поля
Note + то, что мы сами добавим. В XML-манифест добавляем наше поле

<field type="systempluginstatus" name="systempluginstatus" addfieldprefix="Joomla\Module\Wtquicklinks\Site\Fields"/>

-

type - имя файла и класса,-
addfieldprefix - указываем namespace к нашему классу, может быть любой нам нужный-
name - нельзя полю без имени...Это означает, что Joomla будет использовать класс поля из файла
modules/mod_wt_quick_links/src/Fields/SystempluginstatusField.php.А в классе поля будет написано следующее:

<?php // namespace для атрибута addfieldprefix namespace Joomla\Module\Wtquicklinks\Site\Fields; // нельзя напрямую обращаться к этому файлу defined('_JEXEC') or die; // подключаем родительский класс для переопределения use Joomla\CMS\Form\Field\NoteField; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\PluginHelper; // имя класса и имя файла точь-в-точь class SystempluginstatusField extends NoteField { protected $type = 'Systempluginstatus'; protected function getLabel() { // если плагин не включён if(PluginHelper::isEnabled('system','wtquicklinks')) { // меняем свойства родительского класса $this->class = 'alert alert-danger w-100'; $this->element['label'] = '⚠️ А-а-а-а!'; $this->element['description'] = 'Плагин не включён!!'; // и просто рендерим его с нашими свойствами return parent::getLabel(); } // А иначе всё хорошо, скрываем поле из виду. $this->parentclass = 'd-none'; return ''; } }

Просто и удобно. И людям приятно, что о них позаботились и рассказали почему что-то не работает. @webtolkru#joomla #php #webdev #разработка

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

Damarkuzz

  • Захожу иногда
  • 116
  • 1 / 0
Имеется скрипт:
Спойлер
[свернуть]

Делается это для того, чтобы потом сравнить title страницы и наименование категории, если совпадает - выводим инфу о категории.
Теперь о проблеме. Категорий около 30 000, когда я начинаю выполнять $parent_cat = $cat_model->getCategory($product->virtuemart_category_id); , страница начинает "думать".

Подозреваю, что делаю что-то не так. Пожалуйста, укажите, что не так. Спасибо заранее! ^-^
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
А сколько у Вас count( $products ) ?
Да и в обще - Вы для каждого товара в модели запрашиваете данные категории ..
Ну если сильно нужно то там по моему есть получить список категорий id которых в массиве !
то есть это будет 1 запрос а не == count( $products )
То есть если сильно хотите - то соберите id категорий в массив - и получите все категории одним запросом
что то типа
Код
' WHERE #__virtuemart_category.category_id IN ( ' . implode( ' , ' , $arrayCat_id ). ' ) ';
Ну или через модель - но своим запросом будет быстрей !
*

rsn

  • Давно я тут
  • 520
  • 34 / 3
Код
if($products as $product) {
    ...
}
Может тут надо не if, а foreach?

Но дело даже не в этом.
Зачем эта проверка? Хотите определить в шаблоне является ли эта страница страницей просмотра категории?
Возможно, будет интересно: Интеграция с Ozon
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
Может тут надо не if, а foreach?
Ха - А я и не глянул ! Что логический оператор перепутали с итерацией ! )))
то я бы на месте сервера - тоже долго думал бы что от меня хотят -  встретив такое  ! )))
*

rsn

  • Давно я тут
  • 520
  • 34 / 3
я бы на месте сервера - тоже долго думал бы что от меня хотят -  встретив такое  ! )))

 :laugh:
Возможно, будет интересно: Интеграция с Ozon
*

Damarkuzz

  • Захожу иногда
  • 116
  • 1 / 0
Может тут надо не if, а foreach?

Но дело даже не в этом.
Зачем эта проверка? Хотите определить в шаблоне является ли эта страница страницей просмотра категории?

Прошу прощения, опечатался, в коде было именно foreach.
*

Damarkuzz

  • Захожу иногда
  • 116
  • 1 / 0
А сколько у Вас count( $products ) ?
Да и в обще - Вы для каждого товара в модели запрашиваете данные категории ..
Ну если сильно нужно то там по моему есть получить список категорий id которых в массиве !
то есть это будет 1 запрос а не == count( $products )
То есть если сильно хотите - то соберите id категорий в массив - и получите все категории одним запросом
что то типа
Код
' WHERE #__virtuemart_category.category_id IN ( ' . implode( ' , ' , $arrayCat_id ). ' ) ';
Ну или через модель - но своим запросом будет быстрей !

Прошу прощения, выше упомянул, что опечатался, на самом деле указан foreach,  а не if.

count( $products ) возвращает 710.
*

Damarkuzz

  • Захожу иногда
  • 116
  • 1 / 0
@rsn
Цитировать
Зачем эта проверка? Хотите определить в шаблоне является ли эта страница страницей просмотра категории?

Возможно, вы знаете модуль mod_virtuemart_products, в нём есть функция фильтрации вывода товара по родительской категории.
У меня имеется около 400 страниц с некоторым "калькулятором ссылки" на исходный товар. На каждой из страниц необходимо вывести ссылку на товар + наименование товара + картинку товара.

Мой мозг, зеленый в подобных затеях, подумал: зачем создавать 400 модулей, если можно брать категорию из title страницы, и вывести товар по сверке title и соотв. категории.
Код
if (strpos($current_title, $allParentsCategory)!== false) {
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
Ну то как придумает так и решает !
Главное что бы это по ресурсам не затратно было !!
Кста - включите отладку (общие настройки Joomla ) и там можно посмотреть - сколько какой процесс - хавает памяти и времени ! -
*

rsn

  • Давно я тут
  • 520
  • 34 / 3
@Damarkuzz не понял Вашу задачу. Попробуйте объяснить другими словами.
Возможно, будет интересно: Интеграция с Ozon
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
Код
count( $products ) возвращает 710.
Что то Вы точно не совсем то затеяли !
при таких количествах count( $products ) возвращает 710 - я бы не советовал в обще ни каких вычислений и расчетов проводить !
А тем более  в прямом потоке HTTP - Запроса !
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
не понял Вашу задачу. Попробуйте объяснить другими словами.
Та да ! - То ли объяснили не так - то ли - что то не то делаете - типа как делить на ноль ! == можно - но ненужно ! )))
*

draff

  • Гуру
  • 5801
  • 434 / 7
  • ищу работу
Делается это для того, чтобы потом сравнить title страницы и наименование категории, если совпадает - выводим инфу о категории.
Т.е. фильтрация PHP, а не SQL ?
*

Damarkuzz

  • Захожу иногда
  • 116
  • 1 / 0
@rsn
Цитировать
@Damarkuzz не понял Вашу задачу. Попробуйте объяснить другими словами.

Вкратце.

1) На 400 страницах в SP PageBuilder требуется вывести по одной категории товаров VirtueMart (всего 400 категорий).

2) Чтобы не создавать 400 разных модулей mod_virtuemart_products (на каждую категорию), я решил перебрать вызвать все товары через foreach ($products as $product). Возникает вопрос, как нам теперь из общего потока товаров всех категорий вывести нужную? (моё решение в п.3)

3) С помощью PHP мы берем title заголовка, и сопоставляем его с перечнем категорий
Код
foreach ($products as $product) {
   if (strpos($current_title, $allCategories)!== false) {
      print_r($product)
   }
}
*

Damarkuzz

  • Захожу иногда
  • 116
  • 1 / 0
@draff
Цитировать
Т.е. фильтрация PHP, а не SQL ?
Цитировать
Да, по другому пока что не умею
*

draff

  • Гуру
  • 5801
  • 434 / 7
  • ищу работу
Как вариант хак модуля, включить фильтр и добавить в точку входа модуля
$doc = JFactory::getDocument();
$current_title = $doc->getTitle();
$db = JFactory::getDbo();
            
            $query = $db
               ->getQuery(true)
               ->select('virtuemart_category_id')
               ->from($db->quoteName('#__virtuemart_categories_ru_ru'))
               ->where($db->quoteName('category_name'). " = " . $db->quote($current_title));
            $db->setQuery($query);
            $category_id = $db->loadResult();
*

Damarkuzz

  • Захожу иногда
  • 116
  • 1 / 0
@draff
Цитировать
Как вариант хак модуля, включить фильтр и добавить в точку входа модуля


Спасибо, пытался выполнить Ваш код, дописав некоторые вещи:


Спойлер
[свернуть]


Данным действиями я получил родительскую категорию, затем вызвал дочерние, в которых находятся товары, которые нужно вывести.
Но теперь, если выводить продукты через конструкцию foreach ($product as $products) {...}, выводятся все товары, без фильтрации по категории. Подскажите, как вывести товар, но отфильтровав по категориям?

*

draff

  • Гуру
  • 5801
  • 434 / 7
  • ищу работу
Вы создаете новый модуль или используете стандартный Вирт для вывода продуктов ?
п.с.
Выводит товары из подкатегории в стандартном модуле Вирт и без фильтрации по группе.
Спойлер
[свернуть]
« Последнее редактирование: 04.12.2020, 05:22:30 от draff »
*

draff

  • Гуру
  • 5801
  • 434 / 7
  • ищу работу
Запрос на получение родительской категории
Код
$query = $db
->getQuery(true)
->select($db->quoteName('vc.category_parent_id'))
->from($db->quoteName('#__virtuemart_categories', 'vc'))
->join('INNER', $db->quoteName('#__virtuemart_categories_ru_ru', 'rc'). '  ON ' . $db->quoteName('rc.virtuemart_category_id'). ' = ' . $db->quoteName('vc.virtuemart_category_id'))
->where($db->quoteName('rc.category_name'). " = " . $db->quote($current_title));
$db->setQuery($query);
$category_id = !empty($db->loadResult())? $db->loadResult() : $category_id;
*

Damarkuzz

  • Захожу иногда
  • 116
  • 1 / 0
Вы создаете новый модуль или используете стандартный Вирт для вывода продуктов ?
п.с.
Выводит товары из подкатегории в стандартном модуле Вирт и без фильтрации по группе.
Спойлер
[свернуть]

Большое спасибо, получилось вывести товары:
1) Главной категории (Тест)
2) Дочерней категории первой вложенности (Тест -> Тапочки)

Но, если товары находятся во второй вложенности и далее (Тест->Тапочки->Тканевые) - товары не выводятся.
*

draff

  • Гуру
  • 5801
  • 434 / 7
  • ищу работу
*

Damarkuzz

  • Захожу иногда
  • 116
  • 1 / 0
@draff да, гораздо быстрее
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Один пункт меню думает что он главный

Автор DamaVbubi

Ответов: 4
Просмотров: 958
Последний ответ 13.02.2024, 19:49:10
от DamaVbubi
Долго грузятся страницы категорий

Автор SuperRomario

Ответов: 4
Просмотров: 1820
Последний ответ 03.07.2023, 17:59:07
от Wood
Ошибка 1054 Unknown column 'created_by' in 'field list' VirtueMart

Автор Evgen Kulibin

Ответов: 3
Просмотров: 1302
Последний ответ 26.02.2023, 01:56:42
от lakshmi
Как вывести в категории VirtueMart кастомное поле с редактором?

Автор dc_web

Ответов: 4
Просмотров: 608
Последний ответ 05.10.2022, 11:07:00
от sivers
Проблема с выводом изображения в VirtueMart 3

Автор vetkrs

Ответов: 0
Просмотров: 484
Последний ответ 30.09.2022, 17:22:43
от vetkrs