<?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="https://forum.readyscript.ru/feed/atom/topic/923/" />
	<updated>2016-10-11T04:46:08Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.readyscript.ru/topic/923/dopolnitelnyi-filtr-po-nalichiyu-fotografii-tovara/</id>
		<entry>
			<title type="html"><![CDATA[Re: Дополнительный фильтр по наличию фотографий товара]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/4967/#p4967" />
			<content type="html"><![CDATA[<p>Финальный вариант, если кого вдруг заинтересует:</p><div class="codebox"><pre><code>$adv_config = \RS\Config\Loader::byModule(&quot;custom&quot;); /*Проверяем настройку показа товаров без фотографий*/
        if ($adv_config[&#039;hide_nophoto_product&#039;] == 1) {

            $q = $this-&gt;queryObj();

            if ($q-&gt;select === &#039;*&#039;) {
                $q-&gt;select = null;
                $q-&gt;select(&#039;A.*, X.*&#039;);
            }

            $q-&gt;join(new \Photo\Model\Orm\Image, &#039;I.linkid = A.id&#039;, &#039;I&#039;);
            $q-&gt;groupby(&#039;A.id&#039;);

        }</code></pre></div><p>Выяснилось, что при использовании подзапроса в секции WHERE - ломается напрочь поиск и крайне медленно выполняется запрос в случае использования фильтров на странице каталога. Сделал в итоге через JOIN и добавил условие, так как при поиске должны выбираться только поля из таблицы `A`, а таблица `X` - вообще не джойнится при поиске. Косяков не обнаружено и скорость отличная.</p>]]></content>
			<author>
				<name><![CDATA[Максим]]></name>
				<uri>https://forum.readyscript.ru/user/474/</uri>
			</author>
			<updated>2016-10-11T04:46:08Z</updated>
			<id>https://forum.readyscript.ru/post/4967/#p4967</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Дополнительный фильтр по наличию фотографий товара]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/4831/#p4831" />
			<content type="html"><![CDATA[<p>ВЫ можете через запятую указать те таблицы которые нужны в SELECT.<br /></p><div class="codebox"><pre><code>A.*, B.* и т.д.</code></pre></div><p>Т.е. исключите картинки.</p>]]></content>
			<author>
				<name><![CDATA[Закусило Александр]]></name>
				<uri>https://forum.readyscript.ru/user/20/</uri>
			</author>
			<updated>2016-09-30T16:18:01Z</updated>
			<id>https://forum.readyscript.ru/post/4831/#p4831</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Дополнительный фильтр по наличию фотографий товара]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/4829/#p4829" />
			<content type="html"><![CDATA[<p>Все, теперь я доволен.</p><div class="codebox"><pre><code>$adv_config = \RS\Config\Loader::byModule(&quot;custom&quot;);
        if ($adv_config[&#039;hide_nophoto_product&#039;] == 1) {
            $qImage = new \RS\Orm\Request();
            $qImage
                -&gt;select(&#039;linkid&#039;)
                -&gt;from(new \Photo\Model\Orm\Image(), &#039;Img&#039;);
            $this-&gt;queryObj()
                -&gt;where(&quot;A.id IN (&quot;.$qImage-&gt;toSql().&quot;)&quot;);

        }</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Максим]]></name>
				<uri>https://forum.readyscript.ru/user/474/</uri>
			</author>
			<updated>2016-09-30T15:30:31Z</updated>
			<id>https://forum.readyscript.ru/post/4829/#p4829</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Дополнительный фильтр по наличию фотографий товара]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/4828/#p4828" />
			<content type="html"><![CDATA[<p>только вот мне не нравится, что замес получился с sql синтаксисом. Хочется как-то в отдельный запрос вывести то, что в скобках, но не пойму, как.</p>]]></content>
			<author>
				<name><![CDATA[Максим]]></name>
				<uri>https://forum.readyscript.ru/user/474/</uri>
			</author>
			<updated>2016-09-30T15:17:35Z</updated>
			<id>https://forum.readyscript.ru/post/4828/#p4828</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Дополнительный фильтр по наличию фотографий товара]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/4827/#p4827" />
			<content type="html"><![CDATA[<p>Не, так не пойдет. Тогда приджойненные цены не выведутся. Но я нашел способ. Вместо join использовал where с подзапросом и условием, что id товара находится в результатах этого запроса.</p><div class="codebox"><pre><code>$this-&gt;queryObj()
                -&gt;where(&quot;A.id IN (SELECT `linkid` FROM `readyscriptyoung`.`rs_images`)&quot;);</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Максим]]></name>
				<uri>https://forum.readyscript.ru/user/474/</uri>
			</author>
			<updated>2016-09-30T15:15:17Z</updated>
			<id>https://forum.readyscript.ru/post/4827/#p4827</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Дополнительный фильтр по наличию фотографий товара]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/4824/#p4824" />
			<content type="html"><![CDATA[<p>Как и во всех SQL запросах, нужно указать то что собираетесь выбирать конкретно.<br /></p><div class="codebox"><pre><code>SELECT A.*</code></pre></div><div class="codebox"><pre><code>-&gt;select(&#039;A.*&#039;)</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Закусило Александр]]></name>
				<uri>https://forum.readyscript.ru/user/20/</uri>
			</author>
			<updated>2016-09-30T15:07:32Z</updated>
			<id>https://forum.readyscript.ru/post/4824/#p4824</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Дополнительный фильтр по наличию фотографий товара]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/4821/#p4821" />
			<content type="html"><![CDATA[<p>Александр, спасибо. Заработало. Вот текст запроса. Новая проблема - после JOIN в поле id товара передается теперь id изображения. Соответственно, в каталоге начинается вакханалия, ибо везде в переменной $product.id теперь id картинки. Как-то можно исключить из секции SELECT поле Img.id?</p><div class="codebox"><pre><code>SELECT * FROM `readyscriptyoung`.`rs_product` as A 
INNER JOIN `readyscriptyoung`.`rs_product_x_dir` as X ON A.id = X.product_id 
INNER JOIN `readyscriptyoung`.`rs_images` as Img ON A.id = Img.linkid 
WHERE (`A`.`site_id` = &#039;1&#039;) AND `X`.`dir_id` IN (&#039;675&#039;,&#039;676&#039;,&#039;677&#039;,&#039;678&#039;,&#039;679&#039;,&#039;680&#039;,&#039;681&#039;,&#039;682&#039;,&#039;683&#039;,&#039;684&#039;,&#039;685&#039;,&#039;686&#039;,&#039;687&#039;,&#039;688&#039;,&#039;689&#039;,&#039;690&#039;,&#039;691&#039;,&#039;692&#039;,&#039;834&#039;,&#039;835&#039;,&#039;837&#039;,&#039;845&#039;,&#039;846&#039;,&#039;847&#039;,&#039;848&#039;,&#039;849&#039;,&#039;850&#039;,&#039;851&#039;,&#039;852&#039;,&#039;853&#039;,&#039;854&#039;,&#039;855&#039;,&#039;907&#039;,&#039;674&#039;,&#039;694&#039;,&#039;695&#039;,&#039;696&#039;,&#039;698&#039;,&#039;699&#039;,&#039;700&#039;,&#039;701&#039;,&#039;702&#039;,&#039;703&#039;,&#039;838&#039;,&#039;856&#039;,&#039;857&#039;,&#039;858&#039;,&#039;875&#039;,&#039;876&#039;,&#039;900&#039;,&#039;901&#039;,&#039;902&#039;,&#039;904&#039;,&#039;905&#039;,&#039;906&#039;,&#039;693&#039;,&#039;673&#039;,&#039;672&#039;) AND `A`.`public` = &#039;1&#039; AND `A`.`num` &gt; &#039;0&#039; 
ORDER BY dateof DESC</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Максим]]></name>
				<uri>https://forum.readyscript.ru/user/474/</uri>
			</author>
			<updated>2016-09-30T13:13:33Z</updated>
			<id>https://forum.readyscript.ru/post/4821/#p4821</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Дополнительный фильтр по наличию фотографий товара]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/4820/#p4820" />
			<content type="html"><![CDATA[<p>Ух ты, похоже, что да, оно. Да и из своего модуля все-таки кошернее. Отпишусь по-результату. Спасибо.</p>]]></content>
			<author>
				<name><![CDATA[Максим]]></name>
				<uri>https://forum.readyscript.ru/user/474/</uri>
			</author>
			<updated>2016-09-30T10:16:48Z</updated>
			<id>https://forum.readyscript.ru/post/4820/#p4820</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Дополнительный фильтр по наличию фотографий товара]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/4819/#p4819" />
			<content type="html"><![CDATA[<p>filterSection по идее срабатывает тогда когда вы пытаетесь фильтровать что-то. Вам нужен вывод сразу во всём каталоге только тех что с фото? Я правильно понимаю?</p><p>Если да, то тогда лучше всего подвеситься из своего модуля на хук страницы со списком товаров. И уже у объекта API добавить нужный фильтр.<br /><strong>controller.beforeexec.catalog-front-listproducts</strong></p><p>Там первым аргументом будет.<br /></p><div class="codebox"><pre><code>/**
* @param \Catalog\Controller\Front\ListProducts $controller - объект контроллера
* @param string $action - наименование метода, который отработал (использовать для нужного)
*/
public static function controllerBeforeexecCatalogFrontListproducts($controller, $action)
{
     $q = $controller-&gt;api-&gt;queryObj(); //Потому что у фронт контроллера публичное свойство $api, в котором объект API товаров
     //И нужные мне действия с \RS\Orm\Request в $q, т.е. обычным запросом
}</code></pre></div><p>Попробуйте, если это оно.</p>]]></content>
			<author>
				<name><![CDATA[Закусило Александр]]></name>
				<uri>https://forum.readyscript.ru/user/20/</uri>
			</author>
			<updated>2016-09-30T10:04:31Z</updated>
			<id>https://forum.readyscript.ru/post/4819/#p4819</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Дополнительный фильтр по наличию фотографий товара]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/4817/#p4817" />
			<content type="html"><![CDATA[<p>Ничего не выводит, похоже, что я совсем не туда вставляю код. Помогите найти, где происходит первичное формирование запроса для вывода каталога.</p>]]></content>
			<author>
				<name><![CDATA[Максим]]></name>
				<uri>https://forum.readyscript.ru/user/474/</uri>
			</author>
			<updated>2016-09-30T09:37:53Z</updated>
			<id>https://forum.readyscript.ru/post/4817/#p4817</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Дополнительный фильтр по наличию фотографий товара]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/4808/#p4808" />
			<content type="html"><![CDATA[<p>Ах да там же у Вас innerjoin. В проверьте у Вас в эту ветку заходит.<br />Можно вывести итоговый SQL так:<br /></p><div class="codebox"><pre><code>var_dump($q-&gt;toSql());</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Закусило Александр]]></name>
				<uri>https://forum.readyscript.ru/user/20/</uri>
			</author>
			<updated>2016-09-29T16:38:39Z</updated>
			<id>https://forum.readyscript.ru/post/4808/#p4808</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Дополнительный фильтр по наличию фотографий товара]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/4806/#p4806" />
			<content type="html"><![CDATA[<p>А разве сам по себе join не подразумевает, что в выборку попадает только пересечение? Таким образом моя логика говорит мне, что останутся в выборке только товары, у которых есть соответствие в таблице с изображениями. Разве не так?</p>]]></content>
			<author>
				<name><![CDATA[Максим]]></name>
				<uri>https://forum.readyscript.ru/user/474/</uri>
			</author>
			<updated>2016-09-29T14:22:50Z</updated>
			<id>https://forum.readyscript.ru/post/4806/#p4806</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Дополнительный фильтр по наличию фотографий товара]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/4799/#p4799" />
			<content type="html"><![CDATA[<p>Ну прибавили Вы таблицу с фото. А где WHERE с условием?</p>]]></content>
			<author>
				<name><![CDATA[Закусило Александр]]></name>
				<uri>https://forum.readyscript.ru/user/20/</uri>
			</author>
			<updated>2016-09-28T16:22:34Z</updated>
			<id>https://forum.readyscript.ru/post/4799/#p4799</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Дополнительный фильтр по наличию фотографий товара]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/4798/#p4798" />
			<content type="html"><![CDATA[<p>Не работает ))</p>]]></content>
			<author>
				<name><![CDATA[Максим]]></name>
				<uri>https://forum.readyscript.ru/user/474/</uri>
			</author>
			<updated>2016-09-28T15:14:16Z</updated>
			<id>https://forum.readyscript.ru/post/4798/#p4798</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Дополнительный фильтр по наличию фотографий товара]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/4797/#p4797" />
			<content type="html"><![CDATA[<p>И в чём вопрос?)</p>]]></content>
			<author>
				<name><![CDATA[Закусило Александр]]></name>
				<uri>https://forum.readyscript.ru/user/20/</uri>
			</author>
			<updated>2016-09-28T15:13:07Z</updated>
			<id>https://forum.readyscript.ru/post/4797/#p4797</id>
		</entry>
</feed>
