Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Новый шаблонизатор или очередной велостпед

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
Longi
Отправлено: 11 Октября, 2011 - 00:52:31
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




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

Итак сначало Вступление.

Зачем вообще я завел эту тему!?

Года 3 я кодил на C# и C++, соответственно на .NET фреймворке. Тут судьба распорядилась так, что стал я заниматься php и прочей веб лабудой, месяца 3 или 4 уже. Когда я начал, после .NET, я конечно был в шоке от такого бардака (новички меня поймут, да и профи тоже должны). Спустя эти месяцы, меня сильно начали напрягать (сейчас надо правильно выразиться чтоб меня поняли...) шаблонизаторы которые существуют на данный момент ну или те о которых мне известно, точне то чего в них нет, и то, что они утверждают, что отделяют бизнес логику от логики отображения. Логика должа разделяться архитектурой приложения, и концепцией шаблонизатора. То что версальщик и кодер могут независимо работать, тоже байка, они по любому работают
сообща, а иначе один из них такой геморой получит, и на выходе полный изврат получится.

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

Но что то я отвлекся от темы. Кто хоть раз связывался с WPF и xaml разметкой тот меня сразу поймет. Microsoft всетаки молодцы, такую класную вещь придумали. Вот только для php никто подобного не сделал. Хотя может и сделали, но я сегодня весь день ковырялся в инете, в поисках и увы.

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

Теперь ответ на выше поставленный вопрос, поднял я эту тему чтоб общественность высказалась, нужен этот велосипед или нет. По итогам так сказать голосования и коментариев я может напишу PEAR и PECL расширения. Плюс, я всетаки не все аспекты php знаю так что нужны советы и замечания Гуру, и пожелания простых смертных.

Теперь Вестч.

Начнем со структуры данных, у нас значит есть классы модели, неважно чо в них и как это все заполняетсяю Так же неких Класс ViewModel в котором эти модели как нам нужно содержаться.

вот наглядно
PHP:
скопировать код в буфер обмена
  1.  
  2. class MenuItem{
  3.         var $Link;
  4.         Var $DisplayName;
  5. }
  6.  
  7. class MainMenuModel{
  8.         function Load(){
  9.                 //Здесь допустим логика заполнения
  10.         }
  11.         var $Items = array();//массив объектов MenuItem
  12. }
  13.  
  14. class FormModel{
  15.         var $InputTextLabel = 'тра та та';
  16.         var $InputTextValue = 'а здесь шиш';
  17. }
  18.  
  19. class ClassViewModel{
  20.         var $MainMenu = new MainMenuModel->Load(); // это не совсем корректно но общая идея понятна
  21.         var $Title = 'бла бла бла';
  22.         var $Header = 'Твой НЭДЭР';
  23.         var $Form = new FormModel();
  24. }
  25.  

Ничего нового... стандартное ООП


Теперь гденить в контроллере
PHP:
скопировать код в буфер обмена
  1.  
  2. MyTemplateEngine::DataContext = new ClassViewModel();
  3. MyTemplateEngine::Render();


Теперь наши шаблоны. Что бы примерно показать возможности системы я сделал два файла с расширением xml, такое расширение было выбрано просто потому что во всех код-редакторах неизвестные тэги и атрибуты нормально подсвечиваются, хотя правельней использовать расширение xaml.

Теперь внимание может быть очень много непонятного

page.xml

CODE (html):
скопировать код в буфер обмена
  1. //В Начале файла шаблона есть возможность включать блок <Resources> в нем будут храниться различные ресурсы шаблона, в том числе и другие шаблоны
  2. <Resources>
  3.  
  4.     // а вот и первый шаблон, он имеет свой уникальный id для того чтобы его использовать дальше
  5.     <DataTemplate id="Header">
  6.         // здесь я думаю все понятно кроме {Bind Header},
  7.         // эта конструкция привязывает значение переменной Header из переданного ему DataSources
  8.         // поскольку у шаблона явно не объявлен DataSources, (ниже увидите)
  9.         // а как мы помним MyTemplateEngine::DataContext = new ClassViewModel(); и так далее
  10.         // значит значение берется прям из DataContext
  11.         <h1>Привет! это я, {Bind Header}</h1>
  12.     </DataTemplate>
  13.    
  14.     //Так же допустимо создавать шаблоны из внешних файлов
  15.     // естественно эти файлы должны состоять из html тэгов и других шаблонов, но не должны обворачиваться в тэг DataTemplate
  16.     <DataTemplate id="FormTemplate" Sources="FormTemplate.xml"/>
  17.    
  18. </Resources>
  19.  
  20. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  21. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  22. <html xmlns="http://www.w3.org/1999/xhtml">
  23.  
  24. <head>
  25.     <title>{Bind Title}</title>
  26. </head>
  27.  
  28. <body>
  29.     // а вот и вставка шаблона. tpl: - значит что вызывается шаблон, Header - естественно id шаблона
  30.     <tpl:Header/>
  31.    
  32.     // а вот и то что мне нехватало в имеющихся шаблонизаторах
  33.     // fe: - вызывается стандартный элемент управления, что он из себя представляет расскажу позже
  34.     // TreeView я думаю всем понятно
  35.    
  36.     <fe:TreeView id="main_menu" DataSources="{Bind MainMenu}" ItemSouces="{Bind Items}">
  37. // Также вы видите третий вариант объявления и сразу привязки шаблона к ItemTemplate, id шаблона задается системой
  38.         <ItemTemplate>
  39.                 <a href="{Bind Link}">{Bind DisplayName}</a>
  40.         </ItemTemplate>
  41.     </fe:TreeView>
  42.    
  43.     <form method="get" enctype="text/plain">
  44.         //здесь явно заданется DataSources
  45.         <tpl:FormTemplate DataSources="{Bind Form}"/>
  46.     </form>
  47.        
  48.     <div>
  49.         <tpl:FormTemplate DataSources="{Bind Form}">
  50.                 Этот текст будет стоять внутри FormTemplate,
  51.                 пока незнаю где в начале или конце, надо это продумать
  52.         </tpl:FormTemplate>        
  53.     </div>
  54.    
  55. </body>
  56. </html>


и FormTemplate.xml

CODE (html):
скопировать код в буфер обмена
  1. {Bind InputTextLabel}<br/>
  2. <input type="text" value="{Bind InputTextValue}" /><br/>
  3. <input type="submit" />


Ну примерно като так...

Теперь насчет стандартных Элементов таких как TreeView, они состоят из обычных html тэгов и php кода, содержат минимум javascript-а для поддержания базового функционала на стороне клиента, и минимун css для правельного отображения. То есть, он легко стлизуем, и на него без вреда для здоровья можно лепить свои скрипты.

Теперь, по моему мнению, плюсы
* Файлы разметки вообще не содержат ни какого кода. Конечно в шаблоне нужна некая логика, я пока не продумал как это будет, возможно чтото вроде тригеров или ValueConverter-ов в WPF. Но конструкций типо include или вызов функций, не будет - изначально задумано концепцией.
* Четко видна структура шаблона
* главный, я считаю плюс и мой любимый. Элементы управления, которые кстати избавляют от таких конструкций в шаблоне как for, while. Естествнно есть возможность делать свои элементы управления, и прикручивать их к системе.
* на выходе получаем чистый html документ без пробельных символов, коментариев, и прочей ненужной фигни.
* также имеется стек css и javascript, чтоб к странице небыло прикручено несколько одинаковых скриптов и стилей. Это позволяет каждому элементу и шаблону, прям внутри разметки, без опасений клеить скрипты и стили. Если шаблон на странице используется не один раз, то стиль или скрипт будет объявлен единажды.
* и конечно система кеширования.

Так вот. Кто дочитал до конца, тому я сочувствую ))) чтото может я упустил или корявенько написал, мне прастительно - у меня уже третий час ночи. Так что задавайте вопросы если чтото не ясно.

Спасибо всем прочитавшим и особенно оставившим свое мнение и советы...
PS Можно будет продолжать эту тему, может чтонить интересное слепим. Мастера и новички, подключайтесь кому интересно...
(Добавление)
Еще маленькое дополнение

еще можно сделать альтернативный синтаксис зарезервированных слов для любителей сокращений иподдержания стиля html

что то типо такого

Layout | lay
ContentTemplate | cnttpl
ItemTemplate | itmtpl
Sources | src
DataSources | dsrc
Resources | res
DataTemplate | dtpl

(Отредактировано автором: 11 Октября, 2011 - 01:13:08)

 
 Top
DlTA
Отправлено: 11 Октября, 2011 - 01:24:28
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




вопрос производительности
скольких юзеров будет достаточно чтоб сайт пал смертью храбрых???
 
 Top
Longi
Отправлено: 11 Октября, 2011 - 01:31:04
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




DlTA пишет:
вопрос производительности
скольких юзеров будет достаточно чтоб сайт пал смертью храбрых???


Зависит от сервака... в конечном итоге каждый шаблон в отдельности будет переведен в php скрипт, и сохранен в папочку кеша. И следующий раз перекешируется только при изменении исходного файла. Так что производительность будет такая же как у php скрипта.
 
 Top
DlTA
Отправлено: 11 Октября, 2011 - 01:40:27
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




так тогда это уже копмилируемый шаблон


хотя вообще не вижу улучшения в сторону удобства между
"<tpl:FormTemplate DataSources="{Bind Form}"/>"
и например
"<?=@$data['val']?>" (каким небудь)
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Октября, 2011 - 01:50:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Longi пишет:
Конечно в шаблоне нужна некая логика, я пока не продумал как это будет, возможно чтото вроде тригеров или ValueConverter-ов в WPF.
Не придираюсь к тому, что еще не придумали. Хочу указать лишь на то, что идёте вы в сторону придумывания нового синтаксиса для шаблонов.
Самое важное для интерпретируемого языка, это - скорость выполнения и уменьшение ресурсов, которые он будет в это время пожирать.
Понятно, что за удобство придется платить..
Идея очень хороша. Делайте конечно.

Я же наоборот отказался от шаблонизатора как такового. Именно для скорости.
Если не вникать в детали, то так:
PHP:
скопировать код в буфер обмена
  1. class template {
  2.  
  3.   private $vars = array();
  4.   private $tpl = null;
  5.  
  6.   function __construct() {
  7.     $this->assign("title","Титла главной странички");
  8.     }
  9.  
  10.   function headers() {
  11.     header("Content-Type: text/html; charset=utf-8");
  12.     }
  13.  
  14.   function p404($message = "") {
  15.     $this->setTemplate("views/templates/404.tpl.php");
  16.     header("HTTP/1.0 404 Not Found");
  17.     $this->headers();
  18.     $this->draw();
  19.     die();
  20.     }
  21.  
  22.   function setTemplate($path) {
  23.     if (!file_exists($path)) die("Template file: $path not exists");
  24.     $this->tpl = $path;
  25.     }
  26.  
  27.   function draw() {
  28.     if ($this->tpl === null) die("You don't have template");
  29.     extract($this->vars);
  30.     require_once($this->gtpl);
  31.     }
  32.  
  33.   function assign($item,$i = null) {
  34.     if (!is_array($item) and $i !== null) $this->vars[$item] = $i;
  35.     elseif (is_array($item) and $i === null) $this->vars += $item;
  36.     else die("Method expects the key of var");
  37.     }
  38.  
  39.   }

В реалиях оно еще умеет автоматически "рожать" пагинацию.
Выводить любой запрошенный блок (не макрос!!!) (с нужными параметрами: лимит, сортировка) прямо в шаблоне.
Тесно общается с буфером, т.е. не вызывает лишний раз метод какого либо класса, ну того же меню, которое по идее ломится в базу и т.д...
Если что-то ранее вызывалось - берем данные из буфера.
Страница со всеми списками, пагинаторами, меню, блоков новостей,
аутенфикацией юзера и пр.. обходится мне в 3-10 запросов к базе..
Сами шаблоны же просто хтмл-странички с пхп-вставками с обычным синтаксисом.
Всеравно шаблоны делаются для всех вариантов отображения юзеру.

В вашем случае придется шаблоны эти парсить, парсить, парсить...
Я - за скорость.
 
 Top
Longi
Отправлено: 11 Октября, 2011 - 01:58:17
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




DlTA пишет:
так тогда это уже копмилируемый шаблон


хотя вообще не вижу улучшения в сторону удобства между
"<tpl:FormTemplate DataSources="{Bind Form}"/>"
и например
"<?=@$data['val']?>" (каким небудь)


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

в удобстве {Bind Form} и <?=@$data['val']?> не различаются, я щас именно так и делаю впринцепи. Но глаза это всетаки режет, особенно когда большой шаблон. И плюс хочу облегчить жинь версальшикам.

Удобство заключается в использовании элементов управления, и манипуляции с шаблонами.
И еще рез повторюсь, структуру документа сразу видно, если из моего первого поста уберете все коментарии будет видно.
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Октября, 2011 - 02:01:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DeepVarvar пишет:
Самое важное для интерпретируемого языка, это - скорость выполнения и уменьшение ресурсов, которые он будет в это время пожирать.
 
 Top
