Хак: Автоматический вывод списка ID подкатегорий

Простенький хак предназначенный для вывода списка подкатегорий в виде списка ID через запятую.
Область применения: тег {custom category=»…», тег [category=…], [catlist=…] и т.п.

Данный хак будет полезен тем, кто часто добавляет новые подкатегории или просто вы ленивая жопа устали каждый раз перебирать файлы шаблона в поисках всех custom-ов и [category для добавления нового ID.

С помощью этого хака достаточно будет прописать:

[category={subcat=3}]
{custom category="{subcat=7}"}

В момент загрузки файла шаблона хак выполнит обработку тега, в итоге обработчик получит привычный вид:

[category=3,21,22,25,29,33,34,35,39]
{custom category="7,59,60,61,66,67,68,69,80"}

Так же можно комбинировать теги:

[category={subcat=3},100,105-110]
[category={subcat=3},{subcat=7},551]

Установка:
Для DLE 13.0 достаточно установить плагин:
Хак: Автоматический вывод списка ID подкатегорий plugin.xml

<?xml version="1.0" encoding="utf-8"?>
<dleplugin>
	<name>Обработка тега {subcat=x}</name>
	<description>Автоматический вывод списка ID подкатегорий заданной &quot;x&quot; категории</description>
	<icon></icon>
	<version></version>
	<dleversion></dleversion>
	<versioncompare>less</versioncompare>
	<mysqlinstall><![CDATA[]]></mysqlinstall>
	<mysqlupgrade><![CDATA[]]></mysqlupgrade>
	<mysqlenable><![CDATA[]]></mysqlenable>
	<mysqldisable><![CDATA[]]></mysqldisable>
	<mysqldelete><![CDATA[]]></mysqldelete>
	<file name="engine/classes/templates.class.php">
		<operation action="before">
			<searchcode><![CDATA[function load_template($tpl_name) {]]></searchcode>
			<replacecode><![CDATA[//////////////////////////////////////////////////////////////
	private function getSubCatList($match)
	{
		global $cat_info;
		$id = is_array($match) ? $match[1] : $match;

		if (!$cat_info[$id]) {
			return $id;
		}
		$list = [$id];
		foreach ($cat_info as $v) {
			if ($v['parentid'] == $id) {
				$list[] = $this->getSubCatList($v['id']);
			}
		}
		return join(',', $list);
	}
//////////////////////////////////////////////////////////////]]></replacecode>
		</operation>
		<operation action="after">
			<searchcode><![CDATA[$this->template = file_get_contents( $this->dir . "/" . $tpl_name );]]></searchcode>
			<replacecode><![CDATA[//////////////////////////////////////////////////////////////////////////////////////////////
		$this->template = preg_replace_callback("#{subcat=(d+)}#i", [&$this, 'getSubCatList'], $this->template);
//////////////////////////////////////////////////////////////////////////////////////////////]]></replacecode>
		</operation>
		<operation action="after">
			<searchcode><![CDATA[$template = file_get_contents( $templatefile );]]></searchcode>
			<replacecode><![CDATA[//////////////////////////////////////////////////////////////////////////////////////////////
		$template = preg_replace_callback("#{subcat=(d+)}#i", [&$this, 'getSubCatList'], $template);
//////////////////////////////////////////////////////////////////////////////////////////////]]></replacecode>
		</operation>
	</file>
</dleplugin>

Для предыдущих версий:
Открыть файл engine/classes/templates.class.php
Найти строку:

	function load_template($tpl_name) {

ПЕРЕД ней вставить:

//////////////////////////////////////////////////////////////
	private function getSubCatList($match)
	{
		global $cat_info;
		$id = is_array($match) ? $match[1] : $match;

		if (!$cat_info[$id]) {
			return $id;
		}
		$list = [$id];
		foreach ($cat_info as $v) {
			if ($v['parentid'] == $id) {
				$list[] = $this->getSubCatList($v['id']);
			}
		}
		return join(',', $list);
	}
//////////////////////////////////////////////////////////////

Найти строку:

		$this->template = file_get_contents( $this->dir . "/" . $tpl_name );

После нее вставить:

//////////////////////////////////////////////////////////////////////////////////////////////
		$this->template = preg_replace_callback("#{subcat=(d+)}#i", [&$this, 'getSubCatList'], $this->template);
//////////////////////////////////////////////////////////////////////////////////////////////

Найти строку:

		$template = file_get_contents( $templatefile );

После нее вставить:

//////////////////////////////////////////////////////////////////////////////////////////////
		$template = preg_replace_callback("#{subcat=(d+)}#i", [&$this, 'getSubCatList'], $template);
//////////////////////////////////////////////////////////////////////////////////////////////

На этом все.

С уважением,
Олег Александрович a.k.a. Sander
Источник: sandev.pro

Просмотров:

Добавить комментарий