Статьи
Портфолио
Друзья
Контакты

Последние статьи

06.07.2010 Memcache и Zend: у Вас "падает" Memcache? 4 коммент.

06.07.2010 Collabtive - web-based project management software 2 коммент.

03.06.2010 Ускоряем ZF-проекты: автолоад и сборка в один файл 2 коммент.

Все

Категории

PHP 2 стат.

Zend Framework 25 стат.

Javascript 3 стат.

Другое 12 стат.

Книги 1 стат.

Украина 1 стат.

Все

RSS

Статьи

Комментарии

Портфолио

Облако тегов

программирование  Программы  портфолио  php  zend framework  Zend_Db  Smarty  Zend_Form  паттерны  javascript  niceforms  jQuery  Zend_Mail  веб  Google  Zend_Rest  Zend_View_Helper  zend casts  Zend_View  Zend_Layout  speedUp  интернет  Загрузчик фотографий  Flash  ВКонтакте  zend  localization  zend_translate  gettext  антон шевчук  подарки  Я читаю  Книги  sphinx  релизы 

Все

Реклама



Статистика



Rambler's Top100

Главная > Статьи > Zend Framework > Введение в Zend Framework: часть вторая
06.08.08 Введение в Zend Framework: часть вторая

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

 

Возможно, когда я уже привыкну, тогда и писаться будет быстрее. Ну это не самое главное, для меня очень важно, чтобы мой труд был кем-то оценен и хотя бы кому-то было интересно читать мои материалы. Так, ладно, что-то никак не начну. На чем мы остановились? Ах да, на написании полноценного (но простого) веб-сайта. В предыдущей части я остановился на создании файла начальной загрузки.

 


Итак, приступим!


 

Начнём с простого примера: допустим нам требуется написать раздел новости на нашем сайте. Для этого нам нужно будет создать базу данных, таблици в ней, котроллеры и скрипты вида (для Zend_View, но об этом позже). Создайте базу данных, и для того, чтобы избежать путаници в названиях, назовите ее «zf_db» (обратите внимание, что все буквы в нижнем регистре). Создайте в базе данных таблицу под названием «news» со следующими полями:

 

НазваниеТипНулевое значение?Примечание
idint(11)нетPrimary key, Autoincrement
titlevarchar(500)нет 
descriptiontextнет 
full_texttextнет

 

 

Сперва нужно четко определится, каким функционалом мы наделим наше приложение. На главной странице мы будем отображать список всех новостей сайта, с возможностью их редактирования. Также будут кнопки для создания новости и её удаления. В итоге наше приложение должно иметь такой функционал:

  1. Вывод всех новостей сайта;
  2. Добавление новостей;
  3. Редактирование новостей;
  4. Удаление новостей;

 

Давайте ознакомися с основами создания страниц в Zend Framework. Согласно принятой терминологии, каждая страница веб-приложения определяется термином «действие». Действия, в свою очередь, объединяются в специальные группы — «контроллеры». Например, для URL http://localhost/web-blog.org.ua/news/view/ контроллером будет news, а действием — view. Контроллеры предназначены для объединения родственных действий.

 

В нашем случае будет один контроллер "news" и четире действия: add, edit, delete, index. Действие index - это действие которое выполняется по-умолчанию (если в адресе URL не задано какое-то другое действие).

 

Для того, чтобы создать необходимые контроллеры и действия, перейдите в папку «/application/controllers/». В Zend Framework контроллер представляет собой класс с именем типа {Имя_контроллера}Controller. Класс должен быть описан внутри файла с именем {Имя_контроллера}Controller.php. Как я уже писал выше, наш конроллер будет называться «news», поетому создайте файл «NewsController.php», а в нём напишите следующий код:

 

 

В этом файле мы объявили класс NewsController, который наследует класс Zend_Controller_Action из библиотеки фреймворка и специфические методы класса, которые оканчиваются словом «Action». Эти методы и есть действиями о которых я писал выше. Тоесть если Вы, например, обратитесь по адресу http://site/news/add/  - «запустится» NewsController, действие add (функция addAction()).

 

Всё. Осталось только наполнить данные действия кодом. Что мы сейчас и сделаем!

 

 

База данных и файл конфигурации


 

Для хранения настроек сайта (настройки для БД, пароли, директории) очень удобно использовать класс Zend_Config и xml файлы. Zend_Config даёт удобный интерфейс для чтения настроек базы данных и для их использования. Также есть класс Zend_Registry, который позволит получать доступ к переменным из любого места нашего приложения. Чтобы использовать всю эту красоту нужно дописать в файл index.php (до вызова метода dispatch() фронт-контроллера) следующие строчки:

 

 

