Есть файл конфигурации, (config.php) и в этом файле есть строка PHP: define('TEMPLATE_NAME', 'default'); По имени шаблона 'default' есть директория, в которой лежат файлы шаблона -> css, js, img, html и т.п. Допустим я хочу "переодеть" сайт в новый шаблон, мне нужно изменить значение константы в 'TEMPLATE_NAME' на 'new', т.е. в конфигурационном фале нужно просто перезаписать это ручками и всё. А как можно это сделать так, чтоб менялось это через админку, как например в вордпрессе, просто выбрть новый шаблон и сайт уже переодет? Структуру вордпресса не знаю, просто видел, что там такое возможно. Можно конечно создать отдельный файл где будет единственная запись: PHP: define('TEMPLATE_NAME', 'default'); И написать код с поиск/замена, брать PHP: define('TEMPLATE_NAME', '{default}'); заменять {default} на нужное значение и перезаписывать файл, но это вроде как-то на извращение похоже. Типа такого: PHP: $string = "define('TEMPLATE_NAME', '{default}');"; $tmp = str_replace("{default}", "new", "$string"); file_put_contents('tmp_config.php', $tmp);
Ок, допустим. Но тот всплывает такой момент, что вся статика (css, js, img и т.п.), которая задействована в дизайне подтягиваются через имя шаблона, т.е. получается при открытии страницы, будет происходить запрос к БД чтоб получить текущее имя шаблона. Т.е. если у меня к примеру пару десятков элементов дизайна, должно произойти 20 обращений к БД? Т.е. пимерно вот такой скрипт отвечает за статику: PHP: public function content($requestedPath) { $pathToContent = $this->preparePath($requestedPath); $mime_content_type = mime_content_type($pathToContent); header("Content-Type: $mime_content_type"); readfile($pathToContent); exit(); } private function preparePath($path) { return "webapp/general/content/templates/%%%%%%/design/$path"; } Вместо %%%%%% нужно подставить текущее имя шаблона Т.е. если в шаблоне есть такое: HTML: <img src="images/pic01.jpg" alt="" /> <img src="images/pic02.jpg" alt="" /> <img src="images/pic03.jpg" alt="" /> <img src="images/pic04.jpg" alt="" /> <img src="images/pic05.jpg" alt="" /> Каждое такое изображение, это получается отдельное обращение к скрипту т.е. в preparePath передастся по порядку: images/pic01.jpg и он должен обратиться к базе чтоб получить значение имени шаблона, чтоб заменить %%%%%%, допустим на new, чтоб получилось: webapp/general/content/templates/new/design/images/pic01.jpg webapp/general/content/templates/new/design/images/pic02.jpg webapp/general/content/templates/new/design/images/pic03.jpg и так далее
Как выше написали, константы – это прежде всего для программистов. В остальных случаях нужно использовать переменные, заполняемые откуда-то, или ф-ции. Почему у тебя $path не может содержать в том числе и имя шаблона? --- Добавлено --- По примеру, который я ранее приводил: /a/first/... Тут «ручкой» экшина, не относящейся к идентификатору, максимум является "a", а first (это имя шаблона) и далее – это уже идет идентификатор. Смысл в том, чтобы твой экшин позволял (одновременно) работать с файлами разных шаблонов. --- Добавлено --- P.S. На лету менять содержимое скриптов нерационально и часто чревато разными неприятными последствиями. В общем конфиги могут быть исполняемыми, но только без их изменения на лету.
На самом деле нет нужды брести в стаде и мычать вместе со всеми )) вариантов множество, самых разных, например: https://www.php.net/manual/ru/book.yaml.php yaml - удобный формат чтобы и руками править, и чтобы интерфейс было просто подключить. это просто в качестве примера того что вообще возможно сделать. не обязательно выбирать строго между базой и хранением в нативном PHP-коде
Походу к вечеру уже голова забита, возможно что-то уже не вижу. С конфигом, то что менять налету не правильно, я как раз тоже за это и думал, что чревато багом. Сейчас во 'view' из конфига берется имя шаблона, на основе этого имени формируется путь к директории с файлами на основе которого и рендерится сама страница с теми самыми HTML: <img src="images/pic01.jpg" alt="" /> <img src="images/pic02.jpg" alt="" /> Потом получается чтоб отобразились изображения и другие статические файлы шаблона, просиходят запросы "images/pic01.jpg" и эти запросы летят к скрипту который отвечает за вывод статикии соответственно в процессе всё также путь к реальным файлам проходит через всё тот же конфиг
К пред. посту. Если у тебя местоположение статик обвеса фиксировано, ты можешь захардкодить ссылки на обвес прямо в разметке этого шаблона, максимум добавив в них переменную с «базой» сайта (это для «тупого» подхода, когда сайт может располагаться глубже его реального корня) или «базой» статик обвеса.
Но ведь изначально же во view нужно передать имя шаблона и тут получается что если захардкодить имя другого шаблона, будет перекос. Т.е. подключится вьюха та что нужно, а из-за неправильного хардкода изображения могут тянуться другие. В любом случае благодарю за инфу, поразмышляю.
Я тебе ранее писал, что для программного доступа к файлам используешь абс. пути, а для ссылок на обвес (стили, картинки, клиентские скрипты и т.п., относящиеся к общему оформлению) – абс. адреса. И тут еще такой момент: шаблон оформления можно разделить на две части: 1) файлы содержащие разметку и т.п., 2) собственно статик обвес. В собранных страницах по адресам ты обращаешься только ко второму. Эти адреса полностью или почти полностью (см. пред. пост) можно захардкодить в первом. Т.е. тебе для динамического изменения оформления достаточно где-то сохранять/откуда-то извлекать имя тек. шаблона для запуска первой группы файлов.
Да, но я как-то не совсем понял, что такое абсолютные и относительные пути я понимаю, но я не совсем понял чем речь. абс. пути и абс. адреса - это разное? Можно пример? Если я буду писать в ссылках на обвес ((стили, картинки, клиентские скрипты и т.п., относящиеся к общему оформлению) ) http://domain.com/style/css.css то будет идти обращение к не существующим файлам. Т.к. ведь всё это отдается через PHP.
Разметка должна лежать по идее вне корня, например тут: /var/www/site/mods/first – это абс. путь в ФС (для каталога, но и у файлов аналогично). Обвес обычно лежит в пределах корня (хотя при отдаче статика скриптом это не обязательно, но давай для простоты отождествим физ. расположение файлов с их адресами), например по такому адресу: /a/first (физическое местоположение в ФС – /var/www/site/docs/a/first; /var/www/site/docs – это корень). Для работы «морды» сайта важны только адреса, а не физ. расположение. Как я ранее писал, не обязательно абс. пути в ФС или абс адреса хардкодить полностью (хотя для адресов это может быть вполне норм.). Обычно делают так: MODS_PATH.'first/...', ASSETS_BASE.'first/...' и т.п. Переменные/ф-ции вместо констант тоже допустимы.
Т.е. то что у меня в автозагрузке и композере и то что пути идут относительно них это всё другое? Я как-то думал что это как раз таки избавляет от всех этих лишних движений с адресами.
Не совсем понял, о чем ты. Это «в автозагрузке и композере» тоже используется. Но там речь прежде всего об автозагрузке классов, совмещении компонентов разных вендоров и т.п. Как это связано с твоими шаблонами, объясни.
Я просто запутался, где неправильно пути стоят тут: PHP: private function preparePath($path) { return "webapp/general/content/templates/%%%%%%/design/$path"; } т.е. должно быть как-то так: PHP: private function preparePath($path) { return " /var/www/site/webapp/general/content/templates/%%%%%%/design/$path"; } ?
Возвращать ты можешь и относительный, пусть и дополненный. Это зависит от логики. Проблема в том, что его же ты продолжаешь использовать в readfile. P.S. Как ранее писал, тут можно вообще обойтись без непосредственной работы с именем шаблона.
Адреса вроде images/pic01.jpg для шаблонов тоже неправильные (использование тега base в расчет не беру). Нужно как-то так: HTML: src="/a/first/..." или HTML: src="<?= ASSETS_BASE ?>first/..." или HTML: src="<?= SITE_BASE ?>a/first/..." --- Добавлено --- Имя шаблона тут тоже можно через переменную вставлять, но обычно в этом нет необходимости.