Jump to content
sv2109

hook pre render Идея и примерная реализация

Recommended Posts

У меня 2 варианта:

1. Добавить больше динамики в шаблоны. Приведу пример. Как сейчас все реализовано, например как выводятся табы для товара (написал без условий для лучшего понимания):

  <div id="tabs" class="htabs">
		<a href="#tab-description"><?php echo $tab_description; ?></a>
	<a href="#tab-attribute"><?php echo $tab_attribute; ?></a>
	<a href="#tab-review"><?php echo $tab_review; ?></a>
	<a href="#tab-related"><?php echo $tab_related; ?> (<?php echo count($products); ?>)</a>
  </div>
То есть все жестко прописано в коде и даже местами поменять например описание с атрибутами без правки шаблона не получится не говоря уже о том чтобы что-то добавить.

Как можно сделать. Создать массив $tabs, в котором каждый таб будет элементом этого массива, и выводить его с помощью foreach. В этом случае мы на сервере сможем и поменять местами табы переставив элементы массива и добавить новый таб добавив новые элемент и он потом выведется на странице, так как все табы печатаются через foreach.

Так же можно и меню выводить и разные списки и например поля для товаров итд. При таком подходе очень много чего можно будет переопределить на сервере с помощью например тех же хуков.

2. Opencart использует паттерн MVC для разделения логики на слои. У каждого слоя своя область применения. Так вот слой Представления в это самый близкий до пользователя слой он специально с создавался чтобы можно было без знания php и баз данных вносить изменения в код. Руками! Открыл нужный шаблон и добавил несколько строк html кода, это сейчас даже школьники делают на уроках информатики. А если человек занимается созданием сайтов то он просто обязан знать самые азы html-а и при необходимости добавить пару строк html кода в шаблон не должно составить для него вообще никакой трудности.

А истина скорее всего где-то посередине. И если найти компромисс между этими двумя вариантами то получится то что нужно. Например максимально добавить динамики в шаблоны чтобы можно было программно их изменять. А то что нельзя так сделать (или не выгодно потому что сильно усложнит логику или скажется на производительности) - просто править руками. Тем кто не умеет - учить html :)

Еще немного и компоненты (табы, таблицы и т.д. будут генериться почти без шаблонов - получится что-то типа Microsoft Foundation classes). Меньше логики в шаблоны! Вот шаблонизатор mustache не зря такой минималистичный.

Share this post


Link to post
Share on other sites

vQmod - говно! Я когда увидел в коде опенкарта что его встраивают - заплевал весь монитор ...

... но кому такая сборка нужна? На форуме людей понимающих о чем идёт речь в этой теме - полтора человека... остальных всё устраивает..

Нам нужна! Чтобы при следующем открытии редактора не хотелось плевать в монитор, понимая с чем приходится работать! И чтобы работа не превращалась в скучную рутину для зарабатывания денег, а чтобы получать от этой работы элементарное удовольствие, понимая что работаешь с реально хорошим движком, что у этого движка есть реальные перспективы, что он не просто не хуже аналогов, а даже превосходит их по множеству параметров и при этом постоянно развивается в правильном направлении становясь от этого еще лучше. А направление это не задаст большинство, им пофиг.. как-то работает ну и ладно.. Направление в большинстве проектов как раз и задают тех "полтора человека" и именно благодаря им мы и имеет сейчас Друпал, Линукс, Симфони...

Share this post


Link to post
Share on other sites

Еще немного и компоненты (табы, таблицы и т.д. будут генериться почти без шаблонов - получится что-то типа Microsoft Foundation classes). Меньше логики в шаблоны! Вот шаблонизатор mustache не зря такой минималистичный.

А теперь аргументируйте и предложите альтернативу.

Share this post


Link to post
Share on other sites

Еще в симфони есть компонент Лоадер, который позволяет автоматизировать процесс подключения классов с использованием неймспейсов. Для одного компонента я не стал его подключать, но если будут другие то есть смысл его настроить и все подключать через него.

В этом случае лучше не связываться с внешним кодом, проще свой автолоадер сделать через __autoload или лучше через spl_autoload_register, чтобы стек автолоадеров можно было набирать. Тогда остальные подобные приложения легко будет подключать.

  • +1 2

