Есть ли такие реализации на PHP когда в одном файле пишется js, html, css, php, а движок разделяет их и выплевывает пользователю?

В общем нужда такая. Представим, что нам необходимо написать компонент для проекта на php. Этот компонент выводит, например, маленький div блоки с информацией о футбольной команде. В этом div есть статическая информация, есть какие-то интерактивные элементы, например кнопочка "Подписаться на новости команды".

Соответственно, нам бы хотелось вставлять этот компонент в проект в любом из шаблонов проекта (предположим используется шаблонизатор Smarty) как-нибудь так:
{SomeCMS::include_component('footbal_command_info', 'command_id:17');}

А сам компонент это один только файл где-то в дереве проекта, в котором описывается и css, и js, и html верстка, и логика php. CMS'ка при подключении данного компонента выделяет из него css, js, html, получает данные из БД согласно логики описанной на php и отдает клиенту страницу. И для клиента выглядит все так, будто я отдал ему среди прочего три файла:
footbal_command.js
footbal_command.css
index.html - в котором где-то глубоко есть блоки с фотбольными командами.

Есть ли такие CMS, возможно библиотеки, или возможно кто-то знает как этот подход называется. Подойдет любая помощь!

MVC - хорошо, я знаю. Но есть нужда именно в таком подходе.

Спасибо.
  • Вопрос задан
  • 3011 просмотров
Пригласить эксперта
Ответы на вопрос 4
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Такой подход называется "говнокод".

Вот вам пример:
пишите вы такой в php файле (внезапно) css стили например. Проблемы которые могут возникнут:
- расширяемость. Что бы поменять стили нужно лесть в какой-то файлик и разбираться. При этом в этом файлике содержится логика, и шаблоны и все на свете.
- автокомплит - на все IDE будут радостно подставлять вам значения и автодополнять селекторы.
- инструменты сборки типа autoprefixer, uglifycss и т.д. впилить будет проблематично. Так же в огромными кастылями придется вклинивать тот же livereload.

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

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

Уж извините, но то что вы не пользуетесь IDE и вам лень держать все в разных файлах - это ваши проблемы.
Ответ написан
KOLANICH
@KOLANICH
Знаю JS, PHP, C++, C#
А сам компонент это один только файл

А что мешает использовать папку? Если нужно распространять одним файлом, что мешает использовать архивы?
Ответ написан
viktorvsk
@viktorvsk
1) В чем смысл такой конспирации? Почему не написать и стиль и js инлайн? Так, кстати, будет и проще с подгрузкой элемента (никаких onload в js).
2) Почему не описывать такой блок тремя файлами: js, html, css. и подключать их соответственно при вызове в нужных местах?
3) Под ваше описание подходит метот yield в руби (www.tutorialspoint.com/ruby/ruby_blocks.htm). В Rails вы можете сделать что-то вроде:
<head>
<%= yeild :head %>
</head>
...
<body>
...
<div id="myBlock">
<%=  content_for :head { '<style>...</style>' } %>
</div>
</body>
Ответ написан
macik_spb
@macik_spb
Ф-ф-фрилансер :))
Во-первых, как тут правильно сказали — мешать все в один файл это очень плохо с точки зрения последующей поддержки кода.
Во-вторых, на сколько необходимо, чтобы код отдавался именно отдельными файлами? Ведь можно, как правильно написал @victorvsk включить весь код в страницу «inline». Это и для загрузки быстрее будет.

В принципе оба эти подхода реализуемы в плагинах CMS Cotonti. И хотя его плагины это обычно несколько отдельных js/css/php файлов подключаемых для загрузки, но можно реализовать и «inline» подход.

Приведу кусок кода для обоих вариантов:
1. подключение раздельных ресурсов
cot_rc_add_file($cot_bootstrap['css_file']); // подключаем CSS файл в <head>
cot_rc_link_footer($cot_bootstrap['js_file']); // подключаем JS файл в конец страницы


2. использование включения прямо в код:
// вставляем CSS код в текущее место выполнения скрипта
cot_rc_embed(".my_red{ color:red; }", false, 'css');
// подключаем JS код в конец страницы
cot_rc_embed_footer("javascript_var = $current_timestamp; console.log(javascript_var);");
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы