Проблемы с Zend Framework

Давно хотел поработать с Zend Framework, да все руки не доходили. А тут несколько дней назад услышал, что вышла новая версия 1.7.1. Ну я и решил восполнить пробел, так сказать.

Сразу скажу, что этот пост не о том, как сделать свой первый сайт на Zend Framework за 10 минут. И даже не о том, как в Zend Framework все круто сделано. Сразу после того как я скачал 20 Мб архив с исходниками и всем остальным – я полез в инет за поиском документации с примерами вроде “Быстрого старта”.

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

Итак, в этой небольшой статье я опишу решения тех проблем, с которыми я столкнулся в первые дни работы с Фреймворком и ответы, на которые было довольно проблематично найти в Интернете.

Корневая директория.

Так уж повелось у меня, что каждый отдельный проект на php я храню локально в отдельной папке корневого каталога веб-сервера. Доступ к ним через адресную строку браузера осуществляется так: https://localhost/project1/ и так https://localhost/project2/

Здесь меня подстерегала первая проблема. При запуске моего первого скрипта “Hello, world” на Zend Framework, у маршрутизатора возникли проблемы с путями.

Примечание: Маршрутизатором в Zend Framework называется часть кода, которая преобразует URI в команду управляющим классам (контроллерам).

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

В каком-то посте писали, что проблема исправляется элементарно – достаточно передать контроллеру запросов (Front Controller) через метод setBaseUrl путь до корневой папки сайта. Например, так:

…
$frontController->setBaseUrl().
…

Ну и еще некоторые вариации этого же подхода. Но, не тут-то было. У меня это проблемы не решило.

Еще через минут 10 в англоязычной версии инета нашел другое решение – добавить директиву в .htaccess-файл.

RewriteEngine on
RewriteBase /site/

Это решение помогло для ZF 1.7.1. Так что пробуйте его, если кто-то с такой проблемой тоже столкнулся 😉

Работа с БД.

В Zend Framework поддержа работы с БД сводится к классу Zend_Table, скрывающему механизм отображения реляционной БД в объектную модель логики программы. Механизм этот довольно ресурсоемкий и, поэтому, видимо, в Zend Framework включена поддержка такого решения через использование php-расширений PDO. Но, почему-то, только этим поддержка работы с БД и ограничивается.

У меня на сервере не были установлены такие расширения, и я оказывался как бы в обломе. Но, благодаря удачной структуре кода Zend Framework, и мой случай оказался не безнадежным. В качестве решения, было принято использовать библиотеку для работы с БД dbSimple.

Для подключения dbSimple в bootstrap-файле необходимо прописать следующее:

…
$cfg = new Zend_Config_Ini(ROOTDIR.'/config.ini', 'db');// подключаемся к БД
$db = DbSimple_Generic::connect('mysql://'.$cfg->db->username.':'.$cfg->db->password.'@'.$cfg->db->host.'/'.$cfg->db->dbname);
// сохраняем объект БД в реестре
Zend_Registry::getInstance()->set('db', $db);
…

Здесь я использовал данные конфига при подключении к БД, а после подключения сохранил объект для работы с БД в реестре. Теперь внутри класса-модели можно его использовать, например, так:

Class Users {
    public function getList() {
        $db = Zend_Registry::getInstance()->get('db');
        $list = $db->select('SELECT * FROM accounts ORDER BY created DESC');
 	return $list;
    }
…

Так что работать с БД в Zend Framework можно и без расширений PDO.

Элемент select в Zend_Form.

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

Кто-то предлагал указать атрибут selected через $select_item->setAttr(), при создании выбранной опции, но это почему-то не сработало.

Немного поискав на англоязычных блогах, решение было найдено. И оно оказалось довольно простым, надо заметить. Нужно просто передать значение (value) выбранной опции select`а элементу select через метод setValue():

…
$role = $form->createElement('select', 'role_id');
$role->setLabel('Role')
        ->setMultiOptions($role_options)
        ->setValue($user['role_id']);
…

На этом все. Удачи. :)





Читайте также:



13 Ответов на “Проблемы с Zend Framework”

  1. Для того чтобы нормально заработало Zend_DB можно прописать mysqli он есть на большинстве серверов по дефолту.

    Или выбрать другой адаптер:
    [ссылка]

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

  2. В Zend Framework поддержа работы с БД сводится к классу Zend_Table, скрывающему механизм отображения реляционной БД в объектную модель логики программы.

    Во первых класс Zend_Db_Table, во вторых работа с бд не сводится к классу Zend_Db_Table, есть класс Zend_Db и есть еще масса других. В третьих ваша фраза - глупость. Что еще за механизм отображения БД? Что за модель логики программы?. Можно конечно догадаться, что вы имели ввиду, но выражаться нужно более грамотно, если вы пытаетесь учить других.

    Механизм этот довольно ресурсоемкий и, поэтому, видимо, в Zend Framework включена поддержка такого решения через использование php-расширений PDO. Но, почему-то, только этим поддержка работы с БД и ограничивается

    Чем по вашему поддержка работы с БД должна быть дополнена?
    PDO является быстрым и удачным расширением реализующим data-access abstraction layer. Или вы предпочитаете обращаться к БД через mysql_query?

    Любой нормальный хостер если и не имеет установленного PDO то установит его по требованию.

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

    P.S. В качестве квик старта можете ознакомиться с моей статьей

  3. По поводу формы.
    Если я правильно понимаю, Вы в контроллере создаете экземпляр Zend_Form, добавляете в него элементы и каждому элементу присваиваете значения?

    Могу предложить вариант значительно проще:
    Создаете свой класс - наследник Zend_Form. В его конструкторе создаете все элементы формы. Затем в контроллере создаете экземпляр своего класса и вызываете метод populate с массивом значений элементов формы, в качестве входного параметра.
    Например: $form->populate($formData);
    Такой способ обычно использовать удобнее прямого присвоения значений, т.к. значения для заполнения формы уже содержатся в массиве (полученном из базы или переданным из браузера).

    И на последок еще хинт: форму можно просто описать в конфиге, а потом создать объект формы на основе этого конфига.

  4. Игорь

    Мда странная статья. Сложилось такое впечатление, что знакомство с ЗФ произошло наскоком.
    А насчет БД, можно не использовать PDO есть еще простые адаптеры для Oracle, DB2 and Mysqli.

  5. cryptus

    2 Александр Махомет:
    1. Именно СВОДИТСЯ, а не происходит ТОЛЬКО ЧЕРЕЗ. Zend_DB конечно еще есть, но это только фабрика.
    2. Отображение базы на модель логики - это когда Вы данные из Бд берете и заполняете ими поля рабочих объектов, которые определяют логику Вашего приложения. Модель логики или модель предметной области (Domain Model) - как не назови, а смысл не изменится :)
    3. В этом официальном документе:
    [ссылка]
    я не нашел как мне установить опцию в selected состояние. Искал в других местах тоже там, но безуспешно.
    4. Я как бы не говорил, что поддержка работы с бд ДОЛЖНА быть дополнена в ZF, просто мне показалось странным, что они ограничили готовые решения только ORM-моделью. Ведь data-access abstraction layer это конечно круто, но ORM - это не единственное решение, которое может изолировать бизнес-логику приложения от слоя источника данных (если граматно :) ), да и не самое быстрое, особенно для PHP.

  6. cryptus

    2 Oleg Lobach: Гляну насчет этого, спасибо. Из конфига форму редактировать легче будет конечно. Тем более что в коде ее нахождение, определенно лишнее)

  7. cryptus

    2 Игорь: Честно говоря, с наскока и начинал, чтобы сразу был какой-то результат, который можно было использовать как отправную точку для изучения деталей. О тех проблемах, с которыми столкнулся я написал пост. Это же блог, а не учебник, не забыли еще? 😉

  8. Как мне показалось, ZF не из простых фреймворков. А какой фреймворк для чайников?

  9. cryptus

    Даже не знаю.. Может имеет смысл посмотреть CakePHP? :)

  10. ZlyddeN

    >>>функции setValue
    это то понятно, а вот как с чекбоксами, я от души нагуглился, а так и не нашел как у них убрать декоратор
    _______________________

    вот что я делаю
    _______________________ Zend_Loader::loadClass(‘Zend_Form_Element_MultiCheckbox’);
    $disciplineSelect = new Zend_Form_Element_MultiCheckbox(‘discipline’);
    $disciplineSelect->setMultiOptions($disciplines);
    $disciplineSelect->removeDecorator(‘Label’);
    $disciplineSelect->removeDecorator(‘HtmlTag’);

    // выбранные значения
    $checked=explode(‘,’,$this->view->entry->disciplines);
    $disciplineSelect->setValue($checked);
    $form->addElement($disciplineSelect);

    _____________________
    вот что получается
    ___________________

    математикабиология<br /
    ______________

    ЗЫ:
    я тоже новичек, причем не просто, а еще и в ООП как таковом ни в зуб ногой. :)

  11. ZlyddeN

    эх… не покажет оно :(
    в общем вокруг каждого чекбокса обертка в виде LABEL FOR…

  12. 666

    Здравствуйте. Очень нужна помощь по данному вопросу!
    Следовал инструкциям официального quickstart:

    1. Установил Zend Server
    2. С помощью cmd в произвольном каталоге (C:\zf) создал проект quickstart
    3. Каталог C:\Program Files\Zend\ZendServer\share\ZendFramework\library\Zend скопировал в C:\zf\quickstart\library
    4. Создал виртуальный хост:

    C:\Program Files\Zend\Apache2\conf\httpd.conf

    ServerName guestbook.local
    DocumentRoot C:/zf/guestbook/public
    SetEnv APPLICATION_ENV “development”

    DirectoryIndex index.php
    AllowOverride All
    Order allow,deny
    Allow from all

    #ZEND-{2EF3DCE7C059B268CF8B9E0707EE5594}
    Include “C:\Program Files\Zend\ZendServer/etc/sites.d/zend-default-vhost-80.conf”
    #ZEND-{2EF3DCE7C059B268CF8B9E0707EE5594}

    5. Добавил в C:\WINDOWS\system32\drivers\etc

    01. 127.0.0.1 guestbook.local

    При открытии локалхоста в браузер выдаёт

    Forbidden

    You don’t have permission to access / on this server.

    Подскажите пожалуйста в чем ошибка.

  13. Артем

    Возникла проблема при переносе сайта, написанного на zend framework, с локального сервера denwer-а на хостинг в интернете. На локалке у меня отлично работали post-запросы, передаваемые через форму, но в интернете все такие запросы воспринимались как get-запросы, хотя method=post был явно прописан. $_SERVER[‘REQUEST_METHOD’] всегда возвращает GET. Что можно сделать?


© Copyright. . I-Novice. All Rights Reserved. Terms | Site Map