Шаблонирование в PHP сделано правильно ... как? - PullRequest
1 голос
/ 04 апреля 2011

Несколько лет назад я создал небольшой веб-сайт на PHP, который теперь вырос, и, как вы, наверное, догадываетесь, это немного путаница.Хотя у меня есть отдельный шаблон, который выполняет окончательный вывод html, я все же в конечном итоге вынужден обрабатывать большую часть html в части «бизнес-логики» кода.

Моя главная проблема заключается в том, чтостраница содержит различные виджеты (такие как «последние записи», реклама и т. д.), которые меняются от страницы к странице, и, следовательно, их html- (template-) код не может быть жестко закодирован в шаблоне.На самом деле, даже контейнер основного содержимого является виджетом, поскольку структура страницы (или макет) всегда одинаковы.

Так что в итоге я получил массив с $ templateData ['mainContent'], $ templateData['widget1'], $ templateData ['widget2'] и т. д., которые генерируются в части бизнес-логики кода.

Как мне решить эту проблему?

Посмотрев вокругв течение некоторого времени, кажется, есть 2 способа решить эту проблему:

  1. Очевидным способом было бы использование выделенного языка шаблонов с наследованием и включением, как это делает django, но с учетом сложности этих языковЯ действительно не хочу изучать еще один из них.Кроме того, я заметил, что за время, проведенное с django, он не особенно быстр (особенно потому, что он соблазняет использовать этот шаблон для css и javascript).

  2. Другой вариант будетиспользовать шаблоны, которые предоставляет сам PHP.Но это будет означать, что каждый виджет будет иметь свой собственный php-шаблон и будет генерировать свой html-код, включая файл-шаблон, и перехватывать результат, используя буферизацию вывода.Это хорошая идея?Так как я до сих пор получаю HTML внутри переменных внутри логической части.Кроме того, разве эта неправильная выходная буферизация для чего-то, для чего она не была предназначена?А как насчет производительности?(где находится буфер, из которого я пишу / читаю / очищаю? Сколько стоят вызовы функций ob_ *?)

Из того, что я видел, есть сторонники обоих вариантов.,Лично мне больше нравится вариант 2 (так как он вроде того, что я уже делаю), но html-in-переменные выглядит очень неправильно, и я сомневаюсь, что я решил бы что-нибудь таким образом.

Может быть, естьдругой вариант?Как вы решили эту проблему?

Ответы [ 5 ]

2 голосов
/ 04 апреля 2011

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

2 голосов
/ 04 апреля 2011

присвойте эти симпатичные массивы smarty и научитесь их повторять в файлах tpl. это проще, чем кажется. когда вам нужно много раз включать один и тот же фрагмент HTML / PHP, вы просто включаете его.

http://www.smarty.net/

умный, быстрый и надежный? да

2 голосов
/ 04 апреля 2011

У меня была эта проблема раньше, и у меня были почти те же идеи / вопросы, которые у вас есть в настоящее время. Я обязал себя выучить язык шаблонов. Введите Twig облегченный язык шаблонов, на который влияет язык шаблонов Django. У него очень маленькая занимаемая площадь, почти невидимая с точки зрения использования памяти.

Дайте себе время привыкнуть к этому, а затем решите, хотите вы этого или нет.

1 голос
/ 04 апреля 2011

Одной из идей может быть создание управляемых шаблонами / управляемых представлением страниц с доступом к веб-службе или API, обслуживающих все необходимые данные.

Вы можете связать URL-адреса с шаблонами, а шаблоны вызывают функции извлечения данных либо через веб-службу (стиль AJAX), либо статически.

Часть бизнес-логики затем ограничивается обработкой входных данных и подготовкой общего поиска и обеспечивает механизмы, например, для фильтрация или сортировка, в то время как шаблоны определяют, как фильтровать, как сортировать или разбивать на страницы и т. д.

Я предлагаю вам использовать подходящую структуру объектно-реляционного отображения (ORM) / ActiveRecord шаблон (см. здесь, в StackOverflow или в Википедии ), что позволяет использовать универсальные поисковые объекты, которые могут быть переконфигурированы шаблоном в соответствии с его потребностями (например, вышеупомянутые фильтрация и сортировка).

Фактическое извлечение будет затем выполняться в шаблоне при необходимости путем вызова специального метода, такого как find(), load() или аналогичного для извлекаемых объектов.

EDIT:
Что касается шаблонных каркасов, как предлагали другие, они мне не очень нравятся, поскольку они часто дублируют функциональность, уже найденную в PHP, изобретая колесо, добавляя еще один слой парсера; однако вы получаете выгоду от любой приличной структуры шаблонов - кэширование (могут быть некоторые шаблоны на основе PHP, которые также поддерживают кэширование).

0 голосов
/ 14 марта 2014

Несколько вариантов

Есть несколько способов сделать это.

Вот пара стратегий, которые стоит рассмотреть:

  • Используйте простые представления PHP, которые вы инкапсулируете (включаете) в метод объекта PHP. Вот как CakePHP реализует свои представления.

  • Загрузить файл HTML с заполнителями, такими как <%%>, в виде простого текста и использовать регулярные выражения для замены содержимого

  • Загрузить файл HTML и проанализировать его как XML или HTML. Затем вы можете использовать что-то вроде компонента Symfony CssSelector , чтобы добавлять, удалять или заменять контент так же, как вы делали бы это с jQuery. Затем верните его в обычный текст и echo it.

  • Используйте один из следующих популярных шаблонизаторов:

  • ...


Лучший вариант?

Какой вариант лучше? Я думаю, это зависит от вашего варианта использования:

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

  • Если вам нравится просматривать HTML-код так же, как вы делаете это с помощью jQuery, вы можете использовать библиотеку, например DOM-Query .

  • Если вы ищете хорошо протестированный шаблонизатор, который можно использовать как в бэкэнде, так и во внешнем интерфейсе, Усы - это путь!

  • ...

...