Перейти к публикации

Рекомендованные сообщения

Приношу извинения за задержку, были проблемы со здоровьем :)

А теперь к делу!

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

Но была проблема с тем, как это сделать.

Вы НАВЕРНЯКА пробовали пробовали вставить PHP код в шаблон и были сильно удивлены почему он не сработал?

А потом применили хак на eval и тут уже задумались о безопасности :)

Теоритически с установленным хаком на eval ЛЮБОЙ человек который получит доступ к редактированию шаблонов может взломать полностью сайт. Дабы не допустить даже теоритической дырки научу Вас как НЕ использовать php код, но вставлять его в шаблон :)

Итак смотрим пример.

Есть у нас код:

<?php

echo "Hello, world!";

?>
И хотим мы его вставить на главную. Открываем index.php и ищем:
$tpl->load_template ( 'main.tpl' );
Ниже пишем:
include (ROOT_DIR."/путь_к_файлу.php");
Открываем сайт - вуаля - видим вывод. Вот только одна проблема....Он над дизайном...Незадача, правда?Решаемо! Смысл в том, что шаблонизатор DLE устроен так, что берёт шаблон main.tpl, производит в нём замены и потом выводит его на экран. Нам нужно НЕМНОГО изменить нашу программку. А именно:
В начало скрипта пишем:

$my_mod_buffer = '';

Получаем примерно такое:

<?php

$my_mod_buffer = '';

echo "Hello, world!";

?>
Теперь нам нужно заменить ВСЕ echo в нашей программе на:
$my_mod_buffer.= "код";

Тоесть получаем:

<?php

$my_mod_buffer = '';

$my_mod_buffer.= "Hello, world!";

?>
Далее идём в index.php и после include (ROOT_DIR."/путь_к_файлу.php"); пишем:
$tpl->set("{my_mod_buffer}", $my_mod_buffer);
Тэг {my_mod_buffer} необходимо ЗАРАНЕЕ поставить в main.tpl! Тоесть получается примерно такое в index.php:
$tpl->load_template ( 'main.tpl' );

include (ROOT_DIR."/my_modules/my_super_mod.php");

$tpl->set("{my_mod_buffer}", $my_mod_buffer);

ВНИМАНИЕ!Переменная $my_mod_buffer для каждого модуля индивидуальна!

Жду вопросов/критики.

Ссылка на сообщение
Поделиться на других сайтах

IT-Security, Большое спасибо!

Вопросы:

1) Что такое Хак ?

2) Что такое Eval ?

3) Если я никогда не буду через админку редактировать шаблоны, то может не ставить права (CHMOD) 777 ?

4) Как правильнее писать? require_once ROOT_DIR . '/engine/init.php'; или include (ROOT_DIR . '/engine/init.php';)

5) Как быть если есть такой php код который выводит результат зависящий от внешних факторов, то есть может выводить, а может и вообще ничего не выводить. И вот надо, чтобы когда он выводит, то выводилось, например, в таблице уже красиво отформатированной и дизайнерски оформленной под шаблон сайта. Но не хочеться html писать в php скриптах, надо как-то именно в шаблоне дизайн чтобы был! Как быть?

Если же я создам такое в index.php

$tpl->set("{xxx}", $xxx);

а в шаблон вставлю:

{xxx}

и в шаблоне если {xxx} сделаю в таблицу и красиво оформлю, то если php код не выведет никакой информации, то таблица останется, а должна пропасть, если нету никаких результатов работы скрипта.

P.S.

Очень надеюсь 5 вопрос понятно написал :mellow:

Изменено пользователем www.zeos.com.ua
Ссылка на сообщение
Поделиться на других сайтах

roman78, хм, а так даже удобнее! Спасибо! Что-то сам не догадался! Попробую. Не знаю, только правильно ли так делать?

Хотя....., лучше оставлять в index.php, так более понятно, что вставляется, а то пришлось бы искать по файлах какая переменная вставляется.

И в таком случае надо точно инклудить свой код после того как шаблон подгрузится, а именно после: $tpl->load_template ( 'main.tpl' );

Изменено пользователем www.zeos.com.ua
Ссылка на сообщение
Поделиться на других сайтах

1) Хак - замена в коде. Бывают монолитные системы. тоесть целостные...Это DLE, так как в нём фиксированы модули.

И когда что-то в коде меняется, то это называется хак.

Впринципе даже в модульных системах замена кода системы - это хак.

2) Eval - функция, выполняющая всё, что она видит. Если передать в eval строку, содержащую PHP-код, то она его выполнит

3) На что именно ставить такие права?

4) Первый в случае отсутствия файла выдаст fatal error, второй нет

5) Перестроить код так, чтобы он нормально выводил.

Ссылка на сообщение
Поделиться на других сайтах

IT-Security, Спасибо большое!

3) На что именно ставить такие права?

На папку с шаблоном и его файлами советуют ставить 777 права :)

Ссылка на сообщение
Поделиться на других сайтах

Не знаю, только правильно ли так делать?

так прописано во всех файлах дле, например строка из шоуфулл

$tpl->set( '{edit-date}', $lang['time_gestern'] . langdate( ", H:i", $row['editdate'] ) );

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

В любом случае думаю это ни на что не влияет и писать можно как удобнее.

Изменено пользователем roman78
Ссылка на сообщение
Поделиться на других сайтах

Кто может обьяснить какая разница между:

include ROOT_DIR . '/engine/init.php';

и

include (ROOT_DIR . '/engine/init.php');

В файлах DLE 50% написано без скобок, а 50% написано со скобками. :wacko:

Ссылка на сообщение
Поделиться на других сайтах

IT-Security, не подскажете, как решить такую вот задачку?

Надо сделать так, что, если баннер в админке существует и включен на показ, то его содержимое, как и обычно, выводилось на сайте, но с нужным оформлением. А если баннера не существует или он выключен в админке, то чтобы не выводилось содержимое баннера и его оформление.

Оформлением может быть в шаблоне, например, таблица.

Пример:

<table>

<tr>

<td>{banner_xxxxx}</td>

</tr>

</table>

И надо, чтобы, если баннера не существует, то и пропадала бы вся таблица с ним! Но таблица должна быть прописана в шаблоне, а не коде баннера при создании рекламного материала в админке.

Надо, чтобы было что-то подобное: в шаблон прописываю, например, так:

[moybanner]ОФОРМЛЕНИЕ{banner_xxxxxx}ОФОРМЛЕНИЕ[/moybanner]

Пробовал что-то такое вот написать, но, естественно, оно не работает.

if (isset({banner_(.*?)})) {

$tpl->set ( '[moybanner]', "" );

$tpl->set ( '[/moy_banner]', "" );

} else {

$tpl->set_block ( "'\\[moybanner\\](.*?)\\[/moybanner\\]'si", "" );

}

Но как же сделать, чтобы получилось?

Вообщем, суть такая:

Я в шаблоне пропишу много такого:

[moybanner]

<table>

<tr>

<td>{banner_разное-название}</td>

</tr>

</table>

[/moybanner]

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

Заранее спасибо! Решаю эту проблему уже месяца два и никак не могу догнать, как сделать! Пожалуйста помогите кто знает!

Изменено пользователем www.zeos.com.ua
Ссылка на сообщение
Поделиться на других сайтах

пробовал добавить эту таблицу туда где баннер добавляеш?

<table>

<tr>

<td>тут баннер ссылка</td>

</tr>

</table>

а не в шаблон

Ссылка на сообщение
Поделиться на других сайтах

x-zone-x, читай внимательнее, что я пишу! Мне именно этот способ и НЕ подходит!

Я хочу в баннер добавлять только код баннера, а не его оформление! А оформление должно быть в шаблоне.

Изменено пользователем www.zeos.com.ua
Ссылка на сообщение
Поделиться на других сайтах

Это уже под статью не подпадает. Нужно хак писать, который бы обрабатывал тэги [if_banner].

Ссылка на сообщение
Поделиться на других сайтах

Приношу извинения за задержку, были проблемы со здоровьем :)

А теперь к делу!

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

Но была проблема с тем, как это сделать.

Вы НАВЕРНЯКА пробовали пробовали вставить PHP код в шаблон и были сильно удивлены почему он не сработал?

А потом применили хак на eval и тут уже задумались о безопасности :)

Теоритически с установленным хаком на eval ЛЮБОЙ человек который получит доступ к редактированию шаблонов может взломать полностью сайт. Дабы не допустить даже теоритической дырки научу Вас как НЕ использовать php код, но вставлять его в шаблон :)

Итак смотрим пример.

Есть у нас код:

<?php

echo "Hello, world!";

?>
И хотим мы его вставить на главную. Открываем index.php и ищем:
$tpl->load_template ( 'main.tpl' );
Ниже пишем:
include (ROOT_DIR."/путь_к_файлу.php");
Открываем сайт - вуаля - видим вывод. Вот только одна проблема....Он над дизайном...Незадача, правда?Решаемо! Смысл в том, что шаблонизатор DLE устроен так, что берёт шаблон main.tpl, производит в нём замены и потом выводит его на экран. Нам нужно НЕМНОГО изменить нашу программку. А именно:
В начало скрипта пишем:

$my_mod_buffer = '';

Получаем примерно такое:

<?php

$my_mod_buffer = '';

echo "Hello, world!";

?>
Теперь нам нужно заменить ВСЕ echo в нашей программе на:
$my_mod_buffer.= "код";

Тоесть получаем:

<?php

$my_mod_buffer = '';

$my_mod_buffer.= "Hello, world!";

?>
Далее идём в index.php и после include (ROOT_DIR."/путь_к_файлу.php"); пишем:
$tpl->set("{my_mod_buffer}", $my_mod_buffer);
Тэг {my_mod_buffer} необходимо ЗАРАНЕЕ поставить в main.tpl! Тоесть получается примерно такое в index.php:
$tpl->load_template ( 'main.tpl' );

include (ROOT_DIR."/my_modules/my_super_mod.php");

$tpl->set("{my_mod_buffer}", $my_mod_buffer);
ВНИМАНИЕ!Переменная $my_mod_buffer для каждого модуля индивидуальна! Жду вопросов/критики.
Все работает, спасибо.
<?php

$my_mod_buffer = '';

$my_mod_buffer.= "Hello, world!";

?>
Но в этой связке вот эта переменная лишняя
$my_mod_buffer = '';
у меня без нее, а также эта штука без точки
$my_mod_buffer.= "Hello, world!";
Вообще содержимое моего PHP файла такое:
<?

$filmlink= <<<HTML

<tr>

	 <td>&nbsp;<img src="images/01_26.gif" width="15" height="14" border=0 alt="АНОНСЫ ФИЛЬМОВ"></td>

	 <td width="210"  class="font_big"><H1 class="text_name_film"><b>АНОНСЫ ФИЛЬМОВ</b></H1></td>

</tr>

<!---link+--->

<tr>

	 <td>&nbsp;&nbsp;<img src="images/001_26.gif" width="15" height="14" border=0 alt="Загадочная история Бенджамина Баттона"></td>

	 <td width="210"><a href="http://dvd-edem.ru/film1bb.php" class="font_big"><H1 class="text_name_film"><b>Загадочная история Бенджамина Баттона</b></H1></a></td>

</tr>

<!---end-link+--->

<tr>

	  <td colspan="2" align="center"><img src="images/sep.gif" width="195" height="2" border=0 alt=""></td>

</tr>

HTML;

?>
оно выводится одновременно как в DLE, так и в другой скрипт. Работает и там и там. В майн DLE вставка :
{filmlink}
В индекс ДЛЕ вставка :
$tpl->load_template ( 'main.tpl' );

include (ROOT_DIR."/codel.php");

$tpl->set("{filmlink}", $filmlink);
В майн другого скрипта вставка :
$filmlink
В индекс другого скрипта вставка :
include("codel.php");

Изменено пользователем Langly
Ссылка на сообщение
Поделиться на других сайтах

Langly, что-то я не понял смысл Вашего сообщения, это вопрос? брррр.... :huh::blink::wacko:

Изменено пользователем www.zeos.com.ua
Ссылка на сообщение
Поделиться на других сайтах

я написал что у меня все работает в том виде, в каком я привел.

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

Хз... вопрос-не вопрос...

Ссылка на сообщение
Поделиться на других сайтах

Если в моём примере написать без точки, то с точки зрения PHP это будет ошибка уровня Notice...

Я не был бы профессионалом, если бы давал ошибочный код, правда?

Ссылка на сообщение
Поделиться на других сайтах

Если в моём примере написать без точки, то с точки зрения PHP это будет ошибка уровня Notice...

Я не был бы профессионалом, если бы давал ошибочный код, правда?

Странный вы какой то...

Я понятия не имею профессионал вы или нет.

Я написал так как я сделал. Оно работает.

Если лучше сделать по другому (правильнее) так и скажите. А если объясните почему именно так, будет вообще здорово. Я вас поблагодарю.

А оперировать туманными неинформативными фразами никчему.

Ссылка на сообщение
Поделиться на других сайтах

Если в моём примере написать без точки, то с точки зрения PHP это будет ошибка уровня Notice...

Что в этом непонятного?Тем более, что я писал пример без синтаксиса HereDoc, который Вы используете в своём примере.

Так что:

Но в этой связке вот эта переменная лишняя

$my_mod_buffer = '';
у меня без нее, а также эта штука без точки
$my_mod_buffer.= "Hello, world!";

Тут явно не в тему.

Ссылка на сообщение
Поделиться на других сайтах

а как быть если блок нужно вставить например в fullstory.tpl?

вставляю один и тотже блок в main.tpl и в fullstory.tpl в main показывает в full выдаёт {xxx}

что делать?

Ссылка на сообщение
Поделиться на других сайтах

Не очень понятно как это работает, если в скрипте нет ни одного "echo".

В "index.php" прописано:

<?

include("file.php");

?>

А в "file.php" нет ни одного "echo" и "print". Данные сначала берутся с cbr.ru, потом кешируются и берутся с локального файла, поэтому не понятно как применить выше описанную инструкцию.

Может, кто-то подскажет как исправить это дело?

Ссылка на сообщение
Поделиться на других сайтах

Не очень понятно как это работает, если в скрипте нет ни одного "echo".

В "index.php" прописано:

<?

include("file.php");

?>

А в "file.php" нет ни одного "echo" и "print". Данные сначала берутся с cbr.ru, потом кешируются и берутся с локального файла, поэтому не понятно как применить выше описанную инструкцию.

Может, кто-то подскажет как исправить это дело?

ТС взял код echo(); для примера, просто для наглядности ;)

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

Изменено пользователем spam
Ссылка на сообщение
Поделиться на других сайтах

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

Изменено пользователем eleon
Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...