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

Aspik

  • Давно я тут
  • 542
  • 63 / 2
  • В личку не писать, не отвечу.
Пишу плагин для вывода alternate url. (для мультиязычных сайтов)
Есть ли событие типа onBeforeCompileHead, но для компонента JS.
Или любое другое событие которое отправит $html в head до вывода скриптов?
Как получить альтернативные url существующих языков?

Базовый код плагина:


Код
class plgJshoppingProductsJSextalternateurl extends JPlugin {

function __construct(&$subject, $config){
        parent::__construct($subject, $config);
    }

public function onBeforeDisplayProduct(&$product) {  
//
$document = JFactory::getDocument();
$lang = JFactory::getLanguage();
$lang_tag = $lang->getTag();

foreach (JLanguageHelper::getLanguages() as $language) {
if ($language->lang_code != $lang_tag)  {
//print_r($language->lang_code);
$alias = 'alias_'.$language->lang_code;
//print_r($product);
$product_id = JRequest::getInt('product_id');
$category_id = JRequest::getInt('category_id');

if ($product->$alias != '') {
$url = SEFLink('index.php?option=com_jshopping&controller=product&task=view&category_id='.$category_id.'&product_id='.$product_id, 1);
$html = '<link href="'.$url.'" rel="alternate" hreflang="'.$language->lang_code.'" />';
$document->addCustomTag($html);
}
}
}
}
}

« Последнее редактирование: 26.11.2013, 23:52:43 от Aspik »
Мои расширения - http://eco-joom.com/ru/
*

ELLE

  • Глобальный модератор
  • 4505
  • 893 / 0
Re: Есть ли событие типа onBeforeCompileHead ?
« Ответ #1 : 26.11.2013, 23:06:54 »
Есть ли событие типа onBeforeCompileHead, но для компонента JS.
обычно по контексту определяют, если плагин системный

для JS такого отдельного нету, насколько я знаю
триггеров вообще много, но под конкретные события
*

Aspik

  • Давно я тут
  • 542
  • 63 / 2
  • В личку не писать, не отвечу.
Re: Есть ли событие типа onBeforeCompileHead ?
« Ответ #2 : 26.11.2013, 23:22:04 »
Вопросов даже 2, но они связанные.
1) Как получить альтернативные url существующих языков. (Проверка на альтернативный язык представлена в первом посте)
2) Как отправить в head тег типа "<link href="URL" rel="alternate" hreflang="LANG" />"

Или может быть разработчик это в компонент по умолчанию сделает ? Я не вижу нормальных способов получения альтернативных url.

Мои расширения - http://eco-joom.com/ru/
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Есть ли событие типа onBeforeCompileHead ?
« Ответ #3 : 26.11.2013, 23:30:06 »
самое первое событие в ЖШ это
Код
            JPluginHelper::importPlugin('jshopping');
            $dispatcher = JDispatcher::getInstance();
            $dispatcher->trigger('onLoadJshopConfig', array(&$config));
только не пойму чем не подходит onBeforeCompileHead? и не пойму конечную цель
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Есть ли событие типа onBeforeCompileHead ?
« Ответ #4 : 26.11.2013, 23:33:21 »
В смысле
Код: php-brief
$url = str_replace('/ru/', '/en/', JFactory::getURI()->toString());
2.
Код: php-brief
$doc = JFactory::getDocument();
$doc->addCustomTag( '<link href="URL" rel="alternate" hreflang="LANG" />' );
*

Aspik

  • Давно я тут
  • 542
  • 63 / 2
  • В личку не писать, не отвечу.
Re: Есть ли событие типа onBeforeCompileHead ?
« Ответ #5 : 26.11.2013, 23:50:10 »
В смысле
Код: php-brief
$url = str_replace('/ru/', '/en/', JFactory::getURI()->toString());
2.
Код: php-brief
$doc = JFactory::getDocument();
$doc->addCustomTag( '<link href="URL" rel="alternate" hreflang="LANG" />' );



1) alias разные, как правильно сформировать url вопрос остается.
2) с addCustomTag то решение я сделал:

Код плагина:
Код
class plgJshoppingProductsJSextalternateurl extends JPlugin {

function __construct(&$subject, $config){
        parent::__construct($subject, $config);
    }

public function onBeforeDisplayProduct(&$product) {  
//
$document = JFactory::getDocument();
$lang = JFactory::getLanguage();
$lang_tag = $lang->getTag();

public function onBeforeDisplayProduct(&$product) { 
//
$document = JFactory::getDocument();
$lang = JFactory::getLanguage();
$lang_tag = $lang->getTag();

foreach (JLanguageHelper::getLanguages() as $language) {
if ($language->lang_code != $lang_tag)  {
//print_r($language->lang_code);
$alias = 'alias_'.$language->lang_code;
//print_r($product);
$product_id = JRequest::getInt('product_id');
$category_id = JRequest::getInt('category_id');
$Itemid = JRequest::getInt('Itemid');

if ($product->$alias != '') {
$url = SEFLink('index.php?option=com_jshopping&controller=product&task=view&category_id='.$category_id.'&product_id='.$product_id.'&Itemid='.$Itemid.'&lang='.$language->sef, 1);
$html = '<link href="'.$url.'" rel="alternate" hreflang="'.$language->lang_code.'" />';
$document->addCustomTag($html);
}
}
}
}

}




При выключенном ЧПУ такой вид URL рабочий. (Был добавлен &lang='.$language->sef)

Код
$url = SEFLink('index.php?option=com_jshopping&controller=product&task=view&category_id='.$category_id.'&product_id='.$product_id.'&lang='.$language->sef, 1);
« Последнее редактирование: 27.11.2013, 09:26:25 от Aspik »
Мои расширения - http://eco-joom.com/ru/
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Есть ли событие типа onBeforeCompileHead ?
« Ответ #6 : 27.11.2013, 00:18:14 »
нужно добавить к ссылке язык я так понимаю
а какой адрес у ссылки сейчас
что выведет echo $_SERVER["HTTP_HOST"].'/index.php?' . http_build_query($_REQUEST);
*

Aspik

  • Давно я тут
  • 542
  • 63 / 2
  • В личку не писать, не отвечу.
Re: Есть ли событие типа onBeforeCompileHead ?
« Ответ #7 : 27.11.2013, 00:21:09 »
нужно добавить к ссылке язык я так понимаю
а какой адрес у ссылки сейчас
что выведет echo $_SERVER["HTTP_HOST"].'/index.php?' . http_build_query($_REQUEST);



Добавления языка при включенном ЧПУ ничего не меняет.
При выключенном ЧПУ такой вид URL рабочий. (Был добавлен &lang='.$language->sef)

Код
$url = SEFLink('index.php?option=com_jshopping&controller=product&task=view&category_id='.$category_id.'&product_id='.$product_id.'&lang='.$language->sef, 1);
Мои расширения - http://eco-joom.com/ru/
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Есть ли событие типа onBeforeCompileHead ?
« Ответ #8 : 27.11.2013, 00:30:04 »
какие сейчас есть ссылки и для каких языков и какие они должны быть. Почему не использовать замену с помощью  str_replace
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Есть ли событие типа onBeforeCompileHead ?
« Ответ #9 : 27.11.2013, 00:38:43 »
Цитировать
Почему не использовать замену с помощью  str_replace
alias разный для разных языков. не получится просто замена.

1. вызываем SEFLink с флагом языка.
2. onBeforeBuildRoute - смотрим, если есть на флаг, делаем $query = array() чтобы не выполнялись условия в роутере, попутно сохраняя $query в плагине в первоначальном виде для дальнейшего использования
3. onAfterBuildRoute - дублируем блок роутера, отвечающий за генерацию ссылки на товар, заменяя JSFactory::getAliasProduct() и JSFactory::getAliasCategory() своими обработками с учетом нужного языка. исходя из начальной $query генерируем алиас
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Есть ли событие типа onBeforeCompileHead ?
« Ответ #10 : 27.11.2013, 01:17:04 »
Цитировать
alias разный для разных языков. не получится просто замена
что мешает менять алиасы? их я вытащу одним запросом с базы насколько я понимаю
тем самым уменьшу количество запросов на формировании ссылок стандартным роутером
Или они уже есть в $product
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Есть ли событие типа onBeforeCompileHead ?
« Ответ #11 : 27.11.2013, 02:09:13 »
ну можно и так конечно, но по сути в роутере и так по одному запросу делается на алиасы, а в дальнейшем статика возвращается уже. тут надо смотреть по ситуации, что по обработке проще. если бы речь шла только об алиасе товара - тут да, проще замена. а так тут же присутствует еще и алиас(ы) категории, и может быть в зависимости от вложенности категории: категория/подкатегория/подподкатегория/товар, а может быть проще - категория/товар. тяжеловато подмену будет делать. а если рассматривать вариант, когда для русского языка заполнен алиас, а для английского нет, то вообще :)
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Есть ли событие типа onBeforeCompileHead ?
« Ответ #12 : 27.11.2013, 02:25:11 »
Цитировать
а если рассматривать вариант, когда для русского языка заполнен алиас, а для английского нет
эт самое простое пропустили обработку данной части  ^-^
Aspik по коду для материалов пишет. Так прямо в карточку товара можно и всталять плагин то зачем
*

Aspik

  • Давно я тут
  • 542
  • 63 / 2
  • В личку не писать, не отвечу.
Re: Есть ли событие типа onBeforeCompileHead ?
« Ответ #13 : 27.11.2013, 09:37:44 »
эт самое простое пропустили обработку данной части  ^-^
Aspik по коду для материалов пишет. Так прямо в карточку товара можно и всталять плагин то зачем
Угу.
Код должен быть универсальным. Он должен работать как при включенном ЧПУ, так и без него.

По правилам компонента URL составлен правильно, есть category_id, product_id, Itemid и lang. Без ЧПУ все работает прекрасно. Вывод проблема в router.
router не может понять что я от него хочу когда добавляю lang. Нет он конечно меняет язык, заменяет один язык на другой в URL, но на этом все законченно.

Код
$url = SEFLink('index.php?option=com_jshopping&controller=product&task=view&category_id='.$category_id.'&product_id='.$product_id.'&Itemid='.$Itemid.'&lang='.$language->sef, 1);

Оставил эту разработку на потом.
Всем спасибо. Всем +
« Последнее редактирование: 27.11.2013, 09:43:27 от Aspik »
Мои расширения - http://eco-joom.com/ru/
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться