Ни для кого не секрет, что Zend_OpenID не всегда работает так, как хотелось бы.
Сегодня я столкнулся с тем, что этот компонент не принимал ответ от openID-сервера google, выдавая ошибку “Discovery failed”. После изучения исходных кодов я выяснил, что необходимый для корректной валидации код просто отсутствует в компоненте. Пришлось воспользоваться грязным хаком (источник):

  1. В метод Zend_OpenId_Consumer::_discovery(), в серию условий if preg_match (начало около строки 740), надо добавить следующий блок:

    1
    2
    3
    } else if (preg_match('/<URI>([^<]+)<\/URI>/i', $response, $r)) {
      $version = 2.0;
      $server = $r[1];
  2. Класс тот же, метод _checkId(). В блок if ($version <= 2.0), в if ($this->_session !== null) надо добавить:

    1
    2
    3
    4
    if ($server == 'https://www.google.com/accounts/o8/ud') {
      $this->_session->identity = 'http://specs.openid.net/auth/2.0/identifier_select';
      $this->_session->claimed_id = 'http://specs.openid.net/auth/2.0/identifier_select';
    }
  3. Там же, следующая ветка – else if (defined(‘SID’)):

    1
    2
    3
    4
    if ($server == 'https://www.google.com/accounts/o8/ud') {
      $_SESSION['zend_openid']['identity'] = 'http://specs.openid.net/auth/2.0/identifier_select';
      $_SESSION['zend_openid']['claimed_id'] = 'http://specs.openid.net/auth/2.0/identifier_select';
    }
  4. Там же, вне if/else if/else ветки, но внутри $version <= 2.0:

    1
    2
    3
    4
    if ($server == 'https://www.google.com/accounts/o8/ud') {
      $params['openid.identity'] = 'http://specs.openid.net/auth/2.0/identifier_select';
      $params['openid.claimed_id'] = 'http://specs.openid.net/auth/2.0/identifier_select';
    }

Конечно, это некрасивое решение, но оно приемлемо до тех пор, пока этот баг не будет закрыт.

Недавно на сайте http://fbdevzone.com/ был рассмотрен удобный способ передачи URL-параметров в действия.
Обычно для этой цели используются методы $this->_getParam() и $this->getRequest()->getParam() в классах контроллера. Это довольно удобный способ, однако он не идеален — прописывать это из метода в метод не очень удобно.
Предложенный способ заключается в том, что параметры передаются в действия в виде аргументов метода:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * index/info/
 * index/info/tags/one/tags/two
 * index/info/msg/msg-only
 * index/info/date/2009-10-03
 * index/info/msg/RandomOrder/date/2009-10-03
 *
 * @param array $tags
 * @param Zend_Date $date
 * @param string $msg
 */

public function infoAction(array $tags = null, Zend_Date $date = null, $msg = 'hello')
{
    Zend_Debug::dump($tags);
    if (!is_null($date)) echo $date->get(Zend_Date::DATETIME_FULL);
    else echo "no date passed\n";
    Zend_Debug::dump($msg);
    die;
}

При помощи Zend_Reflection производится парсинг phpdoc-комментариев, присваивая переменным соответствующие типы.
Подробнее читайте в блоге автора. Там же вы найдёте исходный код класса.

Здравствуйте.
Сегодня увидела свет новая версия Zend Framework. Ничего особенного, просто правка багов.
Список закрытых вопросов

Здравствуйте.
Думаю, многие из вас сталкивались с проблемой склонения существительных в зависимости от какого-либо числа. Например, “15 дней”. А если будет 21, выводить “21 дней”? Для решения этой проблемы написано множество функций, но я не встречал реализации в виде помощника Zend_View. Итак, встречайте: App_View_Helper_Plural.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Helper_View_Plural extends Zend_View_Helper_Abstract
{
    public function plural($n, $form1, $form2, $form3) {
        $plural = ($n % 10 == 1 && $n % 100 != 11 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 or $n % 100 >= 20) ? 1 : 2));
        switch($plural) {
            case 0:
            default:
                return $form1;
            case 1:
                return $form2;
            case 2:
                return $form3;
        }
    }
}

Использование (в шаблоне):

1
2
3
echo '1 ' . $this->plural(1, 'день', 'дня', 'дней') . '<br>';
echo '4 ' . $this->plural(4, 'день', 'дня', 'дней') . '<br>';
echo '25 ' . $this->plural(25, 'день', 'дня', 'дней');

Вывод:

1 день
4 дня
25 дней

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

Команда разработчиков Zend Framework не перестаёт удивлять нас скоростью разработки. Скачать новую версию.
Следует отметить, что Preview Release предназначен исключительно для ознакомления, не следует использовать его в реальных проектах.
Новшества:

  • Zend_Rest_Route, Zend_Rest_Controller и Zend_Controller_Plugin_PutHandler, которые позволяют использовать RESTful ресурсы как MVC-слой.
  • Zend_Feed_Reader, который предоствляет общий API для RSS и Atom лент, а также кеширование и прочий функционал.
  • Zend_Queue и Zend_Service_Amazon_Sqs, которые делают возможным использование локальных и удалённых сообщений и очередь сервисов для разгрузки асинхронных процессов.
  • Обновления Zend_Db_Table позволяют использовать его как конкретный класс, передавая одно или больше определений таблицы через конструктор.
  • Поддержка комменариев в Zend_Pdf, и некоторые улучшения производительности.
  • Поддержка сборки собственных слоёв в Zend_Dojo.
  • Многочисленные улучшения Zend_Ldap.
  • Zend_Log_Writer_Syslog, компонент для логирования в системный лог.
  • Несколько новых view-хэлперов, включая Zend_View_Helper_BaseUrl.

На следующей неделе запланирован выход бета-версии, стабильный релиз — через неделю или немного позже.

Сегодня вышел Zend Framework 1.8.1. Несмотря на то, что с момента выхода 1.8.0 прошло всего 13 дней, было исправлено более 68 багов.
Основные изменения:

  • Zend_Loader::registerAutoload() теперь вызывает Zend_Loader_Autoloader и устанавливает флаг fallbackAutoloader в true. Подробнее о новом Zend_Loader_Autoloader.
  • Много багфиксов и удобств в Zend_Application
  • Добавлена генерация модулей при помощи Zend_Tool

Полный список доработок
Скачать новую версию

Ниже опубликован перевод статьи Matthew Weier O’Phinney Developing a Comprehensive Autoloader.

В этой статье я буду рассуждать о развитии и нововведениях Zend_Loader_Autoloader и смежного функционала. Тем не менее, основная цель статьи — показать различные проектировочные решения, которые ведут к созданию всеобъемлющего автозагрузчика для ваших PHP-приложений. Автозагрузка, внешне тривиальная задача, имеет много тонкостей, которые часто упускают.
Continue reading ‘Разработка всеобъемлющего автозагрузчика’ »

Всем привет.
Публикую перевод статьи Matthew Weier O’Phinney Zend Framework 1.8.0 Released.

Я рад объявить о выходе Zend Framework 1.8.0, первом в серии релизов ветки 1.8. Этот релиз отмечен кульминацией нескольких продолжительных проектов, а также формализацией многих из рекомендованных нами практик разработки.
Два основных направления этого релиза: во-первых, добавление нескольких компонентов, предназначенных для RAD (Rapid Application Development – быстрая разработка приложений); во-вторых, два дополнения, которые делают использование Zend Framework в вычислительных облаках более простым.

Скачать Zend Framework
Continue reading ‘Вышел Zend Framework 1.8.0’ »

Всем привет.
Сегодня вышел preview release Zend Framework 1.8.0. Финальный релиз этой версии запланирован на этот месяц (Апрель 2009). Скачать его (исключительно для ознакомления).
В новой версии появились два компонента, Zend_Application и Zend_Tool.
Zend_Application предназначен для бутстраппинга вашего приложения. Подробнее о нём вы можете почитать в документации и в статье Роба Аллена.
Zend_Tool – это фреймворк, предоставляющий функциональность для скаффолдинга, генерации кода, генерации поискового индекса и многого другого. Например, можно развернуть скелет ZF приложения, запустив всего пару команд в консоли. Подробнее читайте в документации и вводной статье.
Осталось только напомнить, что этот релиз предназначен исключительно для ознакомления и не готов к использованию в реальных проектах.

Глоссарий.

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

Zend_Filter_Input совершенно незаслуженно был обойдён вниманием со стороны разработчиков. На практике он способен во многих ситуациях заменить уже ставший привычным Zend_Form.
Continue reading ‘Обработка данных с помощью Zend_Filter_Input’ »