Що-то давно я не писав про 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 (які є дочірніми щодо головного), вони можуть встановлювати свої налаштування кешування, що дає досить велику гнучкість (в нашому прикладі ви можете безболісно виставити кешування для меню, не зачіпаючи динамічний контент)

Доопрацьований 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