За последние 24 часа нас посетили 21966 программистов и 1103 робота. Сейчас ищут 739 программистов ...

Смена конфига из админки.

Тема в разделе "PHP для новичков", создана пользователем AlexandrS, 22 ноя 2019.

  1. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Есть файл конфигурации, (config.php) и в этом файле есть строка
    PHP:
    1. define('TEMPLATE_NAME', 'default');
    По имени шаблона 'default' есть директория, в которой лежат файлы шаблона -> css, js, img, html и т.п.
    Допустим я хочу "переодеть" сайт в новый шаблон, мне нужно изменить значение константы в 'TEMPLATE_NAME' на 'new', т.е. в конфигурационном фале нужно просто перезаписать это ручками и всё.
    А как можно это сделать так, чтоб менялось это через админку, как например в вордпрессе, просто выбрть новый шаблон и сайт уже переодет? Структуру вордпресса не знаю, просто видел, что там такое возможно.

    Можно конечно создать отдельный файл где будет единственная запись:
    PHP:
    1. define('TEMPLATE_NAME', 'default');
    И написать код с поиск/замена, брать
    PHP:
    1. define('TEMPLATE_NAME', '{default}');
    заменять {default} на нужное значение и перезаписывать файл, но это вроде как-то на извращение похоже.

    Типа такого:
    PHP:
    1. $string = "define('TEMPLATE_NAME', '{default}');";
    2. $tmp = str_replace("{default}", "new", "$string");
    3. file_put_contents('tmp_config.php', $tmp);
     
    #1 AlexandrS, 22 ноя 2019
    Последнее редактирование: 22 ноя 2019
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.825
    Симпатии:
    738
    Адрес:
    Татарстан
    не использовать define, имя шаблона хранить в БД или в переменной итд
     
    AlexandrS нравится это.
  3. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Ок, допустим. Но тот всплывает такой момент, что вся статика (css, js, img и т.п.), которая задействована в дизайне подтягиваются через имя шаблона, т.е. получается при открытии страницы, будет происходить запрос к БД чтоб получить текущее имя шаблона. Т.е. если у меня к примеру пару десятков элементов дизайна, должно произойти 20 обращений к БД?
    Т.е. пимерно вот такой скрипт отвечает за статику:

    PHP:
    1.     public function content($requestedPath)
    2.     {
    3.         $pathToContent = $this->preparePath($requestedPath);
    4.         $mime_content_type = mime_content_type($pathToContent);
    5.         header("Content-Type: $mime_content_type");
    6.         readfile($pathToContent);
    7.         exit();
    8.     }
    9.     private function preparePath($path)
    10.     {
    11.         return "webapp/general/content/templates/%%%%%%/design/$path";
    12.     }
    Вместо %%%%%% нужно подставить текущее имя шаблона

    Т.е. если в шаблоне есть такое:


    HTML:
    1. <img src="images/pic01.jpg" alt="" />
    2. <img src="images/pic02.jpg" alt="" />
    3. <img src="images/pic03.jpg" alt="" />
    4. <img src="images/pic04.jpg" alt="" />
    5. <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
    и так далее
     
    #3 AlexandrS, 22 ноя 2019
    Последнее редактирование: 22 ноя 2019
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Как выше написали, константы – это прежде всего для программистов. В остальных случаях нужно использовать переменные, заполняемые откуда-то, или ф-ции.

    Почему у тебя $path не может содержать в том числе и имя шаблона?
    --- Добавлено ---
    По примеру, который я ранее приводил:
    /a/first/...

    Тут «ручкой» экшина, не относящейся к идентификатору, максимум является "a", а first (это имя шаблона) и далее – это уже идет идентификатор. Смысл в том, чтобы твой экшин позволял (одновременно) работать с файлами разных шаблонов.
    --- Добавлено ---
    P.S. На лету менять содержимое скриптов нерационально и часто чревато разными неприятными последствиями. В общем конфиги могут быть исполняемыми, но только без их изменения на лету.
     
    AlexandrS нравится это.
  5. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    На самом деле нет нужды брести в стаде и мычать вместе со всеми )) вариантов множество, самых разных, например:

    https://www.php.net/manual/ru/book.yaml.php

    yaml - удобный формат чтобы и руками править, и чтобы интерфейс было просто подключить.

    это просто в качестве примера того что вообще возможно сделать.

    не обязательно выбирать строго между базой и хранением в нативном PHP-коде
     
    AlexandrS нравится это.
  6. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Походу к вечеру уже голова забита, возможно что-то уже не вижу.
    С конфигом, то что менять налету не правильно, я как раз тоже за это и думал, что чревато багом.
    Сейчас во 'view' из конфига берется имя шаблона, на основе этого имени формируется путь к директории с файлами на основе которого и рендерится сама страница с теми самыми
    HTML:
    1. <img src="images/pic01.jpg" alt="" />
    2. <img src="images/pic02.jpg" alt="" />
    Потом получается чтоб отобразились изображения и другие статические файлы шаблона, просиходят запросы "images/pic01.jpg" и эти запросы летят к скрипту который отвечает за вывод статикии соответственно в процессе всё также путь к реальным файлам проходит через всё тот же конфиг
     
  7. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    К пред. посту. Если у тебя местоположение статик обвеса фиксировано, ты можешь захардкодить ссылки на обвес прямо в разметке этого шаблона, максимум добавив в них переменную с «базой» сайта (это для «тупого» подхода, когда сайт может располагаться глубже его реального корня) или «базой» статик обвеса.
     
    AlexandrS нравится это.
  8. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Но ведь изначально же во view нужно передать имя шаблона и тут получается что если захардкодить имя другого шаблона, будет перекос. Т.е. подключится вьюха та что нужно, а из-за неправильного хардкода изображения могут тянуться другие.
    В любом случае благодарю за инфу, поразмышляю.
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Я тебе ранее писал, что для программного доступа к файлам используешь абс. пути, а для ссылок на обвес (стили, картинки, клиентские скрипты и т.п., относящиеся к общему оформлению) – абс. адреса.

    И тут еще такой момент: шаблон оформления можно разделить на две части: 1) файлы содержащие разметку и т.п., 2) собственно статик обвес. В собранных страницах по адресам ты обращаешься только ко второму. Эти адреса полностью или почти полностью (см. пред. пост) можно захардкодить в первом. Т.е. тебе для динамического изменения оформления достаточно где-то сохранять/откуда-то извлекать имя тек. шаблона для запуска первой группы файлов.
     
  10. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Да, но я как-то не совсем понял, что такое абсолютные и относительные пути я понимаю, но я не совсем понял чем речь.
    абс. пути и абс. адреса - это разное?

    Можно пример?

    Если я буду писать в ссылках на обвес ((стили, картинки, клиентские скрипты и т.п., относящиеся к общему оформлению) ) http://domain.com/style/css.css то будет идти обращение к не существующим файлам. Т.к. ведь всё это отдается через PHP.
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Абс. пути имелись в виду в ФС, а не в адресах.
     
    AlexandrS нравится это.
  12. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Разметка должна лежать по идее вне корня, например тут: /var/www/site/mods/first – это абс. путь в ФС (для каталога, но и у файлов аналогично).
    Обвес обычно лежит в пределах корня (хотя при отдаче статика скриптом это не обязательно, но давай для простоты отождествим физ. расположение файлов с их адресами), например по такому адресу: /a/first (физическое местоположение в ФС – /var/www/site/docs/a/first; /var/www/site/docs – это корень). Для работы «морды» сайта важны только адреса, а не физ. расположение.

    Как я ранее писал, не обязательно абс. пути в ФС или абс адреса хардкодить полностью (хотя для адресов это может быть вполне норм.). Обычно делают так: MODS_PATH.'first/...', ASSETS_BASE.'first/...' и т.п. Переменные/ф-ции вместо констант тоже допустимы.
     
    AlexandrS нравится это.
  13. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Т.е. то что у меня в автозагрузке и композере и то что пути идут относительно них это всё другое? Я как-то думал что это как раз таки избавляет от всех этих лишних движений с адресами.
     
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Не совсем понял, о чем ты. Это «в автозагрузке и композере» тоже используется. Но там речь прежде всего об автозагрузке классов, совмещении компонентов разных вендоров и т.п. Как это связано с твоими шаблонами, объясни.
     
  15. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Я просто запутался, где неправильно пути стоят
    тут:
    PHP:
    1.     private function preparePath($path)
    2.     {
    3.         return "webapp/general/content/templates/%%%%%%/design/$path";
    4.     }
    т.е. должно быть как-то так:

    PHP:
    1.     private function preparePath($path)
    2.     {
    3.         return " /var/www/site/webapp/general/content/templates/%%%%%%/design/$path";
    4.     }
    ?
     
  16. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Возвращать ты можешь и относительный, пусть и дополненный. Это зависит от логики. Проблема в том, что его же ты продолжаешь использовать в readfile.

    P.S. Как ранее писал, тут можно вообще обойтись без непосредственной работы с именем шаблона.
     
    AlexandrS нравится это.
  17. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Адреса вроде images/pic01.jpg для шаблонов тоже неправильные (использование тега base в расчет не беру). Нужно как-то так:
    HTML:
    1. src="/a/first/..."
    или
    HTML:
    1. src="<?= ASSETS_BASE ?>first/..."
    или
    HTML:
    1. src="<?= SITE_BASE ?>a/first/..."
    --- Добавлено ---
    Имя шаблона тут тоже можно через переменную вставлять, но обычно в этом нет необходимости.
     
    AlexandrS нравится это.