Короткий код (short code) в CMS Joomla представляет собой часть текста, несущий в себе смысловую нагрузку для последующей обработки контента. Такие коды в основном прописываются в html-модулях, в статьях и в компонентах, которые позволяют такую обработку. Обработчиком коротких кодов служат плагины контентных и системных типов, работающие с методами типа "content" (onContentPrepare, onContentBeforeDisplay и т.д.).

В Jooml'е общепринятое использование короткого и самого простого кода выглядит следующим образом: {shortcode}, (фигурные скобки служат как опозновательный признак, но это не значит, что вы не можете использовать то, что хотите на ваш вкус), где данный текст просто прописывается, к примеру в материал, и далее обработчиком несет уже свои функции во взаимодействии со статьёй для вывода информации или изменения существующих данных. Стандартные примеры, вы скорее всего могли наблюдать для вывода модуля в любом месте материала.

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

  • preg_match_all( "/{shortcode}/si"$article->text$matches, PREG_SET_ORDER );

Для более сложного шорткода к примеру: {shortcode param1="value" param2="value"} регулярное выражение будет выглядеть так:

  • preg_match_all ( "/{shortcode\s*(.*?)}/si", $article->text$matches, PREG_SET_ORDER );

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

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

  1. /**
  2. * Get params 
  3. * @return string
  4. */
  5. function getParamValue($text = '', $key = '', $value = ''{
  6.     ifpreg_match("/".$key."\s*=\s*(\"(.*?)\")|('(.*?)')/si", $text, $matches) {
  7.        $value = $matches[2];
  8.     }
  9.     return $value;
  10. }

Использование данного метода:

  1. // ... param1="value" ... 
  2. $param1 = $this->getParamValue($text, "param1");
  3.  
  4. // ... param2="value" ... 
  5. $param2 = $this->getParamValue($text, "param2");

В итоге получается, что мы разбиваем логику выбора параметров на два шага, вначале ищем шорткод со всем его содержимым "(.*?)", а далее это найденное содержимое разбираем еще раз, в более понятном и человеческом виде.

Если возникли трудности в восприятии статьи, предлагаю Вам скачать прикрепленный плагин и посмотреть пример работы:

zipКонтент плагин (размер: 3.55 kb, скачиваний: 4)
Для удобной работы с регулярным выражением