Xo66uT16 Май 2011Новости
Логотип ZFConf

В воскресенье (15.05) побывал на конференции ZFConf. Хочу поделиться своими впечатлениями.

Организация и проведение.

Конференция проходила в Санкт-Петербурге, у станции метро “Электросила”, что примечательно, место, где проходила конференция, находится в 50 метрах от метро, вышел из него и ты уже на месте. Сам зал просторный, хорошо оборудованный. Для каких целей его использует Ленгипротранс (организация, на территории которой проходила конференция), я не знаю, но по-моему зал можно использовать даже как кинотеатр. Хороший проектор, отличный звук, помогала также хорошая акустика в зале. Все доклады проходили строго по плану, никто чужое время не занимал, никакой суматохи и опозданий докладчиков. На кофе-брейках никаких проблем с едой и напитками не было, возможно дело в сторонней кетеринговой компании, не знаю, но организаторы молодцы.  Вообще вся организация на пять с плюсом.

Доклады и докладчики.

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

  • История разработки собственного ORM
    К сожалению этот доклад я проспал, все таки воскресенье.
  • Воюем за ресурсы
    Алексей Качаев – молодец, “сделал конференцию“, отличный рассказчик, все четко, ясно и по делу. Алексей выступил с двумя докладами, суммарно говорил около 2-х часов. Сам он участник проекта ZF, поэтому ему было что рассказать. Рассказ был по результатам оптимизации конкретного проекта с примерами и кодом, который Алексей выложил на gihub. Меня как раз интересовала подобная реализация для уменьшения нагрузки. Как представится возможность обязательно попробую.
  • Behavior Driven Development
    Отличный доклад, пища для размышления team лидам и менеджерам, использование актуально в компании в целом или в проектах. Мне как разработчику было интересно конкретное применение и возможности.
  • Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue
    Отличный доклад, некая “альтернатива” использованию метода Алексея Качаева по экономии ресурсов. К сожалению инструмент Job Queue платный, что-то в районе 4к зеленых в год. Альтернативный gearman хорош, но пока без визуальных инструментов, хотя проект развивается. Доклад был с практической точки зрения и по результатам собственного применения в компании докладчика.
  • Как может помочь среда разработки при написании приложения на Zend Framework?
    о чем был доклад неясно, какая связь с ZF, тоже не ясно. Просто мини-тур по основным возможностям PhpStorm, 90% которых сейчас есть в любой IDE.
  • Что такое Sphinx
    доклад слишком поверхностный для тех доклада, опять же непонятно как связан с темой Zend Fw, хотя нужно отдать должное – докладчик отличный, да и ему было что рассказать, судя по общению в кулуарах. Возможно, что конкретно рассказывать, он решал в последний момент. Об этом свидетельствует так же то, что были полностью английские слайды, “давно лежащие в запасниках” подготовленные для зарубежной аудитории. Хотя с английским у меня проблем нет, но многие термины все же вызывали проблему. Как кто-то справедливо заметил в зале: “А можно перевод?”
  • Создание REST-API для сторонних разработчиков
    доклад не плохой, но для меня все это было уже известно. Да и доклад был коротким для такой большой темы, кто уже знаком с oAuth (таких в зале было человек 5-10) ничего нового не узнал, кто нет, опять же получил только поверхностную информацию.
  • Гибкая архитектура Zend Framework приложений с использованием Dependency Injection
    Отличнейший доклад от Алексея. Был мини “инсайд“, Алексей рассказал о планах реализации DI в будущей версии ZF 2.0.

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

Все написанное относится только к моему видению конференции, судя по количеству присутствующих конкретно ZF интересует не так много людей, поэтому, я так понимаю, была цель разнообразить количество участников докладами связанными просто с PHP и хайлоад (Sphinx). Полностью относящихся к ZF докладов было всего 4.
Конференция очень понравилась, “хочу еще“.

 
zend_framework

Небольшой lifehack zendhack, по получению списка названий месяцев\дней для отображения в view.

Как нам всем известно русский язык очень сильно отличается от других языков, а самое главное он кардинально отличается от английского. В Zend_Framework, как и во многих других фреймворках локализация и функции локализации сделаны с оглядкой на английский язык. Иногда это становится причиной проблем.

Проблема

Я столкнулся со следующей, мне необходимо было вывести список названий месяцев в году, все бы хорошо, но в русском языке названия месяцев могут быть не только в именительном падеже, но и в родительном, в отличие от английского (February, Февраль -> Февраля). А Zend_Framework в результате следующего кода:

$datearray = array('year' => $date->toString("yyyy"), 'month' => '2');
$other_date = new Zend_Date($datearray);
$other_date->get(Zend_Date::MONTH_NAME);

выводит только месяц в родительном падеже.

Решение

Покопавшись в классе Date метода для вывода месяца в именительном падеже я не нашел. Тогда я полез в xml файл с переводом (Zend/Locale/Data/ru.xml) и там увидел, что раздел с месяцами в именительном падеже присутствует. Посмотрев как обычные методы Zend_Date получают информацию из файла с переводом, я нашел способ как можно вывести имя месяца.

Zend_Locale_Data::getContent("ru_RU", 'month', array('gregorian', 'stand-alone', 'wide', $i));

где $i – номер месяца без лидирующего нуля (1..12)
Кстати таким образом можно выводить любые данные из файла с переводом, просто идя по DOM структуре XML файла.

 
zend_framework

В любом нормальном проекте не избежать форматирования даты, чтобы не тратить время на реализацию своих методов и функций я хочу рассказать как быстро отформатировать дату средствами MySQL и Zend_Date.

Форматирование с помощью Zend_Date.

Для быстрого форматирования даты при выводе ее пользователю я предлагаю создать помощник вида.
Для этого создаем простой viewHelper (application/view/helpers), я назвал его DateHelper:

<?php
/**
 *
 * @author Roman
 * @version
 */
require_once 'Zend/View/Interface.php';
/**
 * DateHelper helper
 *
 * @uses viewHelper Zend_View_Helper
 */
class Zend_View_Helper_DateHelper
{
    /**
     * @var Zend_View_Interface
     */
    public $view;
    /**
     *
     */
    public function dateHelper($date_value, $format)
    {
        $locale = Zend_Registry::get('Zend_Locale');
        $date = new Zend_Date($date_value, false, $locale);
        return $date->toString($format);
    }
    /**
     * Sets the view field
     * @param $view Zend_View_Interface
     */
    public function setView (Zend_View_Interface $view)
    {
        $this->view = $view;
    }
}

Теперь мы можем использовать его в view скрипте следующим образом:

$unformated_data = "2011-01-30 12:21:11";
$this->dateHelper($unformated_data, "dd MMMM"); ?>

Дата будет отформатирована в “30 January“. Для того чтобы дата выводилась с учетом локали (языка) нужно в файле Bootstrap.php добавить метод:

protected function _initLocale()
{
    $locale = new Zend_Locale('ru_RU');
    Zend_Registry::set('Zend_Locale', $locale);
}

В данном случае наш помощник вида выведет “30 января“. Модификаторы даты можно посмотреть тут.

Форматирование средствами СУБД MySQL.

Если вы получаете дату из базы, то не стоит забывать о встроенном форматировании даты в MySQL и других СУБД.

DATE_FORMAT('2011-01-30 12:21:11', '%d %M') AS FIELD_1

Функция DATE_FORMAT вернет нам “30 January“, подробнее модификаторы можно посмотреть тут

 
zend_framework

Не так давно, начал разбираться с Zend Framework, в этом очень помогают скринкасты от Jon Lobenlsold. Документация на офф сайте скудная и раскрывает только частные понятия отдельных классов, которые в принципе итак показываются с помощью той же IntelliSense Eclipse.
Подвигло меня написать этот пост следующее, я не мог понять как лучше коннектиться к базе, возможно мое решение поможет новичкам в ZF, таким же как и я. Я видел решение с созданием Helper‘а, но как выяснилось все намного проще. Как показала практика решение с Helper подходит только тогда, когда коннект к базе происходит из Контроллеров. Я же хочу делать запросы из собственного класса, который лежит у меня в папке /library/App/.
Итак для коннекта к базе необходимо сделать следующее -
Прописать следующие строчки в application.ini (я прописал в секцию production)

resources.db.adapter = "PDO_MYSQL"
resources.db.params.charset = "utf8"
resources.db.params.host = "127.0.0.1"
resources.db.params.username = "root"
resources.db.params.password = "123456"
resources.db.params.dbname = "yourdb"

После этого можно делать запросы из любого класс можно следующим образом.

$dbAdapter = Zend_Db_Table::getDefaultAdapter();
 $result = $dbAdapter->query("SELECT * FROM users")->fetchAll();
 var_dump($result);

В данном случае статический метод getDefaultAdapter возвращает Zend_Db_Adapter_Abstract, то есть тоже самое, что и при создании подключения через factory, а именно:

$config = Zend_Registry::get('config');
$dbAdapter  = Zend_Db::factory($this->config->db->type,
 array('host'     => $config->db->host,
 'username' => $config->db->user,
 'password' => $config->db->pass,
 'dbname'   => $config->db->name
 )
 );

В первом случае настройки автоматически подхватываются из application.ini, во втором же их приходится прописывать вручную.

Буду рад, если кому-нибудь данное открытие поможет как и мне.