« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга



ПнВтСрЧтПтСбВс
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
    Популярное
Налог по основному месту работы

Функция SetBitmapBits

Создание пользовательского пункта системного меню на C

Закругление углов без использования изображений

Получение и установка текущей раскладки клавиатуры

Функция SetSoundNoise

Инструкция case

Полный мануал по созданию компактного кода

Генератор случайных чисел распределенных по нормальному закону

Песнь о CGI-скриптах




    Архив файлов



    Сообщества

    Документация

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 82
Пользователей: 0

Статьи:: Интернет технологии :: PHP :: Введение в Zend Framework



отправить ссылку другу версия для печати  Обсудить на форуме

Введение в Zend Framework

Аннотация от переводчика

PHP — один из самых широко распространенных языков разработки веб-приложений и при этом один из самых спорных. Я очень часто видел негативное отношение к этой технологии, да и недостатки, провоцирующие это отношение — не для кого не являются секретом. Тем не менее, PHP активно эволюционирует и во многих отношениях постепенно становитс лучше. Одним из серьезных шагов его развития, на мой взгляд, является появление MVC-фреймворков, призванных систематизировать процесс разработки веб-приложений и приучить к порядку разработчиков, которым зачастую здорово не хватает силы воли, чтобы при всей предоставляемой языком свободе, сохранить грамотную и красивую инфраструктуру разрабатываемого ПО (сразу уточню, что последнее утверждение субъективно и основано исключительно на виденном мной коде различных программных решений).



В последнее время я активно заинтересовался архитектурой MVC и сделал свою собственную реализацию фреймворка на этой концепции для PHP4. Совсем недавно на глаза попался первый официальный релиз Zend Framework, о котором я давно слышал, но все руки не доходили с ним поиграть. Для PHP существуют и другие подобный библиотеки, но в данном случае привлек бренд.

Вначале я испытал некоторое разочарование в официальной документации, которая оказалась хорошим reference-ом, но просто никаким tutorial-ом и поэтому на роль вводного материала не подошла. Но почти сразу нашлась неплохая статья, в которой автор пошагово разбирает процесс создания веб-приложения. Материала достаточно, чтобы разобравшись в нем можно было начать осмысленно ориентироваться в мане от Zend. Текст ориентирован на программистов, имеющих некоторый опыт в программировании веб-приложений на PHP, но не знакомых с Zend Framework.

Статья довольно объемная, поэтому я решил разделить ее на две части, дабы не перегружать никому мозг. Ниже я привожу первую часть ее перевода, в которой в общих чертах освещена концепция MVC и разобрана структура веб-приложения, реализованного на Zend Framework. Если материал заинтересует хабрачитателей, я опубликую продолжение.

В завершение введения, небольшой дисклаймер. Уважаемые любители Ruby on Rails и Python on Django, я уважаю вашу религию :) Убедительная просьба не развивать в комментариях тему о том, какой фреймворк или язык лучше. Это совсем не относящаяся к топику данного поста тема. Мне и, вероятно, многим сейчас будет гораздо интереснее узнать об опыте реальных разработок ПО на Zend.

Автор: Роб Ален, http://akrabat.com
Оригинал: http://akrabat.com/zend-framework-tutori…
Перевод: Александр Мусаев, http://paradigm.ru

* * *

Данный материал рассчитан на то, чтобы дать общее представление об использовании Zend Framework для создания простейших приложений с использованием баз данных. Приведенные примеры были протестирован на Zend Framework версии 1.0.0. Скорее всего, они будут работать и с более поздними версиями, но не с более ранними.

Архитектура Модель-Вид-Контроллер

PHP-приложение, написанное традиционным способом, может представлять собой некое подобие следующего примера:
<?php
include "common-libs.php";
include "config.php";
mysql_connect($hostname, $username, $password);
mysql_select_db($database);
?>
<?php include "header.php"; ?>
<h1>Home Page</h1>
<?php
$sql = "SELECT * FROM news";
$result = mysql_query($sql);
?>
<table>
<?php while ($row = mysql_fetch_assoc($result)) { ?>
<tr>
<td><?php echo $row['date_created']; ?></td>
<td><?php echo $row['title']; ?></td>
</tr>
<?php } ?>
</table>
<?php include "footer.php"; ?>

