[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите разобраться
TMake
Добрый день.
У меня возникла потребность для автоматизирования своего процесса и именьшения времени на затраты по выполнению работы и решил посоветоваться с людьми.
Мне необходимо сделать отдельные компоненты например:
- Считывание контента
- движек меню
- фото альбом
- голосование
- гостевая
- форма обратной связи и т.д.
Что бы все компоненты были не зависемы от структуры дизайна и выполняли только механический труд. А в отдельной папки был движок с дизайном который все полученные значения раставлял на нужные места.
Я предпологаю что это делается с помощью классов для создание отдельных объектов, но я не могу дойти каким это образом.
Вот на пример необходимо сделать простейший компонент который будет считывать контент из .txt файла как на php реализовать я знаю но как это связать с классами?



Спустя 25 минут, 4 секунды (2.06.2009 - 13:00) Alehandr написал(а):
MVC глянь...

Спустя 1 час, 49 минут, 52 секунды (2.06.2009 - 14:50) glock18 написал(а):
Можешь посмотреть какой-нибудь из mvc-фреймворков, если не очень охота самому это дело писать. А вообще разделение дизайна и кода делается на php достаточно просто и без mvc. Twin здесь где-то ролик на флеше выкладывал как, например, это можно сделать.

В двух словах:
1. Для разделения тебе вовсе необязательно писать классы.
2. Аналогично mvc - в одном скрипте делаются только вычисления, в другом скрипте делается вывод этих вычислений (по сути view в mvc).
3. Эти файлы подключаются один за другим.

простейший вариант:

файл с расчетами.

PHP
// запрос в базу.
// выбрал, посчитал
// получил
$var 'Hello world'// например это


файл с выводом вычислений примерно такого формата:
PHP
<p>Вот что мы получили после расчетов: &lt;?php echo $var; ?&gt;</p>


&lt; - это <
&gt; - это >

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

Выбирай, в общем, что тебе по силам.

PS модераторам: когда вставил <?php echo $var; ?>, wysiwyg удалил ?> и последующий за ним </p> при отображении.

Спустя 6 минут, 37 секунд (2.06.2009 - 14:57) sergeiss написал(а):
Цитата (glock18 @ 2.06.2009 - 15:50)
PS модераторам: когда вставил <?php echo $var; ?>, wysiwyg удалил ?> и последующий за ним </p> при отображении.

Это, скорее не модераторам, а администрации сайта smile.gif Потому как функции модерирования есть у Экспертов, но управлять такими тонкостями мы не можем (это уже код).
Вариантов решения 2:
Или просто помещать в тэги CODE (HTML), или ставить пробелы (кому надо - тот поймет, как правильно):
PHP
<p>...расчетов: < ?php echo $var; ? ></p>

Код
<p>...расчетов: <?php echo $var; ?></p>

HTML
<p>...расчетов: <?php echo $var; ?></p>

На данный момент это считается "не бага, а фича" smile.gif

Спустя 2 минуты, 24 секунды (2.06.2009 - 14:59) vedmed написал(а):
Способ предложенный glock18, не очень хороший, т.к. в себе будет сочетать html и php в одном файле. Как варианты: jQuery+html+php, либо, как уже было сказано выше Smarty+PHP.

Спустя 10 минут, 30 секунд (2.06.2009 - 15:10) sergeiss написал(а):
Цитата (vedmed @ 2.06.2009 - 15:59)
Способ предложенный glock18, не очень хороший, т.к. в себе будет сочетать html и php в одном файле.

И чем же это плохо? blink.gif Тем, что кто-то где-то когда-то тебе об этом сказал?

Спустя 5 минут, 51 секунда (2.06.2009 - 15:16) twin написал(а):
Тут ужже эту багу фичу отловили.

PHP
<p>...расчетов: <?php echo $var;?></p>


Если заканчивается на HTML коде, чтоб не резало, надо так:
[РНР]<p>...расчетов: <?php echo $var; ?></p>
<??>[/РНР]

vedmed
Щас наговоришь. Плох ему...
А Смарти километровый хорош? а jQuery таскать из за 2 строчек кода хорошо? Эти все фреймворки и шаблонизаторы - как корове пятое седло. В сто раз проще и эффективнее работают приложения без этих излишеств. Только нужно с умом подойти. И где ты там увидел
Цитата
будет сочетать html и php в одном файле.

?

Спустя 13 минут, 28 секунд (2.06.2009 - 15:29) vedmed написал(а):
Цитата (sergeiss @ 2.06.2009 - 12:10)
Цитата (vedmed @ 2.06.2009 - 15:59)
Способ предложенный glock18, не очень хороший, т.к. в себе будет сочетать html и php в одном файле.

И чем же это плохо? blink.gif Тем, что кто-то где-то когда-то тебе об этом сказал?

Почему же кто-то??? Дизайн и код надо отделять друг от друга, эт нормальная практика. Есть верстальщики есть программисты. В нормальном проекте - это разные люди.
"На сколько это возможно, код должен быть отделён от конечного
представления, которым является HTML/CSS/JavaScript код." Никогда не задумывался над вопросом почему есть отдельные файлы css,js? Можно ведь тоже все лепить в одном html файле. И нормально будет smile.gif

twin
HTML
<p>...расчетов: <?php echo $var; ?></p>
- а разве это не сочетание php и html тегов?

"Эти все фреймворки и шаблонизаторы - как корове пятое седло." - хых, ну-ну. Хочешь сказать что jQuery пустое место? Может напишешь скрипт на JavaScript, а я на jQuery и посмотрим у кого код короче будет?

Спустя 14 минут, 1 секунда (2.06.2009 - 15:43) Alehandr написал(а):
vedmed
А при чем тут вообще jQuery, он что, будет работать как шаблонизатор? А если пользователь отключил JavaScript?

p.s.: я вообще использую Mootools... Говорить, что он лучше или хуже не буду...

Спустя 3 минуты, 30 секунд (2.06.2009 - 15:46) vedmed написал(а):
Цитата (Alehandr @ 2.06.2009 - 12:43)
vedmed
А при чем тут вообще jQuery, он что, будет работать как шаблонизатор? А если пользователь отключил JavaScript?

p.s.: я вообще использую Mootools... Говорить, что он лучше или хуже не буду...

Как вариант прослойки между html и php, чтобы не использовать шаблоны.

Спустя 1 минута, 10 секунд (2.06.2009 - 15:48) glock18 написал(а):
Цитата
[РНР]<p>...расчетов: <?php echo $var; ?></p>
<??>[/РНР]


симпатичный баг-фикс. Спасибо.

2vedmed
Вообще то наилучший способ на мой взгляд, как раз тот, который тебе не нравится. Конечно, не думаю, что smarty сильно тормозить сайт, но мне лично возможностей его не хватило. Другие движки даже смотреть не стал, а вариант с расширением самого смарти сразу отбросил, ибо заставить надежно работать строку типа:

PHP
echo MyClass::myStaticMethod()->getEntity()->name// name, допустим получается при помощи метода __get();


в шаблонном движке представляется... не представляется разумным.

Спустя 2 минуты, 11 секунд (2.06.2009 - 15:50) twin написал(а):
Цитата
- а разве это не сочетание php и html тегов?

Вот отсюда и все это глобальное заблуждение.
НЕТ.
<?php echo $var; ?>
Это HTML тег, позволяющий вставить в html страницу результат вычислений php процессора.
Это так задумывалось и так реализовано. А не наоборот. Сервер берет эти результаты и вставляет куда нужно.
А хваленая СМАРТИ сначала заставляет сервер сгенерить готовую HTML страницу, записывает её целиком в память PHP процессора, мутит там с ним, бъёт в бубен и снова заставляет основной сервер генерить страницу. То есть делается даже не двойная, а тройная работа.
Плюс к этому гипертрофированный язык шаблонизации...
И это считается хорошим тоном. Кашмар.
И бизнес-логику с представлением делить совсем не всегда оправдано. Это тоже дань моде. Это нужно на больших проектах, тех, которые обслуживают разные категории людей - верстальщики, дизайнеры и программисты. А домашнюю страничку на много удобнее сделать так называемым "быдлокодингом". Если ты сам себе и программист и верстальщик.

Спустя 4 минуты, 5 секунд (2.06.2009 - 15:54) glock18 написал(а):
2vedmed
Если html и php занимаются разные люди и, тот кто занимается html непроходимо туп, то предложенный способ не подходит smile.gif

И вообще если говорить о нормальном разделении html и кода, то js тоже надо отделять абсолютно от html. Не только выделив его в отдельный файл... Не знаю как mootools, а jquery может в этом помочь одним способом - устанавливать все обработчики событий его методами, а не в html.

Цитата
А при чем тут вообще jQuery, он что, будет работать как шаблонизатор? А если пользователь отключил JavaScript?

p.s.: я вообще использую Mootools... Говорить, что он лучше или хуже не буду...


Улыбнуло smile.gif Думаю, что Mootools не отличится крутостью как и jquery, если вырубить Javascript.

Спустя 6 минут, 11 секунд (2.06.2009 - 16:00) vedmed написал(а):
Цитата (twin @ 2.06.2009 - 12:50)
Цитата
- а разве это не сочетание php и html тегов?

Вот отсюда и все это глобальное заблуждение.
НЕТ.
<?php echo $var; ?>
Это HTML тег, позволяющий вставить в html страницу результат вычислений php процессора.

1.
Интересно утверждение, залез посмотреть не встречается ли такой тэг в спецификации HTML. НЕТ! Ссылко:http://www.w3schools.com/tags/default.asp. Это не тэг html. Эт означает, что дальше идет код PHP, который является встраиваемым языком. Но никак не тэг html!
2.
Насчет того, что для простых вещей можно использовать более простые решения-согласен. Но человек, хочет написать грамотно хорошую весчь, а значит нуно писать как нужно, а не как легче, или даже как могу. Эт мое мнение.

Спустя 2 минуты, 3 секунды (2.06.2009 - 16:02) Alehandr написал(а):
Давайте вообще забудем про JavaScript фрэймворки, они тут не при чем...

А вот отделить HTML напрочь от PHP думаю совершенно не возможно, либо придется использовать специальные теги шаблонизаторов (Smarty и т.п.)...

Что-же касаемо раздельной работы программистов и верстальщиков, обычно программисты говорят верстальщикам, что вставить за место определенного текста, как для примера <?=$var?>.

Спустя 4 минуты, 17 секунд (2.06.2009 - 16:06) vedmed написал(а):
Цитата (glock18 @ 2.06.2009 - 12:54)
2vedmed
Если html и php занимаются разные люди и, тот кто занимается html непроходимо туп, то предложенный способ не подходит  smile.gif

И вообще если говорить о нормальном разделении html и кода, то js тоже надо отделять абсолютно от html. Не только выделив его в отдельный файл...

1. У каждого свои задачи. И дело не в тупости. Допустим чтобы сгенерить страницу нужно сделать 20 запросов к базе. Запросы к базе и обработка запросов - дело программиста. Верстка html - дело дизайнера/верстальщика.

2. Дык я об этом и говорю. В jQuery эт делается очень просто: $("MyButtom").click(.....) . И тут никто никому не мешает, ни дизайнер программисту, не программист дизайнеру, каждый занимается своей работой.

Спустя 4 минуты, 49 секунд (2.06.2009 - 16:11) Alehandr написал(а):
vedmed
Ща ругаться буду. smile.gif Выкинь в данный момент из головы JavaScript... Предположи, что он выключен у половины пользователей ресурса...

Спустя 4 минуты, 17 секунд (2.06.2009 - 16:16) glock18 написал(а):
Цитата
Что-же касаемо раздельной работы программистов и верстальщиков, обычно программисты говорят верстальщикам, что вставить за место определенного текста, как для примера <?=$var?>.


Поддерживаю на все 100. Возможности общаться разработчиков никто не лишал.

Цитата
Интересно утверждение, залез посмотреть не встречается ли такой тэг в спецификации HTML. НЕТ! Ссылко:http://www.w3schools.com/tags/default.asp. Это не тэг html. Эт означает, что дальше идет код PHP, который является встраиваемым языком. Но никак не тэг html!


Не по существу. Смысл этого <тега> такой: "Тут надо вставить переменную".

Спустя 9 секунд (2.06.2009 - 16:16) twin написал(а):
Цитата
не встречается ли такой тэг в спецификации HTML. НЕТ!

Вот дотошный какой biggrin.gif Я имею ввиду суть, а не спецификацию.

Вообще PHP это сам по себе и есть шаблонизатор, это тот же набор скриптов, только на С. а тут делается шаблонизатор на шаблонизаторе. Ну почему смарти не написали на С или перле на худой конец? Да потому что тогда получится второй php. А это глупо. Ровно как и то, что можно написать шаблонизатор на смарти. Ведь там тоже есть своеобразная логика.
Кстати, о птичках.
Вот этого
PHP
<?php echo $var

ты боишься, это смешание php и html. Очень страшная вещь, просто ужас. А вот это:
PHP
{foreach src="level"} 
<p><a href="{link_out}">{namemenu}</a></p> 
{/foreach src="level"}
Верх простоты и лаконичности. Я не буду продолжать тему, я уже это делал не раз. Кому нужно, сами сделают выводы.

Спустя 3 минуты, 28 секунд (2.06.2009 - 16:19) glock18 написал(а):
Кстати насчет профессинально сделанных продуктов. Если не ошибаюсь, zend framework всем известной компании не использует шаблонизатор. Ряд фреймворков дают шаблонизатор только для того, чтобы те кто привык с ним работать, работали с ним.

Спустя 1 минута, 13 секунд (2.06.2009 - 16:20) vedmed написал(а):
Я ж не говорю, что боюсь. Я сказал, что для нормальных проектов это нежелательно.Но сам так делал и буду делать. Под каждый проект свои решения. Если он маленький, то только в путь!

Спустя 1 час, 30 секунд (2.06.2009 - 17:21) stepan написал(а):
Огромное всем спосибо но у меня теперь вот что
как я понял smarty и jQuery это библиотеки для решения сложных задач, можете ли мне скинуть ссылку на книжку в pdf формате
А если не использовать эти готовые преспособления как можно собственными ручками писать это все?

Спустя 4 минуты, 3 секунды (2.06.2009 - 17:25) Alehandr написал(а):
stepan
Если точнее, Smarty - это шаблонизатор, а jQuery - это JavaScript фрэймворк, которых сейчас на любой вкус хватает...

Спустя 7 минут, 49 секунд (2.06.2009 - 17:33) stepan написал(а):
Цитата (Alehandr @ 2.06.2009 - 14:25)
Если точнее, Smarty - это шаблонизатор, а jQuery - это JavaScript фрэймворк

Именно это я и хотел сказать
вы мне подскажате как без этих причендалов делать тоже самое что и сними?

Спустя 8 часов, 45 минут, 35 секунд (3.06.2009 - 02:18) Alehandr написал(а):
stepan
Написать свой минишаблонизатор (для своей CMF я так и сделал), либо использовать другой готовый.

Что касаемо JavaScript фрэймворка, то тут, либо использовать, либо нет. Смотря для чего тебе вообще JS нужен.

Спустя 5 часов, 9 минут, 34 секунды (3.06.2009 - 07:28) glock18 написал(а):
Цитата
вы мне подскажате как без этих причендалов делать тоже самое что и сними?


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

Jquery и т.п. самому вообще писать дохлый номер без огромных знаний в js.

Спустя 43 минуты, 39 секунд (3.06.2009 - 08:12) kirik написал(а):
Если от JS на сайте требуется только спойлеры и AJAX, то можно и без js-библиотеки обойтись. Однако если требуется много чего (всякие красивые окошки, плавная анимация, календарики, "драг энд дроп" и пр.), то сразу используй jQuery. Я в одном из своих проектов решил сделать все сам, и сделал, но теперь когда нужно что-то добавить приходится дописывать с нуля..

Спустя 4 минуты, 11 секунд (3.06.2009 - 08:16) glock18 написал(а):
Цитата
Однако если требуется много чего (всякие красивые окошки, плавная анимация, календарики, "драг энд дроп" и пр.), то сразу используй jQuery

+1.

Спустя 15 минут, 42 секунды (3.06.2009 - 08:31) stepan написал(а):
Цитата (glock18 @ 3.06.2009 - 04:28)
Шаблонизаторов вагон целый, а у тебя может не получиться написать его

Вот такое изречение можеш оставить при себе т.к. на этом форуме люди помогают изучать азы программирования, а не использовать готовые решения.
И если ты не знаеш на сколько человек знает программирование то не надо утверждать такие вещи, если боятся чего то сделать самаму то лучше <censored> mad.gif


 ! 
[mod][/mod]sergeiss
Ну уж так не надо, человек же искренне сказал (это я насчет удаленной части сообщения).

Цитата (Alehandr @ 2.06.2009 - 23:18)
Написать свой минишаблонизатор (для своей CMF я так и сделал)

Этим и займусь спосибо. wink.gif

Спустя 1 час, 7 минут, 25 секунд (3.06.2009 - 09:39) glock18 написал(а):
Цитата
у тебя может не получиться написать его


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

Что касается существенной части сообщения, то она тоже обоснована, поскольку незнание понятия "шаблонизатор" несколько осложнит написание такого.

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

Если вам станет легче, то я не могу сказать, что я наверняка напишу качественный шаблонизатор. А его еще нужно заставить правильно кешировать скомпилированный код (без кеширования это пустая трата времени). Вы могли этого не учесть, и я лишь решил вас предостеречь от ошибки.

Спустя 31 минута, 31 секунда (3.06.2009 - 10:10) kirik написал(а):
О как! Одно слово опустили, и получился конфликт smile.gif
Не горячитесь, мужики! А шаблонизатор стоит написать, чтобы понять что лучший шаблонизатор уже встроен в php wink.gif

Спустя 1 минута, 17 секунд (3.06.2009 - 10:12) stepan написал(а):
Цитата (glock18 @ 3.06.2009 - 06:39)
а может вам верно говорят.

Не зная человека нельзя такие вещи говорить, мне ведь обидно. sad.gif
Цитата (glock18 @ 3.06.2009 - 06:39)
я вам искренне рекомендую не изобретать велосипед.

Конечно спасибо но я думаю что лучшей вариант по изобретать велосипед. Конечно понимаю что буду пользоваться готовым продуктом, но если я буду знать каким образом работат шаблонизатор это же лучше будет так как я более развит буду, а если действовать вашим предложениям то я бы досих пор сидел и думал что Бил Гейтс сам написал Widows и кроме этой операционки больше ни чего не существует так как ни кто не захотел изобретать велосипед.
Цитата (glock18 @ 3.06.2009 - 06:39)
Вы могли этого не учесть, и я лишь решил вас предостеречь от ошибки.

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

Абсолютно с тобой согласен. smile.gif

Спустя 10 минут, 30 секунд (3.06.2009 - 10:22) sergeiss написал(а):
"Горячие эстонские парни"!!! А может, угомонитесь? smile.gif Хотя, конечно, можно всю ругань и споры "ни о чем" перенести во Флейм. И ругайтесь там, сколько угодно. Но только в пределах Правил форума и без нарушения УК РФ.

Спустя 13 минут, 13 секунд (3.06.2009 - 10:35) twin написал(а):
Еще один "качественный" шаблонизатор.... Да сколько ж можно то...
Их уже тритыщимиллионов, этих качественных. Как только человек научится чтото чуть сложнее Привет, Мир! (Боже упаси, никого лично в виду не имею), сразу норовит сделать качественный шаблонизатор. Не хотел же продолжать, вынуждаете. На мозоль потому что.
Вот на кой он вообще нужен то? Давай по порядку. Плюсы и минусы.
1. Разделение бизнесс-логики и представления.
Любой шаблонизатор в этом плане ущербен, каким гениальным бы он не был. Потому что пустив пыль в глаза подменяет одну логику на другую. В любом случае без обозначения циклов в шаблоне не обойтись, а это как не крути - логика.
А вот другой подход. Вынести интерацию в отдельный файл. И сделать что то типа такого:

PHP
function table()
{
ob_start();
include(
'tpl/header_table.html');

for(
$i=0;$i<5;$i++)
include(
'tpl/row_table.html');

include(
'tpl/footer_table.html');
$table ob_get_contents();
ob_end_clean();
return 
$table;

}


Тогда в шаблоне будет всего навсего так:

HTML
<!-- begin tpl/index.html -->
<?php echo table() ?>
<!-- end tpl/index.html -->

Это по сути своей тег, он не требует никаких дополнительных знаний от верстальщика, в отличии от этого:
PHP
{foreach src="level"
<
p><a href="{link_out}">{namemenu}</a></p
{/foreach 
src="level"}

Потому что как не крути, а тут он вынужден узнать, что такое фореч. Можно конечно развести полемику, что если он не может выучить... что такой не нужен... Так а зачем тогда вообще делить то их? Именно эта цель и преследуется, оградить дизайнера от несвойственной ему логики.
Так что задача разделения спокойно (и лучше) решается без шаблонизатора.
2. Ресурсоемкость. При шаблонизации в оперативную память пишется не только целиком весь шаблон, но и все библиотеки шаблонизатора. Плюс к этому регулярки, которые увеличивают время работы скрипта. Умножим все это на к-во посетителей и получим нелицеприятную картину. При хорошей посещаемости сайт неминуемо будет тормозить, так как всех посетителей поставит в очередь.
А вот если подключать только тот функционал, который необходим в данный момент, ресурсоемкость снижается в рвзы, если не на порядки.
3. Унификация. Вот сейчас ты напишешь свой шаблонизатор. Он будет использовать какой то специально придуманный синтаксис. Его конечно выучит верстальщик, помучившись и поматерившись недельку-другую. А потом он заболеет или вообще уйдет в другую контору. Надо править дизайн, а новый верстальщик грызет гранит форечей и ифов.
С другой стороны, если по той схеме, которую я описал, каждый файл помечать комментами, то любой, совершенно новый дизайнер, щелкнув правой мышко по экрану, сразу увидит, где находится нужный фрагмент и преспокойненько его поправит.
4. Кэширование. Смарти, на сколько мне известно, кэширует всю страницу целиком. А если на ней висит датчик онлайн? Страница не будет статичной из за одной единственной циферки. И кэш накроется медным тазом.
По моей схеме кэшировать можно участки страницы. Именно те файлы, на которые разбит шаблон. А динамику выводить отдельно. Собственно все это реализовано здесь, можешь поклацать. Там основной объём страницы - статика, к-во запросов минимально, и никоем образом не страдают динамические данные.

Я могу долго перечислять, потому что эта идея (шаблонизаторов на php) сама по себе ущербна по определению. Вот идут разговоры о включении СМАРТИ в PHP, но я уверен, что там далеко не бубни сидят, и не станут сувать её в таком виде, в каком есть. Наверняка это будет библиотека, гармонично и лаконично вписанная, и выглядеть будет как тот же xml допустим. А не как сейчас - такой бегимот. Особенно веселит, когда её суют на сайты из 10-15 страниц. Давайде будем обойные гвозди забивать сваебиткой...












Спустя 13 минут, 58 секунд (3.06.2009 - 10:49) sergeiss написал(а):
twin, эка тебя "распёрло" smile.gif
Мне так кажется, стОит создать "тему на эту тему" и отсылать туда всех желающих поговорить о шаблонизаторах.

Спустя 36 секунд (3.06.2009 - 10:50) glock18 написал(а):
twin
толково.

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

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

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

По-моему так полностью разделить, как ни изворачивайся, не удастся.
Вариант, предложенный twin'ом с вынесением итераций поможет еще несколько снизить количество логики в представлении.

sergeiss
Закрыли тему "ругани".))

Спустя 15 минут, 13 секунд (3.06.2009 - 11:05) twin написал(а):
Так, стоп. Почему собственно не кул? У меня просто напросто шаблоны страниц в своих каталогах. Не вижу большой разницы между шаблоном в файле и в каталоге. Структурно все понятно, другой вопрос - лениво много файлов открывать, но это гораздо проще, нежели ковыряться в логике шаблона.

На 100% наверное и не к чему делить, это тоже крайняя мера и изврат. Вот в моем примере вместо
PHP
include('tpl/footer_table.html');
Можно просто написать
PHP
echo '</table>';

Никому это не повредит. А вот на 99% можно. Потому что где здесь логика:
HTML
<!-- begin tpl/index.html -->
<?php echo table() ?>
<!-- end tpl/index.html -->

?
Обычный статичный тег. Просто его нет в спицификации, но коню понятно, что это таблица. Никакой логической составляющей.

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

Цитата
Вариант, предложенный twin'ом с вынесением итераций поможет еще несколько снизить количество логики в представлении.


Если поставить такую задачу, то можно не просто снизить, а полностью исключить логику. ну пусть на 99,99%.

Спустя 41 минута, 8 секунд (3.06.2009 - 11:46) Alehandr написал(а):
Раз уж такое пошло, то выложу свой шаблонизатор:
PHP
<?
class 
TPL {
    
    private static 
$tpls = array();
    
    public static function 
Get($tpl){
        if (!isset(
self::$tpls[$tpl]))
            
self::Load($tpl);
        return 
self::Parse(self::$tpls[$tpl]);
    }
    
    private static function 
Load($tpl){
        
self::$tpls[$tpl] = "";
        
$tpl_arr explode("/"$tpl);
        
$folder = ($tpl_arr[count($tpl_arr) - 1][0] == "_") ? "tpls" "pages";
        
        
//Загрузка страници (шаблона) в зависимости от языка
        
if (is_file(ROOT Core::$main_folder "/" $folder "/" $tpl "." Core::$language ".html")){
            
self::$tpls[$tpl] = file_get_contents(ROOT Core::$main_folder "/" $folder "/" $tpl "." Core::$language ".html");
            return;
        }
        
        
//Загрузка страници (шаблона) вне зависимости от языка
        
if (is_file(ROOT Core::$main_folder "/" $folder "/" $tpl ".html")){
            
self::$tpls[$tpl] = file_get_contents(ROOT Core::$main_folder "/" $folder "/" $tpl ".html");
            return;
        }
        
        
//Если ничего не найдено, то возвращаем пустую строку
        
self::$tpls[$tpl] = "";
    }
    
    public static function 
Parse($tpl){
        
$tpl preg_replace("/\r/mui"""$tpl);
        
$tpl preg_replace("/\n\n/mui""\n"$tpl);
        
$tpl preg_replace("/\n[\t ]+/mui""\n"$tpl);
        
$tpl preg_replace("/\n\n/mui""\n"$tpl);
        
$tpl trim($tpl);
        while (
true){
            
//Тег <:module:> - инициализируем модуль
            
if (preg_match("/<:([^:]+):>/ui"$tpl$res)){
                require_once(
ROOT Core::$main_folder "/modules/" $res[1] . ".class.php");
                
$tpl str_replace($res[0], ""$tpl);
                continue;
            }
            
//Тег <+module func data+> - выводим значение функции из модуля по заданным данным
            
if (preg_match("/<\+([^\+ ]+) ([^\+ ]+) ([^\+]*)\+>/ui"$tpl$res)){
                
$mod = &Core::GetModule($res[1]);
                
$cmd $res[2];
                
$data $res[3];
                
                
$data self::ParseData($data);
                
                
$tpl str_replace($res[0], $mod->$cmd($data), $tpl);
                continue;
            }
            
//Тег <#template#> - выводим дополнительный шаблон
            
if (preg_match("/<#([^#]+)#>/ui"$tpl$res)){
                
$tpl str_replace($res[0], self::Get($res[1]), $tpl);
                continue;
            }
            
//Тег <*_post var*> - выводим значение переменной var из массива $_POST
            
if (preg_match("/<\*_post ([^\*]+)\*>/ui"$tpl$res)){
                
$data $res[1];
                
$tpl str_replace($res[0], htmlspecialchars($_POST[$data]), $tpl);
                continue;
            }
            
//Тег <*_get var*> - выводим значение переменной var из массива $_GET
            
if (preg_match("/<\*_get ([^\*]+)\*>/ui"$tpl$res)){
                
$data $res[1];
                
$tpl str_replace($res[0], htmlspecialchars($_GET[$data]), $tpl);
                continue;
            }
            
//Тег <*_url num*> - выводим часть запроса из URL
            
if (preg_match("/<\*_url ([0-9]+)\*>/ui"$tpl$res)){
                
$data $res[1];
                
$tpl str_replace($res[0], htmlspecialchars(Core::$url[(int)$data]), $tpl);
                continue;
            }
            
//Тег <*module var*> - выводим значение переменной var из модуля module
            
if (preg_match("/<\*([^ \*]+) ([^ \*]+)\*>/ui"$tpl$res)){

                
$mod = &Core::GetModule($res[1]);
                
$data is_array($mod->data[$res[2]]) ? $mod->data[$res[2]][Core::$language] : $mod->data[$res[2]];
                
$tpl str_replace($res[0], $data$tpl);
                
                continue;
            }
            
//Тег <{constant}> - выводим значение константы
            
if (preg_match("/<{([^}]+)}>/ui"$tpl$res)){
                
$data is_array(Core::$data[$res[1]]) ? Core::$data[$res[1]][Core::$language] : Core::$data[$res[1]];
                
$tpl str_replace($res[0], $data$tpl);
                continue;
            }
            break;
        }
        return 
trim($tpl);
    }
    
    private static function 
ParseData($str){
        
$dataArr explode("&"$str);
        
$data = Array();
        foreach(
$dataArr as $dataNow){
            
$now explode("="$dataNow);
            
$param $now[0];
            unset(
$now[0]);
            
$data[$param] = implode("="$now);
        }
        return 
$data;
    }
    
}


Использую несколько специальных тегов (вывод переменной, функции и т.п.).
Для огранизации циклов вот пример (от балды):
PHP
<?
$res TPL::Get("_table_header");
for (
$i $i 1000 $i++){
  
$res .= TPL::Get("_table_row");
}
$res .= TPL::Get("_table_bottom");


Спустя 2 минуты, 19 секунд (3.06.2009 - 11:49) Alehandr написал(а):
Сразу хочу сказать, что это не оптимизированный вариант, потом буду делать кэширование, после которого не будет регулярных выражений и подстраницы и шаблоны используемые в главной странице, будут грузится с 1 файла.

Спустя 18 минут, 31 секунда (3.06.2009 - 12:07) glock18 написал(а):
twin
Цитата
Если поставить такую задачу, то можно не просто снизить, а полностью исключить логику. ну пусть на 99,99%.


Возможно. Просто я достаточно осторожен в выводах. Я не могу однозначно сейчас проанализировать обход всех сложностей твоим способом. Он кажется полезным (нисколько не преуменьшаю его полезность и обязательно постараюсь выжать из него максимум).

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

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

Спустя 19 минут, 7 секунд (3.06.2009 - 12:26) twin написал(а):
Инклюд работает в сто раз быстрее регулярки. Пусть их даже больше, все равно быстрее.

Спустя 1 час, 56 минут, 37 секунд (3.06.2009 - 14:23) Alehandr написал(а):
twin
Я при оптимизации хочу сделать кэширование так, что регулярки будут использоваться только при обновлении страниц(шаблонов)...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.