Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090

Шаблонизация сайта

21.12.2019, 18:58. Показов 2361. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сижу, вот, шаблонизирую сайт. Сверстал шаблон страницы с динамическими вставками типа
Code
1
<div id="header_phone">:phone:</div>
Набросал функцию, которая находит в тексте ключевые слова, выделенные двоеточием, и подставляет вместо них нужные блоки...
А теперь сижу и думаю, нафига я это всё нагородил вместо элементарного
Code
1
<div id="header_phone"><?=$phone;?></div>
без всяких дополнительных функций. Где-то видел что-то похожее, вот и сделал по образу и подобию. А теперь задумался... это я чего-то не понимаю, или тот, у кого я скатал? Как правильно то?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.12.2019, 18:58
Ответы с готовыми решениями:

XLS шаблонизация
Есть большое количество шаблонов, пример шаблона смотрите вложение., необходимо чтобы шаблоны работали в PHP и на выходе получался файл с...

Шаблонизация вывода в html или как там это называют?
ну мы все знаем, что &quot;мухи - отдельно, а котлеты - отдельно&quot;. Парит вывод переменных внутри html. Есть же решения адекватные для среднего...

Шаблонизация интерактивов
Делаю небольшие интерактивы типа игр для диплома. Они все имеют примерно 1 структуру меню - выбор игры и сама игра типа тестов и тп. Как...

44
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,890
21.12.2019, 19:42
ChildOfFlowers, у вас правильно. Только при таком "echo" точку с запятой обычно не ставят.

Шаблонизатор над PHP обычно нужен для людей, далеких от Web-разработки, чтобы они ничего "не сломали глобально" и "не понаделали дыр". Разработчики же вполне могут использовать родной синтаксис PHP. (Для шаблонов обычно используется т.н. альтернативный синтаксис, элемент которого вы показали.)

Добавлено через 11 минут
Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
без всяких дополнительных функций.
Обычные функции представления или хелперы все же бывают нужны. Например, посмотрите мой первый ответ в теме Паразитные символы над выводом сайта.

Даже если вы уверены, что HTML-кодирование не требуется, могут понадобиться функции изменения формата, "обрезания" и т.п. Например, вот я недавно переводил с Ликуида (Liquid):
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<div class="posts">
<?php while ($post=getrow()): ?>
  <div class="post">
    <h1 class="post-title">
      <a href="<?= pagelink(1,$post['id'],'posts') ?>">
        <?= $post['title'] ?>
 
      </a>
    </h1>
    <span class="post-date"><?= date_to_string($post['date']) ?></span>
<?= excerpt('post') ?>
 
  </div>
<?php endwhile; ?>
</div>
C именем date_to_string долго не думал, а просто взял имя используемого в оригинальном шаблоне "фильтра" и сделал аналогичную функцию
1
 Аватар для ChildOfFlowers
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,090
21.12.2019, 19:49  [ТС]
Цитата Сообщение от estic Посмотреть сообщение
могут понадобиться функции изменения формата, "обрезания" и т.п.
Ну это то понятно. Тем более, что, как я понимаю, этим же способом придётся реализовывать локализацию. Т.е., вместо всех надписей будет вызов функции-локализатора, которая в зависимости от выбранного языка будет дёргать из БД нужные строки.
0
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,890
21.12.2019, 20:52
Тому, что "дёргается" из БД, может, специальные функции локализации в шаблоне и не нужны. Они скорее нужны тексту, который является частью шаблона. Например, при переводе того же шаблона я не сделал какую-либо локализацию текста "Related Posts" (хотя мог бы):
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<div class="post">
  <h1 class="post-title"><?= $page['title'] ?></h1>
  <span class="post-date"><?= date_to_string($page['date']) ?></span>
<?= $page['content'] ?>
 
</div>
 
<div class="related">
  <h2>Related Posts</h2>
  <ul class="related-posts">
<?php while ($post=getrow()): ?>
    <li>
      <h3>
        <a href="<?= pagelink(1,$post['id'],'posts') ?>">
          <?= $post['title'] ?>
 
          <small><?= date_to_string($post['date']) ?></small>
        </a>
      </h3>
    </li>
<?php endwhile; ?>
  </ul>
</div>
Хотя, конечно, тут много нюансов. Та же date_to_string сейчас форматирует дату в "28 Dec 2013", что, естественно, лучше локализовать, например, для русскоязычного сайта.