Share this post


Link to post
Share on other sites

В обсуждение нужно ввести какую то систему. Иначе будет каша и нулевой результат. Уже сейчас заметны шарахания из стороны в сторону. Может разделить на несколько подзадач? Шаблонизация, контроллеры, бизнес-модели, ядро и т.п.

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

Чтобы оптимизировать контроллеры, структурировать их функции и распределить по иерархии классов. Например в некоторых движках есть многоуровневое разделение функций между классами контроллеров 3-х и более уровней (и это помимо оверайда). ОбщийКонтроллер->ФронтКонтроллер->КонтроллерыСтраницы и т.п.

Возможно для работы с данными стоит ввести группу CRUD классов или что-то вроде xPDO.

Еще не помешает прежде чем делать репозитарии кода создать репозитарий проектной документации, взяв в качестве инструмента например Oracle Fusion Middleware. Если порядка в проекте не будет, то опять получится барахло. Серьезные вещи методом проб и ошибок не пишутся. Нужна стратегия и какое то управление обсуждением.

  • +1 3

Share this post


Link to post
Share on other sites

Другой вариант развития обсуждения и поиска решений - от проблем и слабых мест. Перечисляем слабые места ОС: шаблонизация, управлением модулями, кастомизация ядра и т.п.; потом определяем источники или причины этих проблем в ОС, ну и наконец предложения по их решению, а потом и кодирование новых решений.

  • +1 2

Share this post


Link to post
Share on other sites

Другой вариант развития обсуждения и поиска решений - от проблем и слабых мест. Перечисляем слабые места ОС: шаблонизация, управлением модулями, кастомизация ядра и т.п.; потом определяем источники или причины этих проблем в ОС, ну и наконец предложения по их решению, а потом и кодирование новых решений.

Да, все правильно. Я именно с этого и начал. Взял, на мой взгляд. самое слабое место ОС - невозможность что-либо переопределить без правки кода движка. Придумал реализацию системы хуков и событий. И создал для обсуждения именно этой проблемы эту тему. После чего тема превратилась "чего кому не хватает в ОС" :)

Нужно создать отдельную тему для обсуждения всех слабых мест. И каждое такое место обсуждать в отдельной теме, возможно даже в нескольких если есть несколько альтернативных решений.

Share this post


Link to post
Share on other sites

Да, все правильно. Я именно с этого и начал. Взял, на мой взгляд. самое слабое место ОС - невозможность что-либо переопределить без правки кода движка. Придумал реализацию системы хуков и событий. И создал для обсуждения именно этой проблемы эту тему. После чего тема превратилась "чего кому не хватает в ОС" :)

Нужно создать отдельную тему для обсуждения всех слабых мест. И каждое такое место обсуждать в отдельной теме, возможно даже в нескольких если есть несколько альтернативных решений.

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

С шаблонами там оказывается предлагается через переопределение функции preRender загружать файл шаблона, править его командами типа pred_replace на лету и потом передавать на рендеринг. Такой аналог vQmod. Но при желании можно вносить таким образом изменения и в шаблоны без их физической в правки.

  • +1 1

Share this post


Link to post
Share on other sites

Коллеги, для удобства совместной работы сделал такую доку http://smartceo.ru/o.../annotated.html. Если полезно - дайте, знать. Если нет - удалю чтобы место не занимала.Да кстати в этой доке включен оверайд движок и один тестовый класс для оверайда. Дока соответственно по 1.5.4.

  • +1 3

Share this post


Link to post
Share on other sites

Коллеги, для удобства совместной работы сделал такую доку http://smartceo.ru/o.../annotated.html. Если полезно - дайте, знать.

Вы бы это вынесли в отдельную тему. Так и эта тема была бы чище и отклик получили бы больший.

