<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Varien &#187; Основы</title>
	<atom:link href="http://varien.com.ua/blog/category/magento/essentials/feed/" rel="self" type="application/rss+xml" />
	<link>http://varien.com.ua</link>
	<description>Varien/Magento blog</description>
	<lastBuildDate>Fri, 25 Jun 2010 13:02:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Архитектура коллекций в Magento</title>
		<link>http://varien.com.ua/blog/arxitektura-kollekcij-v-magento/</link>
		<comments>http://varien.com.ua/blog/arxitektura-kollekcij-v-magento/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 09:16:00 +0000</pubDate>
		<dc:creator>Антон Макаренко</dc:creator>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[Основы]]></category>

		<guid isPermaLink="false">http://varien.com.ua/?p=495</guid>
		<description><![CDATA[В статье описаны теоретические основы коллекций в Magento — одного из архитектурных решений, повсеместно использующихся в проекте.
Коллекция — это объект, который может содержать определенный набор других объектов определенного класса. По логике организации коллекции в Magento работают как «список» В Magento коллекции реализовывают интерфейсы IteratorAggregate и Countable, что позволяет их «форичить» и подсчитывать количество элементов с [...]]]></description>
			<content:encoded><![CDATA[<p>В статье описаны теоретические основы коллекций в Magento — одного из архитектурных решений, повсеместно использующихся в проекте.</p>
<p>Коллекция — это объект, который может содержать определенный набор других объектов определенного класса. По логике организации коллекции в Magento работают как «<a title="Википедия, коллекции в программировании" href="http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)">список</a>» В Magento коллекции реализовывают интерфейсы IteratorAggregate и Countable, что позволяет их «форичить» и подсчитывать количество элементов с помощью функции count():</p>
<pre class="brush: php;">foreach ($collection as $item) {
    echo get_class($item);
}

echo count($collection);</pre>
<p>Абстрактная коллекция, Varien_Data_Collection, сконцентрирована на работе с элементами, подсчете количества элементов, разбивке их на страницы, кешированием. В абстрактной коллекции определается класс, который будет инстанциирован при создании каждого элемента. По умолчанию это Varien_Object.</p>
<p>Коллекция декларирует метод load(), который вызывается автоматически при попытке «посчитать» или проитерировать коллекцию. В абстрактной коллекции метод load() лишь задействует метод loadData(), который ничего не делает — реализовать логику по загрузке данных предоставляется наследникам. Кроме работы с элементами (добавление, удаление, геттеры), есть возможность устанавливать фильтры. Реализацию работы фильтров абстрактная коллекция также предоставляет коллекциям, наследующих ее.</p>
<h3>Ресурс-модель Varien_Data_Collection_Db</h3>
<p>В библиотеке Varien представлены две ресурс-модели, наследующие абстрактную коллекцию — Varien_Data_Collection_Db и Varien_Data_Collection_Filesystem.</p>
<p>Varien_Data_Collection_Db реализовывает абстрактный уровень доступа к БД, используя Zend_Db_Adapter_Abstract. Основные функциональные возможности класса:</p>
<ol>
<li> сформировать SQL-запрос без привязки к определенному диалекту</li>
<li> «скормить» запрос адаптеру для загрузки данных</li>
<li> загрузить конкретные данные и создать элементы коллекции с помощью «родительских» методов</li>
</ol>
<p>Особенностью этой ресурс-модели является то, что метод load() выполняет SQL-запрос и грузит данные лишь один раз — при первом вызове. Последующие вызовы load() ни к чему не приведут. То есть, можно «грузить» или итерировать коллекцию сколько угодно раз, не беспокоясь о лишних запросах к БД.</p>
<p>Можно получить объект SQL-запроса коллекции с помощью метода getSelect(). Этот объект может модифицироваться до загрузки коллекции по мере установке фильтров. Непосредственно перед загрузкой объекту запроса устанавливаются все фильтры, сортировка и ограничения выборки. Чтобы получить конечный SQL-запрос, можно вывести объект запроса после загрузкти коллекции:</p>
<pre class="brush: php;">$collection-&gt;load();
echo $collection-&gt;getSelect();
</pre>
<p>Подразумевается, что элементы коллекции будут объектами класса Varien_Object или его наследниками. Впрочем, это не обязательно — достаточно лишь чтобы объект элемента поддерживал метод addData(), аналогичный методу Varien_Object.</p>
<p>Отдельного внимания заслуживает процесс установки фильтра коллекци — метод addFieldToFilter($field, $condition). Метод добавляет условие WHERE в SQL-запрос, абстрагируясь от определенного диалекта и от имени поля в запросе.</p>
<ul>
<li> Параметр $field — некое имя «колонки» в результате. Перед вставкой в запрос (точнее, в фильтр запроса), пропускается через «маппер», который может преобразовать имя колонки результата в имя колонки запроса с корелляционным именем.</li>
<li> Параметр $condition — может быть строкой или массивом — тип сравнения и значение, которое добавить во WHERE запроса. Поддерживаются простые типы сравнения, такие как IS NULL, LIKE, «больше равно», «меньше равно», «равно». Также есть возможность манипулировать интервалами даты.</li>
</ul>
<p>Для подсчета количества элементов в этой ресурс-модели клонируется объект запроса, полученному объекту применяются фильтры (аналогично как перед загрузкой коллекции), вырезаются ограничения на выборку и сортировки, и колонки запроса заменяются на COUNT(*). Чтобы получить количество без выполнения основного SQL-запроса загрузки, можно вызвать метод getSize().</p>
<h4>Ресурс-модель Mage_Core_Model_Mysql4_Collection_Abstract</h4>
<p>«Рабочая лошадка». Большинство коллекций Magento основаны на этой ресурс-модели. Добавляет в Varien_Data_Collection_Db немного условностей:</p>
<ol>
<li> у SQL-запроса есть «главная» таблица, ей по умолчанию дается корелляционное имя «main_table»</li>
<li> подразумевается, что все эелементы коллекции — модели, наследники Mage_Core_Model_Abstract. Объявление фабричного имени модели элементов должно происходить в инициализации коллекции</li>
<li> есть метод save(), который проходится по всем элементам и вызывает им метод save() (реализован в абстрактной модели)</li>
</ol>
<h3>Ресурс-модель Varien_Data_Collection_Filesystem</h3>
<p>Файловая коллекция в качестве строк возвращает имена файлов и/или папок, в зависимости от настроек и установленных фильтров. Умеет рекурсивно «ходить» по указанной папке, собирая файлы/папки. Может в результате возвращать сначала все папки, потом все файлы.</p>
<p>Эта ресурс-модель работает по той же схеме, что и Varien_Data_Collection_Db — получает массив данных, считает их, разбивает на страницы и генерирует набор элементов-объектов с указанными «колонками» для текущей «страницы». Принципиальное отличие от БД в том, что приходится загружать весь массив данных, потому что иначе подсчитать их количество (и разбить на страницы) не получится. С целью экономии ресурсов, можно задавать «предварительный» фильтр — регулярные выражения для имен файлов/папок, чтобы они вообще не попадали в выборку.</p>
<p>Базовый набор данных по умолчанию — полное системное имя файла и его базовое имя. Метод _generateRow() можно переопределить и на основании системного имени файла добавить любые другие «колонки».</p>
<p>Метод addFieldToFilter() реализован совместимым с аналогичным в Varien_Data_Collection_Db. Только вместо построения SQL-запроса, здесь строится Одно Большое Условие, которое выполняется с помощью eval() при загрузке данных и генерации элементов. Сама же коллекция и реализовывает простейшие типы сравнения, аналогичные коллекции БД (IS NULL, LIKE, «больше равно», «меньше равно», «равно»).</p>
<h3>Общая схема загрузки данных коллекцией</h3>
<p><img class="alignnone size-full wp-image-516" title="Блок-схема работы коллекции" src="http://varien.com.ua/wp-content/uploads/collection_architecture.gif" alt="Блок-схема работы коллекции" width="475" height="690" /></p>
]]></content:encoded>
			<wfw:commentRss>http://varien.com.ua/blog/arxitektura-kollekcij-v-magento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Framework в Magento</title>
		<link>http://varien.com.ua/blog/zend-framework-in-magento/</link>
		<comments>http://varien.com.ua/blog/zend-framework-in-magento/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 09:00:00 +0000</pubDate>
		<dc:creator>Михаил Бессолов</dc:creator>
				<category><![CDATA[Основы]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://varien.com.ua/?p=81</guid>
		<description><![CDATA[В прошлом году на одном из IRC каналов сообщества Zend Framework разгорелась длинная дискуссия о том, является ли Magento приложением, построенным <strong>на</strong> Zend Framework. Мы участия в обсуждении не принимали, и узнали о нем лишь через некоторое время. Но постараемся восполнить этот пробел сейчас.]]></description>
			<content:encoded><![CDATA[<p>В прошлом году на одном из IRC каналов сообщества Zend Framework разгорелась длинная дискуссия о том, является ли Magento приложением, построенным <strong>на</strong> Zend Framework. Мы участия в обсуждении не принимали, и узнали о нем лишь через некоторое время. Но постараемся восполнить этот пробел сейчас.</p>
<p><strong>Небольшая историческая справка</strong>:</p>
<p>Zend Framework:</p>
<p>Zend Framework (<a href="http://framework.zend.com/">framework.zend.com</a>) &#8211; современная, объектно-ориентированная библиотека для построения приложений на PHP 5. Создание Zend Framework было впервые публично анонсировано компанией <a href="http://www.zend.com/">Zend Technologies Inc.</a> на Zend Conference в октябре 2005 года. Первая версия Zend Framework была выпущена 1 июля 2007 года.</p>
<p>Magento:</p>
<p>Первые идеи о создании собственной открытой платформы для создания ecommerce-сайтов появились в компании Varien в 2006 году. Новая платформа строилась по архитектуре MVC, с использованием ООП-возможностей пятой версии языка PHP, и ориентировалась на использование передовой на тот момент технологии, которую предоставляла новая библиотека от компании Zend. Первый внутренний альфа-релиз Magento состоялся весной 2007 года, тогда же <a href="http://www.magentocommerce.com/blog/welcome-to-the-wonderful-world-of-magento/">было объявлено</a> о планах по её выпуску, и 31 августа 2007 года была выпущена <a href="http://www.magentocommerce.com/blog/announcing-magento-beta-and-launch-of-the-magento-community-site/">первая публичная бета-версия Magento</a>.</p>
<p><strong>Начало разработки:</strong></p>
<p>Начиная разработку Magento, несмотря на то, что Zend Framework не был выпущен и находился лишь в стадии разработки, мы были восхищены подходом автором библиотеки и предоставляемыми возможностями уже в самых ранних версиях. Так как Zend Framework является open source библиотекой, уже после первого объявления был предоставлен публичный доступ к Subversion-репозиторию проекта.</p>
<p>На тот момент (напомним, что это было начало 2007 года), были реализованы основные компоненты Zend Framework, а остальные только разрабатывалось и не могли быть использованы для создания полноценного приложения.</p>
<p>Но у нас были свои планы, свой календарь разработки, и мы не могли ожидать, когда все компоненты Zend Framework будут закончены. Поэтому было принято решение включить библиотеку ZF в состав проекта, и стараться использовать её компоненты по максимуму, где это уже было возможно:</p>
<ul>
<li><a href="http://framework.zend.com/manual/en/zend.acl.html">Zend_Acl</a> и <a href="http://framework.zend.com/manual/en/zend.auth.html">Zend_Auth</a> используются для управления пользователями контрольной панели</li>
<li><a href="http://framework.zend.com/manual/en/zend.cache.html">Zend_Cache</a> используется для реализации кеширования данных конфигурации, промежуточных данных и вывода</li>
<li><a href="http://framework.zend.com/manual/en/zend.config.html">Zend_Config</a> использовался для работы с конфигурацией</li>
<li><a href="http://framework.zend.com/manual/en/zend.controller.html">Zend_Controller</a> использовался для роутинга, работы с входящими запросами и формирования ответа</li>
<li><a href="http://framework.zend.com/manual/en/zend.db.html">Zend_Db</a> используется для работы с базой данных, динамического построения и модификации запросов к ней</li>
<li><a href="http://framework.zend.com/manual/en/zend.filter.html">Zend_Filter</a> с дополнительными собственными фильтрами применяется для предварительной обработки вывода</li>
<li><a href="http://framework.zend.com/manual/en/zend.http.html">Zend_Http</a> используется для работы с внешними сервисами по HTTP-протоколу</li>
<li><a href="http://framework.zend.com/manual/en/zend.json.html">Zend_Json</a> используется для работы с данными в JSON-формате, так как <a href="http://www.php.net/manual/en/ref.json.php">встроенные функции json_encode и json_decode</a> появились в составе PHP только начиная с версии 5.2.0</li>
<li><a href="http://framework.zend.com/manual/en/zend.locale.html">Zend_Locale</a> используется для локализации Magento</li>
<li><a href="http://framework.zend.com/manual/en/zend.mail.html">Zend_Mail</a> используется для отправки исходящей почты</li>
<li><a href="http://framework.zend.com/manual/en/zend.session.html">Zend_Session</a> использовался для работы с данными сессии пользователя</li>
<li><a href="http://framework.zend.com/manual/en/zend.translate.html">Zend_Translate</a> использовался для работы с переводами интерфейса Magento</li>
<li><a href="http://framework.zend.com/manual/en/zend.validate.html">Zend_Validate</a> для валидации входящих данных</li>
</ul>
<p><strong>Последующие изменения:</strong></p>
<p>В процессе разработки пришлось отказаться от дальнейшего использования некоторых компонентов и создать собственную реализацию:</p>
<ul>
<li>Из-за специфики приложения и некоторых, на тот момент, проблем с производительностью, была реализована собственная система роутинга и контроллеров</li>
<li>В связи с многоуровневостью системы хранения (конфигурационные файлы модулей, и значения настроек в базе данных) и сложного процесса сборки конфигурационных данными мы отказались от использования Zend_Config</li>
<li>Для поддержки модульности и иерархии переводов были реализованы свои компоненты</li>
</ul>
<p>В последующих версиях Magento стали ипользоваться также:</p>
<ul>
<li><a href="http://framework.zend.com/manual/en/zend.currency.html">Zend_Currency</a></li>
<li><a href="http://framework.zend.com/manual/en/zend.date.html">Zend_Date</a></li>
<li><a href="http://framework.zend.com/manual/en/zend.feed.html">Zend_Feed</a></li>
<li><a href="http://framework.zend.com/manual/en/zend.gdata.html">Zend_Gdata</a></li>
<li><a href="http://framework.zend.com/manual/en/zend.pdf.html">Zend_Pdf</a></li>
<li><a href="http://framework.zend.com/manual/en/zend.service.strikeiron.html">Zend_Validate</a></li>
<li><a href="http://framework.zend.com/manual/en/zend.soap.html">Zend_Soap</a></li>
</ul>
<p><strong>Какой же из этого можно сделать вывод ?</strong></p>
<p>А вывод таков:</p>
<ul>
<li>Magento <strong>является</strong> приложением, построенным <strong>с использованием</strong> компонентов Zend Framework, что стало возможным благодаря принципу <a href="http://en.wikipedia.org/wiki/Loose_coupling">use-at-will</a>, заложенному в архитектуру этой замечательной библиотеки.</li>
<li>Magento, на данный момент, <strong>не является</strong> приложением, построенным <strong>на</strong> Zend Framework, так как мы используем собственную логику компонентной архитектуры приложения и системы обработки запросов, взамен <a href="http://framework.zend.com/manual/en/zend.controller.html#zend.controller.quickstart">стандартной реализации</a>, предоставляемой Zend Framework.</li>
</ul>
<p><strong>Планы на будущее</strong></p>
<p>Zend Framework не стоит на месте, ведется его активная разработка, выпуск новых версий, содержащих всё больше и больше функциональности.</p>
<p>Последний, выпущенный на момент написания этой статьи, релиз Magento 1.3.2.2 включает в себя Zend Framework версии 1.7.2. Последняя доступная версия ZF &#8211; <a href="http://devzone.zend.com/article/4766-Zend-Framework-1.8.4-Released">1.8.4</a>, которая уже интегрирована в Magento trunk и в данный момент тестируется. Вполне возможно, что следующий релиз Magento будет включать в себя еще более новый Zend Framework, выпуск <a href="http://framework.zend.com/roadmap/1.9.0">версии 1.9.0</a> которого планируется в конце июля этого года.</p>
]]></content:encoded>
			<wfw:commentRss>http://varien.com.ua/blog/zend-framework-in-magento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Многоликий MVC</title>
		<link>http://varien.com.ua/blog/the-many-faces-of-mvc/</link>
		<comments>http://varien.com.ua/blog/the-many-faces-of-mvc/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 09:00:00 +0000</pubDate>
		<dc:creator>Михаил Бессолов</dc:creator>
				<category><![CDATA[Основы]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://varien.com.ua/?p=101</guid>
		<description><![CDATA[Magento построена по MVC-шаблону, чтобы разделить данные, представление и обработку действий пользователя на три отдельных уровня. Однако при детальном взгляде на Magento оказывается, что в действительности таких уровней разделения немного больше. Давайте же посмотрим, как именно реализована архитектура MVC в Magento.]]></description>
			<content:encoded><![CDATA[<p>Magento построена по MVC-шаблону, чтобы разделить данные, представление и обработку действий пользователя на три отдельных уровня. Однако при детальном взгляде на Magento оказывается, что в действительности таких уровней разделения немного больше. Давайте же посмотрим, как именно эти уровни соотносятся с обычной трактовкой MVC.</p>
<p><strong>Стандартный шаблон MVC</strong> (model-view-controller, модель-представление-контроллер):</p>
<p><img src="http://varien.com.ua/wp-content/uploads/mvc/MVC-pattern.png" alt="MVC pattern" title="MVC pattern" width="266" height="153" class="aligncenter size-full" /></p>
<p><strong>Уровни разделения в Magento</strong>:</p>
<ul>
<li>Модели (models)</li>
<li>Ресурс-модели (resource models)</li>
<li>Лейауты (layouts)</li>
<li>Блоки (blocks)</li>
<li>Шаблоны (templates)</li>
<li>Контроллеры (controllers)</li>
</ul>
<p><strong>Модели (models)</strong> &#8211; это компоненты, реализующие бизнес-логику любых сущностей и связи между ними.</p>
<p><strong>Ресурс-модели (resource models)</strong> &#8211; это мостики между моделями и источниками данных, с которыми те работают. Ресурс-модели содержат специфический для выбранного источника данных код, позволяющий моделям получать, сохранять и удалять данные из источника.<br />
<strong><br />
Лейауты (layouts)</strong> &#8211; это xml-файлы, описывающие связи между блоками, и привязывающие определенный набор блоков к конкретным действиям (actions) контроллера.<br />
<strong><br />
Блоки (blocks) </strong>- это составные кирпичики, из которых строятся страницы, отдаваемые броузеру пользователя.</p>
<p><strong>Шаблоны (templates)</strong> &#8211; это файлы, которые используются блоками для формирования вывода. Они содержат в себе HTML разметку для представления данных в нужном виде.</p>
<p><strong>Контроллеры (controllers)</strong> &#8211; это компоненты, реализующие взаимодействие с пользователем, посредством выдачи визуального представления данных, и обработку действий пользователя.</p>
<p>Соответсвенно, распределение этих компонентов по стандартным уровням MVC осуществляется следующим образом:</p>
<p>MVC Модель:</p>
<ul>
<li>Модели</li>
<li>Ресурс-модели</li>
</ul>
<p>MVC Представление:</p>
<ul>
<li>Лейауты</li>
<li>Блоки</li>
<li>Шаблоны</li>
</ul>
<p>MVC Контроллер:</p>
<ul>
<li>Контроллеры</li>
</ul>
<p><img src="http://varien.com.ua/wp-content/uploads/mvc/MVC-pattern-in-Magento.png" alt="MVC pattern in Magento" title="MVC pattern in Magento" width="473" height="288" class="aligncenter size-full" /></p>
<p>В последующих версиях Magento может произойти выделение еще одного дополнительного слоя из ресурс-моделей:</p>
<ul>
<li>Ресурс-модели будут предоставлять интерфейс для работы с абстрактным типом источников данных (например, реляционная база данных, используемая только как хранилище данных, в отличие от реляционной базы данных, содержащей часть логики на сервере БД)
</li>
<li>Ресурсы будут являться адаптерами, включащими только тот код, который является специфическим для конкретного источника данных (например ресурс для работы с MySQL, с Oracle или с Microsoft SQL)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://varien.com.ua/blog/the-many-faces-of-mvc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
