Форумы / National / Russian / Тех. поддержка / Добавление данных в теги шаблона.

Salador
#1 09.06.2017 14:22

Возникла ситуация добавить пункты меню из плагина.

Вот так выглядит тег в шаблоне:

<ul class="nav">    
{MENU_GENERAL}  
</ul>

в плагине текст в меню добавляется вот так:

$t->assign('MENU_GENERAL',$text_menu);

но проблема в том, что если я добавляю ещё один плагин и в нем хочу вставить пункт меню, то он заменяет другие, а не добавляет.

Также мне нужно было чтобы на главной странице каждый плагин добавлял свой блок.

Решил я это так - в файл system/cotemplate.php после public function assign добавил почти аналогичную функцию :

	public function assign_add($name, $val = NULL, $prefix = '')
	{
		if (is_array($name))
		{
			foreach ($name as $key => $val)
			{
				$this->vars[$prefix.$key] .= $val;
			}
		}
		else
		{
			$this->vars[$prefix.$name] .= $val;
		}
		return $this;
	}

где просто добавил точки перед равно.

Теперь данные в теги можно добавлять

$t->assign_add('MENU_GENERAL',$text_menu);

Это можно было решить штатными средствами по другому?

Macik
#2 21.06.2017 19:13

Метод `assign` подразумевает присвоение заданному тегу определенного значения. И естественно при повторном вызове переопределяет его. Это штатное поведение шаблонизатора. 
Если у вас есть плагин (строку из которого вы привели `$t->assign('MENU_GENERAL',$text_menu);`), то по логике он, и только он определяет, что должно быть в меню.

Теперь о том, что можно сделать —

Вариант 1. Расширить за счет доп. тегов (если число доп.плагинов конечно): 

<ul class="nav">    
{MENU_GENERAL}  
{MENU_ADDITION_PLUG1}  
{MENU_ADDITION_PLUG2}  
...
</ul>

После чего в каждом плагине вызывать ф-ю присвоения для «своего тега»:
 

$t->assign('MENU_ADDITION_PLUG1', $some_menu_items);

 

Вариант 2. В основном плагине, который генерирует меню, перед вызовом метода присвоения (`assign`) вставить вызов хука, например:

/* === Hook === */
foreach (cot_getextplugins('menu.assign.first') as $pl)
{
	include $pl;
}
/* ===== */

$t->assign('MENU_GENERAL',$text_menu);

А остальные плагины (точнее ту их часть, которая генерит свое дополнение для меню) вызывать по указанному хуку, и в коде делать расширение переменной `$text_menu` : 

$text_menu .= '<тут код дополнительных пунктов меню>';
 
https://github.com/macik
правильный хостинг — https://goo.gl/fjCa1F