Добавлено через 30 минут
В принципе к "Related Posts" можно было подойти, как к каким-нибудь общим данным шаблона/сайта (вроде того же телефона). Например:
PHP
1
2
3
return [
  'title'=>'Hyde',
  'tagline'=>'A Jekyll theme',
PHP
1
$site = require THEME_PATH.'config.php';
PHP
1
2
3
4
5
6
7
8
  <title>
<?php if ($page['title']=='Home'): ?>
    <?= $site['title'] ?> &middot; <?= $site['tagline'] ?>
<?php else: ?>
    <?= $page['title'] ?> &middot; <?= $site['title'] ?>
<?php endif; ?>
 
  </title>
Только не обращайте внимание на приравнивание к "Home". Эта "грубость" была в оригинальном шаблоне. Я, естественно, долго думать не стал
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
21.12.2019, 21:06
Вообще в идеале, должен быть отдельный слой презентаторов, которые приводят все данные в нужный формат для вывода, но это в идеале, так сказать "по книжке". А в шаблоне вы просто выводите. Нужно для работы фронтендеров, чтоб не захламлять верстку излишней логикой. Тем более, что сайты могут писать не только на php. А фронтэндеров это вообще не должно касаться.
Еще шаблонизатор нужен для дисциплины. Если вы пишете для себя это одно, вы сами можете следить, чтоб в шаблоне не было ничего лишнего. А вот когда разрабатывается крупное приложение несколькими программистами, то там проще ограничить саму возможность, а то многие бывают ленивые и напишут прям в шаблоне всякую дичь.
В любом случае, свой шаблонизатор не нужен. Ведь php изначально и есть шаблонизатор. Так что либо пишите на php, либо тогда уже используйте какой-нибудь популярный шаблонизатор типа twig, чтоб на нем могли работать не только вы)
Причем это достаточно сложная система. Потратите кучу времени впустую. Еще к примеру при выводе нужно всегда обрабатывать данные, чтоб не было никаких Инъекций. В twig-е все выводы по умолчанию обрабатываются. А в php вам приходится постоянно оборачивать данные в какой-нибудь статический метод для вывода.
0
63 / 34 / 8
Регистрация: 07.02.2015
Сообщений: 125
21.12.2019, 21:34
estic,
а я сделал через {тег}, заменяемый итоговой $content, собираемой используемым модулем.
В итоге html полностью чистый, только в нужных местах {тег} ставить нужно.
0
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,890
21.12.2019, 21:57
AlexNewaro, насколько я понял автора, мы все же о полноценной шаблонизации говорим, а не о замене ":рhone:" на значение $phone и т.п., несмотря на его пример.

Добавлено через 5 минут
К тому же, как верно заметил автор, {content} ненамного лучше <?= $content ?> (если вообще лучше), чтобы из-за этого добавлять дополнительный слой представления.
0
63 / 34 / 8
Регистрация: 07.02.2015
Сообщений: 125
21.12.2019, 22:08
estic,
Ну у меня набор tpl файлов, подключаемых к модулю (можно переназначать на любые).
В них как раз {content} или {top_banner} или что угодно.
А в модуле формируется наполнение для соответствующих переменных
0
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,890
21.12.2019, 22:17
Цитата Сообщение от sad67man Посмотреть сообщение
А в php вам приходится постоянно оборачивать данные в какой-нибудь статический метод для вывода.
Вы можете использовать формат хранения, совпадающий с наиболее вероятным форматом вывода.

В каких-то шаблонизаторах перестраховываются, кодируя все подряд (хотя там тоже нужны обходные пути, чтобы при необходимости не заниматься глупостями вроде декодирования после кодирования), в каких-то используют специальные скобки или дублирование скобок. В использовании отдельных шаблонизаторов определенно есть смысл, раз они получили достаточно большую популярность. Но автор писал немного о другом: зачем изобретать свой велосипед, когда можно использовать возможности самого PHP?!

Добавлено через 6 минут
AlexNewaro, я тебя не понимаю. Т.е. ничего сильно примечательного в твоих словах не вижу (извини за грубость ). В обычном PHP на месте <?= $content ?> тоже спокойно может отображаться результат выполнения какого-то другого шаблона. Если я правильно тебя понял.
0
63 / 34 / 8
Регистрация: 07.02.2015
Сообщений: 125
21.12.2019, 22:31
estic,
Какие обиды )
Я просто поделился как у меня сделано, я ж никогда не претендую на звание умейки
Я потому и стараюсь писать только в разделе для новичков, потому что сам новичок ))
Но считаю пусть поисковик проиндексирует, вдруг кому-то пригодится )

А отдельные файлики tpl я сделал для универсализации и для удобства дизайнера своего
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
21.12.2019, 22:34
Цитата Сообщение от estic Посмотреть сообщение
Вы можете использовать формат хранения, совпадающий с наиболее вероятным форматом вывода.
Не совсем понял. Проще это контролировать при выводе, иначе в какой момент вам нужно это сделать, это порождает множество проблем.
Цитата Сообщение от estic Посмотреть сообщение
Но автор писал немного о другом: зачем изобретать свой велосипед, когда можно использовать возможности самого PHP
Я про то и говорю. Что не нужно изобретать велосипед. Либо используем php, либо уже готовый шаблонизатор. Не нужно писать свой. А чтоб понять, какой вариант выбрать, нужно понимать, для чего вообще используются шаблонизаторы.
0
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,890
21.12.2019, 22:54
Цитата Сообщение от sad67man Посмотреть сообщение
Не совсем понял. Проще это контролировать при выводе, иначе в какой момент вам нужно это сделать, это порождает множество проблем.
Может, и проще, но и накладнее, если не используется кэширование. К тому же совсем без проблем тут тоже не получится. Например, что только ни придумывают, чтобы не хранить отформатированный текст в HTML. Особенно удивляют различные гремучие смеси с HTML, когда "своими изобретениями" все потребности форматирования покрыть не получается.
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
21.12.2019, 23:07
estic, Тут о ресурсах задумываться не стоит. Сейчас серваки достаточно мощные, да и железяки дешевле, чем работа программистов. Ну сколько вы выиграете микросекунд, стоит ли это потраченного вашего времени, да и в дальнейшем это только усложняет разработку, соответственно опять же удораживает поддержку.
Хранить нужно как есть. А следить при выводе. Даже если вы заморочитесь, и будете хранить в бд закодированный текст. В шаблоне вы все равно не будете уверены, какие данные у вас безопасные, а какие нет. И тут лучше еще раз будет подстраховаться. А смысл тогда хранить эти данные в таком виде?)
0
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,890
21.12.2019, 23:34
sad67man, если вы будете при выводе еще и фильтровать потенциально небезопасные теги (коими являются практически все теги, т.к. к ним можно добавить атрибуты с кодом на JS и т.п.), даже ресурсов достаточно мощного сервера может не хватить

Цитата Сообщение от sad67man Посмотреть сообщение
Хранить нужно как есть.
Это как? Например, как вы храните отформатированный текст, о котором я выше писал?

Добавлено через 2 минуты
Цитата Сообщение от sad67man Посмотреть сообщение
В шаблоне вы все равно не будете уверены, какие данные у вас безопасные, а какие нет. И тут лучше еще раз будет подстраховаться.
Просто так подстраховаться может и не получиться. Иначе вы рискуете повторно закодировать то, что уже один раз закодировано

Добавлено через 1 минуту
Цитата Сообщение от sad67man Посмотреть сообщение
А смысл тогда хранить эти данные в таком виде?)
Вы не позволяете мне самому выбрать формат хранения?
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
21.12.2019, 23:43
estic,
Цитата Сообщение от estic Посмотреть сообщение
Это как? Например, как вы храните отформатированный текст, о котором я выше писал?
Нет, ну тут Используются bbcode для написания сообщения, Вы же не в html пишете. Для этого обрабатывается bbcode, нужные переделываются в теги, остальное кодируется. А в бд хранится 2 поля. В одном html, в другом bbcode. Один для вывода, другой для редактирования.
0
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,890
21.12.2019, 23:45
В общем я понимаю, о чем вы. Просто периодически приходится иметь дело с людьми, которые делают все шаблонно и не могут даже поверхностно обосновать, почему нужно делать именно так и никак иначе Вы, видимо, к ним не относитесь. Поэтому подумайте над моими аргументами в пользу того, что это можно сделать иначе, нежели так, как вы привыкли.

Не по теме:

Спокойной ночи.

0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
21.12.2019, 23:47
estic,

Не по теме:

Главное, чтоб мы не запутали автора темы)

0
1306 / 998 / 232
Регистрация: 01.10.2018
Сообщений: 3,890
21.12.2019, 23:55
BBCode - это лишь один из форматов хранения/редактирования. HTML тут тоже вполне уместен.

Цитата Сообщение от sad67man Посмотреть сообщение
В одном html, в другом bbcode.
Одно и то же в двух разных форматах? Не самый оптимальный вариант. Вам так не кажется?
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
21.12.2019, 23:59
estic, Мне кажется это самый оптимальный вариант. Помню как-то давно, было у меня подобное тестовое задание. Типо гостевой книги, и там были разрешены определенные теги для написания сообщений. И что? Я буду вырезать все ненужное, думать о том, а что еще там может быть? Проще сделать через bbcode, просто сначала закодировать все, потом заменить разрешенные bbcode на теги при создании сообщения. То, что есть и редакторы, которые напрямую работуют с html я знаю, но они больше подходят для админки. А не для пользователей)
0
63 / 34 / 8
Регистрация: 07.02.2015
Сообщений: 125
22.12.2019, 00:00
estic,
я понял одно - я лопух
Я храню в базе принятое от редактора, пропущенное только через фильтр нежелательных слов, trim, mysqli_real_escape_string и с заменой кавычек на двойные (в случае, если в редактор скопипастили что-то).
И спокойно оттуда забираю в редактор обратно прямо из базы как есть.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.12.2019, 00:00
Помогаю со студенческими работами здесь

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

Шаблонизация указателя на метод класса
Есть класс с набором геттеров. Например, такой: class MyObject { public: int getInt() const { return 2; } double...

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

Изменяю файл hosts, ставлю напротив сайта ip адрес другого сайта
По идее должен идти редирект на этот самый другой сайт. Например строчка 87.240.156.161 www.kiss.ru должна редиректить сайт www.kiss.ru на...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru