Редактор темы

Разделение категорий на вывод друг от друга в новостях для dle 13.0

  • Автор темы Автор темы PunPun
  • Дата начала Дата начала
Как адаптировать под DLE 20.0 Ошибки выше

Проблема не в хаке, а в точках вставки.
В DLE 20.0 изменился код/форматирование файлов, а XML-плагин ищет строки точно один в один, например:

PHP:
$tpl->compile( 'content' );

или даже вместе с закрывающей скобкой:

PHP:
$tpl->compile( 'content' );

}

В DLE 20 у тебя, скорее всего, строка выглядит иначе:

PHP:
$tpl->compile('content');

или находится в другом месте.

Что делать:

  • Открой XML-файл плагина.
  • Найди все блоки с поиском:

PHP:
$tpl->compile( 'content' );

  • Замени в поиске на фактическую строку из DLE 20:

PHP:
$tpl->compile('content');

  • Если в поиске есть ещё закрывающая скобка }, убери её из поиска. Ищи только строку компиляции.

То есть вместо поиска такого куска:

PHP:
$tpl->compile( 'content' );

}

лучше использовать только:

PHP:
$tpl->compile('content');

Код хака нужно вставлять перед:

PHP:
$tpl->compile('content');

в файлах:

PHP:
engine/modules/show.short.php
engine/modules/show.full.php
engine/modules/show.custom.php

После правки:

  • переустанови плагин;
  • очисти кеш DLE;
  • проверь шаблон.

Если не заведётся — скинь сюда XML плагина или хотя бы кусок install с заменами, подгоню конкретно под DLE 20.0.
 
@Ai
Имя файла:engine/modules/show.short.php
Ошибка:Не удалось найти код:
$tpl->compile('content');

}

Имя файла:engine/modules/show.full.php
Ошибка:Не удалось найти код:
$tpl->compile('content');

Имя файла:engine/modules/show.custom.php
Ошибка:Не удалось найти код:
$tpl->compile('content');

}
тоже самое
 
Имя файла:engine/modules/show.short.php
Ошибка:Не удалось найти код:
$tpl->compile('content');

}

Имя...

Это значит, что в твоих файлах DLE 20.0 нет такой строки в точном виде. XML-плагин ищет 1 в 1, включая пробелы, табы и }.

Сделай так:

  • Открой файлы:
    engine/modules/show.short.php
    engine/modules/show.full.php
    engine/modules/show.custom.php
  • В каждом найди просто:
    compile
  • Смотри реальную строку, скорее всего в DLE 20 она отличается, например может быть так:

PHP:
$tpl->compile( 'content', true );

или так:

PHP:
$tpl->compile('content', true);

или с другими параметрами.

В XML плагина в блоке поиска нужно ставить именно ту строку, которая есть у тебя в файле.

Например если в файле так:

PHP:
$tpl->compile( 'content', true );

то в XML должно быть так:

XML:
<searchcode><![CDATA[$tpl->compile( 'content', true );]]></searchcode>

А не так:

XML:
<searchcode><![CDATA[$tpl->compile('content');

}]]></searchcode>

Важно: убери из поиска закрывающую скобку }. Оставь только строку $tpl->compile..., иначе будет постоянно ошибка.

То есть логика такая:

XML:
<searchcode><![CDATA[$tpl->compile( 'content', true );]]></searchcode>
<replacecode><![CDATA[
ТУТ_КОД_ПЛАГИНА

$tpl->compile( 'content', true );
]]></replacecode>

Если хочешь — скинь сюда по 10-15 строк из каждого файла вокруг строки compile, я тебе сразу напишу готовые замены под DLE 20.0.
 
Ai
Код:
<?xml version="1.0" encoding="utf-8"?>
<dleplugin>
    <name>Разделение категорий на вывод друг от друга в новостях</name>
    <description>сайт lazydev Хак позволит выводить отдельно категории друг от друга, заменяя громоздкие конструкции [catlist]</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/modules/functions.php">
        <operation action="before">
            <searchcode><![CDATA[function get_url($id) {]]></searchcode>
            <replacecode><![CDATA[function checkCatFunction($data, $cat_list, $cat_info)
{
    $cat_list = array_flip($cat_list);
    $flag_checkCatFunction = false;
    
    if (preg_match("#id=['\"](.+?)['\"]#i", $data[1], $match)) {
        $cats_select = true;
        $cat_array = [];
        $match[1] = explode(',', $match[1]);

        foreach ($match[1] as $value) {
            if (count(explode('-', $value)) == 2) {
                $temp_array = [];
                $temp_cats = explode('-', $value);
                foreach ($cat_info as $cats) {
                    if ($cats['id'] >= $temp_cats[0] && $cats['id'] <= $temp_cats[1]) {
                        $temp_array[] = intval($cats['id']);
                    }
                }
                sort($temp_array);
                $cat_array = $cat_array + $temp_array;
            } else {
                $cat_array[] = intval($value);
            }
        }
    }

    $sub_cat = false;
    if (preg_match("#sub=['\"](.+?)['\"]#i", $data[1], $match)) {
        if ($match[1] == "yes") {
            $sub_cat = true;
        }
    }

    if ($sub_cat) {
        $sub_cats = [];
        foreach ($cat_array as $value) {
            $sub_cats[] = get_sub_cats($value);
        }
        $sub_cats = implode('|', $sub_cats);
        $sub_cats_array = explode('|', $sub_cats);
        $cat_array = array_unique($sub_cats_array);
    }
    
    foreach ($cat_array as $value) {
        if (isset($cat_list[$value])) {
            $flag_checkCatFunction = true;
            break;
        }
    }
    
    return ($flag_checkCatFunction == true) ? $data[2] : '';
}

function catFunction($data, $cat_list, $config, $cat_info)
{
    $cat_list = array_flip($cat_list);
    
    if (preg_match("#id=['\"](.+?)['\"]#i", $data[1], $match)) {
        $cats_select = true;
        $cat_array = [];
        $match[1] = explode(',', $match[1]);

        foreach ($match[1] as $value) {
            if (count(explode('-', $value)) == 2) {
                $temp_array = [];
                $temp_cats = explode('-', $value);
                foreach ($cat_info as $cats) {
                    if ($cats['id'] >= $temp_cats[0] && $cats['id'] <= $temp_cats[1]) {
                        $temp_array[] = intval($cats['id']);
                    }
                }
                sort($temp_array);
                $cat_array = $cat_array + $temp_array;
            } else {
                $cat_array[] = intval($value);
            }
        }
    }

    $sub_cat = false;
    if (preg_match("#sub=['\"](.+?)['\"]#i", $data[1], $match)) {
        if ($match[1] == "yes") {
            $sub_cat = true;
        }
    }

    $get_cat = [];
    
    if ($sub_cat) {
        $sub_cats = [];
        foreach ($cat_array as $value) {
            $sub_cats[] = get_sub_cats($value);
        }
        $sub_cats = implode('|', $sub_cats);
        $sub_cats_array = explode('|', $sub_cats);
        $cat_array = array_unique($sub_cats_array);
    }
    
    foreach ($cat_array as $value) {
        if (isset($cat_list[$value])) {
            if ($config['allow_alt_url']) {
                $get_cat[] = "<a href=\"" . $config['http_home_url'] . get_url($value) . "/\">{$cat_info[$value]['name']}</a>";
            } else {
                $get_cat[] = "<a href=\"/index.php?do=cat&category={$cat_info[$value]['alt_name']}\">{$cat_info[$value]['name']}</a>";
            }
        }
    }
    
    $get_cat = implode($config['category_separator'] . ' ', $get_cat);

    return $get_cat;
}]]></replacecode>
        </operation>
    </file>
    <file name="engine/modules/show.short.php">
        <operation action="before">
            <searchcode><![CDATA[        $tpl->compile('content');

    }]]></searchcode>
            <replacecode><![CDATA[if (strpos($tpl->copy_template, "[cat") !== false) {
    $tpl->copy_template = preg_replace_callback("#\\[cat(.+?)\\](.+?)\\[/cat\\]#is", function($data) use ($cat_list, $cat_info)
    {
        return checkCatFunction($data, $cat_list, $cat_info);
    }, $tpl->copy_template);
}
if (strpos($tpl->copy_template, "{cat") !== false) {
    $tpl->copy_template = preg_replace_callback("#{cat(.+?)}#i", function($data) use ($cat_list, $config, $cat_info)
    {
        return catFunction($data, $cat_list, $config, $cat_info);
    }, $tpl->copy_template);
}]]></replacecode>
        </operation>
    </file>
    <file name="engine/modules/show.full.php">
        <operation action="before">
            <searchcode><![CDATA[$tpl->compile('content');]]></searchcode>
            <replacecode><![CDATA[if (strpos($tpl->copy_template, "[cat") !== false) {
    $tpl->copy_template = preg_replace_callback("#\\[cat(.+?)\\](.+?)\\[/cat\\]#is", function($data) use ($cat_list, $cat_info)
    {
        return checkCatFunction($data, $cat_list, $cat_info);
    }, $tpl->copy_template);
}
if (strpos($tpl->copy_template, "{cat") !== false) {
    $tpl->copy_template = preg_replace_callback("#{cat(.+?)}#i", function($data) use ($cat_list, $config, $cat_info)
    {
        return catFunction($data, $cat_list, $config, $cat_info);
    }, $tpl->copy_template);
}]]></replacecode>
        </operation>
    </file>
    <file name="engine/modules/show.custom.php">
        <operation action="before">
            <searchcode><![CDATA[    $tpl->compile('content');

}]]></searchcode>
            <replacecode><![CDATA[if (strpos($tpl->copy_template, "[cat") !== false) {
    $tpl->copy_template = preg_replace_callback("#\\[cat(.+?)\\](.+?)\\[/cat\\]#is", function($data) use ($cat_list, $cat_info)
    {
        return checkCatFunction($data, $cat_list, $cat_info);
    }, $tpl->copy_template);
}
if (strpos($tpl->copy_template, "{cat") !== false) {
    $tpl->copy_template = preg_replace_callback("#{cat(.+?)}#i", function($data) use ($cat_list, $config, $cat_info)
    {
        return catFunction($data, $cat_list, $config, $cat_info);
    }, $tpl->copy_template);
}]]></replacecode>
        </operation>
    </file>
</dleplugin>
 
<?xml version="1.0" encoding="utf-8"?>
<dleplugin>
<name>Разделение категорий на вывод друг от друга в новостях</name>
...

Этот XML в текущем виде под DLE 20 не поставится: у тебя в нём сломаны/пустые блоки searchcode и старый код с ошибками по массивам категорий.

Проще для DLE 20.0 поставить руками.

1. В engine/modules/functions.php добавь после <?php

PHP:
if (!function_exists('zcp_cat_ids_from_attrs')) {
 function zcp_cat_ids_from_attrs($attrs, $cat_info)
 {
 $ids = [];

 if (!preg_match("#id=['\"]?([^'\"\s\]]+)#i", $attrs, $match)) {
 return [];
 }

 $items = explode(',', $match);

 foreach ($items as $item) {
 $item = trim($item);

 if (strpos($item, '-') !== false) {
 list($from, $to) = array_map('intval', explode('-', $item, 2));

 foreach ($cat_info as $cat_id => $cat_data) {
 $cat_id = intval($cat_id);

 if ($cat_id >= $from && $cat_id <= $to) {
 $ids[] = $cat_id;
 }
 }
 } else {
 $ids[] = intval($item);
 }
 }

 if (preg_match("#sub=['\"]?yes#i", $attrs)) {
 foreach ($ids as $id) {
 $sub_cats = get_sub_cats($id);
 $sub_cats = preg_split("#[|,]#", $sub_cats);

 foreach ($sub_cats as $sub_id) {
 $ids[] = intval($sub_id);
 }
 }
 }

 return array_unique(array_filter($ids));
 }
}

if (!function_exists('zcp_prepare_cat_list')) {
 function zcp_prepare_cat_list($cat_list)
 {
 if (is_array($cat_list)) {
 return array_map('intval', $cat_list);
 }

 return array_map('intval', explode(',', $cat_list));
 }
}

if (!function_exists('checkCatFunction')) {
 function checkCatFunction($data, $cat_list, $cat_info)
 {
 $need_cats = zcp_cat_ids_from_attrs($data, $cat_info);
 $news_cats = zcp_prepare_cat_list($cat_list);

 if (array_intersect($need_cats, $news_cats)) {
 return $data;
 }

 return '';
 }
}

if (!function_exists('catFunction')) {
 function catFunction($data, $cat_list, $config, $cat_info)
 {
 $need_cats = zcp_cat_ids_from_attrs($data, $cat_info);
 $news_cats = zcp_prepare_cat_list($cat_list);
 $result = [];

 foreach ($need_cats as $cat_id) {
 if (!in_array($cat_id, $news_cats, true)) {
 continue;
 }

 if (empty($cat_info[$cat_id])) {
 continue;
 }

 $name = htmlspecialchars(stripslashes($cat_info[$cat_id]['name']), ENT_QUOTES, $config['charset']);

 if (!empty($config['allow_alt_url'])) {
 $url = $config['http_home_url'] . get_url($cat_id) . '/';
 } else {
 $url = $config['http_home_url'] . 'index.php?do=cat&category=' . $cat_info[$cat_id]['alt_name'];
 }

 $result[] = '<a href="' . $url . '">' . $name . '</a>';
 }

 return implode(' ', $result);
 }
}

2. В файлах вставь перед $tpl->compile...

Файлы:

  • engine/modules/show.short.php
  • engine/modules/show.full.php
  • engine/modules/show.custom.php

Ищи не точную строку, а просто:

PHP:
$tpl->compile

Перед компиляцией шаблона вставь:

PHP:
$zcp_cat_list = $cat_list ?? ($row['category'] ?? '');

if (strpos($tpl->copy_template, '[cat') !== false) {
 $tpl->copy_template = preg_replace_callback("#\[cat([^\]]*)\](.*?)\[/cat\]#is", function($data) use ($zcp_cat_list, $cat_info) {
 return checkCatFunction($data, $zcp_cat_list, $cat_info);
 }, $tpl->copy_template);
}

if (strpos($tpl->copy_template, '{cat') !== false) {
 $tpl->copy_template = preg_replace_callback("#{cat([^}]*)}#i", function($data) use ($zcp_cat_list, $config, $cat_info) {
 return catFunction($data, $zcp_cat_list, $config, $cat_info);
 }, $tpl->copy_template);
}

3. Использование в шаблоне

Вывести только категории из нужного раздела:

HTML:
{cat id=1,2,3}

С учётом подкатегорий:

HTML:
{cat id=1 sub=yes}

Условный вывод блока:

HTML:
[cat id=1 sub=yes]
 Контент только если новость относится к категории 1 или её подкатегориям
[/cat]

После правок очисти кеш DLE.

Если хочешь именно XML-плагином — скинь содержимое show.short.php вокруг строки $tpl->compile, 15-20 строк выше/ниже, тогда дам готовый XML под твою сборку DLE 20.0.
 

Smart Category Tags Native 1.0.1 для DLE 20.0

Условный вывод категорий и HTML-блоков в шаблонах DataLife Engine



Описание

Smart Category Tags Native — нативный плагин для DataLife Engine 20.0, который добавляет шаблонные теги для работы с категориями текущей новости.

С помощью плагина можно:

  • выводить только выбранные категории текущей новости;
  • показывать названия категорий со ссылками или без ссылок;
  • учитывать вложенные подкатегории;
  • выводить HTML-блоки только в определённых категориях;
  • указывать несколько ID категорий;
  • использовать диапазоны ID;
  • создавать разный дизайн для разных разделов сайта;
  • использовать вложенные условные блоки.

Плагин не создаёт дополнительных таблиц, не выполняет SQL-запросы и не требует отдельной страницы настроек.

Системные требования

  • DataLife Engine 20.0 и выше;
  • PHP 8.2 и выше;
  • установка через стандартный менеджер плагинов DLE.

Поддерживаемые шаблоны и контуры вывода

Теги автоматически обрабатываются в стандартных контурах DLE:

  • shortstory.tpl;
  • fullstory.tpl;
  • шаблоны блоков {custom ...};
  • результаты поиска;
  • избранные новости;
  • RSS;
  • версия для печати;
  • другие стандартные списки новостей DLE.

Дополнительный тег {include ...} подключать не требуется.

Вывод одной категории

Вывести категорию с ID 5:

HTML:
{cat-tag id="5"}

Если текущая новость относится к категории с ID 5, плагин выведет её название и ссылку.

Вывод нескольких категорий

HTML:
{cat-tag id="5,8,12"}

Плагин проверит категории 5, 8 и 12 и выведет только те, к которым относится текущая новость.

Диапазоны категорий

Можно указывать диапазон ID:

HTML:
{cat-tag id="5-12"}

Также можно объединять отдельные категории и диапазоны:

HTML:
{cat-tag id="5,8,12-20"}

Учёт подкатегорий

Вывести категорию с ID 5 и учитывать все её вложенные подкатегории:

HTML:
{cat-tag id="5" sub="yes"}

Проверять только указанную категорию:

HTML:
{cat-tag id="5" sub="no"}

Для нескольких категорий:

HTML:
{cat-tag id="5,8,12" sub="yes"}

Вывод названий без ссылок

По умолчанию категории выводятся как ссылки.

Для вывода обычного текста используйте параметр url="no":

HTML:
{cat-tag id="5,8,12" sub="yes" url="no"}

Пример использования внутри бейджа:

HTML:
<span class="news-category-badge">
    {cat-tag id="5,8,12" sub="yes" url="no"}
</span>

Условный вывод контента

Показать блок только для категории с ID 5:

HTML:
[cat-tag id="5" sub="no"]
    <div class="category-message">
        Этот блок показывается только в категории с ID 5.
    </div>
[/cat-tag]

Если текущая новость не относится к категории 5, весь блок будет удалён из итогового HTML.

Условие для нескольких категорий

HTML:
[cat-tag id="5,8,12" sub="no"]
    <div class="category-message">
        Этот блок показывается в категориях 5, 8 и 12.
    </div>
[/cat-tag]

Условие с учётом подкатегорий

HTML:
[cat-tag id="5" sub="yes"]
    <div class="category-banner">
        Этот баннер показывается в категории 5
        и во всех её вложенных подкатегориях.
    </div>
[/cat-tag]

Разный дизайн для разных категорий

HTML:
[cat-tag id="10" sub="yes"]
    <span class="news-type news-type--module">
        Модуль DLE
    </span>
[/cat-tag]

[cat-tag id="20" sub="yes"]
    <span class="news-type news-type--article">
        Статья
    </span>
[/cat-tag]

[cat-tag id="30" sub="yes"]
    <span class="news-type news-type--news">
        Новости
    </span>
[/cat-tag]

В итоговой странице останутся только блоки, соответствующие категориям текущей новости.

Разные кнопки для разных разделов

HTML:
[cat-tag id="10" sub="yes"]
    <a href="#download" class="module-download-button">
        Скачать модуль
    </a>
[/cat-tag]

[cat-tag id="20" sub="yes"]
    <a href="{full-link}" class="article-read-button">
        Читать статью
    </a>
[/cat-tag]

Разные изображения и иконки

HTML:
[cat-tag id="10" sub="yes"]
    <img src="{THEME}/images/icons/module.svg"
         alt="Модуль DLE">
[/cat-tag]

[cat-tag id="20" sub="yes"]
    <img src="{THEME}/images/icons/article.svg"
         alt="Статья">
[/cat-tag]

Вложенные условные блоки

Версия 1.0.1 поддерживает вложенные условия:

HTML:
[cat-tag id="10" sub="yes"]
    <div class="module-card">

        <strong>Модуль DLE</strong>

        [cat-tag id="12" sub="no"]
            <span class="module-card__label">
                Бесплатный модуль
            </span>
        [/cat-tag]

    </div>
[/cat-tag]

Внешний блок будет показан для категории 10 и её подкатегорий.

Внутренний элемент дополнительно появится только в категории 12.

Пример для shortstory.tpl

HTML:
<article class="story-card">

    <div class="story-card__categories">
        {cat-tag id="10,20,30" sub="yes"}
    </div>

    <h2 class="story-card__title">
        <a href="{full-link}">
            {title}
        </a>
    </h2>

    <div class="story-card__description">
        {short-story}
    </div>

    [cat-tag id="10" sub="yes"]
        <span class="story-card__type">
            Модуль для DLE
        </span>
    [/cat-tag]

    [cat-tag id="20" sub="yes"]
        <span class="story-card__type">
            Практическая статья
        </span>
    [/cat-tag]

</article>

Пример для fullstory.tpl

HTML:
<article class="full-story">

    <header class="full-story__header">

        <div class="full-story__categories">
            {cat-tag id="10,20,30" sub="yes"}
        </div>

        <h1>{title}</h1>

    </header>

    [cat-tag id="10" sub="yes"]
        <div class="module-notice">
            Этот материал содержит модуль
            для DataLife Engine.
        </div>
    [/cat-tag]

    <div class="full-story__content">
        {full-story}
    </div>

</article>

Доступные параметры

  • id="5" — одна категория;
  • id="5,8,12" — несколько категорий;
  • id="5-12" — диапазон ID категорий;
  • id="5,8,12-20" — отдельные ID и диапазоны;
  • sub="yes" — учитывать вложенные подкатегории;
  • sub="no" — проверять только указанные категории;
  • url="yes" — выводить названия категорий ссылками;
  • url="no" — выводить названия категорий обычным текстом.

Формат атрибутов

Поддерживаются двойные кавычки:

HTML:
{cat-tag id="5" sub="yes"}

Одинарные кавычки:

HTML:
{cat-tag id='5' sub='yes'}

А также атрибуты без кавычек:

HTML:
{cat-tag id=5 sub=yes}

Для единообразия рекомендуется использовать двойные кавычки.

Установка

  1. Сделайте резервную копию файлов сайта.
  2. Откройте менеджер плагинов DataLife Engine.
  3. Загрузите файл plugin.xml из архива.
  4. Установите и активируйте плагин.
  5. Очистите кеш DataLife Engine.
  6. Добавьте необходимые теги в шаблоны сайта.

Все файлы плагина устанавливаются автоматически.

Ручное редактирование файлов движка не требуется.

Обновление с версии 1.0.0

Версию 1.0.1 можно установить поверх версии 1.0.0 через стандартный менеджер плагинов DLE.

После обновления рекомендуется:

  • очистить кеш DataLife Engine;
  • очистить кеш браузера;
  • проверить краткую и полную страницы новости;
  • проверить блоки, использующие {custom ...}.

Что изменилось в версии 1.0.1

  • исправлено определение категорий текущей новости;
  • устранена возможность использования категорий предыдущей новости;
  • устранено повторное HTML-экранирование названий категорий;
  • добавлена поддержка вложенных условных блоков;
  • добавлена поддержка атрибутов без кавычек;
  • исправлена обработка пустого каталога категорий;
  • улучшена обработка некорректных и незакрытых тегов;
  • исправлен вывод стандартного разделителя категорий;
  • сохранена штатная генерация URL средствами DLE;
  • улучшена совместимость с DLE 20.0 и PHP 8.2+.

Особенности плагина

  • 0 дополнительных SQL-запросов;
  • 0 новых таблиц в базе данных;
  • нет AJAX-запросов;
  • нет фоновых задач;
  • нет внешних библиотек;
  • не используется jQuery;
  • не создаются дополнительные настройки;
  • обработка выполняется на основе уже загруженных данных DLE;
  • поддерживаются ЧПУ и стандартные ссылки DLE;
  • поддерживается стандартный разделитель категорий.

Удаление

Удаление выполняется через стандартный менеджер плагинов DataLife Engine.

Плагин удаляет только собственный файл и собственные VFS-операции.

Новости, категории, шаблоны и настройки сайта не удаляются.



Название: Smart Category Tags Native
Версия: 1.0.1
Совместимость: DataLife Engine 20.0+
PHP: 8.2+
Тип установки: менеджер плагинов DLE
База данных: не используется
Дополнительные SQL-запросы: отсутствуют
 

Вложения

Похожие темы Последние темы Популярные темы

Назад
Сверху