В первой строчке мы загружаем конфигурационный файл. Во второй - сохраняем объект Zend_Config_Xml в реестр (подробнее о работе этих функций читайте в мануале). Далее мы создаём адаптер базы данных, передавая в конструктор настройки из конфигурационного файла и также сохраняем адаптер в реестр. Строка «Zend_Db_Table::setDefaultAdapter($dbAdapter);» устанавливает наш адаптер БД, как адаптер по-умолчанию для всех операций с БД.

 

Создайте файл «config.xml» (что именно вписать — читайте в мануале)  в папке «application». Всё, базу данных мы сконфигурировали. Перейдём к наполнению кодом нашего приложения.

 

 

Наполняем приложение функционалом


 

Напишите такой код в NewsController.php:

 

Код очень простой, поэтому объяснать много не буду (тем более он хорошо задокументирован), если что - читайте мануал по использованным классам - там всё очень неплохо написано. Функция init() вызывается при создании класса, поэтому для удобства я сохранил адаптер БД в переменной класса.

 

Также я использовал очень удобную функцию — _redirect(), которая перенаправляет браузер на заданый адрес. Zend вообще логически понятен, самое сложное в нём - начать. Конечно, Вы можете сказать мне: «И что толку с этого фреймворка?».

 

Поясню: то, что Вы увидели, — очень тривиальные вещи и только со временем, когда Вы дойдёте до использования, например, классов Zend_Feed, Zend_Db_Table, Zend_Db_Table_Rowset или Zend_Db_Table_Row, тогда Вы оцените всю мощь и удобство Zend Framework. Также советую Вам обратить Ваше внимание на классы Zend_Controller_Router_Route и Zend_Cache.

 

 

Послесловие


 

На этих примерах мы с Вами научились работать с контроллерами, действиями, а также выполнять примитивные операции с базой данных. В следующей части моего рассказа я покажу Вам как использовать скрипты вида и как работать с Zend_View. В дальнейшем, я планирую ввести читателя в основы использования классов Zend_Db_Table, Zend_Db_Table_Rowset и Zend_Db_Table_Row.

Теги:  программирование, Zend_Db, zend framework

Другие категории:

■ PHP ■ Zend Framework ■ Javascript ■ Другое ■ Книги ■ Украина
Комментарии к статье
  Петя

19.10.09 16:53:33

Кто тебя так статьи учил писать. Где текст файла config.xml, "я опишу позже", где описал? Пиши либо нормально, либо не трать время людей, дятел

  illusive

19.10.09 18:24:59

Извините, но "дятел"(раз уж перешли на оскорбления) по-моему Вы. Читать надо внимательно, перед тем как людей грязью обливать:

Создайте файл «config.xml» (что именно вписать — читайте в мануале)  в папке «application»...

А Вашего "опишу позже" в материале, по поводу config.xml я почему-то не нашел !

  Михаил

03.11.09 12:01:45

Статья для начинающих - очень хороша... И, по-моему, главная мысль таих статей - это не сделать за нас проект, а постараться объяснить нам подход разработак в данном фреймворке... Только вот возникает вопрос... Под какую версию фрейморка Вы пишете???

  illusive

03.11.09 12:58:35

Спасибо, приятно слышать такие слова.

Материал писался на Zend Framework 1.5.

Извините, что в статье не указал, неподумал, это же мои первые статьи были...

  Дмитрий

09.11.09 15:31:31

Ну наконец что-то внятное в сети я нашел!

Большое человеческое спасибо автору!

понятно всё,очень просто (при наличии прямых рук и трезвой головы Улыбается)

Вот тлько не понял для чего нужна функция init () ? Везде ли нужно использовать ее до вызова indexAction() ?

  illusive

09.11.09 16:03:30

Спасибо Улыбается

Функция init() предназначена для инициализации контроллера. Т.е. если Вам необходимо выполнять определенный код в каждом Action(), то вы просто можете не переписывая конструктор класса(где потом придется вызвать конструктор родительского класса), поместить необходимый код в функцию init(). Эта функция выполняется каждый раз при инициализации контроллера.

 

В нашем случае я использовал эту функцию для помещения объекта БД в защищенную переменную класса, которая доступна потом в каждом из действий контроллера. А зачем дублировать код? Заодно и читателям будет полезно освоить новый прием.

  Дмитрий

09.11.09 19:23:54

как я говорил что всё прекрасно понятно,но что-то не грузится.Скорее всего проблемы с автозагрузкой.

Ничего не пойму.

Пожалуйстя помогите найти ошибку:

Пользуясь мануалом я выяснил,что надо использовать Автолоад.Что и сделал на 9-ой строчке.

При всём этом выдаёт ошибку:

Fatal error: Uncaught exception 'Zend_Exception' with message 'No entry is registered for key 'dbAdapter'' in C:\apache\ilovezf.ru\www\lib\Zend\Registry.php:147 Stack trace: #0 C:\apache\ilovezf.ru\www\application\controllers\NewsController.php(17): Zend_Registry::get('dbAdapter') #1 C:\apache\ilovezf.ru\www\lib\Zend\Controller\Action.php(133): NewsController->init() #2 C:\apache\ilovezf.ru\www\lib\Zend\Controller\Dispatcher\Standard.php(262): Zend_Controller_Action->__construct(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http), Array) #3 C:\apache\ilovezf.ru\www\lib\Zend\Controller\Front.php(946): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #4 C:\apache\ilovezf.ru\www\index.php(15): Zend_Controller_Front->dispatch() #5 {main} thrown in C:\apache\ilovezf.ru\www\lib\Zend\Registry.php on line 147

 

В чём ошибка?

и если можно то поподробнее расскажите про автозагрузку в индексном файле точки входа.а то что-то ничего не выходит...

 

  illusive

09.11.09 23:18:35

Лично я до сих пор не использую автолоад, хотя уже не раз слышал позитивные отзывы об этом. Говорят, что механизм автолоада существенно улучшился. Но не знаю, лично пока не проверял, поэтому и подсказать по нинешней организации автолоада не смогу.

 

А по поводу ошибки, то есть одна мысль. Напишите, например, имя переменной db. Возможно Вы делали копи/паст кода из статьи и где-то там затаилась русские буквы А или Е. Впишите просто название переменной сами, ручками.

  Дмитрий

10.11.09 11:36:07

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

В этом случае,просто вызывается почему-то ErrorController м на этом всё.

Почему так?вроде же ни ошибок,ничего нет?

 

  illusive

10.11.09 11:43:58

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

Рекомендую Вам упаковать Ваш код + импорт БД в архив и закинуть сюда. Буду иметь время - обязательно посмотрю.

 

Попробуйте написать вместо этого

это

  Дмитрий

11.11.09 09:38:17

Понял в чём загвоздка: оказывается в файле NewsController.php есть в функции init() вот это:

вот оно-то и является корнем всех несчастий:)

Если его убрать - то всё работает.а без него никак!

в чём может быть дело?

  illusive

11.11.09 10:48:39

Когда я использовал код, который Вы мне сбросили почтой, я первым делом посмотрел работает ли он. Зашел на корень - было все отлично. Сегодня же зашел по адресу /news - возникла ошибка.

 

На этот раз, когда я уже видел, что именно и как не работает, я более детально покопался в коде. Оказалось, что Вы не верно провели настройку файла начальной инициализации (bootstrap). Мой код (код из статьи) - отработал отлично.

 

Вот переделанный проект. Пробуйте.

 

З.Ы. Вот Ваш старый вариант, для ознакомления читателей

  Дмитрий

12.11.09 10:43:07

всё прекрасно работает,но свои корректировки всё же пришлось внести.

еще хочу добавить,что в индексном файле корневого каталога,нужно писать вместо этого:

вот это

и всё будеи также прекрасно работать.Автозагрузчику не надо указывать все используемые тобой классы.он и так "разберётся" что подключать.

Всем удачи и от автора ждём более подробных и полезных на прктике статей!

  illusive

12.11.09 11:41:43

Они были полезны на практике год назад. А сейчас уже многое поменялось, поэтому у Вас и возникли трудности

  Yuriy

22.12.09 12:36:10

Подскажите, гдн найти содерживое файла  config.xml? Спасибо!

  Дмитрий

22.12.09 15:51:26

содержимое описано в мануале по ZF,согласно описанному и создавайте свой  config.xml.

  Yuriy

24.12.09 10:20:39

А как понять синтаксис Zend_Registry::set('config', $config); меня интересует двоеточие (::) что это означает. В классах принято писать -> . Что за синтаксис такой??? Сппасибо!!!!

  illusive

24.12.09 10:41:07

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

Таким образом вызываются статические методы классов

  Yuriy

24.12.09 12:10:42

Создайте файл «config.xml» (что именно вписать — читайте в мануале). Я нашел вот ето код. Именно его нужно вставить у файл «config.xml»? Какие параметры настройки необходимо в этом файле поменять?

  illusive

24.12.09 19:24:37

Просто изучите возможности Zend_Config и Вы быстро поймете как такой файл должен выглядеть. Копипастить мануал - не вижу смысла

  Yuriy

