Archive for the ‘Руководства’ Category

Автор: Rob Allen,
Также доступна устаревшая версия руководства, ориентированная на старые версии Zend Framework.

Это руководство предназначено для введения в использование Zend Framework для создания простых приложений с использованием БД с использованием парадигмы . Оно было переписано для версии фреймворка 1.8 и использует все преимущества скриптов командной строки Zend_Tool и Zend_Application для бутстраппинга. Используются другие компоненты, включая Zend_Controller, Zend_View, Zend_Db_Table и Zend_Form.
Continue reading ‘Начало работы с Zend Framework’ »

опубликовал .
Я знал, что через ZF это сделать просто, но, оказалось, даже проще, чем я думал. Например, вот так выглядит создание XML-RPC-сервера:

1
2
3
$server = new Zend_XmlRpc_Server();
$server->setClass('My_Awesome_Api');
echo $server->handle();

Также не следует использовать для этих целей полноценный MVC — просто незачем проходить полный цикл диспатчеризации, если можно заменить его куда более производительным сервис-сервером:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class XmlRpc_Bootstrap extends Bootstrap
{
    public function run()
    {
        $server = new Zend_XmlRpc_Server();
        $server->setClass('My_Awesome_Api');
        echo $server->handle();
    }
}

$app = new Zend_Application(
    APPLICATION_ENV,
    (
        'bootstrap' => (
            'class' => 'XmlRpc_Bootstrap',
            'path'  => 'path/to/Bootstrap.php',
        ),
        'config' => APPLICATION_PATH . '/configs/application.ini',
    ),
);
$app->bootstrap()
    ->run();

Подробности читайте в .

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

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

    1
    2
    3
    } else if (('/<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';
    }

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

Недавно на сайте был рассмотрен .
Обычно для этой цели используются методы $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( $tags = null, Zend_Date $date = null, $msg = 'hello')
{
    Zend_Debug::dump($tags);
    if (!($date)) echo $date->get(Zend_Date::DATETIME_FULL);
    else echo "no date passed\n";
    Zend_Debug::dump($msg);
    ;
}

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

Здравствуйте.
Думаю, многие из вас сталкивались с проблемой склонения существительных в зависимости от какого-либо числа. Например, “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_Loader_Autoloader и смежного функционала. Тем не менее, основная цель статьи — показать различные проектировочные решения, которые ведут к созданию всеобъемлющего автозагрузчика для ваших PHP-приложений. Автозагрузка, внешне тривиальная задача, имеет много тонкостей, которые часто упускают.
Continue reading ‘Разработка всеобъемлющего автозагрузчика’ »

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

В было опубликовано . Как оказалось, всё просто и удобно. Рекомендую к прочтению.

Как известно, по умолчанию Zend_Form генерирует форму в виде . При этом многих не устраивает внешний вид списка – более привычным является оформление формы в таблицу. Можно решить эту проблему с помощью декораторов, но это решение является не самым лучшим.
В опубликовано руководство под названием , в котором рассказано, как с помощью CSS изменить внешний вид формы, чтобы она выглядела, как таблица. Именно так должна решаться проблема с внешним видом форм, а разметка форм должна оставаться списком определений (dl).

Zend_Captcha – компонент Zend Framework, позволяющий быстро и удобно использовать .
Если вы используете Zend_Form, то вам понадобится статья , автор .
В случае, если вы хотите использовать Zend_Captcha без связки с Zend_Form, вам будет полезна статья , опубликованная в блоге

info@zend-framework.ru