Шаблонизатор условий Tpl-If v.2.0 by Sander для DLE

Шаблонизатор условий Tpl-If v.2.0 by Sander

Шаблонизатор условий Tpl-If v.2.0 by Sander

Расширение функционала стандартного шаблонизатора с помощью тегов условий if, elseif, else.
Данный модуль является продолжением первой версии модуля Расширение функционала шаблонизатора новостей. Условия IF
В этой версии значительно расширен изначальный функционал, а главное добавлены elseif и else.

Область применения по умолчанию проработана под новости в основном контенте (shortstory.tpl, fullstory.tpl) и custom. Но так же модуль можно подключить и шаблоне комментариев.

В модуле поддерживается ряд логических операндов, покажу на примерах:
[if field='текст']  значение поля строго равно указанному в кавычках тексту [/if]
[if field!='текст'] значение поля не равно указанному тексту [/if]
[if field>1] значение поля строго больше единицы [/if]
[if field>=2] значение поля больше либо равно 2 [/if]
[if field<3] значение поля строго меньше 3 [/if]
[if field<=4] значение поля меньше или равно 4 [/if]
[if field~'vk.com'] в тексте поля встречается слово 'vk.com' [/if]
[if field!~'vk.com'] в тексте поля НЕ встречается слово 'vk.com' [/if]

А так же:
[if field] поле не пустое [/if]
[if !field] поле пустое [/if]
[if length.field>40] длина строки поля более 40 символов [/if]


Для полей с датой можно использовать префикс `age.` для получения 'возраста', значение в днях.


[if age.date<=7] дата публикации не более 7 дней назад [/if]
[if age.editdate<=1] сегодня новость была отредактирована [/if]

Так же можно использовать префикс `date.` для использования даты в формате YYYY-MM-DD
[if date.date='2017-10-25'] дата публикации 2017-10-25 [/if]
[if date.date='today'] новость опубликована сегодня [/if]


Если необходимо проверить просто есть ли что-то в поле или оно пусто (не существует), то можно использовать короткую запись:


[if xfvalue_image] картинка есть [/if]
[if !xfvalue_cost] цена не указана [/if]
[if xfvalue_allow_cart && xfvalue_cart_count] есть в наличии [/if]
[if xfvalue_allow_cart && !xfvalue_cart_count] под заказ [/if]

Пример запись:
[if fixed]
	новость зафиксирована 
[else]
	новость не зафиксирована
[/if]

Является аналогом:
[fixed]
	новость зафиксирована
[/fixed]
[not-fixed]
	новость не зафиксирована
[/fixed]


Использование {include file="...php"}


Шаблонизатор DLE обрабатывает подключение php файла в самом конце, в обработчике $tpl->compile();
Данный же модуль обрабатывает данные на лету, что позволяет подключать некий php обработчик который будет выполнять какие-либо действия над новостью при совпадении заданных условий.
К примеру нужно переносить новость в "архив" или убирать с главной если рейтинг достигает некоего порогового значения.
[if category_id!=13 && rating<10]{include file="engine/mods/post_move_archive.php?id={news-id}"}[/if]
[if allow_main && rating<10]{include file="engine/mods/post_move_from_main.php?id={news-id}"}[/if]


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


[if age.date<=7]	<!-- новость была опубликована менее 7 дней назад -->
	[if1 news_read>1000]
		Просматриваемый материал с
		[if2 rating>=4]
			высоким рейтингом!
		[elseif2 rating>=3]
			сомнительным рейтингом.
		[else2]
			низким рейтингом.
		[/if2]
		[if2 comm_num>50]
			Обсуждаемая тема
		[/if2]
	[elseif1 news_read>500]
		Набирает популярность
		[if2 comm_num>30]
			и активно обсуждается
		[/if2]
	[/if1]
[/if]

[if comm_num>10 && news_read>1000]
	новость популярная
	[if1 comm_num>50] и обсуждаемая![/if1]
[/if]


Можно комбинировать условия с помощью операндов && (И) или || (ИЛИ).


[if xfvalue_kp_rating>8 || xfvalue_imdb_rating>8]
	Хороший фильм
[elseif xfvalue_kp_rating>6 || xfvalue_imdb_rating>6]
	Так себе, но посмотреть можно
[elseif xfvalue_kp_rating || xfvalue_imdb_rating]
	плохой фильм
[else]
	рейтинг еще не известен
[/if]