По доке. Спорный вопрос. Пользы с нее было бы больше если бы в коде использовались правильные комментарии с использование @param, @return, @var, @todo итд. Подобные док креаторы их вроде подхватывают. А так.. посмотреть, что все контроллеры наследуются от главного контроллера, это и так известно. Та и работать со структурой приходится редко, в основном нужен какой-то конкретный класс, который мне например удобнее открыть в редакторе (у меня NetBeans IDE 7.2), который во вкладке Навигатор покажет список всех методов и свойств этого класса, а по клику можно перейти к конкретному методу и посмотреть его код.

Это мое мнение. Но в любом случае за проделанную работу плюсую.

Share this post


Link to post
Share on other sites

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

Э-э... нет. Потом в коде одно, в html другое, а ты смотришь на 5 регулярок и думаешь: какого хера?

Коллеги, для удобства совместной работы сделал такую доку http://smartceo.ru/o.../annotated.html.

В общем-то пока не надо на самом деле - рано, нечего ещё смотреть.

sv2109, создавай ещё 2 темы

Share this post


Link to post
Share on other sites

С шаблонами там оказывается предлагается через переопределение функции preRender загружать файл шаблона, править его командами типа pred_replace на лету и потом передавать на рендеринг. Такой аналог vQmod. Но при желании можно вносить таким образом изменения и в шаблоны без их физической в правки.

Это категорически не правильно! Вся эта тема и создалась для того, чтобы найти некий аналог vqmod-а, который бы дал возможность на программном уровне без правки кода вносить изменения. А тут предлагается полный аналог vqmod-a, мало того имели 1 vqmod, а теперь получим целых 2..

Share this post


Link to post
Share on other sites

Вы бы это вынесли в отдельную тему. Так и эта тема была бы чище и отклик получили бы больший.

По доке. Спорный вопрос. Пользы с нее было бы больше если бы в коде использовались правильные комментарии с использование @param, @return, @var, @todo итд. Подобные док креаторы их вроде подхватывают. А так.. посмотреть, что все контроллеры наследуются от главного контроллера, это и так известно. Та и работать со структурой приходится редко, в основном нужен какой-то конкретный класс, который мне например удобнее открыть в редакторе (у меня NetBeans IDE 7.2), который во вкладке Навигатор покажет список всех методов и свойств этого класса, а по клику можно перейти к конкретному методу и посмотреть его код.

Это мое мнение. Но в любом случае за проделанную работу плюсую.

Да не вопрос, если бесполезно, то я зачищу. Мне не долго :-). А докгенератор действительно подхватывает разметку JavaDoc если она в коде есть :-). А если нет, то ...

Кстати даже из доки видна слабость развития структуры классов. Например берешь код многих контроллеров и видишь одни и те же строки вроде формирования хлебных крошек и т.п. Понятно, что можно было вынести это в класс предок, как во многих движках и делается. А на схемах видна убогая одноуровневость. Второй уровень там появился из-за установки движка оверрайд.

  • +1 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

NetBeans хорошая вещь, но я ее в основном использую для работы с JS кодом. Для PHP ZendStudio 7.1 + ZendDebbuger.

Share this post


Link to post
Share on other sites

По поводу способа правки шаблонов через preRender тоже против, когда через regexp-ы. На уровне данных, передаваемых в шаблон - за.

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

Это позволит выделить базовые элементы из шаблонов и при изменении темы кастомизировать их не только на уровне CSS.

Сейчас, например, чтобы сделать выбор страны в форме заказа-регистрации не в виде селектора, а в виде например текстового поля с комплишином надо попотеть, ну либо сделать jQuery-хак. Если же вынести однотопные элементы в отдельные шаблоны, то можно будет более гибко настраивать дизайн, да и верстальщик не придет в ужас, увидев тучу <?php в шаблонах.

Share this post


Link to post
Share on other sites

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

Да это и сейчас ни кто не мешает делать. Или предлагается сделать специальную дефолтную тему?

Кстати этих <?php без меры натыкано не от большого ума. Когда учть ли не каждый IF в собственные php тэги закрыт. Ну это же бред

