Що-то давно я не писав про PHP, пора це виправляти. Сьогодні буду розповідати про Zend Framework’е – який він класний, але не завжди зручний.
Отже першим потрапляє під роздачу Zend_View – простий шаблонизатор, дуже схожий на ряд велосипедів включаючи мій: HSTamplate, Прощай Smarty або простий шаблонизатор, Шаблонизировать за 6 секунд (і 6 рядків) .
Перерахую все ж його переваги та недоліки…
Плюси:
- рідний php, у всій своїй силі і красі, і ніякого мови шаблонів
- наявність допоміжних функцій для генерації HTML
- наявність фільтрів виведення
- легкість вивчення (навіть для дизайнера)
- хороша документація
Мінуси:
- відсутність аналогічної функції fetch в Smarty (корисна функція все-таки)
- можна попередньо встановити використовується шаблон, тобто не можна сказати спочатку скрипта – використовуємо шаблон A. tpl, вказівку який шаблон використовувати повинно бути тільки при виклику методу renderer (ось такий я примхливий)
- немає вбудованих функцій для кешування шаблонів, необхідно кожен раз згадувати про Zend_Cache
- і все…
Доопрацювання:
Якщо хто не знає, я один з ініціаторів появи на світ CMF/CMS системи під назвою phpXCore, ця система базувалася на PEAR пакетах і використовувала Smarty як Template Engine. І ось, так як PHP4 вирішив спочити з миром, я і моя команда вирішили таки переписати phpXCore під PHP5. І ми взяли за основу Zend Framework, і почали впроваджувати Zend_View, але перед цим мені довелося його трохи доопрацювати:
- Перші два “мінуса” досить легко виправити, у нас з’являється метод для встановлення шаблону, і ще два методу fetch і display
- C Zend_Cache трошки доведеться повозитися, але зате наскільки зручно стало використання кешу:
// перевірка попадання в кеш
if (!$View->cache($UNIQUE_ID, 3600)) {
// кеш недоступний, і треба заповнити об’єкт Zend_View даними
$View->test = __METHOD__ . ‘#’ . date(‘H:i:s’);
}
// вказуємо шаблон виводу
$View->setTemplate(‘test.tpl’); - Ще одна доопрацювання – це реалізація патерна композит, щодо даної доопрацювання – я не зовсім впевнений в її універсальності, т. к. призначення даного поліпшення – задовольнити потреби нашої системи:
// створюємо нащадка
$ViewChild = $View->addChild(‘Child1′);
$ViewChild -> test = __FILE__.’#’.__LINE__;
$ViewChild -> setTemplate(‘child.tpl’);
// висновок нащадка
<?=$this->displayChild(‘Child1’); ?>
// висновок нащадка з передачею параметрів
<?=$this->displayChild(‘Child1’, array(‘id’=>$id, ‘error’=>$error)); ?>Щоб зрозуміти навіщо нам знадобився композит необхідно зрозуміти організацію виведення в phpXCore:
- Існує основний шаблон, який може змінюватися в залежності від налаштувань, це якийсь index.tpl, він визначає розташування виведення модулів на сторінці:
- Index.tpl налаштовує активний контролер в системі, тобто це наш головний примірник Zend_View
- Модулі самі налаштовують свій висновок, тобто вони оперують зі своїм власним Zend_View (які є дочірніми щодо головного), вони можуть встановлювати свої налаштування кешування, що дає досить велику гнучкість (в нашому прикладі ви можете безболісно виставити кешування для меню, не зачіпаючи динамічний контент)
- Існує основний шаблон, який може змінюватися в залежності від налаштувань, це якийсь index.tpl, він визначає розташування виведення модулів на сторінці:
Доопрацьований Zend_View можна подивитися тут: http://svn.nixsolutions.com/xcore/application/classes/XCore/View.php ( login: anonymous, password: anonymous), дізнатися більше про розроблюваної системі можна тут: http://www.phpxcore.org/wiki/index.php/Phpxcore:php5:architecture