25.12.09 10:13:15

А будьте так любезны. Подскажите мне одну особенность. Вот есть начальный загрузочный файл index.php. В нем прописаны пути к дерикториям. Когда мне нужно сохранить, скажем к примеру в реестре Zend_Registry какие-нибуть данные, то приходиться указывать путь и включать таким способом  include("../libs/Zend/Registry.php"); чтобы добраиться к этому файлу. Если я не включу то выдает ошибку, класс не найден!!! А можно ли как-то в самом начале определить все деректории чтобы не писать каждый раз  include чтобы добраться к нужному классу? А то получается если мне нужен какой-то класс, то нужно сначала включить с помощью include у файл index.php, а затем только пользоваться им! Зарание спасибо за розяснения!!!

 

 

  Дмитрий

25.12.09 10:23:03

нет,вы же в самом начале подключили автолоадер классов.вот он всю работу и делает за вас.

  Yuriy

25.12.09 12:26:17

Еще один вопрос: не работает вот этот код:

Создал подключение:

  Затем:

Делаю запрос:

И мне выдает:

Fatal error: Call to undefined method Zend_Config_Ini::select() in T:\home\virtual\aqua\applications\controllers\NewsController.php on line 20

Что может быть не так? Спасибо!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  Yuriy

25.12.09 15:09:44

А скажите, пожалуйста, как проверить подключение к базе даных, каким способом. У меня проблема возникла. Не работает метод вывода

метод fetchAll() вообще толи не распознается толи я уже не знаю...

Я меня следующий код:

   


и мне выдает ошибку:
Fatal error: Uncaught exception 'Zend_Db_Adapter_Exception' with message 'The mysql driver is not currently installed' in T:\home\virtual\aqua\libs\Zend\Db\Adapter\Pdo\Abstract.php:112 Stack trace: #0 T:\home\virtual\aqua\libs\Zend\Db\Adapter\Pdo\Mysql.php(96): Zend_Db_Adapter_Pdo_Abstract->_connect() #1 T:\home\virtual\aqua\libs\Zend\Db\Adapter\Abstract.php(448): Zend_Db_Adapter_Pdo_Mysql->_connect() #2 T:\home\virtual\aqua\libs\Zend\Db\Adapter\Pdo\Abstract.php(238): Zend_Db_Adapter_Abstract->query('SELECT * FROM n...', Array) #3 T:\home\virtual\aqua\libs\Zend\Db\Adapter\Abstract.php(706): Zend_Db_Adapter_Pdo_Abstract->query('SELECT * FROM n...', Array) #4 T:\home\virtual\aqua\public\index.php(49): Zend_Db_Adapter_Abstract->fetchAll('SELECT * FROM n...') #5 {main} thrown in T:\home\virtual\aqua\libs\Zend\Db\Adapter\Pdo\Abstract.php on line 112

Хотя должно по умолчанию fetchAll() возвращать массив строк, каждая из которых представлена ассоциативным массивом.
Помогите разобраться что не так написано, или что еще нужно может дописать в код!!!

 

 

 

 

 

 

  illusive

25.12.09 17:12:52

По поводу фатал еррора... У Вас глупая ошибка в программном коде: Вы пытаетесь вызвать метод select() Zend_Config_Ini (а его не существует)... Надо написать так:


По поводу БД - у Вас не установлено расширение PHP pdo_mysql на сервере.

Будьте повнимательней! 

  Yuriy

25.12.09 17:23:18

Подскажите где можна скачать библиотеку php_pdo_mysql.dll в бинарном виде для Window XP? без этого с БД работать невозможно!!!Клёвый

  Дмитрий

25.12.09 17:27:10

зачем вам это???она уже есть в стандартном пакете РНР.

Извините,но чтоб лезти в такие дебри как Зенд Фреймворк,подучите синтаксис РНР5+ООП ну и установку и настройку РНР5.Это вещи простые и для обсуждения сдесь не уместны.Надеюсь вы меня поймете.

  illusive

25.12.09 17:27:22

Не пробовали погуглить?
  Yuriy

26.12.09 08:29:41

Синтаксис  и настройку  я понимаю. А вот то, что нет библиотеки в папке usr/local/PHPPECL/php_pdo_mysql.dll и нет совсем строчки в файле php.ini - extension=php_pdo_mysql.dll - это факт. Как же тогда Зенд может работать с БД? Вопрос!!! Единственная библиотека, каторая эсть с PDO - это - php_pdo.dll. Поэтому потрудитесь объяснить мне пожалуйста, может без этой библиотеки работать Зенд? Кстати денвер у меня TopServer, версия модуля РНР - PHP Version 5.1.6. Может просто в комплект установки не включили, поэтому нужно где-то раскопать библиотеку и поддключить ее, или проще другой денвер установить чтобы были все примочки???

  Дмитрий

