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

<channel>
	<title>sb0y[AT]home &#187; webasyst</title>
	<atom:link href="http://www.bagrincev.ru/tag/webasyst/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bagrincev.ru</link>
	<description>Уютный бложик девелопера.</description>
	<lastBuildDate>Fri, 30 Jul 2010 13:23:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>PHP-&gt;Webasyst: программирование под популярный движок виртуального магазина</title>
		<link>http://www.bagrincev.ru/webasyst-programming/</link>
		<comments>http://www.bagrincev.ru/webasyst-programming/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 11:21:48 +0000</pubDate>
		<dc:creator>Sb0y</dc:creator>
				<category><![CDATA[how-to]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[smarty]]></category>
		<category><![CDATA[webasyst]]></category>

		<guid isPermaLink="false">http://www.bagrincev.ru/?p=786</guid>
		<description><![CDATA[Webasyst &#8211; движок, использующий Smarty в качестве шаблонизатора. Cвои функции всё равно можно писать, через интерфейс плагинов Smarty. Плюсы этого способа &#8211; простота освоения и лёгкая инсталляция. Минусы &#8211; из таких плагинов не работают множество полезных и удобных функций движка, которые при написании плагина сэкономили бы вам кучу времени, а так же, не оправданно сложная ]]></description>
			<content:encoded><![CDATA[<p><strong>Webasyst</strong> &#8211; движок, использующий Smarty в качестве шаблонизатора. Cвои функции всё равно можно писать, через интерфейс плагинов Smarty. Плюсы этого способа &#8211; простота освоения и лёгкая инсталляция. Минусы &#8211; из таких плагинов не работают множество полезных и удобных функций движка, которые при написании плагина сэкономили бы вам кучу времени, а так же, не оправданно сложная развёртка сложных структур.<br />
В этом мануале, я так же рассмотрю интерфейс самого движка, в котором работают все функции, используются классы и объекты, а установка сложнее.<br />
<span id="more-786"></span><br />
Я использовал при написании этого материала Webasyst версии <strong>285</strong>.</p>
<p>Для того, чтобы создать свой плагин, используя интерфейс Smarty, достаточно создать файл <strong>function.имяПлагина.php</strong> в директории <strong>/kernel/includes/smarty/plugins</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: #000000; font-weight: bold;">function</span> smarty_function_имяПлагина<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$params</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$smarty</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Hello World!'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>После этого в шаблон можно вставить тег {имяПлагина}, при выводе, он будет заменён на &laquo;Hello World!&raquo;.<br />
Если нужно передать функции параметр, можно использовать массив $params. </p>
<p>В коде шаблона:<br />
{имяПлагина var=&raquo;Hello World!&raquo;}</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;">function</span> smarty_function_имяПлагина<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$params</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$smarty</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'var'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</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;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">function</span> smarty_function_имяПлагина<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$params</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$smarty</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'register_form.class.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$frm</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> frm_reg <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$frm</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">display</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: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>require_once здесь используется не случайно. Бывают случаи, когда смарти из-за кеша пытается загрузить файл повторно, что приводит к ошибке.</p>
<p>Но главный недостаток остаётся всё равно &#8211; из этого интерфейса многие функции движка остаются недоступны. (например <strong>db_fetch_row()</strong>), поэтому переходим к интерфейсу движка.</p>
<p>Создадим папку нашего модуля. Делается это по адресу <strong>$app_root/html/scripts/modules</strong>, где <strong>$app_root</strong> &#8211; путь до установленного приложения на платформу Webasyst (например у shop-script полный путь будет выглядеть так <strong>/published/SC/</strong>html/scripts/modules/). Назовём её новыйМодуль.</p>
<p>Теперь необходимо создать XML файл с именем <strong>connector.новыйМодуль.xml</strong>, с содержанием:</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;Connector<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Class<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>новыйМодуль<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;File<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>class.новыйМодуль.php<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/File<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Любое название<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Title<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>Любое описание<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;SingleInstallation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>true<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/SingleInstallation<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Connector<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Как уже, наверняка стало понятно, в той же папке создаём класс модуля. <strong>class.новыйМодуль.php</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"> <span style="color: #000000; font-weight: bold;">class</span> Modulename <span style="color: #000000; font-weight: bold;">extends</span> ComponentModule  <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> initInterfaces<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>__registerComponent<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'modulename'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Любое название'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'general_layout'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'home_page'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'methodFShowModule'</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;">function</span> methodFShowModule<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$Register</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span>Register<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$smarty</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$Register</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span>VAR_SMARTY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #666666; font-style: italic;">//передаём переменные в шаблон. может быть массивом</span>
		<span style="color: #000088;">$smarty</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;vars&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Hello World!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
               <span style="color: #666666; font-style: italic;">//грузим файл шаблона</span>
		<span style="color: #000088;">$smarty</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">display</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'новыйМодуль.tpl.html'</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;">function</span> <span style="color: #990000;">exec</span> <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;">//любые действия...</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Hello World!'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Опять же, создаём шаблон Smarty, в директории templates, с названием файла <strong>новыйМодуль.tpl.html</strong>.</p>
<p>Остаётся только зарегистрировать новый модуль в базе.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`SC_modules`</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #ff0000;">`ModuleVersion`</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">`ModuleClassName`</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'новыйМодуль'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">`ModuleClassFile`</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'/новыйМодуль/class.новыйМодуль.php'</span></pre></div></div>

<p>Поскольку идентификатор добавленной позиции добавляется autoincrement&#8217;ом, нужно его узнать.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">`ModuleID`</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`SC_modules`</span> <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #ff0000;">`ModuleClassName`</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'новыйМодуль'</span>;</pre></div></div>

<p>Полученное число подставляем в следующий запрос.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`SC_module_configs`</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #ff0000;">`ModuleID`</span><span style="color: #66cc66;">=</span>полученное_ранее_число<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">`ConfigKey`</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'новыйМодуль'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">`ConfigInit`</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1002</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">`ConfigEnabled`</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span>;</pre></div></div>

<p>Опять узаём ID. На это раз, для удобства и понимания назовём полученное число &laquo;ID&raquo; и подставим его в следующий запрос.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">`ModuleConfigID`</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`SC_module_configs`</span> <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #ff0000;">`ModuleID`</span><span style="color: #66cc66;">=</span>полученное_ранее_число;</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`SC_interface_interfaces`</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #ff0000;">`xInterfaceCaller`</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'51_cpt_connector'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">`xInterfaceCalled`</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'ID_новыйМодуль'</span>;</pre></div></div>

<p>Если всё сделано правильно, в шаблон можно будет вставить тег <strong>{cpt_новыйМодуль}</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bagrincev.ru/webasyst-programming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