В ходе жизненного цикла приложений подобного типа, трудоемкость их поддержки становится крайне высока, т. к. меняющиеся требования заказчика приводят к необходимости вносить большое количество изменений («заплаток») в исходный код. Это делает его плохо структурированным и трудно читаемым. Один из методов для повышения гибкости приложения состоит в разделении кода на три категории:
  • Модель. Моделью называют ту часть приложения, которая относится к работе с данными. в приведенном выше фрагменте кода, это реализация новостной ленты. Подобные модели широко применимы в управляющей логике приложений, имеющих в своей основе базы данных.
  • Вид. Под термином «вид» подразумевается пользовательский интерфейс приложения.
  • Контроллер. Контроллеры реализуют задачи, связанные со взаимодействием между моделью и видом.
Zend Framework основан на программной архитектуре Модель-Вид-Контроллер (Model-View-Controller). Ее суть состоит в разделении приложения на перечисленные выше три отдельные компоненты таким образом, что модификация каждого из них оказывает минимальное воздействие на остальные. Это приводит к существенному облегчению процесса разработки и поддержки.

Системные требования

У Zend Framework следующие требования:
  • PHP версии 5.1.4 или выше;
  • Веб-сервер, поддерживающий mod_rewrite.
В данной статье используется сервер Apache.

Где скачать Zend Framework

Zend Framework доступен для свободного скачивания в виде ZIP или TAR.GZ архивов по адресу http://framework.zend.com/download/stabl….

Структура директорий

На данный момент в Zend Framework жестко не стандартизирована структура директорий приложения, но в официальной документации рекомендуется использовать общепринятую схему. Эта схема основана на том, что пользователь, как предполагается, имеет полный доступ к конфигурированию сервера Apache. Мы же будем использовать немного видоизмененный подход, чтобы смягчить данные требования и сделать Zend Framework более применимым в условиях широко распространенного разделяемого хостинга.

Для начала, создайте директорию zf-tutorial в корневом каталоге вашего тестового веб-сайта. Это будет означать, что URL этой директории примет вид http://localhost/zf-tutorial (адрес может варьироваться, в зависимости от настроек вашего сервера).

После этого дополнительно создайте следующую структуру каталогов для хранения файлов веб-приложения:
zf-tutorial/
    /application
        /controllers
        /models
        /views
            /filters
            /helpers
            /scripts
        /library
        /public
            /images
            /scripts
            /styles

Как можно понять из названий, мы выделили специальные директории для файлов моделей, видов и контроллеров приложения. Графика, скрипты и CSS файлы будут храниться в отдельных подкаталогах, расположенных внутри открытой для публичного доступа директории public.

Для начала, разархивируйте скачанный файл ZendFramework-1.0.0.zip (или .tar.gz) во временную директорию. Все файлы внутри архива находятся в директории ZendFramework-1.0.0. Скопируйте содержимое library/Zend в zf-tutorial/library. Теперь ваша директория zf-tutorial/library должна содержать подкаталог Zend.

Начальная загрузка

Контроллер Zend_Controller из библиотеки Zend Framework спроектирован для поддержки сайтов с хорошо читаемыми («чистыми») URL. Для достижения этой цели, все запросы к серверу перенаправляются для обработки на специальный файл index.php, именуемый так же файлом начальной загрузки (“bootstrapper”). Такой подход обеспечивает централизованную организацию инфраструктуры приложения и гарантирует корректную для его функционирования настройку программного окружения. Это достигается благодаря использованию конфигурационного файла .htaccess, который находится в директории zf-tutorial.

zf-tutorial/.htaccess:
RewriteEngine on
RewriteRule .* index.php
php_flag magic_quotes_gpc off
php_flag register_globals off

Директивой RewriteRule задано очень простое правило перенаправления URL, которое может быть переведено на человеческий язык, как «использовать index.php вместо любого URL». Для обеспечения безопасности так же откорректированы некоторые настройки интерпретатора PHP. в принципе, они уже должны быть заданы соответствующим образом в конфигурационном файле php.ini любого грамотно настроенного сервера, но в нашем примере они дублируются локально для большей надежности. Обратите внимание на то, что директива php_flag внутри файла .htaccess может применяться только при использовании mod_php. Если вы используете PHP через CGI или FastCGI, необходимо удостовериться в правильной настройке php.ini.

Вопреки сказанному выше, запросы, относящиеся к графическим файлам, JavaScript и CSS, не должны быть перенаправлены на index.php. Учитывая, что все они хранятся в отдельной директории public, мы с легкостью можем настроить Apache, чтобы сервер отдавал их напрямую. Для этого необходимо создать еще один файл .htaccess в директории public и задать в нем соответствующую директиву.

zf-tutorial/public/.htaccess:
RewriteEngine off

Для повышения безопасности, можно создать дополнительные файлы .htaccess в директориях zf-tutorial/application и zf-tutorial/library, с одинаковым содержимым:

zf-tutorial/application /.htaccess, zf-tutorial/library/.htaccess:
Deny from all

Эта директива закроет доступ из web к содержимому указанных директорий. (Прим. переводчика: последние два файла можно не создавать вообще, если все, что находится вне директории public, заведомо закрыто глобальными настройками сервера).

Обратите внимание на то, что для использования файлов .htaccess, в настройках сервера Apache (httpd.conf) должна быть задана директива AllowOverride со значением All. Приведенная в данной статье идея использования файлов .htaccess принадлежит Джейсону Майнарду (Jayson Minard) и опубликована в статье «Схема построения PHP-приложений: начальная загрузка (Часть 2)» (http://devzone.zend.com/node/view/id/119). Начинающим разработчика стоит ознакомиться с обеими ее частями.

Файл начальной загрузки index.php

Файл начальной загрузки zf-tutorial/index.php содержит следующий код:
<?php

error_reporting(E_ALL|E_STRICT);
date_default_timezone_set('Europe/London');
set_include_path('.'.PATH_SEPARATOR . './library'
    .PATH_SEPARATOR.'./application/models/'
    .PATH_SEPARATOR.get_include_path());

include "Zend/Loader.php";
Zend_Loader::loadClass('Zend_Controller_Front');

// setup controller
$frontController = Zend_Controller_Front::getInstance();
$frontController->throwExceptions(true);
$frontController->setControllerDirectory('./application/controllers');

// run!
$frontController->dispatch();

Заметьте, что в конце файла отсутствует закрытие блока PHP кода ?>, т. к. в нем нет необходимости. Кроме того, наличие закрывающего тага может привести к появлению сложных для выявления ошибок при редиректе функцией header(), если в конце файла по недосмотру останутся лишние пробелы.

Рассмотрим код подробнее.
error_reporting(E_ALL|E_STRICT);
date_default_timezone_set('Europe/London');

Данные строки обеспечивают вывод интерпретатором всех сообщений о происходящих ошибках (подразумевается, что в конфигурационном файле php.ini параметру display_errors задано значение on). Вторая строка кода задает часовой пояс, согласно стандартному требованию PHP 5.1+. Приведенное в примере значение параметра следует заменить на соответствующее вашему географическому положению.
set_include_path('.'.PATH_SEPARATOR.'./library'
    .PATH_SEPARATOR.'./application/models/'
    .PATH_SEPARATOR.get_include_path());
include "Zend/Loader.php";

Zend Framework рассчитан на то, чтобы его файлы находились в include_path, поэтому мы добавляем к значению этого параметра путь к нужной директории. Помимо него, в include_path добавляется директория моделей, чтобы облегчить подключение файлов и из нее.

Файл Zend/Loader.php содержит класс Zend_Loader со статическими функциями, позволяющими подключать любой класс из Zend Framework.
Zend_Loader::loadClass('');

Метод Zend_Loader::loadClass() подключает класс с заданным именем. Для этого выполняется преобразование указанного имени в путь к соответствующему файлу: символы «_» заменяются на «/», а в конце получившейся строки добавляется расширение .php. Таким образом, Zend_Controller_Front преобразуется в Zend/Controller/Front.php. Если следовать аналогичной схеме построения имен для собственных библиотечных классов, то метод Zend_Loader::loadClass() можно будет использовать и с ними.

Класс, который понадобится нам прежде всего, — первичный контроллер. При его работе, в свою очередь, используется специальный класс-роутер, чья задача состоит в нахождении по заданному URL функции отображения соответствующей веб страницы. Для этого роутере должен быть определен базовый URL файла index.php, относительно которого он сможет выделять URI отдельных страниц.

Базовый URL может автоматически определяется с помощью объекта Request, а для того, чтобы применить его в нашем примере следует воспользоваться методом $frontController->setBaseUrl().

Далее нам понадобится сообщить первичному контроллеру о местоположении директории с другими контроллерами:
$frontController = Zend_Controller_Front::getInstance();
$frontController->setControllerDirectory('./application/controllers');
$frontController->throwExceptions(true);

Учитывая, что наша программа предназначена для образовательных целей и функционирует на тестовой системе, можно разрешить все исключения, которые могут происходить при ее работе. По-умолчанию, первичный контроллер будет перехватывать их все до одного и хранить в свойстве _exceptions своего объекта (данному объекту соответствует англоязычный термин “Response object”). Этот объект используется для хранения всей информации, возвращаемой при обращении к заданному URL, что включает HTTP-заголовок, содержимое веб-страницы и массив произошедших исключений.

Первичный контроллер автоматически выдает заголовок и контент страницы непосредственно перед окончанием своей работы. Тех, кто ранее не встречался с архитектурой веб-приложений, подобной Zend Framework, может привести в некоторое недоумение тот факт, что для отображения сообщений об исключительных ситуациях, их (исключения) необходимо повторно возбуждать. Эта особенность становится актуальной для серверов, работающих в своем штатном режиме, когда вывод сообщений об ошибках на страницах неуместен.

В итоге, после всех выполненных приготовлений, наше приложение может быть запущено:
// run!
$frontController->dispatch();

Если вы сейчас попытаетесь открыть страницу http://localhost/zf-tutorial/, то увидите сообщение о фатальной ошибке, гласящее примерно следующее:
Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (index)' in...

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

Веб-сайт

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

Fieldname Type Null? Notes
id Integer No Primary key, Autoincrement
artist Varchar(100) No  
title Varchar(100) No  


Необходимые страницы

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

Организация страниц

Прежде чем приступить к созданию файлов, следует понять, как принято организовывать их в Zend Framework. Согласно принятой терминологии, каждая страница веб-приложения определяется термином «действие».

(Примечание переводчика. Небольшое пояснение терминологии. Англоязычным оригиналом используемого в данной статье термина «действие» является слово “action”. Приведенный перевод на данный момент еще не является устоявшимся понятием, и в некоторых текстах о модели MVC вместо него попадаются иные определения. Например, так же известна прямая (и режущая слух) транслитерация — «экшен».)

Действия, в свою очередь, объединяются в специальные группы — «контроллеры». Например, для URL http://localhost/zf-tutorial/news/view контроллером будет news, а действием — view. Контроллеры предназначены для объединения родственных действий. Для упомянутого news, могут быть определены действия current, archived и view (соответственно для отображения последней новости, архива записей и новостной ленты).

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

В контроллерах Zend Framework существует понятие действия по-умолчанию, для которого зарезервировано имя index. Такие действия исполняются при обращении к URL вида http://localhost/zf-tutorial/news/ (в данном примере выполняется действие index контроллера news). Помимо исполняемых по-умолчанию действий, так же предусмотрены выбираемые по-умолчанию контроллеры с аналогичным именем — index. Это означает, что URL http://localhost/zf-tutorial/ будет соответствовать действию index контроллера index.

Учитывая, что данная статья ориентирована на первое знакомство с Zend Framework, мы не будем пока касаться таких нюансов работы веб-приложения, как авторизация пользователей. Ограничимся реализацией основной функциональности, а именно — набором перечисленных выше страниц. Учитывая, что все они относятся к работе с альбомами, можно отнести их к одному контроллеру. Мы используем стандартный контроллер, а его действия будут выглядеть следующим образом:

Страница Контроллер Действие
Начальная страница Index Index
Добавить альбом Index Add
Редактировать альбом Index Edit
Удалить альбом Index Delete


Настройка контроллера

Приступим к созданию нашего контроллера. в Zend Framework контроллер представляет собой класс с именем типа {Имя_контроллера}Controller. Класс должен быть описан внутри файла с именем {Имя_контроллера}Controller.php, в общей директории контроллеров. Стоит обратить внимание на важный нюанс: первая буква в имени класса-контроллера и имени его файла должна быть заглавной, а все остальные — строчными. Каждое действие должно быть открытой функцией класса-контроллера с именем типа {имя_действия}Action. в данном случае, имена действий должны начинаться со строчной буквы.

Таким образом, наш класс-контроллер будет носить имя IndexController и находиться в файле zf-tutorial/application/controllers/IndexController.php.

zf-tutorial/application/controllers/IndexController.php:
<?php

class IndexController extends Zend_Controller_Action
{
    function indexAction()
    {
        echo "<p>in IndexController::indexAction()</p>";
    }

    function addAction()
    {
        echo "<p>in IndexController::addAction()</p>";
    }

    function editAction()
    {
        echo "<p>in IndexController::editAction()</p>";
    }

    function deleteAction()
    {
        echo "<p>in IndexController::deleteAction()</p>";
    }
}

В данном макете контроллера каждое действие будет выводить свое имя. Это можно протестировать, задавая приведенные ниже URL:
URL Displayed text
http://localhost/zf-tutorial/ in IndexController::indexAction()
http://localhost/zf-tutorial/index/add in IndexController::addAction()
http://localhost/zf-tutorial/index/edit in IndexController::editAction()
http://localhost/zf-tutorial/index/delete in IndexController::deleteAction()

Теперь у нас имеется работающий класс-роутер с набором действий, соответствующих каждой странице веб-приложения. При возникновении каких-либо проблем в процессе его создания, обратитесь к разделу «Устранение неполадок» в конце статьи.

А теперь пришло время добавить в наше приложение новый вид.

Вид

Класс Zend Framework, на базе которого строится вид, называется просто и бесхитростно — Zend_View. Вид позволяет отделить код, отвечающий за отображение страницы, от кода функций-действий.

Простейший вариант использования Zend_View выглядит как показано ниже:
$view = new Zend_View();
$view->setScriptPath('/path/to/view_files');
echo $view->render('view.php');

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

Разработчики Zend Framework предусмотрели решение этой задачи и для ее решения создали так называемые «помощники действий» (“action helpers”). Класс Zend_Controller_Action_Helper_ViewRenderer инициализирует свойство view для нашего последующего использования ($this->view), а так же занимается отображением скриптов вида. Для рендеринга веб-страниц он использует объект Zend_View, который в свою очередь находит скрипты видов в файлах views/scripts/{имя_контроллера}/{имя_действия}.phtml (по-умолчанию они хранятся именно там, но при необходимости дислокацию скриптов можно менять).

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

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

Изменения внутри класса IndexController выделены жирным шрифтом.

zf-tutorial/application/contollers/IndexController.php:
<?php

class IndexController extends Zend_Controller_Action
{
    function indexAction()
    {
        $this->view->title = "My Albums";
    }

    function addAction()
    {
        $this->view->title = "Add New Album";
    }

    function editAction()
    {
        $this->view->title = "Edit Album";
    }

    function deleteAction()
    {
        $this->view->title = "Delete Album";
    }
}

Внутри каждой функции мы присваиваем значение переменной title свойства view. Заметьте, что при этом в действительности не происходит никакого отображения текста — это задача первичного контроллера, которая будет выполнена в самом конце работы системы.

Теперь нам понадобится добавить четыре файла для видов нашего веб-приложения.

zf-tutorial/application/views/scripts/index/index.phtml:
<html>
<head>
    <title><?php echo $this->escape($this->title); ?></title>
</head>
<body>
    <h1><?php echo $this->escape($this->title); ?></h1>
</body>
</html>

zf-tutorial/application/views/scripts/index/add.phtml:
<html>
<head>
    <title><?php echo $this->escape($this->title); ?></title>
</head>
<body>
    <h1><?php echo $this->escape($this->title); ?></h1>
</body>
</html>

zf-tutorial/application/views/scripts/index/edit.phtml:
<html>
<head>
    <title><?php echo $this->escape($this->title); ?></title>
</head>
<body>
    <h1><?php echo $this->escape($this->title); ?></h1>
</body>
</html>

zf-tutorial/application/views/scripts/index/delete.phtml:
<html>
<head>
    <title><?php echo $this->escape($this->title); ?></title>
</head>
<body>
    <h1><?php echo $this->escape($this->title); ?></h1>
</body>
</html>

При тестирование каждого из действий, должны быть отображены выделенные заголовки каждой из страниц.

Общий HTML-код

Уже сейчас становится заметно использование одинаковых фрагментов HTML кода в наших видах. Выделим идентичные для всех файлов части в два отдельных файла: header.phtml и footer.phtml, созданных внутри все той же директории со скриптами.

zf-tutorial/application/views/scripts/header.phtml:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <title><?php echo $this->escape($this->title); ?></title>
</head>
<body>
    <div id="content">

(Обратите внимание на изменения, добавленный в код.)

zf-tutorial/application/views/scripts/footer.phtml:
    </div>
</body>
</html>

Файлы видов так же понадобится откорректировать.

zf-tutorial/application/views/scripts/index/index.phtml:
<?php echo $this->render('header.phtml'); ?>
<h1><?php echo $this->escape($this->title); ?></h1>
<?php echo $this->render('footer.phtml'); ?>

zf-tutorial/application/views/scripts/index/add.phtml:
<?php echo $this->render('header.phtml'); ?>
<h1><?php echo $this->escape($this->title); ?></h1>
<?php echo $this->render('footer.phtml'); ?>

zf-tutorial/application/views/scripts/index/edit.phtml:
<?php echo $this->render('header.phtml'); ?>
<h1><?php echo $this->escape($this->title); ?></h1>
<?php echo $this->render('footer.phtml'); ?>

zf-tutorial/application/views/scripts/index/delete.phtml:
<?php echo $this->render('header.phtml'); ?>
<h1><?php echo $this->escape($this->title); ?></h1>
<?php echo $this->render('footer.phtml'); ?>

Стилевое оформление

Для того, чтобы сделать наше веб-приложение визуально более привлекательным, используем CSS. На этом этапе возникает небольшая проблема, связанная с тем, что заранее неизвестен URL корневой директории, необходимый для ссылки на CSS-файл. Для разрешения этой задачи используется функция getBaseUrl() передаваемого в вид объекта Request. Она и предоставит нам неизвестный заранее фрагмент URL.

Это свойство становится доступным из любого действия, после выполнения IndexController::init().

zf-tutorial/application/controllers/IndexController.php:
...
class IndexController extends Zend_Controller_Action
{
    function init()
    {
        $this->view->baseUrl = $this->_request->getBaseUrl();
    }

    function indexAction()
    {
...

Ссылку на CSS-фалй понадобится добавить в секцию <head> файла header.phtml:

zf-tutorial/application/views/scripts/header.phtml:
...
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <title><?php echo $this->escape($this->title); ?></title>
    <link rel="stylesheet" type="text/css" media="screen"
    href="<?php echo $this->baseUrl;?>/public/styles/site.css" />
</head>
...

В завершении, понадобится создать, собственно, сам стилевой файл.

zf-tutorial/public/styles/site.css:

body,html {
    font-size: 100%;
    margin: 0;
    font-family: Verdana, Arial, Helvetica, sans-serif;
    color: #000;
    background-color: #fff;
}

h1 {
    font-size:1.4em;
    color: #800000;
    background-color: transparent;
}

#content {
    width: 770px;
    margin: 0 auto;
}

label {
    width: 100px;
    display: block;
    float: left;
}

#formbutton {
    margin-left: 100px;
}

a {
    color: #800000;
}

Это заставит страницы выглядеть несколько приятнее.



Рубрика: PHP




Подгрузка через AJAX HTML-кода, содержащег....

AJAX

При разработке CMS S.Builder наша команда активно использовала AJAX. Теперь вот решили поделиться накопленным опытом. Начнем с этого хабратопика. Не буду здесь затрагивать различные фреймворки и библиотеки. Свой код всегда роднее. Для работы с AJAX-ом в S.Builder написана библиотека sbAJAX. Можете качать и пользоваться :). В этом файле есть функция sbEvalJS. Для тех, кто не знает, объясню. При подгрузке через AJAX и вставке на страницу HTML-кода, содержащего JavaScript, JavaScript выполняться не будет или полезут баги. Эта функция как раз решает поставленную задачу.


Подробнее... | Рубрика: AJAX | Добавлено: 19.11.2008

Обзор нового релиза самой мощной Ajax библ....

AJAX

Хотя наш обзор немного запоздал, оригинальный Dojo 1.2 вышел в релизной версии ещё 6-го октября, но сейчас мы наверстаем упущенное. И так, Dojo Toolkit — это самая мощная и гибкая ajax-библиотека из всех, что есть на рынке, она активно развивается и имеет большое комьюнити. Кстати, это самое комьюнити, совместно с компанией Sitepen, имеет ещё несколько проектов, среди которых и Cometd и некоторые другие, не менее интересные, о которых мы скоро вам расскажем. Сегодня же все внимание на флагманский продукт — Dojo 1.2.


Подробнее... | Рубрика: AJAX | Добавлено: 19.11.2008

Firebug 1.3 и 1.4 alpha — что нового и инт....

Вебмастеру

Если вы профессиональный веб-разработчик и постоянно имеете дело с разработкой и отладкой сложных AJAX приложений, то наверняка знаете и используете Firebug — плагин для браузера Firefox, предназначенный для отладки и исследования веб-приложений. Текущая его версия, 1.2х достаточно стабильная и функциональна, чтобы помочь в 99% проблем, которые могут возникнуть при разработке. Но и этот инструмент не лишён если не недостатков, то некоторых фич, которые могли бы облегчить работу. И даже идеальный инструмент можно сделать ещё более идеальным, как бы это не звучало.


Подробнее... | Рубрика: Вебмастеру | Добавлено: 19.11.2008

Остальные статьи:

Релиз Microsoft Silverlight 2.0. Что новог...
XML документация в C#
Курсоры в MySQL 5
Microsoft опубликовала подробности о сесси...
Microsoft делится подробностями о том, что...
Тестируем новый javascript от нового брауз...
MySQL Query Cache
Использование провайдеров компиляции в As...
Чего мы ждем от C# 4.0
Delphi 2009 и C++Builder 2009
Джоэл Спольски и Джеф Этвуд запустили новы...
Поиск кода Google /* что нового? */
10 jQuery скриптов для улучшения интерфейс...
Генераторы отчетов FastReport 4 и QuickRep...
День программиста — набор стерeотипов
Индусские програмисты
Вышел Django 1.0
Портативная версия Google Chrome Portable
Исходные коды .Net Frameword 3.5 SP1 для о...
Пишем правильный online WYSIWYG-редактор


Цитата дня (все,добавить):

Портал фрилансеров

работа на дому


    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование


Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия