ленивец

 

КРАТКО

В процессе работы бывает сталкиваешься с определенными моментами, над которыми ломаешь голову и ищешь различные методы решений. Сегодня вкратце набросаю некоторые из них.

Что вы узнаете:
  • Вставка модуля в материал, если не срабатывают  плагины (шорткоды)
  • Поле "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