КРАТКО
В процессе работы бывает сталкиваешься с определенными моментами, над которыми ломаешь голову и ищешь различные методы решений. Сегодня вкратце набросаю некоторые из них.
Что вы узнаете:
- Вставка модуля в материал, если не срабатывают плагины (шорткоды)
- Поле "editor" в xml и как оно связано с атрибутом filter="raw"
- Проблема Fatal error: Cannot redeclare … previously declared in и вставка if (!function_exists('user_runction')) { ...}
Всем привет, на этот раз ничего веселого, сплошная скучная писанина, но нужная. Особое внимание хочу обратить на то, что данные методы описаны для Joomla 3.9 и протестированы на ней же.
Вставка модуля в материал Joomla, если не срабатывают плагины (шорткоды)
Так получилось, что работал с непонятным шаблоном плюс стояла куча непонятных компонентов. Возникла следующая проблема: модуль никак не вставлялся в материал, шорткоды отображались как есть, то есть loadmodule.
Там было два варианта: либо отыскать причину и (!возможно) пожертвовать важным нужным плагином сторонних разработчиков, либо придумать еще что-нибудь. И тут на помощь приходит смекалка и гугл)
Мы просто вставляем в материал Joomla следующий скрипт PHP:
<?php
jimport( 'joomla.application.module.helper' ); // подключаем требуемый класс
$module = JModuleHelper::getModules('position-666'); // заполняем массив модулями, опубликованными в позиции position-666, позицию ставим вручную и любую
$attribs['style'] = 'none'; // указываем стиль вывода модуля none (так как при использовании стиля xhtml наблюдается дублирование заголовков модуля)
echo JModuleHelper::renderModule($module[0], $attribs); // выводим первый модуль из заданной позиции;
?>
Очень хорошо и просто, но может возникнуть вопрос: как же в свою очередь вставить PHP-скрипт в материал, так как стандартные редакторы беспощадно режут скрипты, плюс там в глубинах еще надо разрешить использование определенных тегов. Можно воспользоваться продвинутым редактором, наподобие JCE, там в платной версии есть такая фишка. Я им не пользуюсь, и вот почему: заметил, что при загрузке сайта и работающим компонентом JCE достаточно заметно падает скорость загрузки страницы. А чтобы вставить скрипт PHP - мне очень понравился плагин Sourcerer плагин для вставки любых кодов в контент Joomla. Данный плагин позволяет вставлять скрипты PHP, HTML, CSS, JavaScript в любое место, будь то материал, модуль или компонент. Вставляется скрипт с помощью кнопки на редакторе, либо с помощью шорткодов {source}
Плагин кстати платный, поэтому тихонько скачиваем отсюда ТУТ
UPD^^10/05/2021
На мой сегодняшний взгляд вставка кода непосредственно в материал - плохая идея. Гораздо правильнее реализовать модуль с нужной логикой. Посмотрим, что напишу по мере приобретения опыта)))
Поле "editor" в xml и как оно связано с атрибутом filter="raw"
Писал модуль и в файле-манифесте мне потребовалось сделать пользовательское текстовое поле, чтобы пользователь мог самостоятельно редактировать нужные значения.
Проблема же возникла в том, что пользователю может понадобиться отформатировать данный текст, а тип "textarea" этого не позволит, поэтому мы делаем следующее:
Используем тип поля "editor":
<fieldset name="pole" label="Поле">
<field name="mod_city_1" type="editor"
label="Значение 1"
description="Напишите текст"
filter="raw" />
</fieldset>
Как вы заметили, мы также используем атрибут filter со значением "raw". Зачем? А затем, что просто смена "textarea" на "editor" ничего нам не даст (вообще эту информацию нужно проверить, у меня и половины гугла - форматирование не сохранялось, данный атрибут в корне устранил вопрос, но причины такого поведения типа "editor" я не понял, а копаться времени как всегда не было, как разберусь - напишу )
UPD^^10/05/2021
Разобрался, потому что столкнулся более плотно со стандартными типами полей:
Атрибут filter отвечает за фильтрацию введенных данных. Принимая разные значения он осуществляет фильтрацию вводимых данных. В том числе параметр raw, который полностью убирает фильтрацию (можно писать что угодно)
Проблема PHP: Fatal error: Cannot redeclare … previously declared in и вставка if (!function_exists ('user_runction')) { ...}
Вообще тут несколько вариантов: вы можете объявлять одноименную функцию несколько раз в одном файле, либо же в подключаемых файлах, суть в том, что функция дублируется. У меня сегодня тоже так случилось, причем судя по тексту ошибки - функция объявлялась дважды в одной и той же строке. При этом в модуле было всего 3 файла, и там она точно не дублировалась. Я решил (возможно неправильно), что из-за одного инклюда она объявляется дважды, то есть еще где-то в дебрях джумлы вызывается повторно (тут нужен скрипт и по-хорошему чтобы посмотрел и объяснил сведущий человек, я же пока не понял почему так случилось, но нагуглил решение).
В общем все, что было в гугле по данному вопросу было изучено, по итогу проблему решил только следующий метод:
if (!function_exists ('user_runction')) { здесь уже вы объявляете свою функцию}
Такие вот шанежки на ночь глядя, записал все это впопыхах, поскольку как всегда смертельно хочу спать, но если отложить на завтра - значит на никогда)))
А этот скрипт PHP поможет отследить, на каком из множества подключенных файлов выполнение скрипта прервалось:
function shutdown() {
var_export(get_included_files());
echo 'Script ended';
}
register_shutdown_function('shutdown');
БОНУС) Чтобы сразу позвонить напрямую техподам из hoster.kz - набираем +7-747-094-10-00 (их ватсап тоже на этом номере)
Примечание: если кто-то внесет поправки, или объяснит причину некоторых явлений из статьи - буду очень признателен. Если же таковых не будет - то когда докопаюсь до сути (как только столкнусь вновь) - обновлю статью
Напоминаю, что вопросы можно задать в группе https://t.me/newqosgroup