LINUX.ORG.RU

PHP, непонятности


0

0

Здравствуй, добролор. Как в php грамотно решить такую задачку.

Код и дизайн при этом обязательно разделить (это и есть суть). То есть, дезигнер должен сделать шаблон аля

<div> тип

<div> тема

<div> каталог

</div>

</div>

</div>

То есть, речь идет о форуме :3

соответственно, эта штука будет в цикле, будет несколько типов, куча тем и каталогов(подтем). Грубо говоря, зайдя в каталог можно будет видеть конкретный список нитей(тредов).

Как в данном случае не смешать код и дизайн, поступив правильно?

Спасибо за внимание.



Последнее исправление: uRandom (всего исправлений: 4)
<div> ${type}
<div> ${thread}
<div> ${catalog}
</div>
</div>
</div>

И это инклудить

или

<div> %{type}
<div> %{thread}
<div> %{catalog}
</div>
</div>
</div>

и это парсить

staseg ★★★★★
()
Ответ на: комментарий от staseg

Инклудить я сразу же подумал, но в памяти вспомнилось, что инклуд в цикле - зло, разве нет? //ночь, возможно я туплю, да.

uRandom
() автор топика
Ответ на: комментарий от uRandom

>что инклуд в цикле - зло, разве нет?

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

staseg ★★★★★
()

Наиболее грамотно в данном случае не городить велосипед, а подключить шаблонизатор типа Blitz_Templates (Ъ-вей) или Smarty (монструоз-вей). И заюзать в whatever.php такую конструкцию:

<?php
$template = new Blitz( '/path/to/template.tpl' );

// внутри цикла провести следующую операцию:
$template->block('posts', array('type' => $val1,
'theme' => $val2,
'catalog' => $val3));

// а потом вывести всё это
echo $template.parse();
exit;
?>

А в файл шаблона template.tpl положить что-то типа этого:

{{BEGIN posts}}
<div>{{ $type }}
<div>{{ $theme }}
<div>{{ $catalog }}
</div>
</div>
</div>
{{END posts}}
Это на примере блиц. Смарти не люблю.

Deleted
()
Ответ на: комментарий от tempuser002

Да ладно, не настолько уж он страшный :)

Deleted
()
Ответ на: комментарий от Deleted

Установка Blitz_Templates подразумевает доступ к серверу помимо фтп? о_О Как быть, если хостинг не предполагает доступ к установке программ на сервере?

uRandom
() автор топика
Ответ на: комментарий от uRandom

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

Deleted
()
Ответ на: комментарий от uRandom

Да, он толст и монструозен, и уже является чуть ли не обёрткой-интерпритатором для интерпритатора php :)
Поищи по шаблонизаторам. Есть еще варианты. Смарти просто самый популярный.

Deleted
()

шаблонизаторы не нужны же. что, верстальщику трудно написать <?php echo $type; ?> ? или главное в проекте - чтоб верстальщик не догадался, что проект на пхп?

heisenberg ★★
()
Ответ на: комментарий от heisenberg

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

uRandom
() автор топика

В Blitz_Templates есть функция

load — загрузить тело шаблона из переменной PHP
bool load ( string tpl )

В Smarty не могу найти такого, то есть, если нужно много раз использовать шаблон(в цикле), то он каждый раз будет обращаться к файлу?
$smarty->display(«index.tpl»);

Но в Smarty есть кэширование

«Кэширование используется для ускорения вызовов display() или fetch() при помощи сохранения результатов их работы в файл. Если доступна кэшированная версия вызова, она отображается вместо повторной обработки шаблона. Кэширование может значительно ускорить работу, особенно в случае длительно обрабатываемых шаблонов. Так как результат работы методов display() или fetch() кэшируется, один файл кэша вполне может состоять из нескольких файлов шаблонов, конфигурационных файлов и т.д. »

Кэширование в моей ситуации поможет?

uRandom
() автор топика
Ответ на: комментарий от Deleted

>Это на примере блиц

Обжегшись на примере Twig'а по каждому шаблонизатору спрашиваю. А в Blitz'е можно в шаблоне дёргать методы объектов?

KRoN73 ★★★★★
()
Ответ на: комментарий от heisenberg

>что, верстальщику трудно написать <?php echo $type; ?>

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

KRoN73 ★★★★★
()
Ответ на: комментарий от uRandom

> Кэширование в моей ситуации поможет?

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

Deleted
()
Ответ на: комментарий от Deleted

По-моему, это совсем не то. Это же просто пользовательский метод. А я про подобное:

<p>Новость из источника «<i>{$this->origin()->titled_link()}</i>»</p>

KRoN73 ★★★★★
()
Ответ на: комментарий от Wizard_

>Метод шаблонизатора?

При чём тут метод шаблонизатора?

На что должен указывать этот $this?


На что будет указано в контроллере. Ну, пусть будет не $this, а $main_object или $news :) Это я уже привычку из своего фреймворка оттранслировал машинально, у меня автономная сущность вывода - объект. И шаблону, индивидуальному для каждого объекта, подаётся этот самый объект под именем $this.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>При чём тут метод шаблонизатора?

Просто единственное возможное применение $this здесь, которое пришло мне в голову.

На что будет указано в контроллере. Ну, пусть будет не $this, а $main_object или $news :)

Именно, экспорт переменных в шаблон. Но он же есть везде, о чём вопрос тогда? :)

Это я уже привычку из своего фреймворка оттранслировал машинально, у меня автономная сущность вывода - объект.

Не понял, что есть «сущность вывода». Объект, в рамках scope которого лежат все перменные, используемые в данном шаблоне?

Wizard_ ★★★★★
()
Ответ на: комментарий от Wizard_

>Но он же есть везде, о чём вопрос тогда? :)

О доступе к методам и свойствам объекта, ссылка на который лежит в данной переменной :) При чём обязательно - с вложенностью. Т.е. если у нас в шаблон передаётся объект $news, то нужно уметь показать, например, заголовок источника этой новости по $news->origin()->title().

Не понял, что есть «сущность вывода»


Каждая картинка/страница или модуль страницы - объект, для которого есть шаблон. В этот шаблон, кроме явно указанных тобой данных ещё обязательно фреймворком прописывается несколько переменных, в том числе в $this пишется ссылка на объект, которому соответствует данный шаблон.

Т.е. если шаблон принадлежит объекту новость, то не обязательно передавать в него $news со ссылкой на текущий объект, можно сразу использовать в шаблоне $this.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>если у нас в шаблон передаётся объект $news, то нужно уметь показать, например, заголовок источника этой новости по $news->origin()->title().

Да, верно, в старых версиях Smarty мне тоже невозможность использования method chaining бесила.

Каждая картинка/страница или модуль страницы - объект, для которого есть шаблон.

Даже картинка? Очень интересно. Надо будет глянуть фреймворк на досуге.

Wizard_ ★★★★★
()
Ответ на: комментарий от Wizard_

>Да, верно, в старых версиях Smarty мне тоже невозможность использования method chaining бесила.

Ну, к нему патчик был почти с самого начала на этот счёт.

Даже картинка?


Картинки, генерируемые JS, RSS'ы, модули на страницах и т.п. Я раньше где-то отмечал, что у меня ООП головного мозга :) «Всё есть объект».

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.