26.12.09 08:37:49

да не пользуйтесь вы денвером!устанавливайте самостоятельно всё по отдельности:РНР 5.3.1+Апач 2.2.14+MySQL 5.1 Если хотите быть хорошим девелопером:) + ко всему есть в этих дистрибутивах всё необходимое.

  Yuriy

28.12.09 11:10:28

Подскажите, пожалуйста. Есть у меня файл header.phtml (он находиться в папке applications/views/scripts/header.phtml) и ссылка в этом файле на подключение стилей CSS - (они находяться у меня в папке public/styles/site.css).




Ссылка, почему-то неработает когда я подключаю ее!!! Когда я вписываю внутри самого файла стили оформления (н/р: <style></style) все работает замечательно, но мне нужно вынести стили, а не писать внутри файла!!! В чем проблема может быть?

  illusive

28.12.09 12:00:09

Попробуйте из путей убрать "public". И лучше задавать абсолютные пути, без указания домена, например, вместо http://domain.com/styles/styles.css писать /styles/styles.css
  Yuriy

28.12.09 13:02:24

Увы, не работает!  Может проблема в том, что файл с расширением phtml и такие файлы не воспиринимают внешнее подключение!!! Когда переименуешь в обычный html-файл стили работают!

Папка site.css - находиться в директори: http://aqua.com/public/styles/site.css

Файл header.phtml в дериктории - http://aqua.com/applications/views/scripts/header.phtml.

Я прописываю ссылку:

<link href="&"quot;http://aqua.com//public/styles/site.css" rel="stylesheet" type="text/css" />

Что сдесь не так? Пробывал писать так как Вы говорили:

<link href="&"quot;/styles/site.css" rel="stylesheet" type="text/css" />

Не работает!!!Плачет

 

 

 

 

 

 

 

  illusive

28.12.09 18:41:57

Понятия не имею, что Вы там крутите и мутите. Совсем непонятно зачем переименовывать phtml. Это же ни на что не влияет. Чувствую, что Вам надо сначала изучить азы веб-разработки, перед тем как заниматься Zend Framework

  Yuriy

29.12.09 09:40:18

Я просто переименовал чтобы посмотреть реакцию файла на подключаемые стили..., а она все таки не работает! Да ладно с ней, попытаюсь как-то сам разобраться! А Хамить то не надо! И основные понятия я уже знаю... единственное что я попросил, так это помочь разобраться с файлом подключения, а  то я вижу сдесь все считают себе "выше крышы" в том числе и ВЫ.... Не красиво так поступать, вы же работаете на публику....)))

  Дмитрий

29.12.09 09:56:59

Юрий,по-моему автор этого блога прав и он абсолютно вам не хамит.

Никто себя выше крыши не считает,просто у кого-то опыта больше и всё.По-моему хамить начинаете вы.Автор и так всё хорошо описывает.

  illusive

29.12.09 16:25:24

@Yuriy
Извините, но в самом деле я не понимаю с Ваших объяснений,  о чем именно идет речь. Тем более, что вопрос со стилями - очень уж нубовский. Извините за излишнее раздражение Подмигивает

@Дмитрий
Спасибо Смеётся 

  illusive

29.12.09 16:26:57

Кстати, а как Вы подключаете Ваш стиль? В шаблоне или скрипте вида? С помощью помощников вида? Расскажите по подробнее

  Роман

23.01.10 20:17:03

Создайте файл «config.xml» (что именно вписать — читайте в мануале)

 

Прошу прощения за глупый вопрос, а где находиться сам мануал?

  illusive

23.01.10 23:16:16

http://framework.zend.com/manual/en/

  Роман

27.01.10 15:02:34

Спасибо! Возник еще один вопрос.

// Передача настроек адаптеру БД  
$dbAdapter = Zend_Db::factory($config->db->adapter, $config->db->config->toArray());

Мне не понятно, что хранится в toArray()?

  illusive

27.01.10 15:16:34

toArray() это уже функция. Она возвращает содержимое ветки конфига ввиде массива

  Сергей

25.02.10 21:43:41

К слову о автозагрузке! Я вот так сделал! require ("Zend/Loader.php"); Zend_Loader::registerAutoload(); // запуск автозагрузки...
Оставить свой комментарий

 
Статьи | Портфолио | Друзья | Контакты
Идея и мозги: Васильев Андрей © 2008-2010 Web-Blog Кисточка и фантазия: Зелинский Богдан