Обновление со старого формата


Старая запись:
[if 5<xfvalue_rating>8] рейтинг находится в пределах между 5 и 8 [/if]

Новая запись:
[if xfvalue_rating>=5 && xfvalue_rating<=8] ... [/if]


ВАЖНО!
При использовании нескольких параметров в одном условии допустимо использование только одного операнда, || или &&
Правильно:
[if rating>4 || news_read>1000] хороший рейтинг или много просмотров [/if]
[if rating<4 && news_read>100 && comm_num=>5] плохой рейтинг, просмотров более 100 и написано 5 или более комментариев [/if]

НЕ правильно:
[if rating>4 && news_read>50 || comm_num>10] ... [/if]


[+] Бонус


В комплекте с модулем идет скрипт обновления информации о новости.
Пример, если рейтинг стал -10, то убираем новость с главной:
[if allow_main && rating<=-10]{include file="engine/mods/postMove.php?news_id={news-id}&allow_main=0"}[/if]

где строка engine/mods/postMove.php?news_id={news-id} обязательная, дальше параметры:
&category=7 - переместить в категорию ID=7
&approve=0 - отправить на модерацию
&allow_main=0 - убрать с главной
&allow_main=1 - выводить на главной
&fixed=0 - снять фиксацию
&fixed=1 - зафиксировать новость
&allow_comm=0 - запретить комментарии
&allow_comm=1 - разрешить комментарии


Информация


Стоимость модуля: 4wmz
Лицензия выдается под 1 сайт.
Стоимость доп.лицензии: 2wmz
Для работы модуля - требуется ionCube Loader v.6.x

Версия DLE: 9.6 и старше
Версия PHP: 5.3 - 7.1 (возможно и 7.2)

Купить: shop.sandev.pro

ICQ: 404-037-556
Skype: Sander8804
E-Mail: olalod@mail.ru

С уважением,
Олег Александрович a.k.a. Sander
Купить модуль
  • Стоимость модуля: $4
  • В комплекте: 1 лицензии
  • Стоимость дополнительной лицензии: $2
