Новости 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 Гость просматривают эту тему.
  • 39 Ответов
  • 6710 Просмотров
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Тип пункта меню
« Ответ #30 : 23.05.2014, 14:26:52 »
Цитировать
бага с ютемовскими шаблонами (не отдают 404) не отсюда растёт?

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

jorevo

  • Давно я тут
  • 595
  • 13 / 1
Re: Тип пункта меню
« Ответ #31 : 23.05.2014, 14:46:35 »
Там ноги со стороны шаблона растут из файла error.php - если его снести, то используется error.php из инсталляции Joomla. С ним всё нормально.

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

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Тип пункта меню
« Ответ #32 : 23.05.2014, 15:34:55 »
да, я знаю, но проблема не в самом этом файле. та как нибудь под кальян доберусь... самому интересно, что же есть причиной
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Тип пункта меню
« Ответ #33 : 17.06.2014, 18:24:28 »
В процессе чуханья репы над одной затеей нашлось решение проблемы пунктов меню.

Итак, под нож попадают всего 4 файла:

1. \components\com_jshopping\jshopping.php. В самом начале сразу после
Код
defined('_JEXEC') or die('Restricted access');
добавляем
Код
$app = JFactory::getApplication();
$controller = $app->input->getCmd('layout');
if ($controller) {
$app->input->set('controller', $controller);
$app->input->set('task', $app->input->getCmd('jshoppingtask'));
}

2. \components\com_jshopping\router.php. В функции jshoppingParseRoute после
Код
$menuItem = $menu->getActive();
добавляем
Код
if (isset($menuItem->query['layout'])) {
$menuItem->query['controller'] = $menuItem->query['layout'];
}
if (isset($menuItem->query['jshoppingtask'])) {
$menuItem->query['task'] = $menuItem->query['jshoppingtask'];
}

3. \components\com_jshopping\metadata.xml
Код: xml
<options var="controller">
меняем на
Код: xml
<options var="layout">
, а также
Код: xml
<field name="task" type="list" label="Show" description="Page to show">
меняем на
Код: xml
<field name="jshoppingtask" type="list" label="Show" description="Page to show">

4. \components\com_jshopping\lib\shop_item_menu.php. В function getList перед
Код
$data[$tmp2[0]] = $tmp2[1];
добавляем
Код
if ($tmp2[0] == 'layout') {
$tmp2[0] = 'controller';
} else if ($tmp2[0] == 'jshoppingtask') {
$tmp2[0] = 'task';
}

Итого, имеем:
1. Абсолютно правильное сохранение пунктов меню. Т.е. ни пустых полей, ни всегда Товары.
2. Практически полная совместимость с уже созданными пунктами меню. Практически означает то, что создавать заново ранее созданные пункты меню специально не нужно. Но если вдруг решите отредактировать их, то значения собьются, и придется вбивать заново.
3. Довольно таки несложное с точки зрения реализации решение доставшей многих проблемы, что позволяет надеяться на то, что это все таки будет в стоковой версии. Хотя какие к черту надежды? :) Это обязательно! должно быть в стоковой версии :)

P.S. @разработчики ЖШ. Возможно, конечно, что я не учел всех особенностей ЖШ в плане распарсивания ссылки меню. Но вроде бы с первого взгляда все работает верно. Так что ждем в стоке :)

P.P.S Ниже есть также код, который надо добавить в плагин JoomShopping Xmap
« Последнее редактирование: 20.06.2014, 12:42:01 от dmitry_stas »
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Linfuby

  • Завсегдатай
  • 1242
  • 176 / 0
  • Всё просто...
Re: Тип пункта меню
« Ответ #34 : 17.06.2014, 18:56:48 »
Кстати для информации:
В версии Joomla 3.3.1 & JoomShopping 4.5.0 тип пункта меню сохраняется. Правда всегда указывается "Товары", но все-таки сохраняется, а это уже плюс. :)
Немного воображения и логики, и любая проблема становится решенной.
Кривые решения - дают кривой результат!
Решения для JoomShopping
Благодарности и поддержка принимаются по след. реквизитам:
Яндекс.Деньги - 41001751720054
*

Biss

  • Давно я тут
  • 995
  • 101 / 0
Re: Тип пункта меню
« Ответ #35 : 17.06.2014, 20:56:44 »
Цитировать
P.S. @разработчики ЖШ. Возможно, конечно, что я не учел всех особенностей ЖШ в плане распарсивания ссылки меню. Но вроде бы с первого взгляда все работает верно. Так что ждем в стоке Azn
5. Ждём обновлеия компонента :)
А так вроде всё работает, спасибо, на правки ушло примерно 5 минут.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Тип пункта меню
« Ответ #36 : 17.06.2014, 21:21:12 »
Ждём обновлеия компонента

Угу... По хорошему вообще бы сделать не через layout и jshoppingtask, а через view и layout соответственно, и добавить XML в каждом view свой, как это сделано во всех уважающих себя компонентах :) И тогда при выборе типа меню можно будет выводить только нужные поля, а не так, как сейчас при выборе, например, Статический текст - Category ID и т.п. Но это уже следующий шаг :) Хотя бы это...

на правки ушло примерно 5 минут.

на правки ушло примерно 3 года :)
« Последнее редактирование: 17.06.2014, 21:26:26 от dmitry_stas »
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Biss

  • Давно я тут
  • 995
  • 101 / 0
Re: Тип пункта меню
« Ответ #37 : 19.06.2014, 20:06:34 »
Цитировать
P.S. @разработчики ЖШ. Возможно, конечно, что я не учел всех особенностей ЖШ в плане распарсивания ссылки меню.
Похоже проблема есть, не знаю где именно.
Короче сделал как описано все норм, пересохранил пункты и так далее.
Через пару дней захожу в Google мастер :o = вместо отправленных по идее 500 с лишнем ссылок отправилось только 70. Захожу в карту (на xmap)
-товаров нет. Покрутил плагином так сяк ничего не получилось (выводит либо все товары по два раза в карте - сначала с категорий потом с производителей, либо ниодного товара с инными настройками)
Вернул всё обратно дабы удостоверится = стало на места.
Подозреваю что с этими переделками надо переделывать плагин к Xmap.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Тип пункта меню
« Ответ #38 : 19.06.2014, 22:08:25 »
в плагине для Xmap после

Код
parse_str(html_entity_decode($link_query['query']), $link_vars);

делаем примерно тоже самое, что и в роутере

Код
if (isset($link_vars['layout'])) {
$link_vars['controller'] = $link_vars['layout'];
}
if (isset($link_vars['jshoppingtask'])) {
$link_vars['task'] = $link_vars['jshoppingtask'];
}

не проверял в реале, но по идее этого достаточно
« Последнее редактирование: 19.06.2014, 22:23:09 от dmitry_stas »
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Biss

  • Давно я тут
  • 995
  • 101 / 0
Re: Тип пункта меню
« Ответ #39 : 20.06.2014, 12:07:29 »
Стоит попробовать.
Прокручу на демо сайте - отпишусь если этого не сделает кто-то раньше )
Уже есть 3.18.0 в апдейте эти файлы не зацепились.

Проверено и работает корректно

JoomShopping 3.18.0
Xmap - JoomShopping 2.0.1 (плагин)
Xmap 2.3.3

п.с. можно добавлять в сток ^-^
« Последнее редактирование: 20.06.2014, 15:04:48 от Biss »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться