Форумы / National / Russian / Идеи / Chunks

Куски кода в шаблоне

Macik
#39734 01.09.2014 19:27
#39730 Dr2005alex:

Да походу только через правку шаблонизатора можно одолеть. Я поспешил с глобальными тегами))))

Да. Только сделать это надо красиво и продуманно, с перспективой на будущее. (см. ниже)

Через плагин можно сделать только такую конструкцию для подключения чанка {PHP.chunk.name} или вызовом функции {PHP|cot_chunk('name')}, но тогда теряется смысл легко подключения чанков.

Главное, что в таком случае мы теряем возможность использовать внутри чанков теги текущего шаблона (в котором чанк используется), и все «скатывается» к прямому аналогу слотов с парсингом а-ля «slot-n-tags». 

Либо перечислять все теги плагине, где плагин должен подключать чанки. Все хуки tags. что бы иметь конструкцию к примеру {[CHUNKNAME]} 

Нет, это совсем не вариант.

---

На счет универсального расширения CoTemplate мысль такая:

  • выбираем единый синтаксис открывающих и закрывающих скобок для «расширенных» тегов, например {{ }}, или как в новом МодИксе [[ ]] ( сейчас не важно)
  • внутри скобок первым делом идет управляющий оператор, пример — {{CHUNK: }} 
  • на основании имени оператора вызывается соотв. функция прописанная в самом CoTemplate или сторонняя, зарегистрированная предварительно через механизм самого CoTemplate. Т.е. если мы нашли конструкцию {{YYY: тело_расширенного_тега}} вызывается функция «привязанная» заранее к оператору `YYY` и ей передается полное «тело_расширенного_тега» и контекст вызова, т.е. ссылка на экземпляр XTemplate в котором идет работа.
  • Далее уже от заданной функции зависит как `тело_расширенного_тега` будет парсится, чем будет заменяться, будут ли у него параметры и т.п.

 

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

// условный код на PHP

// в хуке global регистрируем свои обработчики
XTemplate::set_extender(array(
  'CHUNK:' => 'cot_chunk_parse',
  '$' => 'cot_chunk_parse', // тоже самое но в стиле ModX
));

// в плагине, описываем функцио обработки, которая будет заниматься всем дальнейшим процессом обработки
/**
* обработка чанков
*
* @param array $found_ext_tag массив содержащий PCRE совпадения, содержит:
*     $found_ext_tag[1] — имя расширенного тега, например `CHUNK:`
*     $found_ext_tag[2] — тело расширенного тега для дальнейшей работы
* @param XTemplate $tpl_context ссылка на текущий экземпляр CoTemplate (из которого осуществлен вызов)
* @return string
*/
function cot_chunk_parse($found_ext_tag, $tpl_context){
  /* парсим $found_ext_tag[2] для получения имени конкретного чанка, его параметров и т.п. в зависимости от установленного синтаксиса */

  // …

  return $parsed;
}

 

 

 

Добавлено 4 минуты спустя:

#39733 Dr2005alex:

Вот файл cotemlate.php с коррекцией.

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

Предлагаю более универсальный вариант — см. выше.

https://github.com/macik
правильный хостинг — https://goo.gl/fjCa1F