Longi
Отправлено: 11 Октября, 2011 - 02:14:42
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Цитата:
В вашем случае придется шаблоны эти парсить, парсить, парсить...
Я - за скорость.


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

Единственное пока как я думаю по времени уязвимое место, это постоянные сверки даты компиляции шаблона и последнего изменения исходного файла шаблона.
Либо сделать ручную компиляцию шаблона, то есть - исходник изменил, во фраймворке скрип запустил - шаблон скомпилировался. Но тут получается некое неудобство. Или сделать расширенные функции по компиляции шаблонов. Чтото типо режимов debug и relese.

Что вы думаете по этому поводу???
 
 Top
DlTA
Отправлено: 11 Октября, 2011 - 02:14:53
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




Longi пишет:
Удобство заключается в использовании элементов управления, и манипуляции с шаблонами.
если можно то хотелось бы пример манипуляции, и использования.
(Добавление)
Longi пишет:
ибо сделать ручную компиляцию шаблона, то есть - исходник изменил, во фраймворке скрип запустил - шаблон скомпилировался. Но тут получается некое неудобство. Или сделать расширенные функции по компиляции шаблонов. Чтото типо режимов debug и relese.
ребилд шаблона можно проводить (как вариант) либо раз в сутки, либо при вызове с флогом "debug"
тем самым отпадает необходимость сверять время создания скомпиленного шаблона, ну и всякие остальные тонкости
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Октября, 2011 - 02:34:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Фреймворки и так тяжелые... А вы еще "жирка" подкинете..
Компиляция шаблонов...
Ну да я сказал уже, что идея интересная..

Просто каждый идет своим путем.
Я в основном копаюсь в уже действующих сайтах и скажу что дерьма там мама не горюй..
Тех, кто работает реально чисто, кто к коду относится щепетильно - еденицы..
Остальные - быдлокодеры. Да и сам я не особо высокого полета,
вон, велики свои изобретаю..
Ну насмотрелся я на тыщу раз правленный код..
Что в фреймворках, что в чьих-то велосипедах..


Делайте свое дело - ничто за зря не будет - у вас опыт не малый, но и в вебе есть свои тонкости.
 
 Top
Longi
Отправлено: 11 Октября, 2011 - 02:34:56
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




DlTA пишет:
Longi пишет:
Удобство заключается в использовании элементов управления, и манипуляции с шаблонами.
если можно то хотелось бы пример манипуляции, и использования.


Например TreeView

у нас уже есть сформированная древовидная структура допустим это Menu->MenuItems[]->MenuItems[] и тд

Использование элемента

<fe:TreeView DataSources="Menu" ItemSources="MenuItems" ItemTemplate />
вот эта строчка делает на самом деле примерно такое

<div>
<?php function creatNode($MenuItems) { ?>
<ul>
<?php foreach ($MenuItems as $key => $value):?>
<li><?php echo$value->name; if($value->$MenuItems)creatNode($value->$MenuItems)?></li>
<?php endforeach?>
</ul>
<?php }?>
</div>

а вот список подобных элементом ListView, TabBox и короче куча всякой фигни...

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

(Отредактировано автором: 11 Октября, 2011 - 02:41:24)

 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Октября, 2011 - 02:46:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Longi пишет:
<fe:TreeView DataSources="Menu" ItemSources="MenuItems" ItemTemplate />
DiafanCMS
 
 Top
Longi
Отправлено: 11 Октября, 2011 - 02:51:02
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Цитата:
либо при вызове с флогом "debug"


Да, я тоже больше склоняюсь к этому варианту. Но не уверен, поэтому и спрашиваю...

кстати Может ктонить знает что будет быстрее если инклудить такое

<?php echo "<span>тра та та ".$name."</span> еще какие нить тэги"?>

или такое

<span>тра та та<?php echo$name?></span> еще какие нить тэги

Во втором случае количество символов однозначно меньше, соответственно, парсится интерпретатором будет быстрее...
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Октября, 2011 - 02:55:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Второй вариант быстрее.
Выиграете микросекунды..
 
 Top
Longi
Отправлено: 11 Октября, 2011 - 03:05:03
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Цитата:
DiafanCMS

Очень даже может быть, точнее XSLT шаблон, но что в них не хорошо, если я не ошибаюсь, перед тем как шаблон запустить необходимо модель данных конвертировать в xmldocument а потом еще и преобразование шаблона, и все это на лету... Хотя надо проверить, покопать глубже. Может я на этом варианте и остановлюсь, но это уже завтро...
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« CMS и фреймворки »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB