Проблемы с Zend Framework

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

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

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

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

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

Так уж повелось у меня, что каждый отдельный проект на php я храню локально в отдельной папке корневого каталога веб-сервера. Доступ к ним через адресную строку браузера осуществляется так: http://localhost/project1/ и так http://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']);
…

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




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



 #  #  #  #  #  #  #  #  #  #

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

  1. Sergey
    Декабрь 12th, 2008

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

    Или выбрать другой адаптер:
    http://i-novice.net/gout/DkIQRQgcSwIXUVoAQFxHCk1MVFoHGlZXVBZaAwhDWQlJUwoaSFYKAEtUVUtfR1gNQExUWgcaUVoXWFMDFkJdF0hXAFRCRwEWSF5YEVJA/

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

  2. Александр Махомет
    Декабрь 12th, 2008

    В 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. Oleg Lobach
    Декабрь 12th, 2008

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

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

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

  4. Игорь
    Декабрь 12th, 2008

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

  5. cryptus
    Декабрь 12th, 2008

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

  6. cryptus
    Декабрь 12th, 2008

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

  7. cryptus
    Декабрь 12th, 2008

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

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

  9. cryptus
    Февраль 3rd, 2009

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

  10. ZlyddeN
    Март 26th, 2010

    >>>функции 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
    Март 26th, 2010

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

Оставить комментарий


© 2008 - 2010 i-novice.net | Все права защищены.