Комментарии: (29)
  1. foto
    Посетитель 26 октября 2017 10:05 #
    Можно сравнение с аналогичным модулем от Gamer'а?
    Как тут дела с кешированием?
    В инклюдных шаблонах тоже работает?
    Можно ли заставить работать во всех шаблонах? Включая доп.модули?

    Привязка переменных идёт по колонкам таблицы данных, или по $tpl->set()? Или переменные вообще предустановленные, и для добавления своих кастомных колонок нужно править код модуля?
    0
    1. foto
      Администратор 26 октября 2017 10:24 #
      Можно сравнение с аналогичным модулем от Gamer'а?
      Вы можете ознакомиться с описанием модулей и увидеть отличия. Как программно реализован его модуль мне не известно.

      Как тут дела с кешированием?
      Работа с кешем в данном случае будет занимать больше времени, что сама работа модуля.

      В инклюдных шаблонах тоже работает?
      Да.

      Можно ли заставить работать во всех шаблонах? Включая доп.модули?
      Можно, но не во всех. В некоторых шаблонах это будет проблематично, к примеру addcomments.tpl, addnews.tpl, info.tpl и т.п.

      Привязка переменных идёт по колонкам таблицы данных, или по $tpl->set()? Или переменные вообще предустановленные, и для добавления своих кастомных колонок нужно править код модуля?

      Модуль принимает массив данных, в случае с новостями и комментариями это переменная $row
      TplIf::setRow($row);

      С тем же успехом можно скормить ассоциативный массив:
      TplIf::setRow([
          'field_string' => 'значение',
          'field_integer' => 54,
          'field_date' => 1509002550
      ]);


      В шаблоне будет:
      [if field_integer>20] ... [/if]
      [if date.field_date='2017-10-26'] ... [/if]
      0
      1. foto
        Посетитель 26 октября 2017 17:31 #
        Цитата: Sander
        Вы можете ознакомиться с описанием модулей и увидеть отличия. Как программно реализован его модуль мне не известно.

        Ваш метод основан на str_replace и т.д. или компилируемый код (преобразование в php код)?
        Цитата: Sander
        Работа с кешем в данном случае будет занимать больше времени, что сама работа модуля.

        Имел ввиду попадает ли работа модуля в кеш кратких новостей например, или каждый раз будет идти обработка шаблона?
        Цитата: Sander
        Можно, но не во всех. В некоторых шаблонах это будет проблематично, к примеру addcomments.tpl, addnews.tpl, info.tpl и т.п.

        Цитата: Sander
        Модуль принимает массив данных, в случае с новостями и комментариями это переменная $row

        В принципе как у Gamer'а, но у него вроде как в любых шаблонах работает.
        Может реализуете во всех шаблонах? Тогда цены ему не будет.
        Цитата: Sander
        В шаблоне будет:

        А как вывести саму переменную шаблоне? Только стандартным методом через $tpl->set()?
        0
        1. foto
          Администратор 26 октября 2017 18:05 #
          Ваш метод основан на str_replace и т.д. или компилируемый код (преобразование в php код)?
          Ни то ни другое. preg_match, preg_replace_callback, switch, if.

          Имел ввиду попадает ли работа модуля в кеш кратких новостей например, или каждый раз будет идти обработка шаблона?
          В короткой новости (и custom) кешируется полностью весь контент, готовый сформированный шаблон. Все теги соответственно тоже. В полной новости кешируется только запрос в БД, обработчик выполняется каждый раз.

          В принципе как у Gamer'а, но у него вроде как в любых шаблонах работает.
          Может реализуете во всех шаблонах? Тогда цены ему не будет.
          Я подумаю над этим.

          А как вывести саму переменную шаблоне? Только стандартным методом через $tpl->set()?
          Модуль не имеет никакого отношения к выводу данных.
          0
          1. foto
            Посетитель 26 октября 2017 19:41 #
            Цитата: Sander
            Ни то ни другое. preg_match, preg_replace_callback, switch, if.

            Это печально, нагрузка и скорость при обилии условий будет не очень маленькой, тестировал шаблонизатор DLE и свой нативный на PHP подобной логике, разница в десятки раз. Ваш работает по подобию DLE-шного, только условия посложнее.
            Цитата: Sander
            В короткой новости (и custom) кешируется полностью весь контент, готовый сформированный шаблон. Все теги соответственно тоже. В полной новости кешируется только запрос в БД, обработчик выполняется каждый раз.

            Это мне известно, просто инструкции по установке в свободном доступе нет, по этому и не совсем понятна точная реализация и момент парсинга условия.
            Цитата: Sander
            Я подумаю над этим.

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

            Просто хотел понять, можно ли его в своих модулях использовать как шаблонизатор, или всё таки придётся и DLE-шный подключать.
            0
            1. foto
              Администратор 26 октября 2017 21:06 #
              Это печально, нагрузка и скорость при обилии условий будет не очень маленькой, тестировал шаблонизатор DLE и свой нативный на PHP подобной логике, разница в десятки раз. Ваш работает по подобию DLE-шного, только условия посложнее.
              В полной новости каждый раз выполняться обработка более 100 функций preg_* и более 200 str_replace и более 300 if-else. И все они выполняются практически мгновенно. На фоне этого нагрузка от модуля ничтожная.
              Нативность - это конечно хорошо, но в таком случае необходимо исключить возможность редактирования шаблонов через web-интерфейс.

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

              DLE-шный шаблонизатор не обязательно подключать. Модуль обработает любой шаблон согласно заданным параметрам.
              Нижеуказанный код подключается перед $tpl->compile('content');
              		TplIf::rowSet($row);
              		$tpl->copy_template = preg_replace_callback( 
              			"#...#is", 
              			"myFunction", 
              			$tpl->copy_template
              		);

              Вы можете перед $tpl->compile('content'); вставить var_dump($tpl->copy_template); и увидите с какими данными работает модуль. Ему без разницы как и что выводится в шаблоне. Он работает по своим ключам.
              0
              1. foto
                Посетитель 26 октября 2017 21:48 #
                Цитата: Sander
                В полной новости каждый раз выполняться обработка более 100 функций preg_* и более 200 str_replace и более 300 if-else. И все они выполняются практически мгновенно. На фоне этого нагрузка от модуля ничтожная.
                Нативность - это конечно хорошо, но в таком случае необходимо исключить возможность редактирования шаблонов через web-интерфейс.

                Достаточно качественно фильтровать входящие значения... ;)
                Я тестировал на тысячах и десятках тысяч условий, что бы получить более полную картину на высоко нагруженных проектах.
                Цитата: Sander
                DLE-шный шаблонизатор не обязательно подключать. Модуль обработает любой шаблон согласно заданным параметрам.

                Если нет встроенной функции вывода переменной, то придётся или писать код на str_replace, или подключать встроенный DLE-шный шаблонизатор. В принципе не так критично.

                В принцепе модуль нормальный, но от Gamer'а умеет ещё и это:
                Полное соответствие тегам PHP. В версии v3 теперь есть возможность использовать в одной проверке теги "&&" и "||".
                Хак работает во всех tpl файлах. Если tpl файл вызывается стандартным шаблонизатором DLE!

                Что будет ещё у него в версии 5.1 не известно, но что то явно будет... ;)

                В скрипт бы добавить ещё удаление новости и запись в лог DLE, доски объявлений сожрут вас и ваш модуль сразу, беглым набегом)
                А так же смена категории на categories_add=1,2,3,4,5 и просто добавление категории с проверкой присутствует ли новость уже в ней (как был баг в админке DLE, когда два раза одну категорию в ячейку прописывало).
                Попутно можно так же сделать и исключение из категории categories_delete=1,2,3,4,5.

                А так вполне годный модуль.
                Ну и скрипт операций с новостями у вас как бонус такой не хилый)
                0
  2. foto
    Клиент 31 октября 2017 13:15 #
    Ну что же могу сказать - работа отличная. Придется свой не много апгрейднуть тогда :) Только я все же думал сделать вложенные условии
    [if ...]
        [if ...]
            ....
        [else]
            ...
        [/if]
    [/if]
    Но реализация с числовыми if мне понравилась. Только не понятно почему так долго не было обновления? Ведь мог давно его обновить.
    0
    1. foto
      Администратор 31 октября 2017 13:20 #
      Сам функционал я его еще год назад сделал, лень было оформить и опубликовать :)
      +1
      1. foto
        Клиент 31 октября 2017 13:22 #
        p.s у письмо на активацию аккаунта попадает в спам. Почта gmail.
        +1
      2. foto
        Посетитель 31 октября 2017 13:55 #
        Возможны ли нормальные вложенные условия (без номера условия)?
        Или возможно это сделать?
        0
    2. foto
      Посетитель 31 октября 2017 13:45 #
      Лучше не надо, я сразу не заметил этот бред, только хотел написать и вы опередили...
      [ifN - это дичайший пи...
      Нужна нормальная php логика со всеми её плюсами, а не сидеть и считать количество и отношение определённых if, else и if и искать где ошибся с номером.
      PS: В сложных условиях это будет садомазо.
      0
      1. foto
        Клиент 31 октября 2017 13:58 #
        Хм, красота в буковках или хорошая производительность? Ибо рекурсивные шаблоны в данном случае будут не из легких.
        0
        1. foto
          Посетитель 31 октября 2017 14:22 #
          Сломать мозг работая с овер 10-уровневыми условиями, или сломать сервер? smirk
          0
  3. foto
    Клиент 31 октября 2017 13:20 #
    Хм, а почему нельзя использовать || и && если значения числовые?

    Цитата: SKYNET74
    Это печально, нагрузка и скорость при обилии условий будет не очень маленькой, тестировал шаблонизатор DLE и свой нативный на PHP подобной логике, разница в десятки раз. Ваш работает по подобию DLE-шного, только условия посложнее.

    Не верно, у меня такой же способ реализации через preg_match, switch и if - работает быстро, никаких просадок в скорости загрузки не заметно и быть по идеи не может.
    0
    1. foto
      Администратор 31 октября 2017 13:22 #
      [if rating>4 && comm_num>10 || news_read>100 && votes>5] ... [/if]
      Какой приоритет условий, где скобки ставить?
      Казнить нельзя помиловать.
      [if rating>4 && (comm_num>10 || news_read>100) && votes>5] ... [/if]
      Если так, то все логично:
      Если рейтинг хороший и (много комментов или просмотров) и много оценок то ...
      Будет показан текст, если у новости хорошая активность и хороший рейтинг со многими оценками

      А так уже имеем другую логику...
      [if (rating>4 && comm_num>10) || (news_read>100 && votes>5)] ... [/if]
      Те же параметры. Но уже будет другой результат.
      Получится, что у новости может быть много просмотров, но низкий рейтинг. А может быть только одна хорошая оценка, но много комментов.
      0
      1. foto
        Клиент 31 октября 2017 13:31 #
        Для этого я написал функцию которая разбивает по || потом смотрит есть ли там && проходит по массиву && и если первое условие срабатывает то отдает и так далее.
        0
        1. foto
          Администратор 31 октября 2017 13:45 #
          Пожалуй тоже вариант.
          Но он исключает возможность приоритета.
          К примеру:
          [if rating>4 && comm_num>10 || news_read>500] ... [/if]

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

          А если нужна иная логика:
          Чтобы текст был показан только если хороший рейтинг и у новости есть комментарии или много просмотров.

          PS. Зачем дублировать trim() в цикле если его можно вынести в функцию.
          Почему не используешь foreach ?
          0
          1. foto
            Клиент 31 октября 2017 13:57 #
            Но так же и в самом PHP, если условие первое не подходит то вслед за ним идет другое, если же оно не верно (false) то не заходит внутрь if.
            Цитата: Sander
            Чтобы текст был показан только если хороший рейтинг и у новости есть комментарии или много просмотров.

            [if rating>10 && comm_num>0 || rating>10 && views>100] ... [/if]
            Так, разве нет?

            Цитата: Sander
            PS. Зачем дублировать trim() в цикле если его можно вынести в функцию.
            Почему не используешь foreach ?

            Это довольно старый код, я его не марафетил даже.

            Всего не сделаешь, чем-то нужно пожертвовать, но в данном случае жертва минимальна, приоритет как бы сохраняется и как бы нет.
            0
  4. foto
    Клиент 6 июня 2018 20:23 #
    Здравствуйте!

    Не подскажите, планируется ли обновление модуля с учетом внедрения системы управлениями плагинами в DLE 13?

    Поскольку, на данный момент, не вижу возможности автоматической его установки.
    0
    1. foto
      Администратор 6 июня 2018 21:47 #
      Через пару минут сделаю плагин.

      Поскольку, на данный момент, не вижу возможности автоматической его установки.

      Вы можете легко создать плагин самостоятельно. В некотором роде для этого эта система управления плагинами и была создана.
      https://sandev.pro/blog/137-kak-ustanovit-staryy-modul-na-dle-130-v-novoy-sisteme-upravleniya-plaginami.html

      UPD: Архив с модулем обновил.
      +1
  5. foto
    Клиент 18 июля 2018 01:49 #
    Доброй ночи! Подскажете как вывести определенный текст на главной и строго в определенный категории?
    0
    1. foto
      Администратор 18 июля 2018 09:07 #
      Данный модуль предназначен для работы только в шаблоне полной или короткой новости (и custom).
      На главной можете использовать стандартный тег:
      [category=7] где 7 - ID категории [/category]


      Если в новости, то тег модуля:
      [if category='7'] Новость отмечена только в одной категории, id = 7 [/if]


      Отличие от стандартного тега catlist в том что выполняется строгое соответствие строки (в БД категории прописаны через запятую).
      [catlist=7] Новость может быть отмечена в любых категориях, главное чтобы среди них была категория id = 7 [/catlist]
      0
      1. foto
        Клиент 18 июля 2018 12:41 #
        Стандартный тег к сожалению не подходит он не работает в паре из [aviable=main] получаеться либо в категории фиксируем либо на главной.
        0
  6. foto
    Клиент 31 июля 2018 21:58 #
    Полная новость (fullstory) запоняетсья только доп полями, но пришлось расшырить функционал и добавил такую строку:
    <li><label>Описание вакансии:</label><span>  {full-story} </span></li>

    Как можно задать через условия если данное поле не заполнено то вырезать его из шаблона?
    0
    1. foto
      Администратор 31 июля 2018 22:02 #
      [if full_story]<li><label>Описание вакансии:</label><span>  {full-story} </span></li>[/if]
      +1
  7. foto
    Клиент 3 августа 2018 23:43 #
    НА 7,2 не идёт, и с другими модулями заёбся устанавливая
    0
  8. foto
    Клиент 3 августа 2018 23:43 #
    engine\mods\TplIf\Class\72.php encoded as type [1/72] cannot be decoded by this version of the ionCube Loader.
    0
    1. foto
      Администратор 4 августа 2018 09:58 #
      Обновите версию ionCube Loader до актуальной 10.x
      И убедитесь, что он правильно установлен и работает. Как это сделать - описано тут
      0
Добавить комментарий
  • Логин
  • E-mail (не обязательно)
Повторите рисунок:
antibot
© Sander-Development. 2009-2018.
При копировании, ссылка на источник обязательна.