View против Smarty

41 views
Skip to first unread message

Fatalist

unread,
Jun 18, 2007, 6:13:54 AM6/18/07
to ru-zend-framework
Сразу же отказался эт дефолтового View.

Вот, как работает Smarty:

В index.php

/** Инициализируем Smarty шаблонизатор */
require_once MAIN_ROOT . 'smarty/Smarty.class.php';

$Smarty = new Smarty();
$Smarty -> debugging = false;
$Smarty -> force_compile = true;
$Smarty -> caching = false;
$Smarty -> compile_check = true;
$Smarty -> cache_lifetime = -1;
$Smarty -> template_dir = MAIN_ROOT . 'resources/templates';
$Smarty -> compile_dir = MAIN_ROOT . 'resources/templates_c';
$Smarty -> plugins_dir = array(
SMARTY_DIR . 'plugins', 'resources/
plugins');

/** Добавляем в реестр Smarty */
Zend_Registry::set('smarty', $Smarty);


Далее..., уже в контроллерах...

/**
* Отключаем использование стандартного Action хэлпера
*/
Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer');

И, непосредственно обработка шаблона....

$View = Zend_Registry::get('smarty');
$View -> assign("news", $news);
$View -> display('admin_index.tpl');


В итоге, что имеем:

1. Меньше "каши" с $this->render(), preDispatch и postDispatch
2. Пользуемся всей мощью Smarty и его компилируемыми шаблонами, уже
готовыми плагинами, циклами, обработчиками.... (зачем изобретать
велосипед занова?)
3. В документации сказано, что пользоваться альтернативными
шаблонизаторами возможно и приветствуется, и даже сами разработчики
дают пример использования, на том же примере Smarty (http://
framework.zend.com/manual/en/
zend.view.scripts.html#zend.view.scripts.templates)

Вывод:
К чему мы стремимся каждый день, к чему идём, за что боремся?
За простоту и одновременную мощь, за функционал, за удобство.
Со всех сторон, при рассмотрении View против Smarty всё будет
очевидно.

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

Andrey Korolyov

unread,
Jun 18, 2007, 6:17:11 AM6/18/07
to ru-zend-...@googlegroups.com


On 6/18/07, Fatalist <fatal...@gmail.com> wrote:
Надеюсь, вы согласитесь, что связка ZF и Smarty является более
лаконичной и удобной для построения как простых, так и сложных,
цикличных задач в моменте отделения программного кода от html и
графики.

Не согласимся, вы просто php готовить не умеете =).
--
Andrey Korolyov | WEB Developer

e | akor...@gmail.com

Fatalist

unread,
Jun 18, 2007, 6:26:20 AM6/18/07
to ru-zend-framework
К чему сразу выводы, кто и что умеет готовить.
Знаете, что я Вам скажу:
Критикую - предлагай!

Золотые слова...
Иначе Ваша не обусловленная критика ничего показывает.

Суть данног решения состоит в скорости исполнения, а также разделения
работ...., на:
- дизайнер
- верстальщик
- программист

первым двум вовсе не нужно знать php? а простой интуитивный синтаксис
Smarty не составит особого труда составить шаблон.

On 18 июн, 13:17, "Andrey Korolyov" <akorol...@gmail.com> wrote:


> On 6/18/07, Fatalist <fatalis...@gmail.com> wrote:
>
>
>
> > Надеюсь, вы согласитесь, что связка ZF и Smarty является более
> > лаконичной и удобной для построения как простых, так и сложных,
> > цикличных задач в моменте отделения программного кода от html и
> > графики.
>
> Не согласимся, вы просто php готовить не умеете =).
> --
> Andrey Korolyov | WEB Developer
>

> e | akorol...@gmail.com

Andrey Korolyov

unread,
Jun 18, 2007, 6:33:16 AM6/18/07
to ru-zend-...@googlegroups.com
1. Синтаксис смарти на много сложнее чем синтаксис пхп.
2. При работе с php надо использовать определнный синтаксис (подозреваю что вы ег опросто не знаете)
3. Код полученный компиляцией смарти не всегда оптимальный.
4. Смарти не решает проблему кеширования инклудов
5. Использую дефолтный View можно написать более гибкую систему кеширования, чем это сделанно в смарти.

On 6/18/07, Fatalist <fatal...@gmail.com> wrote:

Fatalist

unread,
Jun 18, 2007, 6:55:48 AM6/18/07
to ru-zend-framework
Могу ответить тем же, что Вы не знаете Smaty вообще, если только
исходники мельком смотрели.
Код Smaty однообразен и проще, проблема инклудов не возникает, т.к
Smarty обрабатывает каждый {include file="file.tpl"}, я компиляцией я
согласен (по поводу оптимальности), не это не является существенной
проблемой.
Что качается моих знаний в синтаксисе php, осмелюсь предположить что
программирую я на php больше Вас, ещё с релиз кандидата 3 версии,
также застал вторую. Но не в этом суть.
В своём посте я не ставил вопроса кто лучше на чём пишет, я лишь
предложил решение.
А вы сказали не за себя а за всех цитирую: "Не согласимся, вы просто
php готовить не умеете =). ".
Прошу заметить, что не зря разработчики php взяли Smarty под свою
эгиду: smarty.php.net
Не исключено, что к 6 версии php, разработчики добавят Smarty ввиде
расширения, а это уже другая песня, об этом было написано в январском
интревью о планх на php6.
Прежде чем написать пост я досконально изучил стратегию View. Если
речь стоит об удобстве и скорости исполнения, то остальные читатели
поста сделают другой вывод, и не станут впадать в амбиции своего
воображаемого профессионализма, а будут анализировать чужие мнения
должным образом, аргументируя свои высказывания.

У меня всё.
Считаю, что смысла больше отвечать на амбициозные реплики господина
"Andrey Korolyov".

On 18 июн, 13:33, "Andrey Korolyov" <akorol...@gmail.com> wrote:
> 1. Синтаксис смарти на много сложнее чем синтаксис пхп.
> 2. При работе с php надо использовать определнный синтаксис (подозреваю что
> вы ег опросто не знаете)
> 3. Код полученный компиляцией смарти не всегда оптимальный.
> 4. Смарти не решает проблему кеширования инклудов
> 5. Использую дефолтный View можно написать более гибкую систему кеширования,
> чем это сделанно в смарти.
>

Taras Taday

unread,
Jun 18, 2007, 7:33:50 AM6/18/07
to ru-zend-...@googlegroups.com
ИМХО
1. Мощь смарти не может сравнится с мощью рнр
Вопрос в чем вы видите существенную выгоду от использования смарти? Лично я ее не вижу.

2007/6/18, Fatalist < fatal...@gmail.com>:
Сразу же отказался эт дефолтового View.




--
matera|ttp

ru-zend-framework

unread,
Jun 18, 2007, 7:37:47 AM6/18/07
to ru-zend-framework
On Jun 18, 1:13 pm, Fatalist <fatalis...@gmail.com> wrote:
> 1. Меньше "каши" с $this->render(), preDispatch и postDispatch
render == display
Каким боком пре и пост относится к шаблонизатору?

Michael Melnikov

unread,
Jun 18, 2007, 7:45:19 AM6/18/07
to Taras Taday

Здравствуйте, Taras.




>

ИМХО 

1. Мощь смарти не может сравнится с мощью рнр

Вопрос в чем вы видите существенную выгоду от использования смарти? 


Я так подозреваю, что в мощи:) Но всё-таки надо у автора уточнить :)


>

Лично я ее не вижу.

>



2007/6/18, Fatalist < fatal...@gmail.com>:

Сразу же отказался эт дефолтового View.





-- 

matera|ttp






-- 

С уважением,

 Michael                          mailto:mike.m...@gmail.com

moLodoi

unread,
Jun 18, 2007, 8:23:02 AM6/18/07
to ru-zend-framework
Также использую только Smarty.
Главное граммотная интеграция с ZF для использования
всех "прелестей" View.

Было бы неплохо, чтобы в ZF Smarty шел как альтернатива ZF View по
дефолту.
Что-то типа $view = new View('Smarty'). И дальше у всех все одинаково.

Fatalist

unread,
Jun 18, 2007, 8:37:35 AM6/18/07
to ru-zend-framework
Я уже писал, что Смарти является хорошим готовым решением.
И как мне кажется, что удовлетворит большинство потребностей по
отделения дизайна от кода.
Для примера: это как пользовать консолью и графической оболочкой.
Смарти сам является ничем инным, как php кодом.
Класс View, который входит в Zend Framework, имеет очень плохие
способности к расширению. Он содержит шаблонные переменные, но не дает
доступа к ним, он включает массив различных путей (к шаблонам,
фильтрам), но не позволяет добавлять другие типы или использовать их.

Теоретически и практически всё можно сделать и написать и дополнить.

Fatalist

unread,
Jun 18, 2007, 8:40:30 AM6/18/07
to ru-zend-framework
Абсолютно согласен!
Именно это я и хотел донести до общественности :-)

Fatalist

unread,
Jun 18, 2007, 8:43:27 AM6/18/07
to ru-zend-framework
Для расширению функционала и управления действиями на разных стадиях
обработки.
Если вы досконально вникните в MVC и реализацию действий и
последовательности в View, вы поймёте, что я имею ввиду.

ru-zend-framework

unread,
Jun 18, 2007, 8:50:40 AM6/18/07
to ru-zend-framework
Вы сами сказали что это ужо действия. Все то же можно приписать и для
смарти.
Если можно покажите практический пример того что нельзя сделать с
помощью View и можно с помощью смарти

Илья Ерохин

unread,
Jun 18, 2007, 9:13:40 AM6/18/07
to ru-zend-...@googlegroups.com
В сообщении от 18 июня 2007 14:13 Fatalist написал(a):

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

Есть логика представления, и от нее никуда не деться. Я использую Zend_View,
так как считаю его более гибким, мощным и прозрачным.

Со Smarty работал - да, хорошее решение, но не на все случаи жизни.

А вообще в документации на ZF описывается, как можно прозрачно "завернуть"
Smarty в Zend_View. Думаю, это оптимальное решение - для переключения между
Smarty и Zend_View нужно изменить только скрипты вида

Andrey Korolyov

unread,
Jun 18, 2007, 9:37:57 AM6/18/07
to ru-zend-...@googlegroups.com
Ладно, с какого это времени умные люди начали спорить о вкусах ?

Fatalist

unread,
Jun 18, 2007, 11:08:30 AM6/18/07
to ru-zend-framework
В моём примере в начале поста сказано, как можно отключить дефолтовый
View и использовать Smarty без Exceptions. И так можно для каждого
контроллера использовать либо Smarty либо дефолтовый View.
В следующем посте опишу возможность использование Smarty и View в
одной связке.

Fatalist

unread,
Jun 18, 2007, 11:18:40 AM6/18/07
to ru-zend-framework
Уважаемый, речь шла о простоте использования и скорости исполнения...
А также для разбиения задач между кодером, программером и
дизайнером....
Ни дизайнеру ни рядовому кодеру нет дела до ZF и ООП в целом, Smarty
зарекомендовал себя, как некоторый стандарт шаблонного
проектирования. Так что в большинстве компаний обязательное условий
для вакансии (касаемо кодера напрямую) является знание шаблонизатора
Smarty, задача программиста - владеть передовыми технологиями и
продвинутые знания пакетов, библиотек, кодовой архитектуры, паттернов
проектирования. Smarty является некоторым мостом в золотой середине
работы команды.

Andrey Korolyov

unread,
Jun 18, 2007, 11:52:35 AM6/18/07
to ru-zend-...@googlegroups.com
Странно, а у меня всего одно правило - голова на плечах =).

On 6/18/07, Fatalist <fatal...@gmail.com> wrote:

Michael Melnikov

unread,
Jun 18, 2007, 11:55:50 AM6/18/07
to Fatalist
Здравствуйте, Fatalist.

>>Smarty является некоторым мостом в золотой середине
>>работы команды.

Вот это вы жжоте:) Хорошо что хоть в золотой середине:)

Илья Ерохин

unread,
Jun 18, 2007, 11:57:38 AM6/18/07
to ru-zend-...@googlegroups.com
В сообщении от 18 июня 2007 17:37 Andrey Korolyov написал(a):

> Ладно, с какого это времени умные люди начали спорить о вкусах ?

Да, вы правы - использовать ZV или Smarty - дело исключительно вкуса. Я
примерно об этом и писал....

dfr

unread,
Jun 18, 2007, 4:24:53 PM6/18/07
to ru-zend-framework
Если можно подробнее пожалуйста.
В мануале видел врапер для Смарти, практически аналог вот этого:
http://akrabat.com/2006/12/23/extending-zend_view_interface-for-use-with-smarty/
реализовал у себя, но осталось ощущение какой то незавершенности.
Хотелось бы посмотреть примеры применительные к RC1/2

dfr

unread,
Jun 18, 2007, 5:37:33 PM6/18/07
to ru-zend-framework
Ниже привел свой набросок скелета, может интересно кому будет :)
Так же буду рад конструктивной критике данного подхода.

index.php

date_default_timezone_set('Europe/Moscow'); # эту штуку надо выносить
в конфигурационный файл .ini
set_include_path(...всякие пути...);

class WebIndex
{
static function run() {
try {
require_once('ApplicationContext.php');
$context = ApplicationContext::getInstance();
$context->front->dispatch();
} catch (exception $e) {
$e->getMessage();
}
}
}

WebIndex::run();
----------------

файлик ApplicationContext.php фактически является конфигуратором app

require_once('Zend/Loader.php');
Zend_Loader::registerAutoload();
class ApplicationContext
{
static private $_instance = null;
public function __construct() {
$this->registry = Zend_Registry::getInstance();
$this->front = $front = Zend_Controller_Front::getInstance();
$front->setParam('useModules', true);
$front->setControllerDirectory('...application/default/
controllers');
$front->addControllerDirectory('...application/admin/
controllers', 'admin');
$front->addControllerDirectory('...application/member/
controllers', 'member');
$front->throwExceptions(true);
Zend_Registry::set('front', $front);
...
тут куча остального кода для инициализации app
...
Zend_Registry::set('context', $this);
}

public function __toString() {
return __CLASS__;
}

static public function getInstance() {
if (self::$_instance == null) {
self::$_instance = new self();
}
return self::$_instance;
}

// disable cloning of a singleton
public function __clone() {
}

// Create on demand
public function __get($name) {
switch ($name) {
case 'view':
return $this->getView();
...
так же выставляем здесь sessions, config, db и т.д.
...
}
}

private function getView() {
if (isset($this->view)) {
return $this->view;
}
// disable default Action helper

Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer');

// на период разработки потянет
$params['debugging'] = false;
$params['force_compile'] = true;
$params['compile_check'] = true;
$params['caching'] = false;
$params['cache_lifetime'] = -1;
$params['cache_dir'] = '...cache';
$params['compile_dir'] = '...templates_c';
$params['template_dir'] = '...application/default/view...';
$params['plugins_dir'] = '...smarty/plugins);
$this->view = $view = new System_View($params);
Zend_Registry::set('view', $view);
return $view;
}
...
множество других, полезных методов
...
}
----------------
пример IndexController.php
class IndexController extends Zend_Controller_Action
{
public function indexAction() {
$view = Zend_Registry::get('context')->view;
...можно выдать
$view->render('index.tpl');
...можно сразу показать
$view->display('index.tpl');
}
}
----------------
и сама обертка в файлике View.php
require_once('Zend/View/Interface.php');
require_once('Smarty.class.php');

class System_View implements Zend_View_Interface
{
protected $_engine;

function __construct($params = null) {
$this->_engine = new Smarty();

// render variables XSS safe by default.
$this->_engine->default_modifiers = array('escape:"htmlall"');

if (is_array($params)) {
foreach ($params as $key=>$value) {
$this->_engine->$key = $value;
}
}
}

public function getEngine() {
return $this->_engine;
}

public function setScriptPath($path) {
if (is_readable($path)) {
$this->_engine->template_dir = $path;
}
}

public function __set($key, $val) {
$this->_engine->assign($key, $val);
}

public function __get($key) {
return $this->_engine->get_template_vars($key);
}

public function __isset($key) {
$var = $this->_engine->get_template_vars($key);
return !is_null($var);
}

public function __unset($key) {
$this->_engine->clear_assign($key);
}

public function assign($spec, $value = null) {
if (is_array($spec)) {
$this->_smarty->assign($spec);
return;
}

$this->_engine->assign($spec, $value);
}

public function clearVars() {
$this->_engine->clear_all_assign();
}

public function render($name) {
return $this->_engine->fetch($name);
}

public function display($name) {
return $this->_engine->display($name);
}
}

ru-zend-framework

unread,
Jul 19, 2007, 8:10:35 AM7/19/07
to ru-zend-framework
On 18 июн, 13:33, "Andrey Korolyov" <akorol...@gmail.com> wrote:
> 4. Смарти не решает проблему кеширования инклудов
это легко решается, на офф сайте в форуме есть пример, как реализовать
{inline}, тогда проблема с инклудами отпадёт.

Reply all
Reply to author
Forward
0 new messages