Фев 12

В конце марта 2010 года в Санкт-Петербурге состоится первая росийская конференция по Zend Framework. Докладчиками будут активные пользователи русскоязычного сообщества ZF и другие специалисты, включая одного из создателей фреймворка.

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

Доклады:

Жизненный цикл предложений (proposals) в проекте Zend Framework
Александр Веремьев (Zend Technologies, Zend Framework Core команда)

Zend_Search_Lucene в деталях
Александр Веремьев (Zend Technologies, Zend Framework Core команда)

Zend Framework и производительность
Александр Махомет (создатель сообщества ZendFramework.ru)

Zend Framework и MVC, «толстая» модель
Александр Стешенко (Norada Corporation, PHP-разработчик)

ФотоСтрана.ru: Прототипирование с использованием ZF (история боевого применения Zend Framework в highload-проекте)
Леонид Жаворонков (ФотоСтрана.ru, тимлид)

Использование очередей сообщений в повседневных проектах
Денис Баклыков (Обновление, веб-разработчик)

Zend Framework и Doctrine
Степан Танасийчук (руководитель веб-студии stfalcon.com)

Zend Framework и мультиязычность
Степан Танасийчук (руководитель веб-студии stfalcon.com)

История проекта e-Штаб
Анатолий Ларин (e-Легион, веб-программист)

Что нового несет нам Zend Framework 2.0?
Надежда Блинова (Wizartech, веб-программист), Георгий Туревич (Wizartech, ведущий веб-программист)

Интеграция Zend Framework c Javascript-фрэймворками jQuery и Dojo Toolkit
Георгий Туревич (Wizartech, ведущий веб-программист)

За последними новостями можно следить здесь:
RSS-канал: feeds.feedburner.com/zfconf
Twitter: @zfconf
Группа Вконтакте: vkontakte.ru/club14951507

Жаль, что у меня нету возможности посетить данное мероприятие. Но я с нетерпением буду ждать видеоматериалов с конференции! :)

Янв 5

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

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

Модуль создается в отдельном namespace. Обычно, namespace - это название компании разработчика модуля.
В данной статье я буду создавать модуль блога для Magento в своем неймспейсе Snowcore.
Название модуля не должно содержать символов подчеркивания. Все custom модули создаются в директории /app/code/local
Мой модуль будет называться Snowcore_Blog

Перейдем непосредственно к делу. Что же нужно для написания модуля для Magento?

Отключение кеша Magento

Первым делом отключаем cache в Magento, иначе не сможем увидеть своих изменений :) Отключить кеширование можно в админке: System - Cache Management - в первой вкладке Cache Control изменяем параметр All Cache на Disable, жмем Save cache settings

Создание структуры директорий

В папке модуля создаем следующую структуру:
/app/code/local/Snowcore/Blog/

Block
controllers
etc
Helper
Model
sql

Добавляем директорию для шаблонов:
/app/design/frontend/default/default/template/blog
(здесь первый default - это интерфейс, второй default - тема)

Подключение модуля

Для подключения модуля нужно создать XML файл конфигурации:
/app/etc/modules/Snowcore_Blog.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Snowcore_Blog>
            <active>true</active>
            <codePool>local</codePool>
        </Snowcore_Blog>
    </modules>
</config>

На данном этапе Magento уже знает о нашем модуле. Включить или выключить его можно при помощи изменения параметра конфигурационного файла.
Управлять модулем также можно через админку: System -> Configuration -> Advanced.
Значение local для узла говорит о том, что наш модуль относится к custom модулям и размещается в папке /app/code/local

Создание XML конфигурации для модуля

Создаем новый xml файл: /app/code/local/Snowcore/Blog/etc/config.xml

<config>
    <modules>
        <Snowcore_Blog>
            <version>0.1.0</version>
        </Snowcore_Blog>
    </modules>
    <frontend>
        <routers>
            <blog>
                <use>standard</use>
                <args>
                    <module>Snowcore_Blog</module>
                    <frontName>blog</frontName>
                </args>
            </blog>
        </routers>
    </frontend>
    <admin>
        <routers>
            <blog>
                <use>admin</use>
                <args>
                    <module>Snowcore_Blog</module>
                    <frontName>blog</frontName>
                </args>
            </blog>
        </routers>
    </admin>
    <adminhtml>
        <menu>
            <blog module=“blog”>
            <title>Blog</title>
            <sort_order>77</sort_order>
                <children>
                    <article module=“blog”>
                        <title>Manage Articles</title>
                        <sort_order>0</sort_order>
                        <action>blog/adminhtml_article</action>
                    </article>
                </children>
            </blog>
        </menu>
        <acl>
            <resources>
                <all>
                    <title>Allow Everything</title>
                </all>
                <admin>
                    <children>
                        <blog>
                            <title>Blog Module</title>
                            <sort_order>200</sort_order>
                        </blog>
                    </children>
                </admin>
            </resources>
        </acl>
        <layout>
            <updates>
                <blog>
                    <file>blog.xml</file>
                </blog>
            </updates>
        </layout>
    </adminhtml>
    <global>
        <models>
            <blog>
                <class>Snowcore_Blog_Model</class>
                <resourceModel>blog_mysql4</resourceModel>
            </blog>
            <blog_mysql4>
                <class>Snowcore_Blog_Model_Mysql4</class>
                <entities>
                    <article>
                        <table>blog_articles</table>
                    </article>
                </entities>
            </blog_mysql4>
        </models>
        <resources>
            <blog_setup>
                <setup>
                    <module>Snowcore_Blog</module>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </blog_setup>
            <blog_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </blog_write>
            <blog_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </blog_read>
        </resources>
        <blocks>
            <blog>
                <class>Snowcore_Blog_Block</class>
            </blog>
        </blocks>
        <helpers>
            <blog>
                <class>Snowcore_Blog_Helper</class>
            </blog>
        </helpers>
    </global>
</config>

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

Создание Helper

Хелпер содержит всего пару строчек кода /app/code/local/Snowcore/Blog/Helper/Data.php

<?php
class Snowcore_Blog_Helper_Data extends Mage_Core_Helper_Abstract
{

}

Этот хелпер нужен для того, чтобы работала система переводов.
На данном этапе у нас должен появиться новый пункт в главном меню админки:

Magento admin menu

Сразу создадим хелпер для статей:
/app/code/local/Snowcore/Blog/Helper/Article.php

<?php
class Snowcore_Blog_Helper_Article extends Mage_Core_Helper_Abstract
{

}

Создание моделей

Magento использует “тонкие” модели. Есть два типа моделей:

  • Обычная модель: отвечает за бизнес-логику
  • Ресурс-модель, которая работает с базой

Для начала нам понадобятся модели для статей.

Создаем обычную модель:
/app/code/local/Snowcore/Blog/Model/Article.php

<?php
class Snowcore_Blog_Model_Article extends Mage_Core_Model_Abstract
{
    public function _construct()
    {
        parent::_construct();
        $this->_init(‘blog/article’);
    }
}

В ней мы указываем ресурс-модель, с которой будет работать данная модель.

Создаем ресурс-модель:
/app/code/local/Snowcore/Blog/Model/Mysql4/Article.php

<?php
class Snowcore_Blog_Model_Mysql4_Article extends Mage_Core_Model_Mysql4_Abstract
{
    public function _construct()
    {   
        $this->_init(‘blog/article’, ‘article_id’);
    }
}

Второй параметр метода _init это первичный ключ таблицы articles.

Создаем коллекцию для статей:
/app/code/local/Snowcore/Blog/Model/Mysql4/Article/Collection.php
С коллекциями работает grid, который показывает список сущностей (статей).

<?php
class Snowcore_Blog_Model_Mysql4_Article_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
{
    public function _construct()
    {
        parent::_construct();
        $this->_init(‘blog/article’);
    }
}

SQL установщик для модуля

Установка модуля (создание таблиц в базе) происходит автоматически.
Здесь главное правильно указать версию для модуля, она должна совпадать с версией, которая назначена в XML конфигурации.
/app/code/local/Snowcore/Blog/sql/blog_setup/mysql4-install-0.1.0.php

<?php
$installer = $this;

$installer->startSetup();

$installer->run(

– DROP TABLE IF EXISTS {$this->getTable(‘blog_articles’)};
CREATE TABLE {$this->getTable(‘blog_articles’)} (
  `article_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(150) NOT NULL,
  `slug` varchar(150) NOT NULL,
  `content` text,
  `meta_keywords` varchar(255) NOT NULL DEFAULT ”,
  `meta_description` varchar(160) NOT NULL DEFAULT ”,
  `created_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
    ”);

$installer->endSetup();

Установка модуля (создание необходимых таблиц) происходит автоматически - при обращении к любой странице. Если возникают проблемы с установкой модуля (таблицы не создались) - посмотрите в базе таблицу core_resource, там должна быть запись со значением code = blog_setup. Удалите запись, модуль переустановится.

Создание Layout модуля

Создаем новый XML:
/app/design/adminhtml/default/default/layout/blog.xml

<?xml version="1.0"?>
<layout version=“0.1.0″>
    <blog_adminhtml_article_index>
        <reference name=“content”>
            <block type=“blog/adminhtml_article” name=“article” />
        </reference>
    </blog_adminhtml_article_index>
</layout>

Создание блоков

Блоки отвечают за отображение модуля. В рамках первой статьи создаем блоки для админки.
Изначально нам понадобится блок для отображения списка существующих записей - grid.

Создаем контейнер для grid:
/app/code/local/Snowcore/Blog/Block/Adminhtml/Article.php

<?php
class Snowcore_Blog_Block_Adminhtml_Article extends Mage_Adminhtml_Block_Widget_Grid_Container
{
    public function __construct()
    {
        $this->_controller = ‘adminhtml_article’;
        $this->_blockGroup = ‘blog’;
        $this->_headerText = Mage::helper(‘blog/article’)->__(‘Articles Manager’);
        $this->_addButtonLabel = Mage::helper(‘blog/article’)->__(‘Add Article’);
        parent::__construct();
    }
}

Далее создаем сам Grid:
/app/code/local/Snowcore/Blog/Block/Adminhtml/Article/Grid.php

<?php
class Snowcore_Blog_Block_Adminhtml_Article_Grid extends Mage_Adminhtml_Block_Widget_Grid
{
    public function __construct()
    {
        parent::__construct();
        $this->setId(‘blogArticleGrid’);
        $this->setDefaultSort(‘article_id’);
        $this->setDefaultDir(‘ASC’);
        $this->setSaveParametersInSession(true);
    }

    protected function _prepareCollection()
    {
        $collection = Mage::getModel(‘blog/article’)->getCollection();
        $this->setCollection($collection);
        return parent::_prepareCollection();
    }

    protected function _prepareColumns()
    {
        $this->addColumn(‘article_id’, array(
          ‘header’    => Mage::helper(‘blog/article’)->__(‘ID’),
          ‘align’     =>‘right’,
          ‘width’     => ‘50px’,
          ‘index’     => ‘article_id’,
        ));

        $this->addColumn(‘title’, array(
          ‘header’    => Mage::helper(‘blog/article’)->__(‘Title’),
          ‘align’     => ‘left’,
          ‘index’     => ‘title’,
        ));

        return parent::_prepareColumns();
    }

    public function getRowUrl($row)
    {
        return $this->getUrl(‘*/*/edit’, array(‘id’ => $row->getId()));
    }
}

Кратко о гриде:

  • В конструкторе мы задаем параметры сортировки
  • В методе _prepareCollection указывается, с какой коллекцией будет работать grid
  • Метод _prepareColumns позволяет определить, какие колонки будут отображаться в таблице сущностей
  • Метод getRowUrl определяет формат ссылки для перехода на форму редактирования (при клике на определенную строку)

Cоздание контроллера

В рамках этой статьи у контроллера будет только index action (отображение таблицы со статьями)
/app/code/local/Snowcore/Blog/controllers/Adminhtml/ArticleController.php

<?php
class Snowcore_Blog_Adminhtml_ArticleController extends Mage_Adminhtml_Controller_action
{
    protected function _initAction()
    {
        $this->loadLayout()
            ->_setActiveMenu(‘blog/article’)
            ->_addBreadcrumb(Mage::helper(‘adminhtml’)->__(‘Articles Manager’), Mage::helper(‘adminhtml’)->__(‘Articles Manager’));
        return $this;
    }   
   
    public function indexAction()
    {
        $this->_initAction()      
            ->renderLayout();
    }
}

Наш контроллер пока содержит index действие, в котором происходит инициализация layout и breadcrumbs. На данном этапе на странице Manage Articles отображается содержимое таблицы статей. Таблица пока пустая, но для проверки работоспособности грида, можете добавить вручную пару записей в базу.
Mage_Adminhtml_Block_Widget_Grid предоставляет возможность использования фильтра и сортировки списка по заданным полям.

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

See you soon ;-)

Дек 30
Итоги 2009
icon1 Snowcore | icon2 Я | icon4 12 30th, 2009| icon34 Comments »

Что ж, вот и подходит к концу этот замечательный 2009 год! Время подводить итоги :-)
Этот год, без сомнений, был самым успешным в моей жизни. Взгляд на жизнь меняется все время, особенно круто он изменился в этом году :-)

Сразу перейду к конкретным фактам:

  • После долгих лет встречаний я наконец-то женился. Спасибо моей любимой жене за то, что она есть - я ее безумно люблю!
  • Переехал в Киев, теперь живу недалеко от родного дома. Все друзья теперь в одном городе :-)
  • Сменил место работы. Работаю в компании, в которой изначально хотел работать. Радости нет предела!
  • Побил все рекорды по доходам. Особенно в декабре…
  • Отлично освоил Zend Framework, пишу на нем постоянно. Начал изучать Magento, естественно ;-)
  • Купил электрогитару! Красавица - Cort X1, красная. Увлекся гитарными виртуозами: John Petrucci, Uli John Roth, Buckethead, Andi Timmons
  • Купил новый ноутбук Acer 5737Z (Dual Core 2.0 Ghz, 4096 DDR3 RAM, 320 Gb HDD) - отличная машинка!
  • Снабдил телефонами половину семьи :-)
  • Начал операцию по спасению своего друга, учу его php
  • Возненавидел панельные дома :-D

Ну и еще ряд более мелких достижений: стал более ответственным, появился ряд новых классных знакомых, возникли новые идеи для двух стартапов.

Также хочу поздравить всех читателей с Новым 2010 годом! Пусть он принесет Вам еще больше успехов!!!

Если вдруг соберетесь делать ремонт, рекомендую выбрать строительный инструмент

P.S.: я есть на твиттере, кому интересно follow me

Дек 2

Одним из неудобных моментов при разработке и тестировании локального проекта является невозможность отправки email’ов.
Наш любимый Google поможет решить данную проблему. Письма можно отправлять через Gmail SMTP.
Zend Framework позволяет отправлять письма через SMTP при помощи класса Zend_Mail_Transport_Smtp.
У вас должен быть включен extension OpenSSL.
Вот простой пример отправки письма через GMail SMTP, используя Zend_Mail:

<?php
$options = array(
        ‘auth’     => ‘login’,
        ‘username’ => ‘_username_@gmail.com’,
        ‘password’ => ‘_password_’,
        ’ssl’      => ‘tls’,
        ‘port’ => 587
    );
    $mailTransport = new Zend_Mail_Transport_Smtp(’smtp.gmail.com’, $options);
    Zend_Mail::setDefaultTransport($mailTransport);
    
    $m = new Zend_Mail();
    $m->addTo(’someone@gmail.com’);
    $m->setFrom(‘_username_@gmail.com’, ‘Sender name’);
    $m->setSubject(‘Using Gmail SMTP’);
    $m->setBodyText(‘Hello! I am using Gmail from the localhost :)’);
    $m->send();

При помощи метода Zend_Mail::setDefaultTransport можно легко переключаться между локальным и удаленным (серверным) окружением.

И продолжая актуальную для меня тему ремонта - строительный инструмент Ridgid

P.S.: Вы еще не подписались на мой RSS? Добро пожаловать :)

« Previous Entries