<?php if ($categories) { ?>

<?php foreach ($categories as $category) { ?>

<tr>

<td style="text-align: center;"><?php if ($category['selected']) { ?>

<input type="checkbox" name="selected[]" value="<?php echo $category['category_id']; ?>" checked="checked" />

<?php } else { ?>

<input type="checkbox" name="selected[]" value="<?php echo $category['category_id']; ?>" />

<?php } ?></td>

<?php if ($category['href']) { ?>

<td class="left"><?php echo $category['indent']; ?><a href="<?php echo $category['href']; ?>"><?php echo $category['name']; ?></a></td>

<?php } else { ?>

<td class="left"><?php echo $category['indent']; ?><?php echo $category['name']; ?></td>

<?php } ?>

<td class="right"><?php echo $category['sort_order']; ?></td>

<td class="right"><?php foreach ($category['action'] as $action) { ?>

[ <a href=<?php echo $action['href]; ?>"><?php echo $action['text']; ?></a> ]

<?php } ?></td>

</tr>

<?php } ?>

<?php } else { ?>

<tr>

<td class="center" colspan="4"><?php echo $text_no_results; ?></td>

</tr>

<?php } ?>

Ну зачем так

<?php if ($categories) { ?>

<?php foreach ($categories as $category) { ?>

каждую строку в свой тэг.

Неужто так <?php if ($categories) {

foreach ($categories as $category) { ?>

нельзя было хотя бы.

Да тут в половину кож ужать можно.

В конце концов можно перенастроить php в htaccess и использовать короткие phph тэги и исключить использование echo.

Share this post


Link to post
Share on other sites
toporchillo, не совсем понял. Ты сейчас говоришь про плейсхолдеры (типа, позиций в Joomla и виджетов в WP) в шаблонах? Есть Layouts, но они слишком неповоротливые. Было бы не плохо упростить до одной строчки кода регистрацию нового Layout'a, да.

Share this post


Link to post
Share on other sites

toporchillo, не совсем понял. Ты сейчас говоришь про плейсхолдеры (типа, позиций в Joomla и виджетов в WP) в шаблонах? Есть Layouts, но они слишком неповоротливые. Было бы не плохо упростить до одной строчки кода регистрацию нового Layout'a, да.

Я имел в виду дефолтную тему разбить на файлы более мелко с инклудами внутри шаблонов. Так же вынести javascript отдельно. (Например в checkout.tpl) его много. Тогда дизайнеру будет проще заниматься кастомизацией. Но в крайность, когда html полностью формируется в методе контроллера (или библиотеки визуальных элементов) не в падать.

Сейчас если верстальщик сверстал дизайн-шаблон в своем css, то натянуть его на openCart ну очень трудно. И нормальный способ создать свою тему - это колдовать с CSS, а трогать html глобально ну очень тяжело.

Share this post


Link to post
Share on other sites

JS вообще по делу должен быть только в <head> причем не все подряд, а только нужное генерируется динамически...

Share this post


Link to post
Share on other sites

JS вообще по делу должен быть только в <head> причем не все подряд, а только нужное генерируется динамически...

JS должен быть в файлах .js

Share this post


Link to post
Share on other sites

JS должен быть в файлах .js

... или *.php

<?php header("Content-type: text/javascript"); ?>
Личном мне динамическая генерация нравится.

Share this post


Link to post
Share on other sites

А шаблонизаторы типа Smarty попробовать не хотите? Они ограничивают возможности построения сложной логики в шаблонах и тем дисциплинируют.

Share this post


Link to post
Share on other sites

Кстати как вариант проблемы с шаблоном - делать как в Magento, там есть так называемая тема blank, то есть без всякого стилевого оформления. Выдается только голый HTML код, на который CSS делается с нуля.

Share this post


Link to post
Share on other sites

А шаблонизаторы типа Smarty попробовать не хотите? Они ограничивают возможности построения сложной логики в шаблонах и тем дисциплинируют.

Smarty хорош, но его сила в эскейпах, форматировании дат и т.л. когда можно {$str|escape:html} делать. Но OpenCart все это делает на уровне контроллера-шаблонизатора. Так же смарти позволяет делать {php}...{/php}, а это уже не очень.

Есть еще шаблонизатор mustache. Плюс в том, что его синтаксис минимальный, но все что надо есть. Вот он точно дисциплинирует.

А еще есть blitz. Минус в том, что нужно ставить отдельный php-модуль, но летает.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.