<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Форум ReadyScript &mdash; Добавление настроек к блочному контроллеру, методов к классу.]]></title>
	<link rel="self" href="http://forum.readyscript.ru/feed/atom/topic/759/" />
	<updated>2016-06-21T07:53:34Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.readyscript.ru/topic/759/dobavlenie-nastroek-k-blochnomu-kontrolleru-metodov-k-klassu/</id>
		<entry>
			<title type="html"><![CDATA[Re: Добавление настроек к блочному контроллеру, методов к классу.]]></title>
			<link rel="alternate" href="http://forum.readyscript.ru/post/3575/#p3575" />
			<content type="html"><![CDATA[<p>Что касается блок контроллера, то можно просто его отклонировать в свой модуль и потом подключить, просто указав свой блок контроллер, его кстати можно отнаследовать от стандартного блок контроллера, чтобы просто добавить потом одно поле.<br />С остальными моментами сложнее, т.к. нужно, в контроллере списка товаров <strong>listproducts.inc.php</strong> обрабатывать приём параметра фильтра из запроса подготовленного блок контроллером. <br />Но здесь можно воспользоваться хуком <strong>controller.beforeexec.catalog-front-product</strong> (controller.beforeexec.КОРОТКОЕ_ИМЯ_КОНТРОЛЛЕРА).<br />О хукам можно почитать здесь:<br /><a href="http://readyscript.ru/dev-manual/dev_hooks.html#dev_hooks_list">http://readyscript.ru/dev-manual/dev_ho … hooks_list</a></p><p>В результате чего у нас должна появится публичная статическая функция<br /></p><div class="codebox"><pre><code>public static function [b]controllerBeforeExecCatalogFrontProduct($data)[/b]
{
      $controller = $data[&#039;controller&#039;];//Объект фронт контроллера listproducts
      $action = $data[&#039;action&#039;];//Метод класса который отрабатывает страницу. Надо проверить на index
      
      //Приём параметра из запроса
      $param = \RS\Http\Request::commonInstance()-&gt;request(&#039;Наш параметр из $_REQUEST который нужно принять&#039;, TYPE_STRING); 

      //Получаем объект запроса из апи товаров, т.к. в контроллере listproduct параметр $api публичный
      $q = $controller-&gt;api-&gt;queryObj(); 
      //Дальше запрос который Вам нужне и нужные действия
}</code></pre></div><p>Т.к. у нас есть публичная переменная класса $api и первым всегда отрабатывает функция init в контроллере listproducts, то в $this-&gt;api будет объект АПИ для запросов, мы его из вне дополним.<br />Видео по запросам, можно посмотреть у нас в разделе видеоуроки</p>]]></content>
			<author>
				<name><![CDATA[Закусило Александр]]></name>
				<uri>http://forum.readyscript.ru/user/20/</uri>
			</author>
			<updated>2016-06-21T07:53:34Z</updated>
			<id>http://forum.readyscript.ru/post/3575/#p3575</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Добавление настроек к блочному контроллеру, методов к классу.]]></title>
			<link rel="alternate" href="http://forum.readyscript.ru/post/3567/#p3567" />
			<content type="html"><![CDATA[<p>Задача: добавить в фильтр товаров в категории фильтрацию по наличию скидки.</p><p>Сначала нужно добавить настройку - выводить ли этот фильтр.<br />В классе Catalog\Controller\Block\SideFilters в методе getParamObject задаются настройки. В массив с настройками нужно добавить еще один элемент:<br /></p><div class="codebox"><pre><code>&#039;show_is_discount&#039; =&gt; new Type\Integer(array(
    &#039;description&#039; =&gt; t(&#039;Отображать фильтр по наличию скидки&#039;),
    &#039;checkboxView&#039; =&gt; array(1,0)
)),</code></pre></div><p>Теперь в filters.tpl можно написать:<br /></p><div class="codebox"><pre><code>{if $param.show_is_discount}
    &lt;div class=&quot;filter&quot;&gt;
        &lt;h4&gt;{t}Скидка{/t}:&lt;/h4&gt;
        &lt;select class=&quot;yesno&quot; name=&quot;bfilter[isdiscount]&quot; data-start-value=&quot;&quot;&gt;
             &lt;option value=&quot;&quot;&gt;{t}Неважно{/t}&lt;/option&gt;
             &lt;option value=&quot;1&quot; {if $basefilters.isdiscount == &#039;1&#039;}selected{/if}&gt;{t}Есть{/t}&lt;/option&gt;
             &lt;option value=&quot;0&quot; {if $basefilters.isdiscount == &#039;0&#039;}selected{/if}&gt;{t}Нет{/t}&lt;/option&gt;
        &lt;/select&gt;
    &lt;/div&gt;
{/if}</code></pre></div><p>Осталось добавить в класс Catalog\Model\Api метод isDiscountFilter, где добавлять условия на выборку товаров со скидкой.<br /></p><div class="codebox"><pre><code>protected function isDiscountFilter($filter)
{
    $old_cost_id = \Catalog\Model\CostApi::getOldCostId();
    if ($old_cost_id) {
        $q = $this-&gt;queryObj();
        $q-&gt;leftjoin(new Xcost(), &quot;A.id = XCO.product_id AND XCO.cost_id=&#039;{$old_cost_id}&#039;&quot;, &#039;XCO&#039;);
        if ($filter) {
            $q-&gt;where(&#039;XCO.cost_val&gt;0&#039;);
        } else {
            $q-&gt;where(&#039;XCO.cost_val=0&#039;);
        }
    }
}</code></pre></div><p>Правильно ли я понимаю, что на данный момент единственный способ решить эту задачу - это подмена оригинальных классов с потерей возможности их обновления?</p>]]></content>
			<author>
				<name><![CDATA[karpen]]></name>
				<uri>http://forum.readyscript.ru/user/383/</uri>
			</author>
			<updated>2016-06-21T04:32:48Z</updated>
			<id>http://forum.readyscript.ru/post/3567/#p3567</id>
		</entry>
</feed>
