Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Модули » Как вставить {custom...} в текст новости?

Как вставить {custom...} в текст новости?


     10.01.2020    custom    Модули, Хаки    878

вопрос
Здравствуйте, можно ли тег {custom} вывести в тексте новостей?

Ответил: Flash


В файле /engine/modules/show.full.php перед строкой
$tpl->set( '{full-story}', $row['full_story'] );


добавляем
if (strpos ( $row['full_story'], "&УБРАТЬ_ЭТУ_ФРАЗУ#123;custom" ) !== false) {
	$row['full_story'] = str_replace ( "&УБРАТЬ_ЭТУ_ФРАЗУ#123;custom ", "{custom_print ", $row['full_story'] );
	$row['full_story'] = preg_replace_callback ( "#\\{custom(.+?)\\}#i", "custom_print", $row['full_story'] );
}


Вторая строка нужна, потому что видимо парсер меняет левую фигурную скобку на спецсимвол, а искать где это было в лом)). Из-за того что, на DLE-FAQ спецсимвол меняется обратно на фигурную скобку, пришлось вставить "УБРАТЬ_ЭТУ_ФРАЗУ" в двух местах, в коде надо это убрать.
Если надо и для анонса, делаем подобное и для short_story перед строкой
$tpl->set( '{short-story}', $row['short_story'] );


В полной новости теперь можно использовать "custom". Если надо и в коротких новостях такое, по этому примеру вносим изменения и для "show.short.php".

16 комментариев

dj-avtosh
PHP-developer

dj-avtosh - 10 января 2020 15:42 -

Здравствуйте, нельзя. Разве что писать костыль который внутрь текста будет вставлять контент сгенерированный из кастом-блока при компиляции шаблона.

https://elkhan.ru
По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

russhe
Юзер

russhe - 10 января 2020 15:58 -

Жаль, видимо буду делать следующим образом.
Создам доп поле, половину текста буду вставлять в полную новость, половину в доп поле, а между ними выводить нужный кастом в шаблоне.

dj-avtosh
PHP-developer

dj-avtosh - 10 января 2020 16:25 -

если это не для поисковиков, то вполне реализуемо средствами js.

https://elkhan.ru
По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 10 января 2020 22:42 -

Не советую делать то, что в ответе. Это будет работать, но везде, где у вас выводится полный текст новости, но без учета кода из ответа будет слово custom и т.п.

https://elkhan.ru
По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

Flash
Эксперт

Flash - 11 января 2020 12:51 -

А где это выводится полный текст новости, кроме как в полной новости?)
Даже если и есть такое, можно добавить по этому примеру и туда код, или же вырезать тег, это уже автору вопроса решать. Из его вопроса - можно ли тег {custom} вывести в тексте новостей, неясно, в полном или кратком описании ему нужен custom и только ли на странице новости или везде.

ТeraМoune
Юзер

ТeraМoune - 10 января 2020 23:07 -

Ну почему сразу костыль, а стандартное средство тогда как назвать ?)







P.S. в двух последних исправлениях в первом параметре вместо знака { нужно использовать html сущность & #123;

между & и # пробел, заменить целый код без пробела символ {

Например с пробелом между этими двумя знаками
$row['short_story'] = str_ireplace( "& #123;custom", "{custom", $row['short_story'] );

ТeraМoune
Юзер

ТeraМoune - 10 января 2020 23:20 -

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

dj-avtosh,
В разве не в этом и суть ?) Нормальное решение, других просто не придумать, а в новости ну не знаю как раз фигурные скобки и возводят слова в тот вид в котором подобное в обычной статье встретиться ну не может.

Да если в описании будет {custom то для скрипта это будет тригер задействовать функцию custom_print, но в это и суть, что подобного не может случиться, а если и может то человек должен знать об этом и не допускать в описании тегов которые будут задействованы для изменения функциями.

Можно и вовсе придумать любые другие замудрённые слова и теги не обязательно кастом.

dj-avtosh
PHP-developer

dj-avtosh - 11 января 2020 03:28 -

Нормальное решение не писать всякие custom и прочее в описании, правильнее уж тогда делить на две разных логических части что-ли (как предлагал сам автор вопроса).

С эстетической стороны: там где будет вызвано описание, но не будет вызван обработчик - описания, получится custom вставка просто как хз какой-то системный текст.

Со стороны безопасности: я даже говорить молчу....

https://elkhan.ru
По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

ТeraМoune
Юзер

ТeraМoune - 11 января 2020 05:12 -

Не соглашусь, я знаю множество примеров того когда ну нужно в описании прямо в нём между двумя абзацами внедрить какой нибудь виджет который из тега в определённом месте новости будет возвращён контент подготовленный функцией. И примером сразу назову то как у blizzard модераторы делают голосование в новостях и выводят блок с голосованием в разных по смыслу местах. И в DLE есть poll но вывести в нужном месте опрос в новости не выйдет, скажете вы, но не я )

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

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

P.S> Со стороны безопасности - ну куда же без этого аргумента. Я может чего-то и не знаю, но вот не вижу никакой разницы откуда использовать обработку тега.

dj-avtosh
PHP-developer

dj-avtosh - 11 января 2020 05:15 -

Я думаю внедрения 500 кастом вставок с выводом большого кол-ва новостей или других сущностей будет уже достаточно.

Хорошо хоть не задали вопрос как вывести свой include в описании.

https://elkhan.ru
По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 11 января 2020 05:24 -

И желательно еще order=rand cache=no, отлично еще если будет shared хостинг.

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

https://elkhan.ru
По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 11 января 2020 05:27 -

В закрепление слов цитирую кусок из оф. доки:

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

https://elkhan.ru
По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

ТeraМoune
Юзер

ТeraМoune - 11 января 2020 06:26 -

Иногда это необходимо и никак нельзя сделать иначе. Плюс у кастома так же есть кэш который сделает запросы лишь один раз. У меня при выводе одного кастома происходит как раз все запросы, при повторном обновлении страниц запросов нету никаких. Пусть даже будет 10 тегов, запросы их будут произведены один раз. Разве нет ?

К тому, же можно поправить и упростить функцию сделав запросы легче.

Просто согласитель если вопрос стоит ребром требуется между абзацами вывести тег каким образом как не через тег внутри описания это сделать ?

Вот голосование в новостях очень легко выводится в тегах причём никакой дополнительной нагрузки или угрозам безопасности тут нету. Так или иначе если опрос есть будет и запрос в базу и просто результат функции опроса помещаю вместо тега в самом описании новости.

ТeraМoune
Юзер

ТeraМoune - 11 января 2020 07:34 -

Вот еще один пример

Есть категория закрытая от всех, туда пользователи публикуют конкурсные работы только используя короткие новости. В сами новости попасть ну никак нельзя. И в новости одной по окончанию конкурса где будут результаты будет конструкция выводящая работы участников для ознакомления и доступны они только в новости.

Как такое сделать ? Верно написать функцию которая будет конечно же что-то делать. И само собой подобные решение лучше всего использовать на сайте где нету свободного добавления новостей или публикующие новости прекрасно понимают последствия множественного использование тега. 1 - 2 кастома на 1 страницу с выводом до умеренного кличества новостей вполне себе допустимо, ни о каких 500 штуках речи не идёт. Да даже 500 штук никто и через шаблон делать не рискнёт.


Хорошо хоть не задали вопрос как вывести свой include в описании.

Удивитесь но всё так же как и происходит работа тега в шаблонах :D и если я буду единственный человек с доступом к созданию новостей я могу себе позволить инклудить скрипты в описании и это вполне нормально ) Другое вопрос что именно можно таким образом вывести я не знаю.


И желательно еще order=rand cache=no, отлично еще если будет shared хостинг.

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

Такое чувство, что вы всячески хотите очернить способ приводя только опасные и экстремальные последствия использования способа.

P.S. Да и в конце концов все теги можно контролировать и сделать так, что одна группа будет иметь возможность писать использовать другая же нет.

У меня вот полно разных причудливых тегов. Один из которых {gallery} выводящий в любом месте описания картинки из доп поля галереи которые выводятся в шаблоне, а не абы как как это сделано в стандарте. И никакой посторонней нагрузки не делает. Исключение если картинок очень много и нужно разбить их на страницы тогда переключаясь по страницам будут запросы на получение других картинок.

russhe
Юзер

russhe - 11 января 2020 13:13 -

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

dj-avtosh
PHP-developer

dj-avtosh - 11 января 2020 14:32 -

О возможных уязвимостях при публичном доступе к добавлению новостей я Вам написал.

Далее решайте сами уже.

https://elkhan.ru
По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх