<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>SpiRi7</title>
	
	<link>http://spiri7.net</link>
	<description>Персональный сайт о web программировании: Madgento, CodeIgnitor, ZendFramework</description>
	<lastBuildDate>Wed, 21 Jul 2010 08:11:44 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Spiri7" /><feedburner:info uri="spiri7" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Magento: испольузем phpUnit для тестирования</title>
		<link>http://feedproxy.google.com/~r/Spiri7/~3/3AkBA6uF7KM/magento-using-phpunit</link>
		<comments>http://spiri7.net/blog/magento/magento-using-phpunit#comments</comments>
		<pubDate>Tue, 04 May 2010 17:18:48 +0000</pubDate>
		<dc:creator>SpiRi7</dc:creator>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[phpunit]]></category>

		<guid isPermaLink="false">http://spiri7.net/?p=332</guid>
		<description><![CDATA[Сегодня я хотел бы затронуть тему очень важную для каждого разработчика. Автоматизированное тестирование разработанного приложения. Использование юнит-тестирование позволяет автоматически распознавать ошибки в разработанных и отлаженных частях исходного кода, при внесении новых правок, изменении архитектуры приложения.
Подробнее о юнит-тестировании можно почитать на викапедии, а мы сегодня поговорим о применимости phpUnit к тестированию модулей написанных для Magento.

Источники информации

Официальный [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://spiri7.net/wp-content/uploads/2010/04/magephpunit.png" alt="" title="magento_phpunit" width="275" height="114" class="alignleft size-full wp-image-333" />Сегодня я хотел бы затронуть тему очень важную для каждого разработчика. Автоматизированное тестирование разработанного приложения. Использование юнит-тестирование позволяет автоматически распознавать ошибки в разработанных и отлаженных частях исходного кода, при внесении новых правок, изменении архитектуры приложения.<br />
Подробнее о юнит-тестировании можно почитать на <a href="http://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" target="_blank">викапедии</a>, а мы сегодня поговорим о применимости phpUnit к тестированию модулей написанных для Magento.<br />
<span id="more-332"></span></p>
<h2>Источники информации</h2>
<ul>
<li>Официальный сайт phpUnit &#8211; <a href="http://www.phpunit.de/" target="_blank">http://www.phpunit.de/</a></li>
<li>Примеры использования &#8211; <a href="http://habrahabr.ru/blogs/php/56289/" target="_blank">http://habrahabr.ru/blogs/php/56289/</a> и <a href="http://habrahabr.ru/blogs/php/89175" target="_blank">http://habrahabr.ru/blogs/php/89175</a></li>
<li>PhpUnit + NetBeans <a href="http://habrahabr.ru/blogs/php/70046/" target="_blank">http://habrahabr.ru/blogs/php/70046/</a></li>
<li>PhpUnit + Magento &#8211; <a href="http://www.magentocommerce.com/wiki/development/phpunit_integration_with_magento" target="_blank">http://www.magentocommerce.com/wiki/development/phpunit_integration_with_magento</a></li>
</ul>
<h2>Предварительные условия</h2>
<p>Для создания юнит-тестов Вам необходимо произвести установку PhpUnit и xDebug. Использование xDebug позволяет производить генерацию отчетов по тестированию, с отображением информации об покрытие исходного кода тестами. Я не буду подробно останаливаться на процессе установки. В интернете достаточно много примеров установки и настройки. Например вот этот краткий <a href="http://pro100pro.com/nastraivaem-phpunit-testy-v-zend-framework-1-10" target="_blank">мануал</a></p>
<h2>Настройка phpUnit для Magento</h2>
<p>Мы подошли к основной части статьи. Для тестирования приложений мы будем использовать комбинацию phpunit.xml (конфигурационный файл), bootstrap.php (стартовый файл для инициализации) и ControllerTestCase.php (базовый класс для всех юнит тестов).<br />
Для тестирования будем использовать слейдующую структуру каталогов.<br />
<img src="http://spiri7.net/wp-content/uploads/2010/04/test_dir.png" alt="" title="Test dirrectory" width="220" height="107" class="aligncenter size-full wp-image-340" /><br />
Папка с тестами находится в корне установленной Magento, на одном уровне с папками app, skin, media и т.д.<br />
Каталог unit &#8211; содержит файлы юнит-тестов, каталог report &#8211; сгенерированный отчет выполнения тестирования. </p>
<p>Переходим к содержимому файлов.</p>
<h5>phpunit.xml &#8211; файл конфигурации</h5>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;phpunit</span> <span style="color: #000066;">bootstrap</span>=<span style="color: #ff0000;">&quot;bootstrap.php&quot;</span></span>
<span style="color: #009900;">		<span style="color: #000066;">colors</span>=<span style="color: #ff0000;">&quot;true&quot;</span></span>
<span style="color: #009900;">		<span style="color: #000066;">convertErrorsToExceptions</span>=<span style="color: #ff0000;">&quot;true&quot;</span></span>
<span style="color: #009900;">		<span style="color: #000066;">convertNoticesToExceptions</span>=<span style="color: #ff0000;">&quot;true&quot;</span></span>
<span style="color: #009900;">		<span style="color: #000066;">convertWarningsToExceptions</span>=<span style="color: #ff0000;">&quot;true&quot;</span></span>
<span style="color: #009900;">		<span style="color: #000066;">stopOnFailure</span>=<span style="color: #ff0000;">&quot;true&quot;</span></span>
<span style="color: #009900;">                <span style="color: #000066;">syntaxCheck</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;testsuite</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;nameofsuite&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;directory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>./<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/directory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/testsuite<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;filter<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;blacklist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;directory</span> <span style="color: #000066;">suffix</span>=<span style="color: #ff0000;">&quot;.php&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>../tests<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/directory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;directory</span> <span style="color: #000066;">suffix</span>=<span style="color: #ff0000;">&quot;.php&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>../lib<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/directory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;directory</span> <span style="color: #000066;">suffix</span>=<span style="color: #ff0000;">&quot;.php&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>../app/code/core<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/directory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;directory</span> <span style="color: #000066;">suffix</span>=<span style="color: #ff0000;">&quot;.php&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>../app/code/community<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/directory<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/blacklist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/filter<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>    
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;logging<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;log</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;coverage-html&quot;</span> <span style="color: #000066;">target</span>=<span style="color: #ff0000;">&quot;./report&quot;</span> <span style="color: #000066;">charset</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span> <span style="color: #000066;">yui</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">highlight</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">lowUpperBound</span>=<span style="color: #ff0000;">&quot;35&quot;</span> <span style="color: #000066;">highLowerBound</span>=<span style="color: #ff0000;">&quot;70&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/logging<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>    
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/phpunit<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>В данном файле мы указываем какие дирректори не надо включать в тестирование. К ним я отнес файлы тестов, файлы community библиотек, и исходные файлы magento. Так же мы добавляем возможность автоматической генерации отчета по выполнению тестирования.</p>
<h5>bootstrap.php &#8211; стартовый файл</h5>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'PHPUnit/Framework.php'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'./../app/Mage.php'</span><span style="color: #339933;">;</span>
Mage<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'default'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Достаточно небольшой файл производящий подключение классов для юнит-тестирования и инициализирующий magento приложение (подобный подход для иницализации так же используется в magento cron.php)</p>
<h5>ControllerTestCase.php &#8211; базовый класс наследник для всех юнит тестов</h5>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">abstract <span style="color: #000000; font-weight: bold;">class</span> ControllerTestCase <span style="color: #000000; font-weight: bold;">extends</span> PHPUnit_Framework_TestCase <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$connection</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setUp<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        parent<span style="color: #339933;">::</span><span style="color: #004000;">setUp</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$class</span>  <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_colorize<span style="color: #009900;">&#40;</span><span style="color: #990000;">get_class</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'blue'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$method</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_colorize<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$class</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' -&gt; '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$method</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_time <span style="color: #339933;">=</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">connection</span> <span style="color: #339933;">=</span> Mage<span style="color: #339933;">::</span><span style="color: #004000;">getModel</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Core/Mysql4_Config'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getReadConnection</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">beginTransaction</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> tearDown<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$time</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'%0.3f sec'</span><span style="color: #339933;">,</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_time<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCount</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'(Assertions)'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_colorize<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$time</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'green'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">rollBack</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        parent<span style="color: #339933;">::</span><span style="color: #004000;">tearDown</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> _colorize<span style="color: #009900;">&#40;</span><span style="color: #000088;">$text</span><span style="color: #339933;">,</span> <span style="color: #000088;">$color</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'yellow'</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$color</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'red'</span><span style="color: #339933;">:</span>
                <span style="color: #000088;">$color</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;1;31m&quot;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'green'</span><span style="color: #339933;">:</span>
                <span style="color: #000088;">$color</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;1;32m&quot;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'blue'</span><span style="color: #339933;">:</span>
                <span style="color: #000088;">$color</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;1;34m&quot;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
                <span style="color: #000088;">$color</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;1;33m&quot;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">&quot;<span style="color: #660099; font-weight: bold;">\033</span>[&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$color</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$text</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #660099; font-weight: bold;">\033</span>[m&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Содержимое файла частично было взято из юнит тестов CMF разработанной на базе Zend Framework &#8211; <a href="http://code.google.com/p/zfcore/" target="_blank">ZFCore</a>.<br />
Функция setUp выполняется перед каждым юнит-тестом. Она получает ссылку на коннект к базе данных и стартует транзацию (нет смысла каждый раз производить чистку magento приложения от тестовых данных). Производит запись времени начала теста и вывод дополнительной полезной информации.<br />
Функция tearDown выполняется после каждого юнит-теста. Производит откат транзации и выводит тестовую информацию о времени выполнения теста и количестве выполненных утверждений. </p>
<h5>unit/SimpleFileOfTest.php &#8211; базовый каркас для каждого созданного юнит теста</h5>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> SimpleFileOfTest <span style="color: #000000; font-weight: bold;">extends</span> ControllerTestCase <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setUp<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        parent<span style="color: #339933;">::</span><span style="color: #004000;">setUp</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> testMagentoModel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #666666; font-style: italic;">// Some test case</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> tearDown<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        parent<span style="color: #339933;">::</span><span style="color: #004000;">tearDown</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>В данном файле мы производим вызов методов перед началом теста и после окончания, не забывая вызвать методы родительского класса. Метод testMagentoModel будет выполняться как тестовый кейс. </p>
<p>Такой структуру приложения будет достаточно для выполнения тестирования Ваших magento модулей.</p>
<h2>Пример юнит-тестирования</h2>
<p>Ранее я описывал возможность создания order в Magento <a href="http://spiri7.net/blog/magento/magento-create-order-manual-version2">программными средствами</a>. Давайте создим юнит тест для этого функционала.</p>
<p>Создаем файл CreateOrderTest.php с слейдующим содержанием.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> CreateOrdersTest <span style="color: #000000; font-weight: bold;">extends</span> ControllerTestCase <span style="color: #009900;">&#123;</span>
&nbsp;
    protected <span style="color: #000088;">$createOrderModel</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setUp<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        parent<span style="color: #339933;">::</span><span style="color: #004000;">setUp</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createOrderModel</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Spiri7_Test_Model_CreateOrders<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * Test order creation for some predeffined Values
     *
     * @dataProvider orderProvider
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> testCreateOrder<span style="color: #009900;">&#40;</span><span style="color: #000088;">$productInfo</span><span style="color: #339933;">,</span> <span style="color: #000088;">$billingInfo</span><span style="color: #339933;">,</span> <span style="color: #000088;">$shippingInfo</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createOrderModel</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createOrder</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$productInfo</span><span style="color: #339933;">,</span> <span style="color: #000088;">$billingInfo</span><span style="color: #339933;">,</span> <span style="color: #000088;">$shippingInfo</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderId</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'orderId'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Test for right Create Order. Order Id Must me not zero</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$orderId</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fail</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'message'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Checking create order for right product</span>
        <span style="color: #000088;">$order</span> <span style="color: #339933;">=</span> Mage<span style="color: #339933;">::</span><span style="color: #004000;">getModel</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'sales/order'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$orderId</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$items</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$order</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAllItems</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$itemcount</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$items</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// We adding only single product</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assertTrue</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$itemcount</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$name</span><span style="color: #339933;">=</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$unitPrice</span><span style="color: #339933;">=</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$sku</span><span style="color: #339933;">=</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$ids</span><span style="color: #339933;">=</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$qty</span><span style="color: #339933;">=</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$items</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$itemId</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$item</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$unitPrice</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #000088;">$item</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPrice</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$ids</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #000088;">$item</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getProductId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$qtyOrdered</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #000088;">$item</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getQtyOrdered</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//ToInvoice();</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
        <span style="color: #666666; font-style: italic;">// Order created for right product</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assertEquals</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ids</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$productInfo</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Price for product same as we set</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assertEquals</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$unitPrice</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$productInfo</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'price'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Qty of ordered product same as we adding</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assertEquals</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$qtyOrdered</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$productInfo</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'qty'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> orderProvider<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// Billing address used for order</span>
        <span style="color: #000088;">$orderBilling</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderBilling</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'firstname'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Alex&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderBilling</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'lastname'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Filin&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderBilling</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'company'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderBilling</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'alexandr.otchenashev@gmail.com'</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderBilling</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'street'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderBilling</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'street'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Address part Line1&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderBilling</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'street'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Address part Line2&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderBilling</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'city'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Dnepropetrovsk&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderBilling</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'region_id'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderBilling</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'region'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderBilling</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'postcode'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;49100&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderBilling</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'country_id'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;US&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderBilling</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'telephone'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;0238559322&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderBilling</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'fax'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;0838559111&quot;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Order Shipping information</span>
        <span style="color: #000088;">$orderShipping</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderShipping</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;UPS&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$orderShipping</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'price'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color:#800080;">100.00</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$dataArray</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">&quot;Simple Product&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>          <span style="color: #666666; font-style: italic;">// Product Info</span>
                      <span style="color: #cc66cc;">0</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                        <span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">47</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// Simple Product ID without custom options</span>
                        <span style="color: #0000ff;">'qty'</span><span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span>
                        <span style="color: #0000ff;">'price'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">123</span>
                     <span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                <span style="color: #000088;">$orderBilling</span><span style="color: #339933;">,</span>
                <span style="color: #000088;">$orderShipping</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">&quot;Simple Product With Custom Options&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>          <span style="color: #666666; font-style: italic;">// Product Info</span>
                      <span style="color: #cc66cc;">0</span> <span style="color: #339933;">=&gt;</span>  <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                        <span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">48</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// Simple product ID with custom options</span>
                        <span style="color: #0000ff;">'qty'</span><span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span>
                        <span style="color: #0000ff;">'price'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">123</span>
                     <span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                <span style="color: #000088;">$orderBilling</span><span style="color: #339933;">,</span>
                <span style="color: #000088;">$orderShipping</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$dataArray</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> tearDown<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        parent<span style="color: #339933;">::</span><span style="color: #004000;">tearDown</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>В setUp производим загрузку модели для создания ордеров. Метод orderProvider возвращает набор данных используемых для тестирования (я произвожу тестирования для simpleproduct с произвольными опциями и без). Метод testCreateOrder производит тестирование создания ордера для наших наборов данных. Обртите внимание что после вызова метода создания, мы проверяем на наличие в возврате id созданного заказа. Если id = 0, тест завершается неудачей и выводом ошибки. При успешном создании производится сверка на правильность добавленного продукта, правильной установки цены и количества товара.</p>
<p>Производим запуск тестов. Для этого в дирректории /tests/ выполняем команду phpunit, результат выполнения будет слейдующий:<br />
<img src="http://spiri7.net/wp-content/uploads/2010/05/test_result.png" alt="" title="test_result" width="801" height="222" class="aligncenter size-full wp-image-346" /><br />
Как видно из результата, второй тест завершился неудачей. Возвратилась ошибка. </p>
<p>В результате выполнения тестов был сгенерирован report с информацией о покрытии кода.<br />
<img src="http://spiri7.net/wp-content/uploads/2010/05/test_result_report.png" alt="" title="test_result_report" width="660" height="517" class="aligncenter size-full wp-image-347" /></p>
<h3>Выводы</h3>
<p>Unit-тестирование выполяемое для magento не сильно отличается от тестирования любого другого приложение. Единственным недостатком следует признать сложность начальной конфигурации, и проблемотичность отладки итоговых тестов. Так же для меня остается не раскрытым вопрос о тестировании контроллеров.<br />
Спасибо за внимание. Буду раз вашим комментариям и уточнением. А как производите тестирование magento модулей, Вы?<strong>Похожие посты:</strong>
<ul class="similar-posts">
<li><a href="http://spiri7.net/blog/magento/magento-create-order-manual" rel="bookmark" title="27.01.2010">Magento: программное создание ордера</a></li>
<li><a href="http://spiri7.net/blog/magento/magento-create-order-manual-version2" rel="bookmark" title="05.02.2010">Magento: программное создание ордера. Версия 2</a></li>
<li><a href="http://spiri7.net/blog/magento/magento-create-shipping-method" rel="bookmark" title="06.02.2010">Magento: создание Shipping method</a></li>
<li><a href="http://spiri7.net/blog/magento/magento-create-user" rel="bookmark" title="09.02.2010">Magento: создание пользователя</a></li>
<li><a href="http://spiri7.net/blog/magento/convert-currency" rel="bookmark" title="12.02.2010">Magento: конвертация валют</a></li>
</ul>
<p><!-- Similar Posts took 9.219 ms --></p>
<img src="http://feeds.feedburner.com/~r/Spiri7/~4/3AkBA6uF7KM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spiri7.net/blog/magento/magento-using-phpunit/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://spiri7.net/blog/magento/magento-using-phpunit</feedburner:origLink></item>
		<item>
		<title>Почему Magento?</title>
		<link>http://feedproxy.google.com/~r/Spiri7/~3/NvQ8Tnf2a1U/why-magento</link>
		<comments>http://spiri7.net/blog/magento/why-magento#comments</comments>
		<pubDate>Tue, 20 Apr 2010 19:51:57 +0000</pubDate>
		<dc:creator>SpiRi7</dc:creator>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[why]]></category>

		<guid isPermaLink="false">http://spiri7.net/?p=326</guid>
		<description><![CDATA[Кросспост моей статьи с хабрахабр. 

Платформа Magento eCommerce уверенно завоевывает популярность. На habrahabr уже было  несколько упоминаний о ней. В этой статье я хочу описать некоторые моменты когда Вам стоит выбрать платформу Magento.


Хостинг
Magento Commerce не будет работать на простом shared хостинге. Разработчики рекомендуют устанавливать 256Мб оперативной памяти доступной скрипту. Минимально желательным размером является 64Мб, [...]]]></description>
			<content:encoded><![CDATA[<p><i>Кросспост моей статьи с <a href="http://habrahabr.ru/blogs/about_cms/91233/" target="_blank">хабрахабр</a>. </i><br />
<img title="" border="0" alt="" src="http://dl.dropbox.com/u/4966678/habr/magento-downloads.jpg" align="left" style="margin: 10px"/></p>
<p>Платформа Magento eCommerce уверенно завоевывает популярность. На habrahabr уже было  <a title="" href="http://habrahabr.ru/search/?q=magento&#038;target_type=posts">несколько упоминаний о ней</a>. В этой статье я хочу описать некоторые моменты когда Вам стоит выбрать платформу Magento.</p>
<p><span id="more-326"></span></p>
<p></p>
<h2>Хостинг</h2>
<p>Magento Commerce не будет работать на простом shared хостинге. Разработчики рекомендуют устанавливать 256Мб оперативной памяти доступной скрипту. Минимально желательным размером является 64Мб, но будьте готовы что без включенного кеша большая часть страниц грузиться не будет.</p>
<p>Так же обратите внимание на cpu лимит хостинга. В моей практике были случаи когда сайт отключили из-за нагрузки на процессор более 3%. При этом за день на сайт заходило не более 15-25 человек. </p>
<p>Хостинг который сможет вытянуть простой магазин на Magento, с посещаемостью 20-50 человек в сутки, стоит около 70$/год. Специализированные хостинг планы для Magento стоят в районе 20$/месяц. Магазин на таком тарифе работает достаточно шустро, без проблем вытягивает посещаемость порядка 300 человек/день.</p>
<p>Для примера приведу результаты простейшего нагрузочного тестирования некоторых хостингов, с которыми я работал.</p>
<p><a title="" href="http://hostmonster.com">hostmonster.com</a> стоимость порядка 70$/год (25 пользователей, 30минут)</p>
<p><img title="" border="0" alt="" src="http://dl.dropbox.com/u/4966678/habr/hostmonst1.png" align="center"/></p>
<p><img title="" border="0" alt="" src="http://dl.dropbox.com/u/4966678/habr/hostmonst2.png" align="center"/></p>
<p><a title="" href="http://nic.ru">nic.ru</a> тариф 201 &#8211; ~110$/год (50 пользователей, 30минут)</p>
<p><img title="" border="0" alt="" src="http://dl.dropbox.com/u/4966678/habr/nic_1.png" align="center"/></p>
<p><img title="" border="0" alt="" src="http://dl.dropbox.com/u/4966678/habr/nic_2.png" align="center"/></p>
<p><a title="" href="http://1gb.ru">1gb.ru</a>, тариф VZ-1 ~130$/год (50 пользователей, 30минут)</p>
<p><img title="" border="0" alt="" src="http://dl.dropbox.com/u/4966678/habr/1gb_1.png" align="center"/></p>
<p><img title="" border="0" alt="" src="http://dl.dropbox.com/u/4966678/habr/1gb_2.png" align="center"/></p>
<p><a title="" href="http://ngx.nl">ngx.nl</a> ~ 300$/год (25 пользователей, 30минут)</p>
<p><img title="" border="0" alt="" src="http://dl.dropbox.com/u/4966678/habr/ngx_1.png" align="center"/></p>
<p><img title="" border="0" alt="" src="http://dl.dropbox.com/u/4966678/habr/ngx_2.png" align="center"/></p>
<h2>Рынок продаж</h2>
<p>Magento разрабатывается украинской командой разработчиков, но методы оплаты и доставок рассчитываются на западный рынок (Европа, США и т.д.). Коробочная версия включает слейдующие методы оплаты: оплата через Credit Card, PayPal, Authorize.net, Payflow Pro, оплата чеком, банковский перевод. Кроме тогда интеграция с большинством западных платежных систем доступна в виде бесплатных расширений. </p>
<p>Если Вам необходима поддержка WebMoney придется покупать платное <a href="http://luxe-soft.com/ru/webmoney.html">расширение</a> (бесплатных аналогов нет). Для &#8220;Яндекс денег&#8221; расширения я не нашел.</p>
<p>Для русских магазинов реальная возможность использовать только методы оплаты: &#8220;Наличными при получении&#8221;, &#8220;Банковский перевод&#8221;. Но для этого придется дополнительно объяснять каждому клиенту как произвести оплату и периодически проверять поступление денег на счет.</p>
<p><br/></p>
<p><img title="" border="0" alt="" src="http://dl.dropbox.com/u/4966678/habr/payment.png" align="center"/></p>
<p>По умолчанию доступны следующие методы доставки: Table rates, Flat Rate, Free shipping, UPS, USPS, FedEx, DHL. С данным вопросом ситуация чуть лучше, дополнительно можно установить бесплатные расширения &#8211; &#8220;Local Pickup&#8221;, &#8220;Multiple tables rate&#8221; &#8211; которые в большинстве случаев покрывают требования магазина. Например используя &#8220;Multiple tables rate&#8221; можно дать пользователю возможность выбора требуемого способа доставки и региона. В зависимости от выбора формировать стоимость. Например сформировать такую таблицу:</p>
<p><br/></p>
<p><img title="" border="1" alt="" src="http://dl.dropbox.com/u/4966678/habr/shipping.png" align="center"/></p>
<p><br/></p>
<p>Так же следует отметить отсутствие интеграции с 1C, что для некоторых клиентов является достаточно необходимым фактором. В защиту можно сказать, что Magento не поддерживает(в коробочной версии), не одной подобной интеграции &#8211; имеется импорт/экспорт csv файлов с списком категорий и продуктов. </p>
<h2>Локализация</h2>
<p>Как и в предыдущем пункте, перевод на русский язык оставляет желать лучшего. Пакет локализации необходимо будет скачать с официального сайта, этот пакет  находится в бете, процесс завершенности порядка 90%. Правда в недрах форума можно найти пользовательскую локализацию, тут ситуация немного лучше. Но в любом случае придется дополнительно производить замену ряда сообщений. Так же пользователю придется поменять все html шаблоны стандартных писем. Таких писем порядка 35. </p>
<h2>Встроенный функционал</h2>
<p>Одна из сильнейших сторон Magento это обширный встроенный функционал &#8211; то что Вы получаете после установки магазина. Установив магазин вы получите следующие возможности:</p>
<ul>
<li>Множество валют</li>
<li>Многоязычность</li>
<li>Множество сайтов на одной системы</li>
<li>Скидки/купоны</li>
<li>Отчеты</li>
<li>Отмеченные товары </li>
<li>Ограничение доступа</li>
<li>И другое</li>
</ul>
<p>Полных список возможностей можно посмотреть на <a href="http://ru.wikipedia.org/wiki/Magento">wikipedia</a></p>
<p><br/></p>
<p><img title="" border="1" alt="" src="http://dl.dropbox.com/u/4966678/habr/shop-by.png" align="center"/></p>
<p><br/></p>
<p>В тоже время, это и недостаток. Если часть функционала на frontend не нужна, разработчику придется постараться что бы его отключить (об этом подробнее ниже)</p>
<h2>Разработка</h2>
<p>Magento является достаточно сложной системой основанной на базе Zend Framework. Для работы с динамическим содержимым используется фреймворк Prototype, а не знакомый большинству jQuery (для подключения которого придется неплохо постараться). Так же, Magento не используется классический патерн MVC. Для генерации страниц используется набор следующих элементов: Controller, Model, Block, View. Таким образом, загрузить напрямую страницу шаблона из контроллера у Вас не получится. Для генерации страниц помимо стандартных phtml файлов с шаблонами, используются xml файлы, определяющие какие блоки включаются в текущую страницу. </p>
<p>Исходя и вышесказанного &#8211; если Вам необходимо сделать уникальный шаблон для магазина, на базе разработанного дизайнером psd файла, необходимо будет привлекать помимо верстальщика еще и программиста. Будьте готовы заплатить серьезную сумму разработчику для привязки дизайна. </p>
<p>Для примера, когда я только начал знакомиться с Magento, передо мной стояла задача произвести привязку достаточно непростого дизайна. В общей сложности на создание темы (без дополнительных расширений) у меня ушло порядка трех недель. Сейчас сложную тему можно привязать за 1-2 недели. Простую тему в районе трех дней. Правда, были прецеденты что сверстанный дизайн простой темы привязался за один день. Конечно есть более простой вариант купить готовую тему на <a href="http://www.templatemonster.com/magento-themes.php">http://www.templatemonster.com/</a>.</p>
<p>Рассмотрим простой пример. Нам необходимо отключить отображение блока &#8220;Compare Products&#8221;. Что бы убрать этот блок придется произвести изменение в приблизительно 5 различных xml файлах. В тоже время magento позволяет включить отладочную информацию &#8211; отображение пути к шаблонам для каждого блока, но увы не показывает в каком xml файле можно его отключить.</p>
<p><br/></p>
<p><img title="" border="0" alt="" src="http://dl.dropbox.com/u/4966678/habr/magento-debug.png" align="center" style="margin: 10px"/></p>
<p><br/></p>
<p>Но, в тоже время, используя лишь модификацию шаблонов можно реализовать магазин с уникальным требуемым функционалом. </p>
<p>Magento отличается очень высокой степенью расширяемости. Фактически любую возможность магазина можно переопределить, подменить файлами разработчика. И внимание, для этого не надо переписывать исходных код движка! Для любой модели, блока можно создать &#8220;rewrite&#8221; и заменить его собственным. Для контроллеров можно активировать перенаправление путей запроса. Кроме того используя event observer для большинства ключевых действий можно добавить произвольный функционал. Использование стороннего кода, не затрагивающего core файлы, позволяет осуществлять безболезненное обновление к новым версиям magento. </p>
<p>Суммируя пункт разработка &#8211; при создании дополнительных расширений для Magento, для привязки дизайна, будьте готовы выделить серьезную сумму. Разработчиков знакомых с этой системой, еще не очень много. А те кто работают с ней имеют много заказов и серьезную стоимость часа работы. </p>
<p><br/></p>
<p><img title="" border="0" alt="" src="http://dl.dropbox.com/u/4966678/habr/inchooers1.jpg" align="center" style="margin: 10px"/></p>
<p><br/></p>
<h2>Юзабилити</h2>
<p>По отзывам некоторых клиентов, magento имеет очень удобный интерфейс администраторской части. Я соглашусь с их мнением. Действительно backend у magento выполнен отлично. Потратив немного времени пользователь сможет произвести основные действия, не заглядывая в помощь. В тоже время некоторые моменты могут быть достаточно непрозрачными. Например управление налогам, создание рассылок, управление локализацией, несколькими валютами, различными видами магазина. Функционал Magento позволяет реализовать управление магазинами с различными доменными имен используя общий backend. При этом, пользователи даже могут не знать что эти магазины связаны. <br/></p>
<p><img title="" border="0" alt="" src="http://dl.dropbox.com/u/4966678/habr/magento-admin.png" align="center" style="margin: 10px"/></p>
<p><br/></p>
<p>С frontend частью стандартного магазина не все хорошо. Согласно большинству отзывов часть оформления заказа сложна для пользователя (придется пройти через 5 шагов). <br/></p>
<p><img title="" border="0" alt="" src="http://dl.dropbox.com/u/4966678/habr/checkout-process.png" align="center" style="margin: 10px"/></p>
<p><br/></p>
<p>Есть выход, купить готовое расширение которое упросит оформление заказа. Кроме того, за счет обширного функционала пользователи могут не добиваться поставленных целей. Но, как я уже говорил выше, можно весь не нужный функционал отключить и оставить непосредственно только часть магазина.<strong>Похожие посты:</strong>
<ul class="similar-posts">None Found
</ul>
<p><!-- Similar Posts took 7.254 ms --></p>
<img src="http://feeds.feedburner.com/~r/Spiri7/~4/NvQ8Tnf2a1U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spiri7.net/blog/magento/why-magento/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://spiri7.net/blog/magento/why-magento</feedburner:origLink></item>
		<item>
		<title>Yii: динамическое меню для backend приложения</title>
		<link>http://feedproxy.google.com/~r/Spiri7/~3/PuqaH9CLTqM/yii-dynamic-backend-menu</link>
		<comments>http://spiri7.net/blog/yii/yii-dynamic-backend-menu#comments</comments>
		<pubDate>Wed, 14 Apr 2010 09:55:48 +0000</pubDate>
		<dc:creator>SpiRi7</dc:creator>
				<category><![CDATA[Yii]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[bicycle]]></category>
		<category><![CDATA[menu]]></category>

		<guid isPermaLink="false">http://spiri7.net/?p=319</guid>
		<description><![CDATA[В прошлых двух заметках я рассказал о том как производить установку модулей в Yii и про организацию backend обработчиков. Сегодня поговорим о возможности динамического формирования меню в backend для каждого установленного модуля, на основании конфигурационных файлов.

Для формирования меню в администратировной части будем использовать дополнительное расширение mbmenu. Этот виджет позволяет строить меню с выпадающими элементами на [...]]]></description>
			<content:encoded><![CDATA[<p>В прошлых двух заметках я рассказал о том как производить <a href="http://spiri7.net/blog/yii/yii-module-install">установку модулей в Yii</a> и про <a href="http://spiri7.net/blog/yii/yii-web-application-backend">организацию backend обработчиков</a>. Сегодня поговорим о возможности динамического формирования меню в backend для каждого установленного модуля, на основании конфигурационных файлов.<br />
<span id="more-319"></span><br />
Для формирования меню в администратировной части будем использовать дополнительное расширение <a href="http://www.yiiframework.com/extension/mbmenu/">mbmenu</a>. Этот виджет позволяет строить меню с выпадающими элементами на основании переданного массива элементов.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">                 <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">widget</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'application.extensions.mbmenu.MbMenu'</span><span style="color: #339933;">,</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
			  <span style="color: #0000ff;">'items'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
			      <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Home'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'url'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/site/index'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			      <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'About'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'url'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/site/page'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'view'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'about'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'items'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
				    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Contact'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'url'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/site/contact'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
				    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'sub 2 contact'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'url'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/admin/invoice/'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
				<span style="color: #009900;">&#41;</span>
			      <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			      <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Login'</span><span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'items'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
				    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Login'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'url'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/site/login'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'visible'</span><span style="color: #339933;">=&gt;</span>Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isGuest</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
				    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Logout ('</span><span style="color: #339933;">.</span>Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span><span style="color: #339933;">.</span><span style="color: #0000ff;">')'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'url'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/site/logout'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'visible'</span><span style="color: #339933;">=&gt;!</span>Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isGuest</span><span style="color: #009900;">&#41;</span>
				  <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
				<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			      <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Content'</span><span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'items'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
				    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Categories'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'url'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/content/category'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
				    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Articles'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'url'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/content/articles'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
				  <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
				<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			   <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			  <span style="color: #0000ff;">'htmlOptions'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'class'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'my-class'</span><span style="color: #009900;">&#41;</span>
		  <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Добавим в каждый xml конфигурационный файл модуля раздел содержащий пункты меню для административной части</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>content<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1.0.0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;active<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>true<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/active<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;creationDate<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2009-03-27<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/creationDate<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;author<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SpiRi7<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/author<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;authorEmail<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>alex@spiri7.net<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/authorEmail<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;authorUrl<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://spiri7.net<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/authorUrl<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;copyright<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/copyright<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;license<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/license<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;description<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Content module<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/description<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;adminhtml<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;menu<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;content<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;label<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Content<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/label<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;sort_order<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>5<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/sort_order<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;items<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;categories<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;label<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Categories Manager<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/label<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;sort_order<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/sort_order<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/admin/content/category<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/categories<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;articles<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;label<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Articles Manager<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/label<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;sort_order<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/sort_order<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/admin/content/articles<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/articles<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/items<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/content<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/menu<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/adminhtml<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Разберем структуру xml файла.<br />
Содержимое меню находится в ноде adminhtml->menu. Каждый узел представляет собой один пункт меню. &#8220;content&#8221; — уникальный идентификатор пункта меню, является верхним уровнем дерева меню. &#8220;label&#8221; — текст пункта, &#8220;sort_order&#8221; — сквозной порядок сортировки, &#8220;items&#8221; — дочерние элементы меню, &#8220;categories&#8221; и &#8220;articles&#8221; дочернии идентификаторы меню, &#8220;url&#8221; — действие выполняемое по щелчку мышки (если не указано, действие не выполняется).</p>
<p>Для построения меню добавим layout административной части ( у меня он называется backend.php) следующий код</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$backendMenu</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getBackendMenu</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">widget</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'application.extensions.mbmenu.MbMenu'</span><span style="color: #339933;">,</span><span style="color: #000088;">$backendMenu</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Метод getBackendMenu находится в базовом контроллере для всех контроллеров административной части приложения. Он возвращает массив элементов меню. Этот метод мы рассмотрим чуть позже.</p>
<p>Перейдем к части анализа xml файла конфигурации и генерация кеша элементов меню. Для этого добавим следующий код в метод actionIndex контроллера InstallController модуля core.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">        <span style="color: #000088;">$model</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Resource<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Refresh backend menu manager</span>
        <span style="color: #000088;">$model</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">refreshBackendMenu</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>метод производит обновление кеша меню установленных модулей. Рассмотрим его содержимое. Файл модели Resource.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">    <span style="color: #009933; font-style: italic;">/**
     * Force refresh backend menu elements.
     * Read all xml configuration file, analize and create cache
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> refreshBackendMenu<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$totalBackendMenuArray</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Get all modules configuration files (configuration stored as xml file)</span>
        <span style="color: #666666; font-style: italic;">// For each file recive backend menu and merge to total backend menu</span>
        <span style="color: #666666; font-style: italic;">// @todo get config file only for installed modules (not for all config into dirrectory)</span>
        <span style="color: #000088;">$configFileList</span> <span style="color: #339933;">=</span> <span style="color: #990000;">glob</span><span style="color: #009900;">&#40;</span>YiiBase<span style="color: #339933;">::</span><span style="color: #004000;">getPathOfAlias</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'application.config.modules'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;/*.xml&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$configFileList</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$singleConfigFile</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$config</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SimpleXMLElement<span style="color: #009900;">&#40;</span><span style="color: #000088;">$singleConfigFile</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$nodes</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">xpath</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/config/adminhtml/menu/*'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #000088;">$menuItemsForModule</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">parsingXmlMenu</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$nodes</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$totalBackendMenuArray</span> <span style="color: #339933;">=</span> CMap<span style="color: #339933;">::</span><span style="color: #004000;">mergeArray</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$totalBackendMenuArray</span><span style="color: #339933;">,</span> <span style="color: #000088;">$menuItemsForModule</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #009900;">&#125;</span>
        <span style="color: #666666; font-style: italic;">// Sorting total menu items array by key &quot;sort_order&quot;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sortingMenuItems</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$totalBackendMenuArray</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$outputMenu</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'items'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">convertXmlMenuFormatToOutputFormat</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$totalBackendMenuArray</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
        <span style="color: #000088;">$fh</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span>YiiBase<span style="color: #339933;">::</span><span style="color: #004000;">getPathOfAlias</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'application.cache'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;/backendmenu.ser&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;w&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fh</span><span style="color: #339933;">,</span> <span style="color: #990000;">serialize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$outputMenu</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fh</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    protected <span style="color: #000000; font-weight: bold;">function</span> convertXmlMenuFormatToOutputFormat<span style="color: #009900;">&#40;</span><span style="color: #000088;">$xmlMenuFormat</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$outputMenu</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$xmlMenuFormat</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$single</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$menuItem</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$menuItem</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'label'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$single</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'label'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$single</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$menuItem</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$single</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$single</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'items'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$menuItem</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'items'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">convertXmlMenuFormatToOutputFormat</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$single</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'items'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #000088;">$outputMenu</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$menuItem</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$outputMenu</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #009933; font-style: italic;">/**
     * Recursive function for parsing XML Object with menu information
     *
     * @param SimpleXMLElement $nodeElements xml element of current level
     */</span>
    protected <span style="color: #000000; font-weight: bold;">function</span> parsingXmlMenu<span style="color: #009900;">&#40;</span><span style="color: #000088;">$nodeElements</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$returnArray</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$nodeElements</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$element</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
            <span style="color: #000088;">$nodeName</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$element</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$returnArray</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$nodeName</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$element</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">label</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$returnArray</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$nodeName</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'label'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$element</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">label</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$element</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sort_order</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$returnArray</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$nodeName</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'sort_order'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$element</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sort_order</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$element</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">url</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$returnArray</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$nodeName</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$element</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">url</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$element</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">items</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$returnArray</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$nodeName</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'items'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">parsingXmlMenu</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$element</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">xpath</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;items/*&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$returnArray</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * Recursive function for sorting all menu for backend
     * including children items. Return nothing. Result in input param
     * $menuItems
     *
     * @param array $menuItems
     */</span>
    protected <span style="color: #000000; font-weight: bold;">function</span> sortingMenuItems<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$menuItems</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #990000;">uasort</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$menuItems</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Resource::sortingByKeySortOrder&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$menuItems</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$item</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'items'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sortingMenuItems</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$menuItems</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'items'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * User definated array sorting function
     * @param array $a item of array
     * @param array $b item of array
     * @return result of compare 0, 1, -1
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> sortingByKeySortOrder <span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #339933;">,</span> <span style="color: #000088;">$b</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'sort_order'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$b</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'sort_order'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'sort_order'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$b</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'sort_order'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #cc66cc;">1</span> <span style="color: #339933;">:</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Рассмотрим созданные методы<br />
<strong>refreshBackendMenu</strong> производит считывание всех конфигурационных файлов модулей, парсит xml (метод parsingXmlMenu) содержимое и формирует общий массив меню админки ($totalBackendMenuArray). Обратите внимание что для объединения массивов используется функция CMap::mergeArray которая производит слияние элементов дополняя и заменяя дублирующие. После этого производится сортировка элементов согласно ключу sort_order (метод sortingMenuItems). Далее производится отсечение не нужных элементов массива(метод convertXmlMenuFormatToOutputFormat). И запись новых элементов  меню в кеш файл (как serialize данные).</p>
<p>Рассмотрим метод который производит считывание кеша и возвращает массив элементов меню.<br />
Данный код помещает в AdminController</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getBackendMenu<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// File with serialize menu data</span>
        <span style="color: #000088;">$fname</span> <span style="color: #339933;">=</span> YiiBase<span style="color: #339933;">::</span><span style="color: #004000;">getPathOfAlias</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'application.cache'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;/backendmenu.ser&quot;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fname</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// When file not exits</span>
            <span style="color: #666666; font-style: italic;">// Create it by calling method to refresh menu</span>
            <span style="color: #000088;">$model</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Resource<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #666666; font-style: italic;">// Refresh backend menu manager</span>
            <span style="color: #000088;">$model</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">refreshBackendMenu</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #666666; font-style: italic;">// Show notification to user</span>
            Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFlash</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'success'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;Create backend menu success.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #666666; font-style: italic;">// Read file content and return array of menu</span>
        <span style="color: #000088;">$fh</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fname</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;r&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$outputMenu</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fread</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fh</span><span style="color: #339933;">,</span> <span style="color: #990000;">filesize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fname</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$outputMenu</span> <span style="color: #339933;">=</span> <span style="color: #990000;">unserialize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$outputMenu</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fh</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$outputMenu</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Обратите внимание, если файла с кешем не существует проивозится вызов метода который создает файл с данными о меню.</p>
<p>Немного подробнее остановится на формировании xml файлов.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;adminhtml<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;menu<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;system<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;items<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;invoice<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;label<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Manage Invoice<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/label<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;sort_order<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/sort_order<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/admin/invoice/index<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/invoice<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/items<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/system<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/menu<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/adminhtml<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Такая структура позволит нам добавить еще один дочерний элемент в меню с идентификатором system, который будет размещен первым (sort_order = 1)</p>
<p>Результатом работы структуры созданной в рамках статьи будет<br />
<img src="http://spiri7.net/wp-content/uploads/2010/04/backend_menu.png" alt="" title="backend_menu" width="521" height="107" class="aligncenter size-full wp-image-320" /></p>
<p>Спасибо за внимание. Буду рад услышать Ваши комментарии и отзывы. <strong>Похожие посты:</strong>
<ul class="similar-posts">
<li><a href="http://spiri7.net/blog/yii/yii-overview" rel="bookmark" title="08.04.2010">Yii: Краткий обзор</a></li>
<li><a href="http://spiri7.net/blog/yii/yii-module-install" rel="bookmark" title="09.04.2010">Yii: инсталяция модулей</a></li>
<li><a href="http://spiri7.net/blog/yii/yii-web-application-backend" rel="bookmark" title="12.04.2010">Yii: организация backend для приложения</a></li>
</ul>
<p><!-- Similar Posts took 10.079 ms --></p>
<img src="http://feeds.feedburner.com/~r/Spiri7/~4/PuqaH9CLTqM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spiri7.net/blog/yii/yii-dynamic-backend-menu/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://spiri7.net/blog/yii/yii-dynamic-backend-menu</feedburner:origLink></item>
		<item>
		<title>Yii: организация backend для приложения</title>
		<link>http://feedproxy.google.com/~r/Spiri7/~3/yh9g1RYqZG0/yii-web-application-backend</link>
		<comments>http://spiri7.net/blog/yii/yii-web-application-backend#comments</comments>
		<pubDate>Mon, 12 Apr 2010 09:00:07 +0000</pubDate>
		<dc:creator>SpiRi7</dc:creator>
				<category><![CDATA[Yii]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[bicycle]]></category>

		<guid isPermaLink="false">http://spiri7.net/?p=314</guid>
		<description><![CDATA[При разработке любого веб приложения перед программистом стоит задача организации управления данными. Реализация административной части — backend приложения. В зависимости от сложности приложения backend может быть представлен одним контролером,  выполнен в виде отдельного модуля или в виде отдельного приложения. Первые два подхода является простыми для понимания и не требуют подробного описания. Третий подход достаточно [...]]]></description>
			<content:encoded><![CDATA[<p>При разработке любого веб приложения перед программистом стоит задача организации управления данными. Реализация административной части — backend приложения. В зависимости от сложности приложения backend может быть представлен одним контролером,  выполнен в виде отдельного модуля или в виде отдельного приложения. Первые два подхода является простыми для понимания и не требуют подробного описания. Третий подход достаточно подробно описан в cookbook на официальном сайте Yii фреймворка. Рассмотрим еще один вариант организации — каждый модуль содержит в своем составе и методы для управления, административную часть.<br />
<span id="more-314"></span><br />
Определимся с структурой. Каждый модуль может содержать контроллеры, модели, отображения. В том числе контроллеры могут располагаться в поддиректории основных контролеров. Пусть в папке admin будут находиться наши контроллеры для управления веб приложением.<br />
<img src="http://spiri7.net/wp-content/uploads/2010/04/backend-module.png" alt="" title="backend-module" width="298" height="345" class="aligncenter size-full wp-image-315" /></p>
<p>При создании веб приложения на Yii используя консольную утилиту, все контроллеры наследуются от Controller, в котором определяется используемый layout, меню и т.п. Естественно для административной части нам необходимо использовать другой layout, и другие основные действия. Поэтому создадим новый экземпляр CController — AdminController.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> AdminController <span style="color: #000000; font-weight: bold;">extends</span> CController <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$breadcrumbs</span><span style="color: #339933;">=</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">layout</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;backend&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Как видно из кода мы используем layout — &#8220;backend&#8221;. Который мы размещаем в папку с темой для приложения /themes/classic/view/layout/backend.php<br />
Все отображения административного функционала находятся в директории модуля, например так &#8211; /modules/modulename/views/admin/action/view.php<br />
Таким образом мы можем произвести перегрузку любого отображения в папке с темой. Для указанного выше примера файла отображения, в папке темы должен быть выдержанна следующая структура.<br />
/themes/classic/views/modulename/admin/action/view.php</p>
<p>Доступ к административной части модуля будет осуществляться по адресу<br />
/module/admin/action/. Используя urlManager произведем переопределение используемых адресов.<br />
Файл конфигурации, по умолчанию /protected/config/main.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">                <span style="color: #0000ff;">'urlManager'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
                    <span style="color: #0000ff;">'urlFormat'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'path'</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'showScriptName'</span><span style="color: #339933;">=&gt;</span>false<span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'rules'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
                            <span style="color: #0000ff;">'admin/&lt;_m:\w+&gt;/&lt;_c:\w+&gt;/&lt;_a:\w+&gt;/*'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'&lt;_m&gt;/admin/&lt;_c&gt;/&lt;_a&gt;'</span><span style="color: #339933;">,</span>
                            <span style="color: #0000ff;">'admin/&lt;_m:\w+&gt;/&lt;_c:\w+&gt;'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'&lt;_m&gt;/admin/&lt;_c&gt;/index'</span><span style="color: #339933;">,</span>
                            <span style="color: #0000ff;">'admin/&lt;_m:\w+&gt;'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'&lt;_m&gt;/admin/default/index'</span><span style="color: #339933;">,</span>
                        <span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span></pre></div></div>

<p>Таким образом доступ к административному функционалу возможен по такому адресу<br />
/admin/modulename/action — что является более наглядным. </p>
<p>Надеюсь эта заметка поможет Вас в организации ваших backend контроллеров. Буду рад любым предложениям и замечаниям. <strong>Похожие посты:</strong>
<ul class="similar-posts">
<li><a href="http://spiri7.net/blog/yii/yii-overview" rel="bookmark" title="08.04.2010">Yii: Краткий обзор</a></li>
<li><a href="http://spiri7.net/blog/yii/yii-module-install" rel="bookmark" title="09.04.2010">Yii: инсталяция модулей</a></li>
<li><a href="http://spiri7.net/blog/yii/yii-dynamic-backend-menu" rel="bookmark" title="14.04.2010">Yii: динамическое меню для backend приложения</a></li>
</ul>
<p><!-- Similar Posts took 8.932 ms --></p>
<img src="http://feeds.feedburner.com/~r/Spiri7/~4/yh9g1RYqZG0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spiri7.net/blog/yii/yii-web-application-backend/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://spiri7.net/blog/yii/yii-web-application-backend</feedburner:origLink></item>
		<item>
		<title>Yii: инсталяция модулей</title>
		<link>http://feedproxy.google.com/~r/Spiri7/~3/JguUHhCeFIw/yii-module-install</link>
		<comments>http://spiri7.net/blog/yii/yii-module-install#comments</comments>
		<pubDate>Fri, 09 Apr 2010 17:50:12 +0000</pubDate>
		<dc:creator>SpiRi7</dc:creator>
				<category><![CDATA[Yii]]></category>
		<category><![CDATA[bicycle]]></category>

		<guid isPermaLink="false">http://spiri7.net/?p=290</guid>
		<description><![CDATA[Как я уже писал, Yii поддерживает модульную архитектуру разработки приложения. Создать модуль можно используя консольную утилиту yiic, или руками. Для того что бы фреймворк &#8220;увидел&#8221; его &#8211; необходимо добавить строку в конфигурационных файл (документация по модулям) следующим образом:

'modules' =&#62; array&#40;'content','core','forum'&#41;

Рассмотрим систему как можно автоматизировать процесс нахождения модуля yii фреймворком.

Начнем с небольшого лирического отступления. 

Последнее время [...]]]></description>
			<content:encoded><![CDATA[<p>Как я уже писал, Yii поддерживает модульную архитектуру разработки приложения. Создать модуль можно используя консольную утилиту yiic, или руками. Для того что бы фреймворк &#8220;увидел&#8221; его &#8211; необходимо добавить строку в конфигурационных файл (<a href="http://yiiframework.ru/doc/guide/ru/basics.module" target="_blank">документация по модулям</a>) следующим образом:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #0000ff;">'modules'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'content'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'core'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'forum'</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Рассмотрим систему как можно автоматизировать процесс нахождения модуля yii фреймворком.<br />
<span id="more-290"></span><br />
Начнем с небольшого лирического отступления. </p>
<blockquote><p>
Последнее время я достаточно плотно работаю с движком создания интернет магазинов Magento. Эта система построена полностью на модульной архитектуре. Разработчики помещают собственный модули в каталог /app/code/local/CompanyName/ModuleName. Каждый модуль содержит файл /etc/config.xml &#8211; содержащий конфигурационные настройки модуля, папку /sql/modulename_setup/ &#8211; содержащую sql скрипты инсталяции и обновления базы. Дополнительно в директорию /app/etc/modules помещается xml файл с краткой информацией о модуле. Magento при обновлении кеша (или при любом действии в админке, если кеш отключен) производит проверку на наличие новых модулей или наличия обновления, и производит автоматическое выполнение sql скриптов. Я хочу показать реализацию подобной системы для Yii фреймворка
</p></blockquote>
<p>Сформулируем задачи которые необходимо выполнить:</p>
<ol>
<li>Необходимо производить изменение конфигурационного файла приложения при установке/удаления модуля</li>
<li>Обеспечить хранение текущих версий установленных модулей в базе данных</li>
<li>Дать возможность выполнять sql скрипты при установке, обновлении и удалении модуля</li>
<li>Предоставить интерфейс для управления модулями</li>
</ol>
<h3>Структура файлов проекта</h3>
<p>Каталог /protected/config содержит 3 конфигурационных файла: </p>
<ul>
<li>config.php &#8211; основной конфигурационный файл приложения. Настройки базы данных, названия приложения, используемых язык и т.п.</li>
<li>modules.php &#8211; список установленных модулей</li>
<li>main.php &#8211; файл производящий объединение данных в config.php и modules.php</li>
</ul>
<p>Дополнительный каталог /protected/config/modules/ содержит xml файлы конфигурации каждого модуля установленного в веб-приложении. Например: content.xml, forum.xml, core.xml<br />
<img src="http://spiri7.net/wp-content/uploads/2010/04/config-folder.png" alt="" title="config-folder" width="197" height="127" class="aligncenter size-full wp-image-295" /></p>
<p>Пример структуры конфигурационного файла модуля (на примере content.xml)</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>content<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1.0.0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/version<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;creationDate<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2009-03-27<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/creationDate<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;author<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>SpiRi7<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/author<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;authorEmail<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>alex@spiri7.net<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/authorEmail<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;authorUrl<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>http://spiri7.net<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/authorUrl<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;copyright<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/copyright<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;license<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/license<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;description<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Content module<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/description<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Из данного файла мы будем использовать только ноды &#8211; name и version </p>
<p>Каждый модуль содержит директорию setup, в которой находятся файлы инсталляции, обновления, удаления модуля: install-1.0.0.sql, uninstall-1.0.0.sql, upgrade-0.9.0-1.0.0.sql. Каждый из этих файлов содержит набор sql инструкций для базы данных.<br />
<img src="http://spiri7.net/wp-content/uploads/2010/04/sql-update-files.png" alt="" title="sql-update-files" width="222" height="110" class="aligncenter size-full wp-image-298" /></p>
<h3>Конфигурационные файлы</h3>
<p>Как я писал выше мы используем 3 конфигурационных файла: main.php, config.php, modules.php<br />
Рассмотрим их содержимое:<br />
config.php &#8211; обычный конфигурационный файл приложения</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
	<span style="color: #0000ff;">'basePath'</span><span style="color: #339933;">=&gt;</span>dirname<span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #009900; font-weight: bold;">DIRECTORY_SEPARATOR</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'..'</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'name'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Yii-Web'</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'preload'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'log'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'import'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'application.models.*'</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'application.components.*'</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// application components</span>
	<span style="color: #0000ff;">'components'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'user'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
			<span style="color: #666666; font-style: italic;">// enable cookie-based authentication</span>
			<span style="color: #0000ff;">'allowAutoLogin'</span><span style="color: #339933;">=&gt;</span>true<span style="color: #339933;">,</span>
                        <span style="color: #0000ff;">'loginUrl'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin/core/dashboard/login'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'db'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
                    <span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'system.db.CDbConnection'</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'connectionString'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'mysql:host=localhost;dbname=yii_test'</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'username'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'root'</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'password'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'charset'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'utf8'</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'tablePrefix'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'errorHandler'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
                        <span style="color: #0000ff;">'errorAction'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'site/error'</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'log'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
			<span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'CLogRouter'</span><span style="color: #339933;">,</span>
			<span style="color: #0000ff;">'routes'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
				<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
					<span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'CFileLogRoute'</span><span style="color: #339933;">,</span>
					<span style="color: #0000ff;">'levels'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'error, warning'</span><span style="color: #339933;">,</span>
				<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'theme'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'classic'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'language'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'ru'</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'params'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
		<span style="color: #666666; font-style: italic;">// this is used in contact page</span>
		<span style="color: #0000ff;">'adminEmail'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'webmaster@example.com'</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>modules.php &#8211; список установленных модулей, этот файл мы будем генерировать.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"> <span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
 <span style="color: #0000ff;">'modules'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'content'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'core'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'invoice'</span><span style="color: #339933;">,</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>main.php &#8211; связка двух конфигурационных файлов в один</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">return</span> CMap<span style="color: #339933;">::</span><span style="color: #004000;">mergeArray</span><span style="color: #009900;">&#40;</span>
    <span style="color: #b1b100;">require</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/config.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> 
    <span style="color: #b1b100;">require</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/modules.php'</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Обратите внимание, что нет необходимости менять стартовый index.php. После создания нового приложения, он по умолчанию ссылается на конфигурационный файл main.php</p>
<h3>Управление модулями</h3>
<p>Перейдем непосредственно к коду. Для управления модулями я создал модуль core, в котором создал контроллер InstallController.php, модель Resource (ActiveRecord связана с таблицей core_resource).<br />
Структура таблицы из БД</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span>  <span style="color: #ff0000;">`yii_test`</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">`core_resource`</span> <span style="color: #66cc66;">&#40;</span>
  <span style="color: #ff0000;">`resource`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`version_installed`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`version_available`</span> varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">50</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`need_install`</span> tinyint<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">'0'</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`need_upgrade`</span> tinyint<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">'0'</span><span style="color: #66cc66;">,</span>
  <span style="color: #ff0000;">`need_uninstall`</span> tinyint<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #ff0000;">'0'</span><span style="color: #66cc66;">,</span>
  <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`resource`</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span> ENGINE<span style="color: #66cc66;">=</span>InnoDB <span style="color: #993333; font-weight: bold;">DEFAULT</span> CHARSET<span style="color: #66cc66;">=</span>utf8 ROW_FORMAT<span style="color: #66cc66;">=</span>DYNAMIC</pre></div></div>

<p>resource &#8211; название ресурса (модуля)<br />
version_installed &#8211; установленная версия (пустое значение если необходима установка)<br />
version_available &#8211; доступная версия модуля<br />
need_install/need_upgrade/need_uninstall флаги о необходимости установки, обновления, удаления</p>
<p>Контроллер</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> InstallController <span style="color: #000000; font-weight: bold;">extends</span> AdminController <span style="color: #009900;">&#123;</span>
    <span style="color: #009933; font-style: italic;">/**
     * @var CActiveRecord the currently loaded data model instance.
     */</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_model</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * @return array action filters
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> filters<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                <span style="color: #0000ff;">'accessControl'</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// perform access control for CRUD operations</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * Specifies the access control rules.
     * This method is used by the 'accessControl' filter.
     * @return array access control rules
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> accessRules<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'allow'</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// allow authenticated user to perform all actions</span>
                        <span style="color: #0000ff;">'users'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'deny'</span><span style="color: #339933;">,</span>  <span style="color: #666666; font-style: italic;">// deny all users</span>
                        <span style="color: #0000ff;">'users'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'*'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * Lists of all installed modules.
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> actionIndex<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #000088;">$model</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Resource<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Refresh backend menu manager</span>
        <span style="color: #666666; font-style: italic;">// Refreshing installing modules</span>
        <span style="color: #000088;">$model</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">refreshModuleList</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$dataProvider</span><span style="color: #339933;">=</span><span style="color: #000000; font-weight: bold;">new</span> CActiveDataProvider<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Resource'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">render</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'resources'</span><span style="color: #339933;">,</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                <span style="color: #0000ff;">'dataProvider'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$dataProvider</span>
        <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * Process install/upgrade/uninstall action
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> actionProcess<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$resourceName</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'resource'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$actionName</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'action'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$model</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Resource<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$newVersion</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$model</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">updateResource</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$resourceName</span><span style="color: #339933;">,</span> <span style="color: #000088;">$actionName</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFlash</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'success'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;Module &lt;b&gt;&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$resourceName</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;&lt;/b&gt; success &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$actionName</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;. SQL script version: &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$newVersion</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span>Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createUrl</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;admin/core/install/index&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Разберем код подробнее.<br />
<strong>actionIndex</strong> &#8211; производит обновление установленных модулей, и передачу данных в отображение списка записей в таблице<br />
<strong>actionProcess</strong> &#8211; производит установку, удаление, обновления модуля (выполнение sql файлов) и передает управление в index (т.е. вывод списка на экран)</p>
<p>Отображение</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">widget</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'zii.widgets.grid.CGridView'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
	<span style="color: #0000ff;">'id'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'articles-grid'</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'dataProvider'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$dataProvider</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">'columns'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'resource'</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'version_installed'</span><span style="color: #339933;">,</span>
                <span style="color: #0000ff;">'version_available'</span><span style="color: #339933;">,</span>
		<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
			<span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'CButtonColumn'</span><span style="color: #339933;">,</span>
                        <span style="color: #0000ff;">'buttons'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
                                <span style="color: #0000ff;">'install'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
                                    <span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Install'</span><span style="color: #339933;">,</span>
                                    <span style="color: #0000ff;">'visible'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'($data-&gt;need_install == 1)?true:false'</span><span style="color: #339933;">,</span>
                                    <span style="color: #0000ff;">'url'</span><span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Yii::app()-&gt;createUrl(&quot;admin/core/install/process&quot;, array(&quot;resource&quot;=&gt;$data-&gt;resource,&quot;action&quot;=&gt;&quot;install&quot;))'</span><span style="color: #339933;">,</span>
                                <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                                <span style="color: #0000ff;">'upgrade'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
                                    <span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Upgrade'</span><span style="color: #339933;">,</span>
                                    <span style="color: #0000ff;">'visible'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'($data-&gt;need_upgrade == 1)?true:false'</span><span style="color: #339933;">,</span>
                                    <span style="color: #0000ff;">'url'</span><span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Yii::app()-&gt;createUrl(&quot;admin/core/install/process&quot;, array(&quot;resource&quot;=&gt;$data-&gt;resource,&quot;action&quot;=&gt;&quot;upgrade&quot;))'</span><span style="color: #339933;">,</span>
                                <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                                <span style="color: #0000ff;">'uninstall'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
                                    <span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Uninstall'</span><span style="color: #339933;">,</span>
                                    <span style="color: #0000ff;">'visible'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'($data-&gt;need_install == 0)?true:false'</span><span style="color: #339933;">,</span>
                                    <span style="color: #0000ff;">'url'</span><span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Yii::app()-&gt;createUrl(&quot;admin/core/install/process&quot;, array(&quot;resource&quot;=&gt;$data-&gt;resource,&quot;action&quot;=&gt;&quot;uninstall&quot;))'</span><span style="color: #339933;">,</span>
                                <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                         <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                         <span style="color: #0000ff;">'template'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'{install}{upgrade}{uninstall}'</span><span style="color: #339933;">,</span>
&nbsp;
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
&nbsp;
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Отображение достаточно простое &#8211; просто производит вывод грида с кнопками для управления.</p>
<p>Модель</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Resource <span style="color: #000000; font-weight: bold;">extends</span> CActiveRecord <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">const</span> VERSION_COMPARE_EQUAL   <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">const</span> VERSION_COMPARE_LOWER   <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">const</span> VERSION_COMPARE_GREATER <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
    protected <span style="color: #000088;">$isUpdated</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009933; font-style: italic;">/**
     * Returns the static model of the specified AR class.
     * @return CActiveRecord the static model class
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> model<span style="color: #009900;">&#40;</span><span style="color: #000088;">$className</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">__CLASS__</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> parent<span style="color: #339933;">::</span><span style="color: #004000;">model</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$className</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * @return string the associated database table name
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> tableName<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">'core_resource'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * @return array customized attribute labels (name=&gt;label)
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> attributeLabels<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                <span style="color: #0000ff;">'resource'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Module'</span><span style="color: #339933;">,</span>
                <span style="color: #0000ff;">'version_installed'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Installed'</span><span style="color: #339933;">,</span>
                <span style="color: #0000ff;">'version_available'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Available'</span><span style="color: #339933;">,</span>
                <span style="color: #0000ff;">'need_install'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Need install'</span><span style="color: #339933;">,</span>
                <span style="color: #0000ff;">'need_upgrade'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Need upgrade'</span><span style="color: #339933;">,</span>
                <span style="color: #0000ff;">'need_uninstall'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Need delete'</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * Refreshing all installed modules list
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span>  refreshModuleList<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$connection</span> <span style="color: #339933;">=</span> Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Clear field that need to install (flag need_install=1)</span>
        <span style="color: #000088;">$command</span> <span style="color: #339933;">=</span>  <span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createCommand</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DELETE FROM {{core_resource}} WHERE need_install = 1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$command</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Get all modules configuration files (configuration stored as xml file)</span>
        <span style="color: #000088;">$configFileList</span> <span style="color: #339933;">=</span> <span style="color: #990000;">glob</span><span style="color: #009900;">&#40;</span>YiiBase<span style="color: #339933;">::</span><span style="color: #004000;">getPathOfAlias</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'application.config.modules'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;/*.xml&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// Create config files array of items module=&gt;version</span>
        <span style="color: #000088;">$installedFileModules</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$configFileList</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$singleConfigFile</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
            <span style="color: #000088;">$config</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SimpleXMLElement<span style="color: #009900;">&#40;</span><span style="color: #000088;">$singleConfigFile</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$installedFileModules</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#40;</span>String<span style="color: #009900;">&#41;</span><span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">name</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>String<span style="color: #009900;">&#41;</span><span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">version</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Get module config array from DB module=&gt;version</span>
        <span style="color: #000088;">$installedDbModules</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$records</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">findAll</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$records</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$recordItem</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$installedDbModules</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$recordItem</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">resource</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$recordItem</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'version_installed'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Determinate what modules need to be installed or upgraded</span>
        <span style="color: #000088;">$updateToDatabase</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$installedFileModules</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$configModuleName</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$configVersion</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$singleDbUpdate</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                    <span style="color: #0000ff;">'resource'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$configModuleName</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'version_installed'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'version_available'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$configVersion</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'need_install'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'need_upgrade'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
                    <span style="color: #0000ff;">'need_uninstall'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$installedDbModules</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$configModuleName</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #666666; font-style: italic;">// Have such module installed into DB</span>
                <span style="color: #000088;">$status</span> <span style="color: #339933;">=</span>  <span style="color: #990000;">version_compare</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$configVersion</span><span style="color: #339933;">,</span> <span style="color: #000088;">$installedDbModules</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$configModuleName</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$status</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">VERSION_COMPARE_LOWER</span><span style="color: #339933;">:</span>
                    <span style="color: #666666; font-style: italic;">//$this-&gt;_rollbackResourceDb($configVer, $dbVer);</span>
                        <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
                    <span style="color: #b1b100;">case</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">VERSION_COMPARE_GREATER</span><span style="color: #339933;">:</span>
                    <span style="color: #666666; font-style: italic;">// Need update this module</span>
                        <span style="color: #000088;">$singleDbUpdate</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'need_upgrade'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">;</span>
                        <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #000088;">$singleDbUpdate</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'version_installed'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$installedDbModules</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$configModuleName</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$singleDbUpdate</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'need_install'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #000088;">$updateToDatabase</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$singleDbUpdate</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Determinate what modules need to be unistalled (no config file found)</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$installedDbModules</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$dbModuleName</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$dbVersion</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$installedFileModules</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$dbModuleName</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$singleDbUpdate</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                        <span style="color: #0000ff;">'resource'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$dbModuleName</span><span style="color: #339933;">,</span>
                        <span style="color: #0000ff;">'version_installed'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$dbVersion</span><span style="color: #339933;">,</span>
                        <span style="color: #0000ff;">'version_available'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
                        <span style="color: #0000ff;">'need_install'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
                        <span style="color: #0000ff;">'need_upgrade'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
                        <span style="color: #0000ff;">'need_uninstall'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$updateToDatabase</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$singleDbUpdate</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Process update to DB</span>
        <span style="color: #666666; font-style: italic;">// Clear all records</span>
        <span style="color: #000088;">$command</span> <span style="color: #339933;">=</span>  <span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createCommand</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DELETE FROM {{core_resource}}&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$command</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;INSERT INTO {{core_resource}} (`resource`, `version_installed`, `version_available`, `need_install`, `need_upgrade`, `need_uninstall`) VALUES &quot;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$updateToDatabase</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$singleUpdate</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$sql</span><span style="color: #339933;">.=</span><span style="color: #0000ff;">&quot;('&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$singleUpdate</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'resource'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;','&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$singleUpdate</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'version_installed'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;','&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$singleUpdate</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'version_available'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;', &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$singleUpdate</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'need_install'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;, &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$singleUpdate</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'need_upgrade'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;, &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$singleUpdate</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'need_uninstall'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;),&quot;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">';'</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// Insert new list of modules</span>
        <span style="color: #000088;">$command</span> <span style="color: #339933;">=</span>  <span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createCommand</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Update module list that installed to system</span>
        <span style="color: #666666; font-style: italic;">// Create string with php code</span>
        <span style="color: #000088;">$installedModulesAsPhpArray</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&lt;?php<span style="color: #000099; font-weight: bold;">\n</span> return array(<span style="color: #000099; font-weight: bold;">\n</span> 'modules' =&gt; array(&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$updateToDatabase</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$singleUpdate</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$singleUpdate</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'need_install'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$singleUpdate</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'need_uninstall'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #666666; font-style: italic;">// Write only modules that installed to system</span>
                <span style="color: #000088;">$installedModulesAsPhpArray</span><span style="color: #339933;">.=</span><span style="color: #0000ff;">&quot;'&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$singleUpdate</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'resource'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;',&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000088;">$installedModulesAsPhpArray</span><span style="color: #339933;">.=</span><span style="color: #0000ff;">&quot;)<span style="color: #000099; font-weight: bold;">\n</span>);&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// Need to have write permission to file config/modules.php</span>
        <span style="color: #000088;">$fh</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span>YiiBase<span style="color: #339933;">::</span><span style="color: #004000;">getPathOfAlias</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'application.config'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;/modules.php&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;w&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fh</span><span style="color: #339933;">,</span> <span style="color: #000088;">$installedModulesAsPhpArray</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fh</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * Make modifaction for module. Possible to install/upgrade/uninstall module.
     *
     * @param String $resourceName module name that need to perform $action
     * @param String $action action to perform install/upgrade/uninstall
     * @return real version that proccessed after update
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> updateResource<span style="color: #009900;">&#40;</span><span style="color: #000088;">$resourceName</span><span style="color: #339933;">,</span> <span style="color: #000088;">$action</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$resource</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">findByPk</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$resourceName</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$version</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_modifyResourceDb<span style="color: #009900;">&#40;</span><span style="color: #000088;">$resourceName</span><span style="color: #339933;">,</span> <span style="color: #000088;">$action</span><span style="color: #339933;">,</span> <span style="color: #000088;">$resource</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'version_installed'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$resource</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'version_available'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$action</span><span style="color: #339933;">!=</span><span style="color: #0000ff;">&quot;uninstall&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// After execute all sql file, update resource information for install/upgrade</span>
            <span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;UPDATE {{core_resource}} SET version_installed='&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$resource</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'version_available'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;'  WHERE resource='&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$resourceName</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;'&quot;</span><span style="color: #339933;">;</span>
            Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createCommand</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// for uninstall delete from table this resource</span>
            Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createCommand</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DELETE FROM {{core_resource}} WHERE resource='&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$resourceName</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Return real updated version</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$version</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * Run module modification files. Return version of last applied upgrade (false if no upgrades applied)
     *
     * @param     string $actionType install|upgrade|uninstall
     * @param     string $fromVersion
     * @param     string $toVersion
     * @return    string | false
     */</span>
    protected <span style="color: #000000; font-weight: bold;">function</span> _modifyResourceDb<span style="color: #009900;">&#40;</span><span style="color: #000088;">$resourceName</span><span style="color: #339933;">,</span> <span style="color: #000088;">$actionType</span><span style="color: #339933;">,</span> <span style="color: #000088;">$fromVersion</span><span style="color: #339933;">,</span> <span style="color: #000088;">$toVersion</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$sqlFilesDir</span> <span style="color: #339933;">=</span> YiiBase<span style="color: #339933;">::</span><span style="color: #004000;">getPathOfAlias</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'application.modules.'</span><span style="color: #339933;">.</span><span style="color: #000088;">$resourceName</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.setup'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">is_dir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sqlFilesDir</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #339933;">!</span><span style="color: #990000;">is_readable</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sqlFilesDir</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Read resource files</span>
        <span style="color: #000088;">$arrAvailableFiles</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$fileToDir</span> <span style="color: #339933;">=</span> <span style="color: #990000;">glob</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sqlFilesDir</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;/&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$actionType</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;-*.sql&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fileToDir</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$sqlFile</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$matches</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'#.*'</span><span style="color: #339933;">.</span><span style="color: #000088;">$actionType</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'-(.*)\.sql$#i'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sqlFile</span><span style="color: #339933;">,</span> <span style="color: #000088;">$matches</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$arrAvailableFiles</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$sqlFile</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$arrAvailableFiles</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// Get SQL files name</span>
        <span style="color: #000088;">$arrModifyFiles</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_getModifySqlFiles<span style="color: #009900;">&#40;</span><span style="color: #000088;">$actionType</span><span style="color: #339933;">,</span> <span style="color: #000088;">$fromVersion</span><span style="color: #339933;">,</span> <span style="color: #000088;">$toVersion</span><span style="color: #339933;">,</span> <span style="color: #000088;">$arrAvailableFiles</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$arrModifyFiles</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000088;">$modifyVersion</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$connection</span> <span style="color: #339933;">=</span> Yii<span style="color: #339933;">::</span><span style="color: #004000;">app</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// $connection-&gt;pdoInstance-&gt;setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);</span>
&nbsp;
        <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$arrModifyFiles</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$resourceFile</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            try <span style="color: #009900;">&#123;</span>
                <span style="color: #990000;">ob_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">include_once</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$resourceFile</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'fileName'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ob_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #339933;">@</span><span style="color: #990000;">ob_end_clean</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #339933;">!=</span><span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #000088;">$command1</span> <span style="color: #339933;">=</span>  <span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createCommand</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #000088;">$command1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #666666; font-style: italic;">// For some pdo adapter on next sql query show error</span>
                    <span style="color: #000088;">$command1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPdoStatement</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">closeCursor</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #666666; font-style: italic;">// Update Database module version</span>
                <span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;UPDATE {{core_resource}} SET version_installed='&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$resourceFile</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'toVersion'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;'  WHERE resource='&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$resourceName</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;'&quot;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createCommand</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#40;</span>Exception <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$message</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Error in file: &quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$resourceFile</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'fileName'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot; - '</span><span style="color: #339933;">.</span><span style="color: #000088;">$e</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMessage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                throw <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #000088;">$modifyVersion</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$resourceFile</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'toVersion'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #666666; font-style: italic;">// On final marked resource as not need install</span>
        <span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;UPDATE {{core_resource}} SET need_install = 0 WHERE resource='&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$resourceName</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;'&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$connection</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createCommand</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$modifyVersion</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * Get sql files for modifications
     *
     * @param     $actionType
     * @return    array
     */</span>
    protected <span style="color: #000000; font-weight: bold;">function</span> _getModifySqlFiles<span style="color: #009900;">&#40;</span><span style="color: #000088;">$actionType</span><span style="color: #339933;">,</span> <span style="color: #000088;">$fromVersion</span><span style="color: #339933;">,</span> <span style="color: #000088;">$toVersion</span><span style="color: #339933;">,</span> <span style="color: #000088;">$arrFiles</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$arrRes</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$actionType</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'install'</span><span style="color: #339933;">:</span>
                <span style="color: #990000;">uksort</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$arrFiles</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'version_compare'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$arrFiles</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$version</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">version_compare</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$version</span><span style="color: #339933;">,</span> <span style="color: #000088;">$toVersion</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">VERSION_COMPARE_GREATER</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #000088;">$arrRes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'toVersion'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$version</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'fileName'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'upgrade'</span><span style="color: #339933;">:</span>
                <span style="color: #990000;">uksort</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$arrFiles</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'version_compare'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$arrFiles</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$version</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #000088;">$version_info</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'-'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$version</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
                    <span style="color: #666666; font-style: italic;">// In array must be 2 elements: 0 =&gt; version from, 1 =&gt; version to</span>
                    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$version_info</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">!=</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
                    <span style="color: #000088;">$infoFrom</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$version_info</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                    <span style="color: #000088;">$infoTo</span>   <span style="color: #339933;">=</span> <span style="color: #000088;">$version_info</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">version_compare</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$infoFrom</span><span style="color: #339933;">,</span> <span style="color: #000088;">$fromVersion</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">!==</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">VERSION_COMPARE_LOWER</span>
                            <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">version_compare</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$infoTo</span><span style="color: #339933;">,</span> <span style="color: #000088;">$toVersion</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">!==</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">VERSION_COMPARE_GREATER</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #000088;">$arrRes</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'toVersion'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$infoTo</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'fileName'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'uninstall'</span><span style="color: #339933;">:</span>
                <span style="color: #990000;">uksort</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$arrFiles</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'version_compare'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$arrFiles</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$version</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">version_compare</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$version</span><span style="color: #339933;">,</span> <span style="color: #000088;">$fromVersion</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">VERSION_COMPARE_GREATER</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #000088;">$arrRes</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'toVersion'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$version</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'fileName'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'rollback'</span><span style="color: #339933;">:</span>
            <span style="color: #666666; font-style: italic;">// @todo support rollback</span>
                <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$arrRes</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Разбираем подробнее.</p>
<p>Метод <strong>refreshModuleList</strong> &#8211; основной метод запускаемый из контроллера когда мы переходит на просмотр грида. Производит удаление из базы данных всех модулей которые требуют установки. Производит считывание конфигурационных файлов модулей (директория /config/modules/*.xml) сохраняет данные в виде: имя модуля &#8211; версия. Получаем список модулей известных веб-приложению. В зависимости от результата сравнения данных (конфигурационные файлы &#8211; данные в базе) записывает в базу данных обновленные значения, с флагами информирующими о необходимости установки (данный модуль не найден в базе, но есть конфиг), обновления (модуль есть в базе и есть конфиг, но версия конфига более новая), необходимости удаления (нет конфигурационного файла, но имеется запись в базе). Записывает в конфигурационный файл приложения (/config/modules.php) список всех установленных и требующих обновления модулей. </p>
<p>Метод <strong>updateResource</strong> производит обновление указанного модуля согласно переданному действию. После успешного выполнения &#8211; обновляет таблицу core_resource (меняет версию или стирает модуль)</p>
<p>Метод <strong>_modifyResourceDb</strong> получает полный список sql файлов из директории модуля /modules/modulename/setup и сохраняет их в массив. Вызывает метод <strong>_getModifySqlFiles</strong> для получения списка файлов которых необходимо выполнить для обновления данных о ресурсе. После этого производит последовательное выполнение каждого файла требуемого для обновления/установки/удаления ресурса.<br />
Обратите внимание на метод $command1->getPdoStatement()->closeCursor(). Sql файл обновления содержит несколько инструкций для модификации базы данных, некоторые pdo адаптеры не завершают корректно данный запрос, и при следующем запросе мы получим ошибку. Эта инструкция принудительно закрывает курсор (сбрасывает кеш).</p>
<p>Метод <strong>_getModifySqlFiles</strong> согласно передаваемого действия производит анализ списка файлов и возвращает только те которые необходимо использовать при обновлении до требуемой версии. </p>
<p>Результат работы нашего функционала будет следующий:</p>
<p><a href="http://spiri7.net/wp-content/uploads/2010/04/module-install-grid-1.png"><img src="http://spiri7.net/wp-content/uploads/2010/04/module-install-grid-1-300x63.png" alt="" title="module-install-grid-1" width="300" height="63" class="aligncenter size-medium wp-image-309" /></a><br />
<br/><br />
<a href="http://spiri7.net/wp-content/uploads/2010/04/module-install-grid-2.png"><img src="http://spiri7.net/wp-content/uploads/2010/04/module-install-grid-2-300x48.png" alt="" title="module-install-grid-2" width="300" height="48" class="aligncenter size-medium wp-image-308" /></a></p>
<h3>Недостатки</h3>
<p>Такая система содержит ряд недостатков:</p>
<ul>
<li>Конфигурационные файлы модуля сделаны в xml формате. Для меня это удобнее, но не совсем Yii-style.</li>
<li>Конфигурационный файл модуля находится в отдельной папке, для разработчика это может быть частично не удобно. Желательным будем размещение конфига в папке с модулем. </li>
<li>При обновлении списка модулей выполняется полная очистка таблицы ресурсов. Это не очень красивый подход, возможна ситуация при которой таблица очиститься, а новые данные добавлены не будут. </li>
<li>Нет защиты модуля от удаления. Например если мы произведем удаление модуля core — для возврата функционирования придется руками править базу данных</li>
<li>При выполнении sql скриптов установки/обновления/удаления ошибки возвращаться  если выполнение первого запроса было неудачным. При ошибке во втором, третьем и т.д. запросе исключение не генерируется, оставшиеся запросы пропускаются</li>
<li>Возможна более грамотная генерация конфигурационного файла со списком установленных модулей.</li>
</ul>
<p>Спасибо за внимание. Буду рад любым предложения, замечаниям и вариантам оптимизации. </p>
<p>Исходный код модуля core можно скачать по ссылке <a href="http://dl.dropbox.com/u/4966678/core.zip">модуль core</a><strong>Похожие посты:</strong>
<ul class="similar-posts">
<li><a href="http://spiri7.net/blog/yii/yii-overview" rel="bookmark" title="08.04.2010">Yii: Краткий обзор</a></li>
<li><a href="http://spiri7.net/blog/yii/yii-web-application-backend" rel="bookmark" title="12.04.2010">Yii: организация backend для приложения</a></li>
<li><a href="http://spiri7.net/blog/yii/yii-dynamic-backend-menu" rel="bookmark" title="14.04.2010">Yii: динамическое меню для backend приложения</a></li>
</ul>
<p><!-- Similar Posts took 11.332 ms --></p>
<img src="http://feeds.feedburner.com/~r/Spiri7/~4/JguUHhCeFIw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spiri7.net/blog/yii/yii-module-install/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://spiri7.net/blog/yii/yii-module-install</feedburner:origLink></item>
		<item>
		<title>Yii: Краткий обзор</title>
		<link>http://feedproxy.google.com/~r/Spiri7/~3/s59Yqo28Efw/yii-overview</link>
		<comments>http://spiri7.net/blog/yii/yii-overview#comments</comments>
		<pubDate>Thu, 08 Apr 2010 19:01:49 +0000</pubDate>
		<dc:creator>SpiRi7</dc:creator>
				<category><![CDATA[Yii]]></category>
		<category><![CDATA[overview]]></category>

		<guid isPermaLink="false">http://spiri7.net/?p=282</guid>
		<description><![CDATA[Для PHP существует ряд достаточно известных и устоявшихся фрейморков. Это легендарный Zend Framework, не менее известный Symfony, простой и с хорошей документацией CodeIgniter, старичек Cakephp, легко расширяемый Kohana. И достаточно новый быстро набирающий популярность Yii Framework.

Свое знакомство с фреймворками я начал с CodeIgniter. Я был поражен той легкостью с помощью которой можно было создавать веб-приложения, [...]]]></description>
			<content:encoded><![CDATA[<p>Для PHP существует ряд достаточно известных и устоявшихся фрейморков. Это легендарный Zend Framework, не менее известный Symfony, простой и с хорошей документацией CodeIgniter, старичек Cakephp, легко расширяемый Kohana. И достаточно новый быстро набирающий популярность Yii Framework.<br />
<span id="more-282"></span><br />
Свое знакомство с фреймворками я начал с CodeIgniter. Я был поражен той легкостью с помощью которой можно было создавать веб-приложения, но через некоторое время я понял что в нем мне не хватает модульной системы и поддержки layout. Да конечно есть расширение с помощью которого можно заставить его понимать модули и работать с layout, но скажем честно &#8211; они весьма слабоваты. Так я пришел к тяжелому, с великолепной расширяемостью Zend Framework. ZF отвечал всем моим требованиям, поддерживал модульную структуру, layout, возможность конфигурировать структуру приложения так как мне нравится. ZF идеален при разработке серьезных корпоративных решений, но для сайта визитки он будет тяжеловат. Большой вес классов, потребление памяти, долгий рендеринг страниц.<br/></p>
<p>Собственно перейдем к Yii. <br/><br />
Yii достаточно быстро работает, потребляет мало памяти, поддерживает модульную архитектуру, layout, темы. И что самое главное содержит множество классов упрощающих работу с данными, реализацию поддержки jQuery. Используя только php код в отображении можно сделать табличный вывод содержимого таблицы базы данных, поддерживающую поиск, сортировки и дополнительные действия. <br/><br />
<img src="http://spiri7.net/wp-content/uploads/2010/04/yii-debug-toolbar.png" alt="" title="yii-debug-toolbar" width="475" height="20" class="aligncenter size-full wp-image-287" /><br />
Несомненным плюсом является наличие консольной (а в разрабатываемой версии и графической)  утилиты для генерации моделей, модулей, CRUD, phpunit тестов. Про CRUD можно сказать отдельно &#8211; несколькими командами в консоли можно полностью реализовать управление таблицей из базы данных: просмотр, добавление, редактирование, удаление. <br/></p>
<p>Конечно, Yii не является идеальным. Есть вещи которые хотелось бы немного поменять для себя, переделать и добавить. Но они не является действительно критичными при разработке веб-приложений, и с ними можно мирится. <br/></p>
<p>К главным недостаткам можно отнести &#8220;скрытые фичи&#8221; фреймворка. Документация не очень подробная, на мой взгляд она описывает только основные моменты. Для большинства случаев приходится лезть в исходных код или смотреть api. В защиту можно сказать, что весь код очень подробно задокументирован, но не всегда понятно как использовать ту или иную фишку класса.<br />
Yii содержит немного не привычную систему работы с базой данных &#8211; Active Record. Конечно можно это понять и в полной мере использовать, но на начальном этапе (а я как раз на нем) бывает достаточно сложно разобраться. <br/></p>
<p>Да и самое главное для Yii написано множество полезных расширений, которые после небольших модификаций можно использовать в своих проектах.<br/><br/></p>
<p>На этом я завершаю свой краткий обзор Yii. В ближайшем будущем я постараюсь выложить в блог результаты моего знакомство с Yii.<br/><br/></p>
<p>И на закуску немного ссылок на полезные сайты связанные с тематикой Yii:<br/></p>
<ul>
<li><a href="http://www.yiiframework.com" target="_blank">http://www.yiiframework.com</a> &#8211; официальный сайт. Есть форум в том числе русский</li>
<li><a href="http://yiiframework.ru/" target="_blank">http://yiiframework.ru/</a> &#8211; русское сообщество разработчиков. Форум, русская документация</li>
<li><a href="http://rmcreative.ru/" target="_blank">http://rmcreative.ru/</a> &#8211; блог одного из разработчиков yii. Обратите внимание что разработчик пишет на русском <img src='http://spiri7.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li><a href="http://dbhelp.ru/" target="_blank">http://dbhelp.ru/</a> &#8211; &#8220;Маленький&#8221; Yii блог. Мануал создания блога, перевод Cookbook, мелкие заметки</li>
<li><a href="http://www.simplecoding.org/category/yii" target="_blank">http://www.simplecoding.org</a> &#8211; Содержит цикл статей посвященных созданию сайта на Yii</li>
<p><strong>Похожие посты:</strong>
<ul class="similar-posts">
<li><a href="http://spiri7.net/blog/yii/yii-module-install" rel="bookmark" title="09.04.2010">Yii: инсталяция модулей</a></li>
<li><a href="http://spiri7.net/blog/yii/yii-web-application-backend" rel="bookmark" title="12.04.2010">Yii: организация backend для приложения</a></li>
<li><a href="http://spiri7.net/blog/yii/yii-dynamic-backend-menu" rel="bookmark" title="14.04.2010">Yii: динамическое меню для backend приложения</a></li>
</ul>
<p><!-- Similar Posts took 10.046 ms --></p>
<img src="http://feeds.feedburner.com/~r/Spiri7/~4/s59Yqo28Efw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spiri7.net/blog/yii/yii-overview/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://spiri7.net/blog/yii/yii-overview</feedburner:origLink></item>
		<item>
		<title>Magento: Построение дерева</title>
		<link>http://feedproxy.google.com/~r/Spiri7/~3/rzKsuyYB4w8/magento-build-tree</link>
		<comments>http://spiri7.net/blog/magento/magento-build-tree#comments</comments>
		<pubDate>Mon, 15 Mar 2010 21:36:29 +0000</pubDate>
		<dc:creator>SpiRi7</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Magento]]></category>
		<category><![CDATA[category-tree]]></category>
		<category><![CDATA[extjs]]></category>
		<category><![CDATA[tree]]></category>

		<guid isPermaLink="false">http://spiri7.net/?p=273</guid>
		<description><![CDATA[ Сегодня речь пойдет о встроенной в Magento возможности для построения древовидных структур. Движок использует такое дерево при построение списка категорий магазина (Catalog->Manage Categories). Для такого построения используется урезанная библиотека Ext и ее дополнительный компонент TreeCheckNode.

Рассмотрим процесс создания такого дерева подробнее.
Первым шагом необходимо в контролере включить загрузку библиотеки ExtJs

 public function indexAction&#40;&#41; &#123;
   [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://spiri7.net/wp-content/uploads/2010/03/category_tree.png" alt="" title="category_tree" width="206" height="269" class="alignleft size-full wp-image-274" /> Сегодня речь пойдет о встроенной в Magento возможности для построения древовидных структур. Движок использует такое дерево при построение списка категорий магазина (Catalog->Manage Categories). Для такого построения используется урезанная библиотека Ext и ее дополнительный компонент <a href="http://crepitus.com/misc/ext/tree.html" target="_blank">TreeCheckNode</a>.<br />
<span id="more-273"></span><br />
Рассмотрим процесс создания такого дерева подробнее.<br />
Первым шагом необходимо в контролере включить загрузку библиотеки ExtJs</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> indexAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">loadLayout</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// Add out block to content to render</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_addContent<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getLayout</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createBlock</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'codename/adminhtml_blockname'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">// Say Magento Load ExtJs</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getLayout</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getBlock</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'head'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setCanLoadExtJs</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">renderLayout</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Далее переходим к отображению. Категории для нашего дерева мы будем подгружать используя Ajax, поэтому для начала просто определим начальную информацию о дереве</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #003366; font-weight: bold;">var</span> tree<span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> defaultLoadTreeParams <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
		animate<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span>
		enableDD<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span>
		containerScroll<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
		rootUIProvider<span style="color: #339933;">:</span> Ext.<span style="color: #660066;">tree</span>.<span style="color: #660066;">CheckboxNodeUI</span><span style="color: #339933;">,</span>
		selModel<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">tree</span>.<span style="color: #660066;">CheckNodeMultiSelectionModel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		rootVisible<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">false</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #006600; font-style: italic;">/** 
 * Function for render new Tree. 
 * @param requestUrl url for get tree information
 */</span>
<span style="color: #003366; font-weight: bold;">function</span> renderNewTree<span style="color: #009900;">&#40;</span>requestUrl<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>requestUrl<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     requestUrl <span style="color: #339933;">=</span> <span style="color: #3366CC;">'treesample'</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  defaultLoadTreeParams<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'loader'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">tree</span>.<span style="color: #660066;">CustomUITreeLoader</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
     dataUrl<span style="color: #339933;">:</span> requestUrl<span style="color: #339933;">,</span>
     baseAttr<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
        uiProvider<span style="color: #339933;">:</span> Ext.<span style="color: #660066;">tree</span>.<span style="color: #660066;">CheckboxNodeUI</span>
     <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>tree<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #006600; font-style: italic;">// Clear prev tree version</span>
     tree.<span style="color: #660066;">purgeListeners</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     tree.<span style="color: #660066;">el</span>.<span style="color: #660066;">dom</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">''</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
   tree <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">tree</span>.<span style="color: #660066;">TreePanel</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'tree-div'</span><span style="color: #339933;">,</span> defaultLoadTreeParams<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   root <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">tree</span>.<span style="color: #660066;">AsyncTreeNode</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
      text<span style="color: #339933;">:</span> <span style="color: #3366CC;">'root'</span><span style="color: #339933;">,</span>
      draggable<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span>
      id<span style="color: #339933;">:</span><span style="color: #3366CC;">'source'</span><span style="color: #339933;">,</span>
      uiProvider<span style="color: #339933;">:</span> Ext.<span style="color: #660066;">tree</span>.<span style="color: #660066;">CheckboxNodeUI</span>
   <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   tree.<span style="color: #660066;">setRootNode</span><span style="color: #009900;">&#40;</span>root<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   tree.<span style="color: #660066;">render</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   root.<span style="color: #660066;">expand</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>root.<span style="color: #660066;">childNodes</span>.<span style="color: #660066;">length</span><span style="color: #339933;">&gt;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #006600; font-style: italic;">// Tree Successfull loaded (root node has child).</span>
        <span style="color: #006600; font-style: italic;">//  Show tree container</span>
        $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;tree-div&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;tree-div&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        root.<span style="color: #660066;">firstChild</span>.<span style="color: #660066;">expand</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
         <span style="color: #006600; font-style: italic;">// Root node don't have child elements</span>
         <span style="color: #006600; font-style: italic;">// Hide tree container and show some error </span>
         $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;tree-div&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;tree-div&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Empty Tree!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Для инициализации дерева необходимо дополнительно создать контейнер с id=&#8221;tree-div&#8221;</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">   &lt;div id=&quot;tree-div&quot;&gt;&lt;/div&gt;</pre></div></div>

<p>В дальнейшем при загрузке документа необходимо произвести вызов функции renderNewTree.</p>
<p>Рассмотри формат данных используемый для указания информации о дереве.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$categoryList</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
       <span style="color: #cc66cc;">0</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
           <span style="color: #0000ff;">&quot;text&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;Sample&quot;</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">&quot;id&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">123123</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">&quot;depth&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">&quot;leaf&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">&quot;children&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                    <span style="color: #cc66cc;">0</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
                       <span style="color: #0000ff;">&quot;text&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;Sample2&quot;</span><span style="color: #339933;">,</span>
                        <span style="color: #0000ff;">&quot;id&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1231233</span><span style="color: #339933;">,</span>
                        <span style="color: #0000ff;">&quot;depth&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span>
                        <span style="color: #0000ff;">&quot;leaf&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span>
                    <span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #990000;">json_encode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$categoryList</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Преведенный выше код вернет данные, на основании которых будет сгенерировано просто дерево из 2х элементов &#8211; &#8220;Sample&#8221; и &#8220;Sample2&#8243;<br />
Ключ &#8220;depth&#8221; указывает уровень вложености элемента дерева, а ключ &#8220;leaf&#8221; говорит является ли элемент последним (дословно листом дерева)<br />
Вот что получилось:<br />
<img src="http://spiri7.net/wp-content/uploads/2010/03/category_tree_build1.png" alt="" title="category_tree_build" width="302" height="129" class="aligncenter size-full wp-image-276" /></p>
<p>На этом я заканчиваю краткий обзор компонета для построения деревьев в Magento. Надеюсь данный материал пригодиться кому то.<br />
<strong>Похожие посты:</strong>
<ul class="similar-posts">
<li><a href="http://spiri7.net/blog/magento/magento-create-order-manual" rel="bookmark" title="27.01.2010">Magento: программное создание ордера</a></li>
<li><a href="http://spiri7.net/blog/magento/magento-create-order-manual-version2" rel="bookmark" title="05.02.2010">Magento: программное создание ордера. Версия 2</a></li>
<li><a href="http://spiri7.net/blog/magento/magento-create-shipping-method" rel="bookmark" title="06.02.2010">Magento: создание Shipping method</a></li>
<li><a href="http://spiri7.net/blog/magento/magento-create-user" rel="bookmark" title="09.02.2010">Magento: создание пользователя</a></li>
<li><a href="http://spiri7.net/blog/magento/convert-currency" rel="bookmark" title="12.02.2010">Magento: конвертация валют</a></li>
</ul>
<p><!-- Similar Posts took 10.505 ms --></p>
<img src="http://feeds.feedburner.com/~r/Spiri7/~4/rzKsuyYB4w8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spiri7.net/blog/magento/magento-build-tree/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://spiri7.net/blog/magento/magento-build-tree</feedburner:origLink></item>
		<item>
		<title>Magento: Стилизация изображений товара</title>
		<link>http://feedproxy.google.com/~r/Spiri7/~3/0tHtppA4xL8/images-more-view</link>
		<comments>http://spiri7.net/blog/magento/images-more-view#comments</comments>
		<pubDate>Wed, 03 Mar 2010 23:14:55 +0000</pubDate>
		<dc:creator>SpiRi7</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Magento]]></category>
		<category><![CDATA[product-view]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[slider]]></category>

		<guid isPermaLink="false">http://spiri7.net/?p=251</guid>
		<description><![CDATA[
Сегодня я хотел бы поговорить о стилизации дополнительных изображений товара. По умолчанию magento производит вывод списка изображений подрядят. Если с товаром указывается много фотографий в дизайне это может выглядеть наляписто. Для решения этой проблемы можно использовать слайдер &#8211; позволяющий листать изображения в фиксированном боксе. Реализацию данной возможности Я и рассмотрю далее.



Выше представлено изображения окончательного варианта. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://spiri7.net/wp-content/uploads/2010/03/slider_home_original.png" alt="" title="slider_home_original" width="288" height="112" class="size-full wp-image-252" align="left"/><br />
Сегодня я хотел бы поговорить о стилизации дополнительных изображений товара. По умолчанию magento производит вывод списка изображений подрядят. Если с товаром указывается много фотографий в дизайне это может выглядеть наляписто. Для решения этой проблемы можно использовать слайдер &#8211; позволяющий листать изображения в фиксированном боксе. Реализацию данной возможности Я и рассмотрю далее.<br />
<span id="more-251"></span><br />
<img src="http://spiri7.net/wp-content/uploads/2010/03/slider_home.png" alt="" title="slider_home" width="395" height="111" class="aligncenter size-full wp-image-256" align="center"/><br />
<br/></p>
<p>Выше представлено изображения окончательного варианта. Я не буду рассматривать тонкости верстки такого блока, единственное что необходимо учитывать это наличие нескольких контейнеров.<br />
На первом этапе производим изменения файла отображения изображений товара. Это файл: app/design/frontend/default/default/template/catalog/product/view/media.phtml<br />
Нас интересует слейдующий кусок кода:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getGalleryImages</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;div class=&quot;more-views&quot;&gt;
    &lt;h4&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'More Views'</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/h4&gt;
    &lt;ul&gt;
    <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getGalleryImages</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$_image</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
        &lt;li&gt;
            &lt;a href=&quot;#&quot; onclick=&quot;popWin('<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getGalleryUrl</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_image</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>', 'gallery', 'width=300,height=300,left=50,top=50,location=no,status=yes,scrollbars=yes,resizable=yes'); return false;&quot;&gt;&lt;img src=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">helper</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'catalog/image'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">init</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getProduct</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'thumbnail'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_image</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFile</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">resize</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">56</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; alt=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">htmlEscape</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_image</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getLabel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; title=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">htmlEscape</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_image</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getLabel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; /&gt;&lt;/a&gt;
        &lt;/li&gt;
    <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endforeach</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
    &lt;/ul&gt;
&lt;/div&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Производим небольшие изменения, добавляем текущую страницу, стрелки вправо/влево, ограничивающий контейнер.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt;div class=&quot;more-view-page&quot;&gt;Страница &lt;span id=&quot;img-more-page&quot;&gt;1&lt;/span&gt; из <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$pageNumber</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/div&gt;
	  &lt;div class=&quot;more-view-arrow step-left-passive&quot; id=&quot;more-view-step-left&quot;&gt;&lt;/div&gt;
	    &lt;div class=&quot;more-view-fix&quot;&gt;
		    &lt;ul id=&quot;more-view-slider&quot;&gt;
			    <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>foreach <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getGalleryImages</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$_image</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
				&lt;li&gt;
	  		             &lt;a href=&quot;#&quot;&gt;&lt;img src=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">helper</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'catalog/image'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">init</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getProduct</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'thumbnail'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_image</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFile</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">resize</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">51</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; alt=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">htmlEscape</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_image</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getLabel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; title=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">htmlEscape</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_image</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getLabel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; /&gt;&lt;/a&gt;
				&lt;/li&gt;
			    <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endforeach</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
		    &lt;/ul&gt;
	    &lt;/div&gt;
&lt;div class=&quot;more-view-arrow step-right-active&quot; id=&quot;more-view-step-right&quot;&gt;&lt;/div&gt;</pre></div></div>

<p>Обратите внимание что в стилях необходимо будет для контейнера c классом &#8220;more-view-fix&#8221; задать фиксированную высоту. И для элементов <strong>li</strong> указать float: left.<br />
Идея скрола заключается в следующем &#8211; мы производим изменение css свойства margin-left для элемента <strong>ul</strong> в отрицательный диапазон.  Для анимации движения я предлагаю использовать библиотеку для prototype <a href="http://berniecode.com/writing/animator.html" target="_blank">animator.js</a></p>
<p>Производим измение шаблона</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;!--</span> Load animator js lib <span style="color: #339933;">--&gt;</span>
<span style="color: #339933;">&lt;</span>script src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;&lt;?php echo $this-&gt;getSkinUrl('js/animator.js');?&gt;&quot;</span> type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;?</span>php
     <span style="color: #006600; font-style: italic;">// Total number of images</span>
    $_imageNumber <span style="color: #339933;">=</span>  count<span style="color: #009900;">&#40;</span>$this<span style="color: #339933;">-&gt;</span>getGalleryImages<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #006600; font-style: italic;">// Total number of scroll page</span>
    $pageNumber <span style="color: #339933;">=</span> ceil<span style="color: #009900;">&#40;</span>$_imageNumber<span style="color: #339933;">/</span><span style="color: #CC0000;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">?&gt;</span>
&nbsp;
<span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> startMargin <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// Width of one set of images, how change margin from one click</span>
<span style="color: #003366; font-weight: bold;">var</span> marginStep <span style="color: #339933;">=</span> <span style="color: #CC0000;">340</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> currentPage <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// Scroll on left arrow</span>
<span style="color: #003366; font-weight: bold;">function</span> sLeft<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// Block if first page</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>currentPage<span style="color: #339933;">&lt;=</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
       <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    currentPage<span style="color: #339933;">--;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Hide left arrow if first page</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>currentPage<span style="color: #339933;">&lt;=</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'more-view-step-left'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">removeClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'step-left-active'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'more-view-step-left'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'step-left-passive'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Show right arrow if not last page</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>currentPage<span style="color: #339933;">&lt;</span> <span style="color: #339933;">&lt;?</span>php echo $pageNumber<span style="color: #339933;">;?&gt;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'more-view-step-right'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">removeClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'step-right-passive'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'more-view-step-right'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'step-right-active'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #006600; font-style: italic;">// Change current page number</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'img-more-page'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> currentPage<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> scrollElement <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'more-view-slider'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> newMargin <span style="color: #339933;">=</span> startMargin <span style="color: #339933;">+</span> marginStep<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> animationObject <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Animator<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    animationObject.<span style="color: #660066;">addSubject</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> NumericalStyleSubject<span style="color: #009900;">&#40;</span>scrollElement<span style="color: #339933;">,</span> <span style="color: #3366CC;">'margin-left'</span><span style="color: #339933;">,</span> startMargin<span style="color: #339933;">,</span> newMargin<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    animationObject.<span style="color: #660066;">play</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    startMargin <span style="color: #339933;">=</span> newMargin<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
<span style="color: #006600; font-style: italic;">// Click on righ arrow</span>
<span style="color: #003366; font-weight: bold;">function</span> sRight<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// Block if last page</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>currentPage<span style="color: #339933;">&gt;=&lt;?</span>php echo $pageNumber<span style="color: #339933;">;?&gt;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
       <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    currentPage<span style="color: #339933;">++;</span>
    <span style="color: #006600; font-style: italic;">// Hide right arrow for last page</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>currentPage<span style="color: #339933;">&gt;=&lt;?</span>php echo $pageNumber<span style="color: #339933;">;?&gt;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'more-view-step-right'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">removeClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'step-right-active'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'more-view-step-right'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'step-right-passive'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">// Show left arrow if page not first</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>currentPage<span style="color: #339933;">&gt;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'more-view-step-left'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">removeClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'step-left-passive'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'more-view-step-left'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">addClassName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'step-left-active'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #006600; font-style: italic;">// Change current page - show on of slider</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'img-more-page'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> currentPage<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> scrollElement <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'more-view-slider'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> newMargin <span style="color: #339933;">=</span> startMargin <span style="color: #339933;">-</span> marginStep<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> animationObject <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Animator<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    animationObject.<span style="color: #660066;">addSubject</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> NumericalStyleSubject<span style="color: #009900;">&#40;</span>scrollElement<span style="color: #339933;">,</span> <span style="color: #3366CC;">'margin-left'</span><span style="color: #339933;">,</span> startMargin<span style="color: #339933;">,</span> newMargin<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    animationObject.<span style="color: #660066;">play</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    startMargin <span style="color: #339933;">=</span> newMargin<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
document.<span style="color: #660066;">observe</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'dom:loaded'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #006600; font-style: italic;">// Add event for click action for our arrow </span>
  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'more-view-step-left'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">observe</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> sLeft<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'more-view-step-right'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">observe</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> sRight<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Этот маленький кусок кода позволяет менять текущий номер страницы скролла, изменять состояние стрелок влево/вправо на активная/пассивная. На мой взгляд этого более чем достаточно для реализации скролла. Спасибо за внимание.<strong>Похожие посты:</strong>
<ul class="similar-posts">
<li><a href="http://spiri7.net/blog/magento/magento-create-order-manual" rel="bookmark" title="27.01.2010">Magento: программное создание ордера</a></li>
<li><a href="http://spiri7.net/blog/magento/magento-create-order-manual-version2" rel="bookmark" title="05.02.2010">Magento: программное создание ордера. Версия 2</a></li>
<li><a href="http://spiri7.net/blog/magento/magento-create-shipping-method" rel="bookmark" title="06.02.2010">Magento: создание Shipping method</a></li>
<li><a href="http://spiri7.net/blog/magento/magento-create-user" rel="bookmark" title="09.02.2010">Magento: создание пользователя</a></li>
<li><a href="http://spiri7.net/blog/magento/convert-currency" rel="bookmark" title="12.02.2010">Magento: конвертация валют</a></li>
</ul>
<p><!-- Similar Posts took 11.502 ms --></p>
<img src="http://feeds.feedburner.com/~r/Spiri7/~4/0tHtppA4xL8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spiri7.net/blog/magento/images-more-view/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://spiri7.net/blog/magento/images-more-view</feedburner:origLink></item>
		<item>
		<title>Javascript: обработчик получения данных</title>
		<link>http://feedproxy.google.com/~r/Spiri7/~3/QHuJvl4VPVM/javascript-fetch-callback</link>
		<comments>http://spiri7.net/blog/javascript/javascript-fetch-callback#comments</comments>
		<pubDate>Fri, 19 Feb 2010 17:38:49 +0000</pubDate>
		<dc:creator>SpiRi7</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[callback]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://spiri7.net/?p=237</guid>
		<description><![CDATA[В процессе работы мне пришлось столкнуться с интерестным плагином для jQuery. Плагин представляет собой календарь позволяющих добавлять события для определенных дат. Функционал реализуемый плагином, в какой мере, подобен google calendar.
Но в этой заметке речь пойдет не о плагине, а о способе получения событий.
Итак необходимо реализовать интерфейс установки массива событий как в виде масива данных, так [...]]]></description>
			<content:encoded><![CDATA[<p>В процессе работы мне пришлось столкнуться с интерестным плагином для jQuery. Плагин представляет собой календарь позволяющих добавлять события для определенных дат. Функционал реализуемый плагином, в какой мере, подобен google calendar.<br />
Но в этой заметке речь пойдет не о плагине, а о способе получения событий.<br />
Итак необходимо реализовать интерфейс установки массива событий как в виде масива данных, так и в виде URL на серверный обработчик данных. Дополнительным требованием будет возможность поддерживать возможность установки нескольких серверных обработчиков. </p>
<p><span id="more-237"></span></p>
<p>Итак первоначально определим обработчик определяющий тип передаваемых данных</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> events <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> eventSources <span style="color: #339933;">=</span> options.<span style="color: #660066;">eventSources</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>options.<span style="color: #660066;">events</span><span style="color: #009900;">&#41;</span> eventSources.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>options.<span style="color: #660066;">events</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>В этом участке кода &#8211; options массив исходных настроек. </p>
<p>Следующей задачей является определение обработчика при вызове которого производится анализ/получение данных и их последующая обработка (преобразование, отрисовка и т. п.)<br />
Итак для вызова этих действий будем использовать одну функцию<br />
<strong>fetchEvents(renderEvents);</strong><br />
где  <strong>renderEvents </strong> это callback функция обработчик полученных данных.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//</span>
<span style="color: #006600; font-style: italic;">// Fetch from ALL sources. Clear 'events' array and populate</span>
<span style="color: #006600; font-style: italic;">//</span>
<span style="color: #003366; font-weight: bold;">function</span> fetchEvents<span style="color: #009900;">&#40;</span>callback<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    events <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>eventSources.<span style="color: #660066;">length</span> <span style="color: #339933;">&gt;</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #003366; font-weight: bold;">var</span> queued <span style="color: #339933;">=</span> eventSources.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>
      <span style="color: #006600; font-style: italic;">// This is a function, code execute only when we call this function</span>
      <span style="color: #006600; font-style: italic;">// Not now</span>
      <span style="color: #003366; font-weight: bold;">var</span> sourceDone <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">--</span>queued <span style="color: #339933;">==</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
             <span style="color: #006600; font-style: italic;">//  stack of call ++</span>
             popLoading<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
             <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>callback<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                 callback<span style="color: #009900;">&#40;</span>events<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
             <span style="color: #009900;">&#125;</span>
          <span style="color: #009900;">&#125;</span>
       <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
       <span style="color: #006600; font-style: italic;">// Stack of call --</span>
       pushLoading<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> eventSources.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            fetchEventSource<span style="color: #009900;">&#40;</span>eventSources<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> sourceDone<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//</span>
<span style="color: #006600; font-style: italic;">// methods for reporting loading state</span>
<span style="color: #006600; font-style: italic;">//</span>
<span style="color: #003366; font-weight: bold;">var</span> loadingLevel <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> pushLoading<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>loadingLevel<span style="color: #339933;">++</span> <span style="color: #339933;">&amp;&amp;</span> options.<span style="color: #660066;">loading</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        options.<span style="color: #660066;">loading</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> popLoading<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span> <span style="color: #339933;">--</span>loadingLevel <span style="color: #339933;">&amp;&amp;</span> options.<span style="color: #660066;">loading</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        options.<span style="color: #660066;">loading</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Этот кусок кода проверяет на наличие источников событий, если источников более 0, создает функцию обработчик, увеличивает счетчик запусков получения данных. И для каждого источника вызывает функцию получения данных. Обратите внимание что в функцию  <strong>fetchEventSource</strong> кроме текущего источника мы передаем, так же callback функцию.<br />
Итак функция обработчик получения данных</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//</span>
<span style="color: #006600; font-style: italic;">// Fetch from a particular source. Append to the 'events' array</span>
<span style="color: #006600; font-style: italic;">//</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> fetchEventSource<span style="color: #009900;">&#40;</span>src<span style="color: #339933;">,</span> callback<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">// This is callback function for ajax call</span>
    <span style="color: #003366; font-weight: bold;">var</span> reportEvents <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>response<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
         <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> responseEvents.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #006600; font-style: italic;">// Translate recived events list to our need format</span>
         <span style="color: #009900;">&#125;</span>
         events <span style="color: #339933;">=</span> events.<span style="color: #660066;">concat</span><span style="color: #009900;">&#40;</span>responseEvents<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>callback<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            callback<span style="color: #009900;">&#40;</span>responseEvents<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
         <span style="color: #009900;">&#125;</span>
     <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
     <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> src <span style="color: #339933;">==</span> <span style="color: #3366CC;">'string'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
           <span style="color: #006600; font-style: italic;">// Type of source is url </span>
           <span style="color: #003366; font-weight: bold;">var</span> params <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// Params for ajax call</span>
            $.<span style="color: #660066;">getJSON</span><span style="color: #009900;">&#40;</span>src<span style="color: #339933;">,</span> params<span style="color: #339933;">,</span> reportEvents<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>$.<span style="color: #660066;">isFunction</span><span style="color: #009900;">&#40;</span>src<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
           <span style="color: #006600; font-style: italic;">// Tupe of source is function</span>
           src<span style="color: #009900;">&#40;</span>start<span style="color: #339933;">,</span> end<span style="color: #339933;">,</span> reportEvents<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
          reportEvents<span style="color: #009900;">&#40;</span>src<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Алгоритм работы функции очень простой. Мы определили функцию обработчик вызова данных — <strong>reportEvents</strong>. Далее, в зависимости от типа исходных данных (url, функция, масив) производим необходимые действия (отправка ajax запроса, прямой вызов обработчика). В дальнейшем функция обработчик вызывает первоначальный указанный callback<br />
Приблизительная схема алгоритма<br />
<a href="http://spiri7.net/wp-content/uploads/2010/02/mindmap.jpg"><img src="http://spiri7.net/wp-content/uploads/2010/02/mindmap-300x49.jpg" alt="" title="Алгоритм" width="300" height="49" class="aligncenter size-medium wp-image-239" /></a><strong>Похожие посты:</strong>
<ul class="similar-posts">None Found
</ul>
<p><!-- Similar Posts took 6.280 ms --></p>
<img src="http://feeds.feedburner.com/~r/Spiri7/~4/QHuJvl4VPVM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spiri7.net/blog/javascript/javascript-fetch-callback/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://spiri7.net/blog/javascript/javascript-fetch-callback</feedburner:origLink></item>
		<item>
		<title>Magento: Боковое меню с категориями и фильтром</title>
		<link>http://feedproxy.google.com/~r/Spiri7/~3/AmV19sUOoWw/magento-left-menu-all-category-tree</link>
		<comments>http://spiri7.net/blog/magento/magento-left-menu-all-category-tree#comments</comments>
		<pubDate>Mon, 15 Feb 2010 23:06:16 +0000</pubDate>
		<dc:creator>SpiRi7</dc:creator>
				<category><![CDATA[Magento]]></category>
		<category><![CDATA[layered]]></category>
		<category><![CDATA[menu]]></category>

		<guid isPermaLink="false">http://spiri7.net/?p=231</guid>
		<description><![CDATA[В стандартном шаблоне Magento левый блок меню представляет собой список подкатегорий для текущей выбранной категории товаров магазина. Такой подход является оправданным для магазинов с большим количеством товаров. Нет необходимости дублировать полный список категорий в левом блоке, поскольку главное меню уже отображает его. В этой статье я хочу рассмотреть ситуацию когда верхнее меню заменяется на статическое, [...]]]></description>
			<content:encoded><![CDATA[<p>В стандартном шаблоне Magento левый блок меню представляет собой список подкатегорий для текущей выбранной категории товаров магазина. Такой подход является оправданным для магазинов с большим количеством товаров. Нет необходимости дублировать полный список категорий в левом блоке, поскольку главное меню уже отображает его. В этой статье я хочу рассмотреть ситуацию когда верхнее меню заменяется на статическое, а в левой части находится список всех категорий и список фильтров.</p>
<p><span id="more-231"></span></p>
<p>Первым шагом нам необходимо произвести изменение в layout &#8211; xml файлов конфигурации какие блоки необходимо отображать.<br />
<strong>design/frontend/default/default/layout/catalog.xml</strong><br />
Находим блок  <default> и  вставляем/заменяем в секции <reference name="left"> следующий блок</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;block</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;catalog/navigation&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;catalog.leftnav&quot;</span> <span style="color: #000066;">after</span>=<span style="color: #ff0000;">&quot;currency&quot;</span> <span style="color: #000066;">template</span>=<span style="color: #ff0000;">&quot;catalog/navigation/left.phtml&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;block</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;catalog/layer_view&quot;</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;catalog.leftnav.layer&quot;</span> <span style="color: #000066;">after</span>=<span style="color: #ff0000;">&quot;catalog.leftnav&quot;</span> <span style="color: #000066;">template</span>=<span style="color: #ff0000;">&quot;catalog/layer/view.phtml&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div>

<p>Производим проверку остальных блоков и удаляем их них упоминания catalog/navigation и catalog/layer_view</p>
<p>Следующим этапом производим модификацию левого блока меню — отображающего список категорий и подкатегорий<br />
Файл  <strong>design/frontend/default/default/template/catalog/navigation/left.phtml</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
      <span style="color: #666666; font-style: italic;">/* Get the categories that are active for the store */</span>
      <span style="color: #000088;">$_main_categories</span><span style="color: #339933;">=</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getStoreCategories</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">/* Get the current category the user is in */</span>
      <span style="color: #000088;">$_current_category</span><span style="color: #339933;">=</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCurrentCategory</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">/* Get the current category path */</span>
      <span style="color: #000088;">$_categorypath</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCurrentCategoryPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_main_categories</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
        &lt;div class=&quot;box normal-nav&quot;&gt;
            &lt;div class=&quot;box-top&quot;&gt;
            &lt;/div&gt;
            &lt;div class=&quot;box-content&quot;&gt;
                    &lt;ul&gt;
                        <span style="color: #000000; font-weight: bold;">&lt;?php</span>
                            <span style="color: #666666; font-style: italic;">/* This bit cycles through the categories - setting the next one to current */</span>
                            <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_main_categories</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$_main_category</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>
                                <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_main_category</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getIsActive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>
                                    <span style="color: #000088;">$cur_category</span><span style="color: #339933;">=</span>Mage<span style="color: #339933;">::</span><span style="color: #004000;">getModel</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'catalog/category'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_main_category</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                    <span style="color: #000088;">$layer</span> <span style="color: #339933;">=</span> Mage<span style="color: #339933;">::</span><span style="color: #004000;">getSingleton</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'catalog/layer'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                    <span style="color: #000088;">$layer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setCurrentCategory</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cur_category</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000000; font-weight: bold;">?&gt;</span>
&nbsp;
                                    &lt;li&gt;&lt;a href=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCurrentCategory</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getUrl</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCurrentCategory</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/a&gt;
&nbsp;
                                        <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$_maincategorylisting</span><span style="color: #339933;">=</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCurrentCategory</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
&nbsp;
                                        <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$_categories</span><span style="color: #339933;">=</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCurrentChildCategories</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
&nbsp;
                                        <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_categories</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
                                            &lt;ul class=&quot;subcategory&quot;&gt;
                                                <span style="color: #000000; font-weight: bold;">&lt;?</span> <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_categories</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$_category</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
                                                   <span style="color: #000000; font-weight: bold;">&lt;?</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_category</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getIsActive</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>
                                                          <span style="color: #000088;">$cur_subcategory</span><span style="color: #339933;">=</span>Mage<span style="color: #339933;">::</span><span style="color: #004000;">getModel</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'catalog/category'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_category</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                                          <span style="color: #000088;">$layer</span> <span style="color: #339933;">=</span> Mage<span style="color: #339933;">::</span><span style="color: #004000;">getSingleton</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'catalog/layer'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                                          <span style="color: #000088;">$layer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setCurrentCategory</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cur_subcategory</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                                                   <span style="color: #000000; font-weight: bold;">?&gt;</span>
&nbsp;
                                                          &lt;li&gt;&lt;a href=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCategoryUrl</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_category</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt; <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$_category</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/a&gt;&lt;/li&gt;
                                                   <span style="color: #000000; font-weight: bold;">&lt;?</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
&nbsp;
                                                 <span style="color: #000000; font-weight: bold;">&lt;?</span><span style="color: #b1b100;">endforeach</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
&nbsp;
                                            &lt;/ul&gt;
                                            <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$layer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setCurrentCategory</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_current_category</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #000000; font-weight: bold;">?&gt;</span>
&nbsp;
                                        <span style="color: #000000; font-weight: bold;">&lt;?</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
                                    &lt;/li&gt;
&nbsp;
                             <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&nbsp;
                        <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endforeach</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
                    &lt;/ul&gt;
                &lt;/div&gt;
                &lt;div class=&quot;box-bottom&quot;&gt;
&nbsp;
                &lt;/div&gt;
        &lt;/div&gt;
    <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span>  <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Производим редактирование шаблона  фильтров для соответствии нашем требованиям. Файл: <strong>app/design/frontend/default/default/template/catalog/layer/view.phtml</strong></p>
<p>В результате получаем:<br />
<img src="http://spiri7.net/wp-content/uploads/2010/02/снимок2.png" alt="" title="снимок2" width="195" height="488" class="alignleft size-full wp-image-233" /><img src="http://spiri7.net/wp-content/uploads/2010/02/снимок3.png" alt="" title="снимок3" width="195" height="488" class="alignleft size-full wp-image-233" /><br />
<br clear="all" /><br />
P.S. В данную очередь этот пост ориентирован для меня, т.к. регулярно приходиться искать подобную реализацию в интернете. </p>
<p><strong>Похожие посты:</strong>
<ul class="similar-posts">
<li><a href="http://spiri7.net/blog/magento/magento-create-order-manual" rel="bookmark" title="27.01.2010">Magento: программное создание ордера</a></li>
<li><a href="http://spiri7.net/blog/magento/magento-create-order-manual-version2" rel="bookmark" title="05.02.2010">Magento: программное создание ордера. Версия 2</a></li>
<li><a href="http://spiri7.net/blog/magento/magento-create-shipping-method" rel="bookmark" title="06.02.2010">Magento: создание Shipping method</a></li>
<li><a href="http://spiri7.net/blog/magento/magento-create-user" rel="bookmark" title="09.02.2010">Magento: создание пользователя</a></li>
<li><a href="http://spiri7.net/blog/magento/convert-currency" rel="bookmark" title="12.02.2010">Magento: конвертация валют</a></li>
</ul>
<p><!-- Similar Posts took 10.567 ms --></p>
<img src="http://feeds.feedburner.com/~r/Spiri7/~4/AmV19sUOoWw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://spiri7.net/blog/magento/magento-left-menu-all-category-tree/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://spiri7.net/blog/magento/magento-left-menu-all-category-tree</feedburner:origLink></item>
	</channel>
</rss>
