Новости Joomla

Совет по Joomla: несколько значений по умолчанию в XML-формах для стандартных полей типа list

👩‍💻 Совет по Joomla: несколько значений по умолчанию в XML-формах для стандартных полей типа list.При работе над плагином возникла необходимость указать стандартный набор из нескольких элементов стандартного поля списка. И хотелось указать их в стандартном же атрибуте default для полей. Когда это нужно?Когда Ваши пользователи устанавливают плагин и НЕ заходят в настройки - в коде вы можете использовать значения по умолчанию с помощью класса Registry (писал об этом ранее) и всегда быть уверенным, что хоть какие-то жизненно необходимые параметры к вам придут всегда. 🧐 Но как сделать то же самое для интерфейса админки?Пользователя нужно направлять, предлагать очевидный работоспособный сценарий для начала, а дальше он уже сам разберется. Когда человек заходит в параметры свежеустановленного плагина в Form ещё нет данных и параметры по умолчанию выставляются из атрибутов default в xml-полях.
<field name="showdesc" type="radio"                       label="PLG_CFI_PARAM_SHOWDESC"                       class="btn-group btn-group-yesno"                       default="1">                    <option value="0">JNO</option>                    <option value="1">JYES</option>                </field>
Здесь по умолчанию будет включено "Да". И если пользователь не переключит параметр, то при сохранении мы ожидаемо получим "да" в params плагина.Для поля списков type=&quot;list&quot; можно указать значение по умолчанию и многие знают, что его можно указать только одно.
<field type="list"                       name="article_fields"                       label="article_fields"                       description="article_fields_desc"                       layout="joomla.form.field.list-fancy-select"                       multiple="true"                       default="id"                >                    <option value="id">id</option>                    <option value="title">title</option>                    <option value="alias">alias</option>                    <option value="introtext">introtext</option>                    <option value="fulltext">fulltext</option>                    <option value="state">state</option></field>
Но у нас поле с множественным выбором (атрибут multiple) и хотелось бы указать несколько значений по умолчанию...Оказывается, так можно сделать. Для этого в атрибуте default нужно указать json с нужными параметрами в виде {int}key : {string} value.Например, default='{"0":"id","1":"title"}'.
<field type="list"                       name="article_fields"                       label="article_fields"                       description="article_fields_desc"                       layout="joomla.form.field.list-fancy-select"                       multiple="true"                       default='{"0":"id","1":"title"}'                >                    <option value="id">id</option>                    <option value="title">title</option>                    <option value="alias">alias</option>                    <option value="introtext">introtext</option>                    <option value="fulltext">fulltext</option>                    <option value="state">state</option></field>
⚠️ Обратите внимание на кавычки! Поскольку json_decode не понимает одинарные кавычки собственно json нужно писать с двойными, а значение для атрибута default писать в одинарные.🙏 За подсказанное решение огромное спасибо участникам нашего сообщества - разработчикам Дмитрию Васюкову (@fictionlabs) и Игорю Бердичевскому (@septdir).@joomlafeed#joomla #разработка #webdev #development

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

novikov82

  • Новичок
  • 9
  • 3 / 0
Попал в довольно гнилую ситуацию: создал в магазине более 3 тысяч категорий, начала феерически тормозить админка на редактировании категорий и товаров.
Беглый анализ дал понять, что затык наступает в функции getTreeAllCategories из модели categories.
В принципе, не мудрено, в функции есть фрагмент:
Код
                    foreach ($categories as $key => $category){
                        ...
                        while ($category_parent_id || $i < 1000) {
                            foreach ($originalCategories as $originalKey => $originalCategory){
                                ...
                            }
                            $i++;
                        }
Три вложенных цикла, два из них размерностью порядка тысяч, да еще, как я понимаю, глубина вложенности категорий, в общем, несколько десятков миллионов итераций набирается.
Кто как с этим борется? Можно ли улучшить работу магазина в админке, не исправляя авторского кода? Мне в голову ничего пока не пришло - в этой функции ни одного плагина нет.

UPD
Функция buildTreeCategory работает еще ужаснее :( пришлось пока забить два грубых костыля.
« Последнее редактирование: 30.09.2015, 00:37:26 от novikov82 »
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Беглый анализ дал понять, что затык наступает в функции getTreeAllCategories из модели categories.
указанный кусок кода выполняется только если isset($filter['text_search']) && !empty($filter['text_search']. соответственно, там далеко не несколько десятков миллионов проходов.

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

Функция buildTreeCategory работает еще ужаснее :( пришлось пока забить два грубых костыля.
есть тема Что нужно доделать в ЖШ. разработчики ее читают и если просьбы/советы действительно стоящие - то они включают это в апдейты. если вы считаете, что вам есть что предложить в плане оптимизации - предлагайте. уверен, что если будет что слушать, то вы будете услышаны :)
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

novikov82

  • Новичок
  • 9
  • 3 / 0
указанный кусок кода выполняется только если isset($filter['text_search']) && !empty($filter['text_search']. соответственно, там далеко не несколько десятков миллионов проходов.
Да, вы правы, дело не в этом кусочке, а в функции recurseTree, она вызывается в другом месте и используется для построения дерева категорий.
Цитировать
приходилось иметь дело с магазинами, у которых было похожее количество категорий. не видел особых проблем. но вообще конечно согласен с вами, что там есть что оптимизировать.
Думаю, дело не столько в количестве категорий, а в большом уровне вложенности (так уж у меня получилось, что магазин сильно ветвится). Для рекурсии это, очевидно, важно.

И непонятно, как решать проблему. Я пишу о том, что мои костыли грубые - ориентированы под мою задачу, на других задачах не прокатит. Поэтому и разработчикам как-то пока нечего предложить. Придется подумать.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
сделайте ради интереса
Код
echo microtime(true);
до и после вызова recurseTree(), чтобы посмотреть сколько функция выполняется по времени.
думается мне что проблема все таки не в ней...
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

novikov82

  • Новичок
  • 9
  • 3 / 0
сделайте ради интереса
Код
echo microtime(true);
до и после вызова recurseTree(), чтобы посмотреть сколько функция выполняется по времени.
думается мне что проблема все таки не в ней...
Сделал. Дело в ней :(
Ради эксперимента вставил такую штуку:
Код
function recurseTree($cat, $level, $all_cats, &$categories, $is_select) {
    $probil = '';
    if($is_select) {
        for ($i = 0; $i < $level; $i++) {
            $probil .= '-- ';
        }
        $cat->name = ($probil . $cat->name);
        $categories[] = JHTML::_('select.option', $cat->category_id, $cat->name,'category_id','name' );
    } else {
        $cat->level = $level;
        $categories[] = $cat;
    }
    foreach ($all_cats as $categ) {
   
        echo "x"; // <--- добавил для проверки

        if($categ->category_parent_id == $cat->category_id) {
            recurseTree($categ, ++$level, $all_cats, $categories, $is_select);
            $level--;
        }
    }
    return $categories;
}
Получил на выходе 7 миллионов иксов. Мне кажется, многовато.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
какое время выполнения получили?
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

novikov82

  • Новичок
  • 9
  • 3 / 0
какое время выполнения получили?
Пять секунд на локальной машине, на сервере не проверял, но, наверное, чуть меньше.
Но вообще диалог с вами подтолкнул на мысль. Функция recursiveTree написана, по сути, довольно бездарно. В рекурсии стоит цикл по всем категориям, в котором ищутся дочерние категории по идентификатора родителя. И при том количестве категорий, которое обычно бывает в магазинах, это не заметно. А я вот попался...
В общем, поправил ее малой кровью с использованием ассоциативного массива:
Код
function recurseTree($cat, $level, $all_cats, &$categories, $is_select) {
   static $cat_by_parent = null;
   if(!$cat_by_parent)
   {
$cat_by_parent = array();
foreach ($all_cats as $categ)
{
  if(!$cat_by_parent[$categ->category_parent_id])
$cat_by_parent[$categ->category_parent_id] = array();
  $cat_by_parent[$categ->category_parent_id][] = $categ;
}
    }

    $probil = '';
    if($is_select) {
        for ($i = 0; $i < $level; $i++) {
            $probil .= '-- ';
        }
        $cat->name = ($probil . $cat->name);
        $categories[] = JHTML::_('select.option', $cat->category_id, $cat->name,'category_id','name' );
    } else {
        $cat->level = $level;
        $categories[] = $cat;
    }
if($cat_by_parent)
    if(count($cat_by_parent[$cat->category_id]))
{
foreach ($cat_by_parent[$cat->category_id] as $categ) {
recurseTree($categ, ++$level, $all_cats, $categories, $is_select, $cat_by_parent);
$level--;
}
}
    return $categories;
}

Буду писать в предложения улучшений... Спасибо :)
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
угу, норм решение. я бы тоже так писал - исходя из цикла по родительским. по хорошему конечно тут тоже нужны проверки вне циклов, но и так насколько я вижу количество проходов снизилось с n*n до n+n. итого у вас 6 тыс вместо 7 млн :)
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Модуль (компонент, плагин) вывода категорий Жш

Автор stitch808

Ответов: 4
Просмотров: 1099
Последний ответ 07.11.2022, 15:01:21
от stitch808
Цена "от" на странице списка категорий товаров (цена самого дешёвого товара)

Автор goga_pgasovav

Ответов: 3
Просмотров: 682
Последний ответ 14.10.2021, 14:13:38
от goga_pgasovav
СТраница с названиями категорий и списком всех товаров

Автор dron

Ответов: 8
Просмотров: 1116
Последний ответ 08.12.2020, 21:32:00
от kit2m2
Список заказов (админка) - Вывести общий вес все товаров в заказе

Автор kit2m2

Ответов: 1
Просмотров: 766
Последний ответ 06.10.2020, 20:42:13
от Taatshi
Алиас вложенных категорий

Автор AlexB

Ответов: 8
Просмотров: 1220
Последний ответ 24.01.2020, 22:26:06
от AlexB