<?xml version="1.0"?>
<rss version="2.0"><channel><title/><link>https://opencartforum.com/en/blogs/241-blog-dlya-naturalov/</link><description/><language>en</language><item><title>&#x410;&#x432;&#x442;&#x43E;&#x43C;&#x430;&#x442;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x430;&#x44F; &#x43F;&#x430;&#x43A;&#x435;&#x442;&#x43D;&#x430;&#x44F; &#x433;&#x435;&#x43D;&#x435;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439; &#x43F;&#x43E; &#x43E;&#x447;&#x435;&#x440;&#x435;&#x434;&#x438;: &#x441;&#x432;&#x44F;&#x437;&#x44B;&#x432;&#x430;&#x435;&#x43C; JSON, PHP &#x438; Gemini Flash Image</title><link>https://opencartforum.com/blogs/entry/573-avtomaticheskaya-paketnaya-generaciya-izobrazheniy-po-ocheredi-svyazyvaem-json-php-i-gemini-flash-image/</link><description><![CDATA[<p>
	Когда нужно сгенерировать большую партию графики (например, десятки баннеров под разные ниши и соотношения сторон), ручной запуск каждого промта это трата времени. Гораздо эффективнее построить мини-конвейер: выгрузить все запросы в <strong>JSON</strong>-файл и запустить самоочищающуюся очередь на <strong>PHP</strong>, которая будет последовательно отправлять задачи в модель <strong><code>gemini-3.1-flash-image</code></strong>, сохранять результат на диск и обновлять страницу до тех пор, пока работа не завершится.
</p>

<p>
	В этой статье разберем, как спроектировать и запустить такую систему.
</p>

<p>
	 
</p>

<h2>
	Архитектура решения
</h2>

<p>
	Наша система состоит из трех основных компонентов:
</p>

<ol start="1">
	<li>
		<p>
			<b><code>prompts.json</code></b> - локальная база данных (очередь), содержащая список текстовых заданий для генерации.
		</p>
	</li>
	<li>
		<p>
			<b>PHP-скрипт управления (<code>index.php</code>)</b> - мозг системы, который забирает первый элемент из массива, удаляет его из файла и управляет автообновлением страницы через заголовок <code>header()</code>.
		</p>
	</li>
	<li>
		<p>
			<b>API-клиент модели <code>gemini-3.1-flash-image</code></b> - обработчик, который принимает строку промта, генерирует картинку и сохраняет её в локальную папку.
		</p>
	</li>
</ol>

<p>
	 
</p>

<h2>
	Шаг 1. Подготовка файла очереди (<code>prompts.json</code>)
</h2>

<p>
	Создадим файл, в котором хранятся наши текстовые запросы в виде простого массива строк:
</p>

<div>
	<div>
		<div>
			<div>
				<span>JSON</span>
			</div>

			<pre class="ipsCode prettyprint lang-javascript prettyprinted"><span class="pun">[</span><span class="pln">
  </span><span class="str">"абстрактный минималистичный веб-баннер, современные плавные геометрические формы, мягкие пастельные градиентные цвета, без текста, без логотипов, без кнопок, профессиональный дизайн"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"широкий рекламный баннер с абстрактным технологичным фоном, глубокие современные оттенки, легкое свечение, без надписей и логотипов, высокое качество"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"квадратный рекламный постер в стиле минимализм, стильные абстрактные элементы, мягкое студийное освещение, без текста, без кнопок и логотипов"</span><span class="pln">
</span><span class="pun">]</span></pre>

			<p>
				 
			</p>
		</div>
	</div>
</div>

<h2>
	Шаг 2. Разработка PHP-скрипта с очередью и автообновлением
</h2>

<p>
	Основная идея автоматизации - использовать функцию <strong><em><code>array_shift()</code></em></strong>. Она извлекает <b>первый</b> элемент из массива и автоматически сдвигает весь массив, удаляя этот элемент. После этого мы перезаписываем JSON-файл обновленным списком.
</p>

<p>
	Для того чтобы скрипт переходил к следующему промту без участия человека, используется стандартный PHP-заголовок <strong><em><code>header("Refresh: 5")</code></em></strong>, перезагружающий страницу каждые 5 секунд.
</p>

<div>
	<div>
		<div>
			<div>
				 
			</div>

			<div class="ipsSpoiler" data-ipsspoiler="">
				<div class="ipsSpoiler_header">
					<span>Скрытый текст</span>
				</div>

				<div class="ipsSpoiler_contents">
					<pre class="ipsCode prettyprint lang-php prettyprinted"><span class="pun">&lt;?</span><span class="pln">php
$filename </span><span class="pun">=</span><span class="pln"> </span><span class="str">'promts.json'</span><span class="pun">;</span><span class="pln">
$api_key </span><span class="pun">=</span><span class="pln"> </span><span class="str">'ВВЕДИТЕ_ВАШ_КЛЮЧ'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// Укажите ваш API ключ</span><span class="pln">
$aspect_ratio </span><span class="pun">=</span><span class="pln"> </span><span class="str">'16:9'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// Пропорции изображения по умолчанию (можно менять под промт)</span><span class="pln">

</span><span class="com">// Проверяем существование файла</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">file_exists</span><span class="pun">(</span><span class="pln">$filename</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// Читаем и декодируем JSON в массив</span><span class="pln">
    $jsonContent </span><span class="pun">=</span><span class="pln"> file_get_contents</span><span class="pun">(</span><span class="pln">$filename</span><span class="pun">);</span><span class="pln">
    $prompts </span><span class="pun">=</span><span class="pln"> json_decode</span><span class="pun">(</span><span class="pln">$jsonContent</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">

    </span><span class="com">// Проверяем, есть ли элементы в очереди</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">empty</span><span class="pun">(</span><span class="pln">$prompts</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> is_array</span><span class="pun">(</span><span class="pln">$prompts</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        header</span><span class="pun">(</span><span class="str">"Refresh: 5"</span><span class="pun">);</span><span class="pln">
        
        </span><span class="com">// Забираем первый элемент и удаляем его из массива</span><span class="pln">
        $user_prompt </span><span class="pun">=</span><span class="pln"> array_shift</span><span class="pun">(</span><span class="pln">$prompts</span><span class="pun">);</span><span class="pln">

        </span><span class="com">// Сохраняем оставшийся массив обратно в JSON-файл</span><span class="pln">
        file_put_contents</span><span class="pun">(</span><span class="pln">$filename</span><span class="pun">,</span><span class="pln"> json_encode</span><span class="pun">(</span><span class="pln">$prompts</span><span class="pun">,</span><span class="pln"> JSON_UNESCAPED_UNICODE </span><span class="pun">|</span><span class="pln"> JSON_PRETTY_PRINT</span><span class="pun">));</span><span class="pln">

        </span><span class="com">// Выводим текущий промт</span><span class="pln">
        echo </span><span class="str">"&lt;h2&gt;Текущий промт в обработке:&lt;/h2&gt;"</span><span class="pun">;</span><span class="pln">
        echo </span><span class="str">"&lt;p style='font-size: 18px; color: #333;'&gt;"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> htmlspecialchars</span><span class="pun">(</span><span class="pln">$user_prompt</span><span class="pun">)</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">"&lt;/p&gt;"</span><span class="pun">;</span><span class="pln">

        $data </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
            </span><span class="str">"contents"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
                </span><span class="pun">[</span><span class="pln">
                    </span><span class="str">"parts"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
                        </span><span class="pun">[</span><span class="str">"text"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $user_prompt</span><span class="pun">]</span><span class="pln">
                    </span><span class="pun">]</span><span class="pln">
                </span><span class="pun">]</span><span class="pln">
            </span><span class="pun">],</span><span class="pln">
            </span><span class="str">"generationConfig"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
                </span><span class="str">"responseModalities"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">[</span><span class="str">"IMAGE"</span><span class="pun">],</span><span class="pln"> </span><span class="com">// Указываем, что ждем картинку</span><span class="pln">
                </span><span class="str">"imageConfig"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
                    </span><span class="str">"aspectRatio"</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $aspect_ratio </span><span class="com">// Пропорции изображения</span><span class="pln">
                </span><span class="pun">]</span><span class="pln">
            </span><span class="pun">]</span><span class="pln">
        </span><span class="pun">];</span><span class="pln">

        </span><span class="com">// Кодируем массив в JSON-строку</span><span class="pln">
        $payload </span><span class="pun">=</span><span class="pln"> json_encode</span><span class="pun">(</span><span class="pln">$data</span><span class="pun">);</span><span class="pln">

        </span><span class="com">// Настраиваем cURL запрос к модели gemini-3.1-flash-image</span><span class="pln">
        $url </span><span class="pun">=</span><span class="pln"> </span><span class="str">"https://generativelanguage.googleapis.com/v1beta/models/gemini-3.1-flash-image:generateContent?key="</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $api_key</span><span class="pun">;</span><span class="pln">

        $ch </span><span class="pun">=</span><span class="pln"> curl_init</span><span class="pun">(</span><span class="pln">$url</span><span class="pun">);</span><span class="pln">
        curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_RETURNTRANSFER</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
        curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_POST</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
        curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_POSTFIELDS</span><span class="pun">,</span><span class="pln"> $payload</span><span class="pun">);</span><span class="pln">
        curl_setopt</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLOPT_HTTPHEADER</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
            </span><span class="str">'Content-Type: application/json'</span><span class="pln">
        </span><span class="pun">]);</span><span class="pln">

        $response </span><span class="pun">=</span><span class="pln"> curl_exec</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">);</span><span class="pln">
        $http_code </span><span class="pun">=</span><span class="pln"> curl_getinfo</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">,</span><span class="pln"> CURLINFO_HTTP_CODE</span><span class="pun">);</span><span class="pln">
        curl_close</span><span class="pun">(</span><span class="pln">$ch</span><span class="pun">);</span><span class="pln">

        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$http_code </span><span class="pun">===</span><span class="pln"> </span><span class="lit">200</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            $result </span><span class="pun">=</span><span class="pln"> json_decode</span><span class="pun">(</span><span class="pln">$response</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
            
            </span><span class="com">// Проверяем наличие изображения в ответе</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isset</span><span class="pun">(</span><span class="pln">$result</span><span class="pun">[</span><span class="str">'candidates'</span><span class="pun">][</span><span class="lit">0</span><span class="pun">][</span><span class="str">'content'</span><span class="pun">][</span><span class="str">'parts'</span><span class="pun">][</span><span class="lit">0</span><span class="pun">][</span><span class="str">'inlineData'</span><span class="pun">][</span><span class="str">'data'</span><span class="pun">]))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                $image_base64 </span><span class="pun">=</span><span class="pln"> $result</span><span class="pun">[</span><span class="str">'candidates'</span><span class="pun">][</span><span class="lit">0</span><span class="pun">][</span><span class="str">'content'</span><span class="pun">][</span><span class="str">'parts'</span><span class="pun">][</span><span class="lit">0</span><span class="pun">][</span><span class="str">'inlineData'</span><span class="pun">][</span><span class="str">'data'</span><span class="pun">];</span><span class="pln">
                $image_data </span><span class="pun">=</span><span class="pln"> base64_decode</span><span class="pun">(</span><span class="pln">$image_base64</span><span class="pun">);</span><span class="pln">

                $img_filename </span><span class="pun">=</span><span class="pln"> </span><span class="str">'generated_image_'</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> time</span><span class="pun">()</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">'.jpg'</span><span class="pun">;</span><span class="pln">
                
                </span><span class="com">// Убедимся, что директория существует</span><span class="pln">
                $save_dir </span><span class="pun">=</span><span class="pln"> __DIR__ </span><span class="pun">.</span><span class="pln"> </span><span class="str">'/image/gemini/'</span><span class="pun">;</span><span class="pln">
                </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">file_exists</span><span class="pun">(</span><span class="pln">$save_dir</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                    mkdir</span><span class="pun">(</span><span class="pln">$save_dir</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0777</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
                </span><span class="pun">}</span><span class="pln">

                file_put_contents</span><span class="pun">(</span><span class="pln">$save_dir </span><span class="pun">.</span><span class="pln"> $img_filename</span><span class="pun">,</span><span class="pln"> $image_data</span><span class="pun">);</span><span class="pln">
                echo </span><span class="str">"&lt;p style='color: green;'&gt;Изображение успешно сохранено: image/gemini/{$img_filename}&lt;/p&gt;"</span><span class="pun">;</span><span class="pln">
            </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                echo </span><span class="str">"&lt;p style='color: red;'&gt;Ошибка структуры ответа API.&lt;/p&gt;"</span><span class="pun">;</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            echo </span><span class="str">"&lt;p style='color: red;'&gt;Ошибка API (Код "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $http_code </span><span class="pun">.</span><span class="pln"> </span><span class="str">"): "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> htmlspecialchars</span><span class="pun">(</span><span class="pln">$response</span><span class="pun">)</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">"&lt;/p&gt;"</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        echo </span><span class="str">"&lt;hr&gt;&lt;p&gt;Обновите страницу (F5), чтобы взять следующий промт.&lt;/p&gt;"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// Очередь пуста — сбрасываем заголовок обновления</span><span class="pln">
        header_remove</span><span class="pun">(</span><span class="str">"Refresh"</span><span class="pun">);</span><span class="pln">
        echo </span><span class="str">"&lt;h2&gt;Очередь пуста! Все промты обработаны.&lt;/h2&gt;"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    echo </span><span class="str">"&lt;h2&gt;Файл prompts.json не найден.&lt;/h2&gt;"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">?&gt;</span></pre>

					<p>
						 
					</p>
				</div>
			</div>

			<p>
				 
			</p>
		</div>
	</div>
</div>

<h2>
	Шаг 3. Запуск и контроль процесса
</h2>

<ol start="1">
	<li>
		<p>
			Поместите скрипт <code>index.php</code> и файл <code>prompts.json</code> в корень вашего локального или удаленного сервера (например, OpenServer или Docker-контейнер).
		</p>
	</li>
	<li>
		<p>
			Откройте страницу в браузере.
		</p>
	</li>
	<li>
		<p>
			Как это работает на практике:
		</p>

		<ul>
			<li>
				<p>
					Скрипт считывает файл
				</p>
			</li>
			<li>
				<p>
					Берет строку номер один, отправляет её в <strong><em><code>gemini-3.1-flash-image</code></em></strong>
				</p>
			</li>
			<li>
				<p>
					Получает картинку, сохраняет её в папку <strong><em><code>generated_banners/</code></em></strong>
				</p>
			</li>
			<li>
				<p>
					Удаляет этот промт из <em><strong><code>prompts.json</code></strong></em>
				</p>
			</li>
			<li>
				<p>
					Перезагружает страницу через 5 секунд, беря в работу следующий элемент
				</p>
			</li>
		</ul>
	</li>
	<li>
		<p>
			Как только массив в JSON опустеет, скрипт автоматически прекратит обновление и выведет сообщение об успешном завершении пакетной генерации.
		</p>
	</li>
</ol>

<p>
	 
</p>

<h2>
	Преимущества такого подхода
</h2>

<ul>
	<li>
		<p>
			<b>Отказоустойчивость:</b> Если на каком-то промте произойдет сбой сети или таймаут API, обработанные элементы уже удалены из JSON, а необработанные ждут своей очереди — процесс можно просто возобновить с того же места.
		</p>
	</li>
	<li>
		<p>
			<b>Минимум кода:</b> Никаких сложных очередей на Redis или RabbitMQ - чистый PHP и файловая система, разворачиваемые за две минуты.
		</p>
	</li>
</ul>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	кстати, пока я тестировал этот конвейер, под руку подвернулся старый проект, и я решил "воскресить" свой старый модуль <b>qBanner Constructor</b>
</p>

<p>
	<a href="https://opencartforum.com/files/file/3707-qbanner-konstruktor/" rel="">https://opencartforum.com/files/file/3707-qbanner-konstruktor/</a>
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">573</guid><pubDate>Sat, 10 Oct 2026 14:11:00 +0000</pubDate></item><item><title>OCMOD Helper &#x434;&#x43B;&#x44F; Sublime</title><link>https://opencartforum.com/blogs/entry/559-ocmod-helper-dlya-sublime/</link><description><![CDATA[<p>
	написал плагин под саблайм, который упрощает разработку модификаторов
</p>

<p>
	позволяет генерировать модификаторы через контекстное меню
</p>

<p>
	 
</p>

<p>
	<img alt="Screenshot_28.png.df4186314be23a64f42ced5fe7f9c1eb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="836933" data-ratio="38.90" style="height:auto;" width="748" data-src="https://opencartforum.com/storage/attachment/monthly_2026_01/Screenshot_28.png.df4186314be23a64f42ced5fe7f9c1eb.png" src="https://opencartforum.com/applications/core/interface/js/spacer.png" />
</p>

<p>
	 
</p>

<p>
	в буфер обмена попадает такой код
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted"><span class="tag">&lt;file</span><span class="pln"> </span><span class="atn">path</span><span class="pun">=</span><span class="atv">"catalog/controller/product/category.php"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;operation&gt;</span><span class="pln">
        </span><span class="tag">&lt;search&gt;</span><span class="pln">&lt;![CDATA[$this-&gt;load-&gt;model('tool/image');]]&gt;</span><span class="tag">&lt;/search&gt;</span><span class="pln">
        </span><span class="tag">&lt;add</span><span class="pln"> </span><span class="atn">position</span><span class="pun">=</span><span class="atv">"after"</span><span class="tag">&gt;</span><span class="pln">&lt;![CDATA[
            
        ]]&gt;</span><span class="tag">&lt;/add&gt;</span><span class="pln">
    </span><span class="tag">&lt;/operation&gt;</span><span class="pln">
</span><span class="tag">&lt;/file&gt;</span></pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	как установить можно найти тут
</p>

<p>
	<a href="https://github.com/kjpower/Ocmod-generator-for-Sublime" rel="external nofollow">https://github.com/kjpower/Ocmod-generator-for-Sublime</a>
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">559</guid><pubDate>Wed, 07 Jan 2026 19:46:34 +0000</pubDate></item><item><title>&#x431;&#x435;&#x441;&#x43A;&#x43E;&#x43D;&#x435;&#x447;&#x43D;&#x430;&#x44F; &#x43F;&#x440;&#x43E;&#x43A;&#x440;&#x443;&#x442;&#x43A;&#x430; octemplates</title><link>https://opencartforum.com/blogs/entry/556-beskonechnaya-prokrutka-octemplates/</link><description><![CDATA[<p>
	в свежих версиях шаблонов функция бесконечной прокрутки в категориях уже есть<br />
	на старых версиях такой функции нет<br />
	обновление темы на работающем магазине может быть рискованным тк есть шанс, что что-то пойдет не так<br />
	этот скрипт можно добавить в кастомные скрипты вашей темы (последний пункт меню в настройках темы)<br />
	так вы безопасно получите функционал бесконечной ленты товаров
</p>

<p>
	кстати, мой скрипт использует таймаут в секундах<br />
	это снижает нагрузку на сервер и при этом позволяет пользователю спокойно прокрутить страницу до футера
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted"><span class="pln">$</span><span class="pun">(</span><span class="pln">document</span><span class="pun">).</span><span class="pln">ready</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">let</span><span class="pln"> isLoading </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">let</span><span class="pln"> loadMoreTimeout </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5000</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">let</span><span class="pln"> lastLoad </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">function</span><span class="pln"> isInViewport</span><span class="pun">(</span><span class="pln">el</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">const</span><span class="pln"> rect </span><span class="pun">=</span><span class="pln"> el</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="lit">0</span><span class="pun">).</span><span class="pln">getBoundingClientRect</span><span class="pun">();</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">(</span><span class="pln">
            rect</span><span class="pun">.</span><span class="pln">top </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln">
            rect</span><span class="pun">.</span><span class="pln">bottom </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">window</span><span class="pun">.</span><span class="pln">innerHeight </span><span class="pun">||</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">documentElement</span><span class="pun">.</span><span class="pln">clientHeight</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">function</span><span class="pln"> checkAndClick</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">const</span><span class="pln"> now </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Date</span><span class="pun">.</span><span class="pln">now</span><span class="pun">();</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">now </span><span class="pun">-</span><span class="pln"> lastLoad </span><span class="pun">&lt;</span><span class="pln"> loadMoreTimeout</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">return</span><span class="pun">;</span><span class="pln">

        </span><span class="kwd">const</span><span class="pln"> $btn </span><span class="pun">=</span><span class="pln"> $</span><span class="pun">(</span><span class="str">'.oct-load-more-button:visible'</span><span class="pun">);</span><span class="pln"> 
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$btn</span><span class="pun">.</span><span class="pln">length </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">!</span><span class="pln">isLoading </span><span class="pun">&amp;&amp;</span><span class="pln"> isInViewport</span><span class="pun">(</span><span class="pln">$btn</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            isLoading </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
            $btn</span><span class="pun">.</span><span class="pln">trigger</span><span class="pun">(</span><span class="str">'click'</span><span class="pun">);</span><span class="pln">

            $</span><span class="pun">(</span><span class="pln">document</span><span class="pun">).</span><span class="pln">one</span><span class="pun">(</span><span class="str">'ajaxStop'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                isLoading </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
                lastLoad </span><span class="pun">=</span><span class="pln"> now</span><span class="pun">;</span><span class="pln">
            </span><span class="pun">});</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    $</span><span class="pun">(</span><span class="pln">window</span><span class="pun">).</span><span class="pln">on</span><span class="pun">(</span><span class="str">'scroll resize'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        checkAndClick</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">});</span><span class="pln">

</span><span class="pun">});</span></pre>

<p>
	 
</p>
]]></description><guid isPermaLink="false">556</guid><pubDate>Thu, 16 Oct 2025 09:32:52 +0000</pubDate></item><item><title>&#x41F;&#x43E;&#x43B;&#x443;&#x447;&#x430;&#x435;&#x43C; &#x43A;&#x43E;&#x440;&#x440;&#x435;&#x43A;&#x442;&#x43D;&#x443;&#x44E; &#x446;&#x435;&#x43D;&#x443; &#x442;&#x43E;&#x432;&#x430;&#x440;&#x430;</title><link>https://opencartforum.com/blogs/entry/549-poluchaem-korrektnuyu-cenu-tovara/</link><description><![CDATA[<p>
	Дело в том, что на многих магазинах стоит модификатор расширяющий знаки для опций = * и тд
</p>

<p>
	конечно есть и другие решения, которые влияют на ценообразование и встречаются гораздо реже
</p>

<p>
	эти модификаторы меняет логику формирования цены в либе <em>system/library/cart/cart.php</em>
</p>

<p>
	поэтому кратчайший способ получить верную цену это:
</p>

<ol>
	<li>
		добавить товар в корзину
	</li>
	<li>
		получить о нем инфу
	</li>
	<li>
		удалить из корзины
	</li>
</ol>

<p>
	 
</p>

<p>
	я это делаю как-то так
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted"><span class="kwd">function</span><span class="pln"> get_cart_prod</span><span class="pun">(</span><span class="pln">$product_id</span><span class="pun">,</span><span class="pln"> $quantity </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> $option </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(),</span><span class="pln"> $recurring_id </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> 
</span><span class="pun">{</span><span class="pln">
    $option</span><span class="pun">[</span><span class="str">'unique'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'unique'</span><span class="pun">;</span><span class="pln">
    $this</span><span class="pun">-&gt;</span><span class="pln">cart</span><span class="pun">-&gt;</span><span class="kwd">add</span><span class="pun">(</span><span class="pln">$product_id</span><span class="pun">,</span><span class="pln"> $quantity</span><span class="pun">,</span><span class="pln"> $option</span><span class="pun">,</span><span class="pln"> $recurring_id</span><span class="pun">);</span><span class="pln">
    $query </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">db</span><span class="pun">-&gt;</span><span class="pln">query</span><span class="pun">(</span><span class="str">"SELECT MAX(cart_id) as cart_id FROM "</span><span class="pun">.</span><span class="pln">DB_PREFIX</span><span class="pun">.</span><span class="str">"cart"</span><span class="pun">);</span><span class="pln">
    $cart_id </span><span class="pun">=</span><span class="pln"> $query</span><span class="pun">-&gt;</span><span class="pln">row</span><span class="pun">[</span><span class="str">'cart_id'</span><span class="pun">];</span><span class="pln">
    $prods </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">cart</span><span class="pun">-&gt;</span><span class="pln">getProducts</span><span class="pun">();</span><span class="pln">
    </span><span class="kwd">foreach</span><span class="pun">(</span><span class="pln">$prods </span><span class="kwd">as</span><span class="pln"> $prod</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">$prod</span><span class="pun">[</span><span class="str">'cart_id'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> $cart_id</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            $last_prod </span><span class="pun">=</span><span class="pln"> $prod</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    $this</span><span class="pun">-&gt;</span><span class="pln">cart</span><span class="pun">-&gt;</span><span class="kwd">remove</span><span class="pun">(</span><span class="pln">$cart_id</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> $last_prod</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	если на посте будет активность. дополню о получении старой(зачеркнутой) цены товара
</p>
]]></description><guid isPermaLink="false">549</guid><pubDate>Wed, 05 Mar 2025 10:41:00 +0000</pubDate></item><item><title>&#x441;&#x43E;&#x440;&#x442;&#x438;&#x440;&#x443;&#x435;&#x43C; &#x437;&#x43D;&#x430;&#x447;&#x435;&#x43D;&#x438;&#x44F; ocfilter</title><link>https://opencartforum.com/blogs/entry/547-sortiruem-znacheniya-ocfilter/</link><description><![CDATA[<p>
	По умолчанию фильтр сортирует подобные значение "до 2 м" &gt; "до 1000 м" как строки
</p>

<p>
	Проблема возникает из-за того, sql запрос "до 2м" + 0 возвращает 0
</p>

<p>
	 
</p>

<p>
	Задача найти блоки фильтра в которых все значения содержат числа и отсортировать их в правильном порядке
</p>

<p>
	Написал скрипт, который находит фильтры имеющие только числовые значения и проставляет им необходимую сортировку 
</p>

<p>
	<strong>Перед тестирование скрипта делайте бекап таблицы oc_ocfilter_filter_value</strong>
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted"><span class="kwd">function</span><span class="pln"> sort_ocfilter</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    $pattern </span><span class="pun">=</span><span class="pln"> </span><span class="str">'/\-?\d+([.,]\d+)?/'</span><span class="pun">;</span><span class="pln">
    $final_groups </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[];</span><span class="pln">
    $groups </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[];</span><span class="pln">
    $batchSize </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5500</span><span class="pun">;</span><span class="pln">

    $query </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">db</span><span class="pun">-&gt;</span><span class="pln">query</span><span class="pun">(</span><span class="str">"SELECT * FROM "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> DB_PREFIX </span><span class="pun">.</span><span class="pln"> </span><span class="str">"ocfilter_filter_value fv
    LEFT JOIN "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> DB_PREFIX </span><span class="pun">.</span><span class="pln"> </span><span class="str">"ocfilter_filter_value_description fvd 
    ON (fv.value_id = fvd.value_id AND fv.source = fvd.source) 
    WHERE fvd.language_id = '"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'config_language_id'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">"'"</span><span class="pun">);</span><span class="pln">

    </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$query</span><span class="pun">-&gt;</span><span class="pln">rows </span><span class="kwd">as</span><span class="pln"> $row</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">array_search</span><span class="pun">(</span><span class="pln">$row</span><span class="pun">[</span><span class="str">'filter_id'</span><span class="pun">],</span><span class="pln"> $exclude_filter_id</span><span class="pun">)</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> FALSE</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            $groups</span><span class="pun">[</span><span class="pln">$row</span><span class="pun">[</span><span class="str">'filter_id'</span><span class="pun">]][]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $row</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$groups </span><span class="kwd">as</span><span class="pln"> $key </span><span class="pun">=&gt;</span><span class="pln"> $group</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        $numeric </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
        $alphabet </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$group </span><span class="kwd">as</span><span class="pln"> $val</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">preg_match</span><span class="pun">(</span><span class="pln">$pattern</span><span class="pun">,</span><span class="pln"> $val</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">],</span><span class="pln"> $matches1</span><span class="pun">))</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                $numeric</span><span class="pun">++;</span><span class="pln">
            </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                $alphabet</span><span class="pun">++;</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$alphabet </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">continue</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        uasort</span><span class="pun">(</span><span class="pln">$groups</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">],</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$a</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">use</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$pattern</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">preg_match</span><span class="pun">(</span><span class="pln">$pattern</span><span class="pun">,</span><span class="pln"> $a</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">],</span><span class="pln"> $matches1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> preg_match</span><span class="pun">(</span><span class="pln">$pattern</span><span class="pun">,</span><span class="pln"> $b</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">],</span><span class="pln"> $matches2</span><span class="pun">))</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">float</span><span class="pun">)</span><span class="pln">str_replace</span><span class="pun">(</span><span class="str">','</span><span class="pun">,</span><span class="pln"> </span><span class="str">'.'</span><span class="pun">,</span><span class="pln"> $matches1</span><span class="pun">[</span><span class="lit">0</span><span class="pun">])</span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">float</span><span class="pun">)</span><span class="pln">str_replace</span><span class="pun">(</span><span class="str">','</span><span class="pun">,</span><span class="pln"> </span><span class="str">'.'</span><span class="pun">,</span><span class="pln"> $matches2</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="kwd">return</span><span class="pln"> $a</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">&lt;=&gt;</span><span class="pln"> $b</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">];</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">});</span><span class="pln">

        $final_groups</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $groups</span><span class="pun">[</span><span class="pln">$key</span><span class="pun">];</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$final_groups </span><span class="kwd">as</span><span class="pln"> $group</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        $counter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$group </span><span class="kwd">as</span><span class="pln"> $val</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            $counter</span><span class="pun">++;</span><span class="pln">
            $sqlQueries</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"WHEN value_id = "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $val</span><span class="pun">[</span><span class="str">'value_id'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">" THEN "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $counter </span><span class="pun">.</span><span class="pln"> </span><span class="str">" "</span><span class="pun">;</span><span class="pln">
            </span><span class="com">//$this-&gt;db-&gt;query($sql);</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

    $chunks </span><span class="pun">=</span><span class="pln"> array_chunk</span><span class="pun">(</span><span class="pln">$sqlQueries</span><span class="pun">,</span><span class="pln"> $batchSize</span><span class="pun">);</span><span class="pln">

    </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$chunks </span><span class="kwd">as</span><span class="pln"> $batch</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        $combinedQuery </span><span class="pun">=</span><span class="pln"> implode</span><span class="pun">(</span><span class="str">" "</span><span class="pun">,</span><span class="pln"> $batch</span><span class="pun">);</span><span class="pln">
        $combinedQuery </span><span class="pun">=</span><span class="pln"> </span><span class="str">"UPDATE "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> DB_PREFIX </span><span class="pun">.</span><span class="pln"> </span><span class="str">"ocfilter_filter_value SET sort_order = (CASE "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $combinedQuery </span><span class="pun">.</span><span class="pln"> </span><span class="str">" ELSE sort_order END)"</span><span class="pun">;</span><span class="pln">
        $this</span><span class="pun">-&gt;</span><span class="pln">db</span><span class="pun">-&gt;</span><span class="pln">query</span><span class="pun">(</span><span class="pln">$combinedQuery</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

echo </span><span class="str">"&lt;PRE&gt;"</span><span class="pun">;</span><span class="pln">var_dump</span><span class="pun">(</span><span class="pln">$final_groups</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	 
</p>
]]></description><guid isPermaLink="false">547</guid><pubDate>Tue, 21 Jan 2025 09:13:43 +0000</pubDate></item><item><title>&#x443;&#x43D;&#x438;&#x444;&#x438;&#x446;&#x438;&#x440;&#x443;&#x435;&#x43C; thumb &#x43A;&#x430;&#x43A; &#x432; &#x43E;&#x43F;&#x435;&#x43D;&#x43A;&#x430;&#x440;&#x442; 4</title><link>https://opencartforum.com/blogs/entry/545-unificiruem-thumb-kak-v-openkart-4/</link><description><![CDATA[<p>
	на одном из проектов мини карточка товара формируется и выводится в 
</p>

<p>
	категории, поиске, акциях, производителе, модулях окдевизарда и тд
</p>

<p>
	сверху на это ложатся всякие модификаторы для опций в категории тд
</p>

<p>
	 
</p>

<p>
	в фигме мы видим, что все карточки товара везде выглядят одинаково
</p>

<p>
	а значит момент формирования и вывода желательно унифицировать
</p>

<p>
	 
</p>

<p>
	формируем новый контроллер на основе модифицированного контроллера категории. тк в этот контроллер попали все необходимые модификации
</p>

<p>
	вьюшку соответственно сформируем на основе модифицированной вьюшки категории по той же причине
</p>

<p>
	технические детали пропустим (за 10 комментов и дополню статью)
</p>

<p>
	 
</p>

<p>
	на выходе мы получаем унифицированный контроллер для получения html карточки товара
</p>

<p>
	используем как-то так
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted"><span class="pln">$data</span><span class="pun">[</span><span class="str">'products_thumb'</span><span class="pun">][]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">controller</span><span class="pun">(</span><span class="str">"product/thumb/getThumb"</span><span class="pun">,</span><span class="pln"> $result</span><span class="pun">[</span><span class="str">'product_id'</span><span class="pun">]);</span></pre>

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

<p>
	чтобы решить эту траблу можно сделать модификатор, который сделает что-то подобное
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted"><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$results </span><span class="kwd">as</span><span class="pln"> $result</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$data</span><span class="pun">[</span><span class="str">'products_thumb'</span><span class="pun">][]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">load</span><span class="pun">-&gt;</span><span class="pln">controller</span><span class="pun">(</span><span class="str">"product/thumb/getThumb"</span><span class="pun">,</span><span class="pln"> $result</span><span class="pun">[</span><span class="str">'product_id'</span><span class="pun">]);</span><span class="pln">
</span><span class="kwd">continue</span><span class="pun">;</span><span class="pln">
</span><span class="com">//тут старый код, который не будет выполняться</span></pre>

<p>
	второй минус в том, что отключения модификаторов для категории никак не повлияет на карточки
</p>

<p>
	на боевом магазине все это провернуть однозначно не так просто. лучше это делать на ранних этапах проектирования
</p>

<p>
	стоит ли игра свеч? 
</p>
]]></description><guid isPermaLink="false">545</guid><pubDate>Tue, 12 Nov 2024 20:24:48 +0000</pubDate></item><item><title>&#x434;&#x43E;&#x43B;&#x433;&#x43E; &#x433;&#x440;&#x443;&#x437;&#x438;&#x442;&#x441;&#x44F; &#x441;&#x430;&#x439;&#x442; &#x43D;&#x430; opencart</title><link>https://opencartforum.com/blogs/entry/534-dolgo-gruzitsya-sayt-na-opencart/</link><description><![CDATA[<p>
	Причин может быть масса от конфига сервера, до тяжелых запросов к бд, проблемы с dns, cdn и тд
</p>

<p>
	Возьмем то случай, когда ваш VPS имеет много ресурсов и настроен серьезным специалистом, а  значит проблема на стороне опенкарта и плагинов, которые были установлены
</p>

<p>
	 
</p>

<p>
	Обычно первым делом включают лог тяжелых запросов. <abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">Опенкарт</abbr></abbr> в момент создания таблицы выбирает тип таблиц ENGINE=MyISAM. Этот тип может блокировать таблицы, именно поэтому в логе можно встретить простейшие запросы выполняющиеся по 2+ секунды. Лучше перейти на innodb. На просторах гитхаба есть скрипт, который поможет сменить движок хранилища, а так же добавить индексы к таблицам. Кстати, индексы он добавляет всем столбцам, которые содержат подстроку "_id" 
</p>

<p>
	<span style="background-color:#ffffff;color:#0c0d0e;font-size:13px;text-align:left;"><a href="https://github.com/lilalaunesau/opencart-turbo" rel="external nofollow">https://github.com/lilalaunesau/<abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">opencart</abbr></abbr>-turbo</a></span>
</p>

<p>
	 
</p>

<p>
	Но одним логом сыт не будешь и поэтому я написал решение, которое покажет время работы каждого контроллера на странице.
</p>

<p>
	Предварительно желательно отключить кеширование mysql. За это отвечают такие параметры конфигурации как 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">query_cache_size        = 0
query_cache_type        = 0</span></pre>

<p>
	 
</p>

<p>
	С скрина, который прикреплен к этому посту можно сделать вывод, что менюшка не кешируется и грузится около 640мс
</p>

<p>
	Один из моих модулей отрабатывает за 100мс, что тоже не есть хорошо, но с учетом того что на этой странице таблица из 10+ товаров, то норм
</p>

<p>
	Футер тоже можно закешировать сэкономив около 300мс
</p>

<p>
	 
</p>

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

<p>
	 
</p>

<p><a href="https://opencartforum.com/storage/attachment/monthly_2024_03/Screenshot_5.png.d1cd056652ba86addd2ec2f53f92f288.png" class="ipsAttachLink ipsAttachLink_image"><img loading="lazy" data-fileid="785536" src="https://opencartforum.com/applications/core/interface/js/spacer.png" data-src="https://opencartforum.com/storage/attachment/monthly_2024_03/Screenshot_5.thumb.png.e70bc6b29264611a8d6147f3ba545d82.png" data-ratio="37" width="1000" class="ipsImage ipsImage_thumbnailed" alt="Screenshot_5.png"></a></p>]]></description><guid isPermaLink="false">534</guid><pubDate>Mon, 25 Mar 2024 12:28:19 +0000</pubDate></item><item><title>&#x41E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x44B; &#x441; &#x43F;&#x440;&#x435;&#x434;&#x432;&#x430;&#x440;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x43C; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435;&#x43C; &#x43C;&#x43E;&#x434;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x43E;&#x440;&#x43E;&#x432;</title><link>https://opencartforum.com/blogs/entry/526-obnovlenie-stranicy-s-predvaritelnym-obnovleniem-modifikatorov/</link><description><![CDATA[<p>
	Надоело во время разработки дергать обновление модификаторов перед каждым обновлением страницы ?
</p>

<p>
	Я нашел в себе силы и написал решение. работает по хоткею CTRL + B на витрине сайта
</p>

<p>
	Единственное условие для работы модификатора - нужно быть авторизованным в админке
</p>

<p>
	 
</p>

<p>
	<a href="https://github.com/kjpower/Refresh-opencart-page-with-modif/blob/main/upload/system/refresh_page_with_modif.ocmod.xml" rel="external nofollow">https://github.com/kjpower/Refresh-<abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">opencart</abbr></abbr>-page-with-modif/blob/main/upload/system/refresh_page_with_modif.ocmod.xml</a>
</p>

<p>
	работает на 2.3.х и 3.х
</p>

<p>
	 
</p>

<p>
	если полезно то ставь лайк и беги покупать мои дополнения <img alt=":grin:" data-emoticon="" src="https://opencartforum.com/storage/smiles/emoticons/test_icon_e_biggrin.gif" title=":grin:" />
</p>
]]></description><guid isPermaLink="false">526</guid><pubDate>Mon, 04 Mar 2024 09:58:01 +0000</pubDate></item><item><title>&#x432;&#x44B;&#x431;&#x43E;&#x440; &#x43A;&#x43E;&#x43B;-&#x432;&#x430; &#x432; &#x43A;&#x430;&#x440;&#x442;&#x43E;&#x447;&#x43A;&#x435; &#x442;&#x43E;&#x432;&#x430;&#x440;&#x430;</title><link>https://opencartforum.com/blogs/entry/521-vybor-kol-va-v-kartochke-tovara/</link><description><![CDATA[<p>
	почему все разработчики тем оставляют выбор кол-ва в карточке товара?
</p>

<p>
	оптовики это нная часть от всех инет магазинов, почему бы по умолчанию не скрыть это поле
</p>

<p>
	господа, ваши мысли по этому поводу?
</p>

<p>
	кстати алло, розетка, элмир, мойо - не имеет кол-ва в карточке товара. только в корзине
</p>
]]></description><guid isPermaLink="false">521</guid><pubDate>Sat, 09 Dec 2023 14:16:00 +0000</pubDate></item><item><title>&#x438;&#x441;&#x447;&#x435;&#x440;&#x43F;&#x44B;&#x432;&#x430;&#x435;&#x43C; &#x432;&#x43E;&#x43F;&#x440;&#x43E;&#x441; &#x43E; &#x43A;&#x44D;&#x448;&#x435;</title><link>https://opencartforum.com/blogs/entry/446-ischerpyvaem-vopros-o-keshe/</link><description><![CDATA[<p>
	привет форумчане. статья может быть полезна для начинающих разрабов и тех, кто недавно столкнулся с опенкартом
</p>

<p>
	<span style="color:#1abc9c;"><span style="font-size:36px;"><strong>штатный кэш опенкарта</strong></span></span>
</p>

<p>
	<span style="font-size:26px;"><b>1. ocmod</b></span>
</p>

<p>
	обновляется в админке. меню слева - расширения - модификаторы.
</p>

<p>
	обновить можно следующим образом
</p>

<p>
	<img alt="Screenshot_1.png.7f7fe02e6c4f33edfd8fc9bc91fa3d5f.png" class="ipsImage ipsImage_thumbnailed" data-fileid="686352" data-ratio="52.40" style="width:500px;height:auto;" width="947" data-src="https://opencartforum.com/storage/attachment/monthly_2021_10/Screenshot_1.png.7f7fe02e6c4f33edfd8fc9bc91fa3d5f.png" src="https://opencartforum.com/applications/core/interface/js/spacer.png" /></p>

<p>
	 
</p>

<p>
	<span style="color:#3498db;">рекомендации: </span>
</p>

<ul><li>
		когда сайту плохо и вы получаете 404 можно сделать очистку всех модификаторов - нажав на желтую кнопку с ластиком, чтобы убедиться, что дело не в них
	</li>
	<li>
		в бд в таблице oc_modification колонка xml легко поддается поиску через интерфейс phpMyAdmin
	</li>
	<li>
		перед работой с сайтом желательно сохранить все модифицированный файлы - storage/modification
	</li>
</ul><p>
	 
</p>

<p>
	<span style="font-size:26px;"><strong>2. twig and sass cache (3.x)</strong></span>
</p>

<p>
	<abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">opencart</abbr></abbr> и <a href="https://opencartforum.com/opencart/" rel="">ocstore</a> 3 ветки обзавелся twig шаблонизатором, который умеет кэшироваться
</p>

<p>
	настраивается это в админке. в левом меню пункт панель состояния
</p>

<p>
	<img alt="Screenshot_2.png.fa15db708965166bc1663c08a3b7e74e.png" class="ipsImage ipsImage_thumbnailed" data-fileid="686353" data-ratio="46.80" style="width:500px;height:auto;" width="945" data-src="https://opencartforum.com/storage/attachment/monthly_2021_10/Screenshot_2.png.fa15db708965166bc1663c08a3b7e74e.png" src="https://opencartforum.com/applications/core/interface/js/spacer.png" /></p>

<p>
	<img alt="Screenshot_3.png.dff07c8743d3b1f9b6e57b043d849195.png" class="ipsImage ipsImage_thumbnailed" data-fileid="686354" data-ratio="37.40" style="width:500px;height:auto;" width="966" data-src="https://opencartforum.com/storage/attachment/monthly_2021_10/Screenshot_3.png.dff07c8743d3b1f9b6e57b043d849195.png" src="https://opencartforum.com/applications/core/interface/js/spacer.png" /></p>

<p>
	 
</p>

<p>
	<span style="color:#3498db;">рекомендации: </span>отключить перед работой с сайтом. после завершения не забыть включить
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:26px;">3. <abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">opencart</abbr></abbr> file/mem cache</span></strong>
</p>

<p>
	 
</p>

<p>
	библиотека для разработчиков. которая используется так
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">$this-&gt;cache-&gt;set('test','value');
$val = $this-&gt;cache-&gt;get('test');</span></pre>

<p>
	содержимое кэша по умолчанию находится в system/storage/cache
</p>

<p>
	для файлового кэша очищается посредством удаления содержимого папки
</p>

<p>
	для мемкэша очищается вызовом пары команд в консоле. это легко гуглится
</p>

<p>
	в этот хранилище обычно кэшируется языки, валюты и меню сайта
</p>

<p>
	 
</p>

<p>
	<span style="color:#3498db;">рекомендации:</span> можно кэшировать любой статический контент сайта, например футер или блок преимуществ
</p>

<p>
	по возможности используйте мемкэш или редис, если вы используете файловый кэш - ssd и m.2 в помощь
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:26px;">4. image cache</span></strong>
</p>

<p>
	<abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">опенкарт</abbr></abbr> создает кэш изображений под размеры указанные в настройках темы
</p>

<p>
	этот кэш находится в <em>image/cache. </em>чтобы очистить - удалите содержимое этой папки
</p>

<p>
	 
</p>

<p>
	<span style="color:#3498db;">рекомендации:</span> не избыточное разрешение, webp и отложенная загрузка изображений. ну и верный <em><strong>Cache-control</strong></em> для изображений от сервера
</p>

<p>
	 
</p>

<p>
	<span style="font-size:26px;"><strong>5. design/theme (3.x)</strong></span>
</p>

<p>
	этот инструмент кэширует представления(view) в бд
</p>

<p>
	находится в левом меню. дизайн - редактор шаблона
</p>

<p>
	на скрине ниже можно увидеть, что файл account/account закэширован
</p>

<p>
	изменение этого файла на сервере не даст ожидаемого результата
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="686355" href="https://opencartforum.com/storage/attachment/monthly_2021_10/Screenshot_4.png.43f832ba0ace6704cca594f8ef28bdbd.png" rel=""><img alt="Screenshot_4.thumb.png.31b5e7abe1cbbf1d26e7e1a57fc80ea5.png" class="ipsImage ipsImage_thumbnailed" data-fileid="686355" data-ratio="44.29" style="width:700px;height:auto;" width="1000" data-src="https://opencartforum.com/storage/attachment/monthly_2021_10/Screenshot_4.thumb.png.31b5e7abe1cbbf1d26e7e1a57fc80ea5.png" src="https://opencartforum.com/applications/core/interface/js/spacer.png" /></a>
</p>

<p>
	 
</p>

<p>
	<span style="color:#3498db;">рекомендации:</span> желательно не использовать вовсе
</p>

<p>
	 
</p>

<p>
	<strong><span style="font-size:26px;">6. внештатные дополнения для кэширования</span></strong>
</p>

<p>
	тут наши полномочия все. следуйте рекомендациям автора и читайте руководства к модулям
</p>

<p>
	 
</p>

<p>
	<span style="color:#3498db;">рекомендации:</span> <em>чтобы сделать ваш сайт быстрым нужен индивидуальный подход. общие решения не дадут нужного эффекта. тут зеленыЙ прав</em>
</p>

<p>
	 
</p>

<p>
	<span style="color:#1abc9c;"><span style="font-size:36px;"><strong>клиентский кэш</strong></span></span>
</p>

<p>
	это кэш вашего браузера. заголовок ответа сервера <strong><em>Cache-control</em> </strong>является инструкцией для браузера
</p>

<p>
	пример блока из конфига для <em>nginx</em>, который отдаст инструкцию браузеру к кэшированию js, css, jpeg на 72 часа
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">location ~* \.(css|js|gif|jpeg|jpg|png)$ {
       expires 3d;
       access_log off;
       add_header Pragma public;
       add_header Cache-Control "public, max-age=259200";
       add_header X-Asset "yes";
   }</span></pre>

<p>
	 
</p>

<p>
	этот кэш <strong>отключается</strong> следующим образом для google chrome:
</p>

<p>
	1. нажатие хоткея CTRL + F5 приведет к перезагрузке страницы со сбросом кэша
</p>

<p>
	2. отключаем кэширование браузера в инструментах разработчика. под спойлером
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Спойлер</span>
	</div>

	<div class="ipsSpoiler_contents">
		<p>
			1. жмем F12 - открытие панели разработчика
		</p>

		<p>
			2. затем в появившемся окне ищем вкладку network. нажимаем на нее
		</p>

		<p>
			3. ставим галочку возле <em>disable cache</em>
		</p>

		<p>
			4. жмем F12 чтобы закрыть панель разработчика
		</p>

		<p>
			<img alt="Screenshot_5.png.fa9388816bdbaf955576a5fd376100fb.png" class="ipsImage ipsImage_thumbnailed" data-fileid="686356" data-ratio="36.86" style="width:700px;height:auto;" width="958" data-src="https://opencartforum.com/storage/attachment/monthly_2021_10/Screenshot_5.png.fa9388816bdbaf955576a5fd376100fb.png" src="https://opencartforum.com/applications/core/interface/js/spacer.png" /></p>
	</div>
</div>

<p>
	 
</p>

<p>
	поправляйте если где-то ошибаюсь <img alt=":)" data-emoticon="" height="20" src="https://opencartforum.com/storage/smiles/emoticons/test_smile.png" srcset="https://opencartforum.com/storage/smiles/emoticons/smile@2x.png 2x" title=":)" width="20" /></p>

<p>
	<img alt="Screenshot_6.png.9ec650efa2b509d800d1951f910e1e73.png" class="ipsImage ipsImage_thumbnailed" data-fileid="686359" data-ratio="86.50" style="width:200px;height:auto;" width="453" data-src="https://opencartforum.com/storage/attachment/monthly_2021_10/Screenshot_6.png.9ec650efa2b509d800d1951f910e1e73.png" src="https://opencartforum.com/applications/core/interface/js/spacer.png" /></p>]]></description><guid isPermaLink="false">446</guid><pubDate>Wed, 27 Oct 2021 15:07:59 +0000</pubDate></item><item><title>&#x43F;&#x440;&#x43E;&#x433;&#x440;&#x430;&#x43C;&#x43C;&#x43D;&#x43E;&#x435; &#x43E;&#x431;&#x43D;&#x43E;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x43C;&#x43E;&#x434;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x43E;&#x440;&#x43E;&#x432;</title><link>https://opencartforum.com/blogs/entry/435-programmnoe-obnovlenie-modifikatorov/</link><description><![CDATA[<p>
	при работе с опенкартом всегда возникает необходимость обновлять модифы, после ряда совершенных правок.
</p>

<p>
	делается это для того, чтобы получить актуальный контент
</p>

<p>
	давным давно я решил этот вопрос программно, что избавило меня от кучи головной боли в виде открытия вкладки и нажатия кнопки обновления модифов раз за разом
</p>

<p>
	я решил этот вопрос программно следующим образом. пришло время делиться
</p>

<p>
	 
</p>

<p>
	<span style="color:#1abc9c;"><span style="font-size:24px;">1. авторизация по ссылке</span></span>
</p>

<p>
	<span> </span>быстрая авторизация в админке по ссылке.
</p>

<p>
	 
</p>

<p>
	<span style="color:#c0392b;"><em>перед использованием модификатора <strong>обязательно </strong>изменить эти значения на свои</em></span>
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted">
<span class="pln">$secret_key </span><span class="pun">=</span><span class="pln"> </span><span class="str">'secret_key64587967'</span><span class="pun">;</span><span class="pln">
$secret_val </span><span class="pun">=</span><span class="pln"> </span><span class="str">'eret345dfgc342'</span><span class="pun">;</span></pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	ссылку в админку для обновления модификаторов выглядит следующим образом
</p>

<p>
	<em><strong><a href="https://site.com/admin/index.php?route=common/dashboard&amp;" rel="external nofollow">https://site.com/admin/index.php?route=extension/modification/refresh</a></strong></em>
</p>

<p>
	добавим к этой ссылке нашу секретную пару
</p>

<p>
	<em><strong><a href="https://site.com/admin/index.php?route=extension/modification/refresh&amp;secret_key64587967=eret345dfgc342" rel="external nofollow">https://site.com/admin/index.php?route=extension/modification/refresh&amp;secret_key64587967=eret345dfgc342</a></strong></em>
</p>

<p>
	в вашем случае ссылка должна отличаться
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted">
<span class="pun">&lt;?</span><span class="pln">xml version</span><span class="pun">=</span><span class="str">"1.0"</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;modification&gt;</span><span class="pln">
  </span><span class="tag">&lt;name&gt;</span><span class="pln">fast admin auth fix</span><span class="tag">&lt;/name&gt;</span><span class="pln">
  </span><span class="tag">&lt;code&gt;</span><span class="pln">fast admin auth fix</span><span class="tag">&lt;/code&gt;</span><span class="pln">
  </span><span class="tag">&lt;version&gt;</span><span class="pln">1.3</span><span class="tag">&lt;/version&gt;</span><span class="pln">
  </span><span class="tag">&lt;author&gt;</span><span class="pln">kJluk</span><span class="tag">&lt;/author&gt;</span><span class="pln">
  </span><span class="tag">&lt;link&gt;</span><span class="pln">cleanphp.ru</span><span class="tag">&lt;/link&gt;</span><span class="pln">
  </span><span class="tag">&lt;file</span><span class="pln"> </span><span class="atn">path</span><span class="pun">=</span><span class="atv">"admin/controller/common/login.php"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;operation&gt;</span><span class="pln">
      </span><span class="tag">&lt;search&gt;</span><span class="pln">&lt;![CDATA[public function index() {]]&gt;</span><span class="tag">&lt;/search&gt;</span><span class="pln">
      </span><span class="tag">&lt;add</span><span class="pln"> </span><span class="atn">position</span><span class="pun">=</span><span class="atv">"after"</span><span class="tag">&gt;</span><span class="pln">&lt;![CDATA[
		//обязательно измените эти значения!
        $secret_key = 'secret_key64587967';
        $secret_val = 'eret345dfgc342';
       
        
        if(isset($this-&gt;request-&gt;get[$secret_key]) &amp;&amp; $this-&gt;request-&gt;get[$secret_key]==$secret_val)
		{   
           $this-&gt;session-&gt;data['user_id'] = 1;
           $token = token(32);
           $this-&gt;session-&gt;data['token'] = $token;
           
           $url=HTTPS_SERVER.'index.php?';
           $params = array('token' =&gt; $token);
           
           if(!empty($this-&gt;request-&gt;get['route']))
                $params['route']=$this-&gt;request-&gt;get['route'];
           
           $this-&gt;response-&gt;redirect($url.http_build_query($params));
		}   
      ]]&gt;</span><span class="tag">&lt;/add&gt;</span><span class="pln">
    </span><span class="tag">&lt;/operation&gt;</span><span class="pln">
  </span><span class="tag">&lt;/file&gt;</span><span class="pln">
</span><span class="tag">&lt;/modification&gt;</span></pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<span style="color:#1abc9c;"><span style="font-size:24px;">2. Запрос к обновлению модифов используя авторизацию по ссылке</span></span>
</p>

<p>
	эта функция, которые прекрасно скушает 302 редирект, после успешной авторизации
</p>

<p>
	путь к куки должен быть ваш. куки должен лежать в какой-то закрытой папке
</p>

<p>
	ее необходимо разместить в system/library/helper.php. возможно это правильно сделать модификатором, но мне лень
</p>

<p>
	 
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">function curlWihteRedir($url)
{
  //путь к куки должен быть ваш
  $path_to_cookie = '/path_to_cookie/cookies.rip';

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url );
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  
  curl_setopt($ch, CURLOPT_COOKIEJAR, $path_to_cookie);
  curl_setopt($ch, CURLOPT_COOKIEFILE, $path_to_cookie);
  curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  $response = curl_exec($ch );
  curl_close($ch);
  return $response;
}</span></pre>

<p>
	 
</p>

<p>
	<span style="color:#1abc9c;"><span style="font-size:24px;">3. Использование</span></span>
</p>

<p>
	вызываем функцию с ссылкой, которую получили в 1п для быстрой авторизации.
</p>

<p>
	обычно вызывать функцию нужно в начале метода контроллера
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">curlWihteRedir(HTTPS_SERVER."index.php?route=extension/modification/refresh&amp;secret_key64587967=eret345dfgc342");</span></pre>

<p>
	 
</p>]]></description><guid isPermaLink="false">435</guid><pubDate>Fri, 01 Oct 2021 07:00:52 +0000</pubDate></item><item><title>&#x43A;&#x430;&#x441;&#x442;&#x43E;&#x43C;&#x43D;&#x44B;&#x439; getProducts &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x442;&#x435;&#x433;&#x43E;&#x440;&#x438;&#x438;</title><link>https://opencartforum.com/blogs/entry/421-kastomnyy-getproducts-dlya-kategorii/</link><description><![CDATA[<p>
	catalog/model/catalog/product.php
</p>

<p>
	метод getProducts имеет следующий цикл
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">foreach ($query-&gt;rows as $result) {
	$product_data[$result['product_id']] = $this-&gt;getProduct($result['product_id']);
}</span></pre>

<p>
	те на каждый товар категории у нас создается отдельный запрос с кучей условий. как избавится от порождения кучи новых запросов?
</p>

<p>
	получить все в одном запросе. без цикличного вызова метода getProduct
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">foreach ($query-&gt;rows as $result) {
	$product_data[$result['product_id']] = $result;
}</span></pre>

<p>
	в родном запросе мы получим<b>: id, рейтинг, акцию и дискаунт</b>
</p>

<p>
	в моем случае для категории мне нужно:  <strong>количество, изображение, <strong>название товара, id , </strong><strong>цена</strong></strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">//исходный
$sql = "SELECT p.product_id, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$this-&gt;config-&gt;get('config_customer_group_id') . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start &lt; NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end &gt; NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this-&gt;config-&gt;get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start &lt; NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end &gt; NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special";</span></pre>

<p>
	 
</p>

<p>
	заменим
</p>

<p>
	<em>SELECT p.product_id</em>
</p>

<p>
	на
</p>

<p>
	<em>SELECT p.product_id, p.image, p.price, p.quantity, pd.name</em>
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">$sql = "SELECT p.product_id, p.image, p.price, p.quantity, pd.name, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$this-&gt;config-&gt;get('config_customer_group_id') . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start &lt; NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end &gt; NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this-&gt;config-&gt;get('config_customer_group_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start &lt; NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end &gt; NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special";</span></pre>

<p>
	 
</p>

<p>
	//тесты
</p>

<p>
	 
</p>

<p>
	10 срезов по ttfb показали
</p>

<p>
	категория 50 товаров. 62.8 =&gt; 23.5 ms
</p>

<p>
	категория 30 товаров: 45.8 =&gt; 22.7 ms
</p>

<p>
	 
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">$startTime = microtime(true);

$query = $this-&gt;db-&gt;query($sql);
foreach ($query-&gt;rows as $result) {
	$product_data[$result['product_id']] = $result;
	//$product_data[$result['product_id']] = $this-&gt;getProduct($result['product_id']);
}

$msec = (microtime(true) - $startTime)*1000;

if($_SERVER['REMOTE_ADDR']=='ваш айпи')
{
	echo round($msec,2);
	exit();
}</span></pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>]]></description><guid isPermaLink="false">421</guid><pubDate>Thu, 05 Aug 2021 13:51:00 +0000</pubDate></item><item><title>redis cache opencart</title><link>https://opencartforum.com/blogs/entry/384-redis-cache-opencart/</link><description><![CDATA[<p>
	недавно увидел что на официальном сайте продается драйвер под редис. ссылку прикладывать не буду
</p>

<p>
	а вот тот самый редис, который уже давно есть на гитхабе (с 6 июля 2017 года)
</p>

<p>
	<a href="https://github.com/opencart/opencart/blob/master/upload/system/library/cache/redis.php" rel="external nofollow">https://github.com/opencart/opencart/blob/master/upload/system/library/cache/redis.php</a>
</p>

<p>
	 
</p>

<p>
	<strong>как кеш опенкарта делегировать редису?</strong>
</p>

<p>
	чтобы заставить работать редис на своем сервере необходимо 
</p>

<p>
	 
</p>

<p>
	1. установить редис и добавить его в список автозагрузки, установить php модуль для редиса . для разных осей комманды могут отличаться. гугл в помощь!
</p>

<p>
	2. <em>актуально для всей ветки 2х ocstore/opencart. в 3х версии окстор и опенкарт драйвер  уже есть</em>
</p>

<p>
	создаем файл <strong><a href="https://github.com/opencart/opencart/blob/master/upload/system/library/cache/redis.php" rel="external nofollow">system/library/cache/redis.php</a> </strong>содержимое вот <a href="https://github.com/opencart/opencart/blob/master/upload/system/library/cache/redis.php" rel="external nofollow">https://github.com/opencart/opencart/blob/master/upload/system/library/cache/redis.php</a>
</p>

<p>
	3. создаем файл <strong>redis_test.php</strong> в корневой директории сайта, вызывать его будем следующим образом <strong><a href="https://site.com/redis_test.php" rel="external nofollow">https://site.com/redis_test.php</a></strong>
</p>

<p>
	это мы делаем, для того, чтобы протестировать редис перед включением, чтобы избежать краша магазина
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pun">&lt;?</span><span class="pln">php
ini_set</span><span class="pun">(</span><span class="str">'display_errors'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'1'</span><span class="pun">);</span><span class="pln">
ini_set</span><span class="pun">(</span><span class="str">'display_startup_errors'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'1'</span><span class="pun">);</span><span class="pln">
error_reporting</span><span class="pun">(</span><span class="pln">E_ALL</span><span class="pun">);</span><span class="pln">

include __DIR__</span><span class="pun">.</span><span class="str">'/system/library/cache/redis.php'</span><span class="pun">;</span><span class="pln">
$expire </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5000</span><span class="pun">;</span><span class="pln">

</span><span class="com">//namespace opencart 4 O_O</span><span class="pln">
$obj_redis </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Opencart</span><span class="pln">\System\Library\Cache\Redis</span><span class="pun">(</span><span class="pln">$expire</span><span class="pun">);</span><span class="pln">
</span><span class="com">//namespace opencart 3x</span><span class="pln">
</span><span class="com">//$obj_redis = new Cache\Redis($expire);</span><span class="pln">

$obj_redis</span><span class="pun">-&gt;</span><span class="kwd">set</span><span class="pun">(</span><span class="str">'key'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'REDIS WORK FINE'</span><span class="pun">);</span><span class="pln">
$res </span><span class="pun">=</span><span class="pln"> $obj_redis</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'key'</span><span class="pun">);</span><span class="pln">
echo $res</span><span class="pun">;</span></pre>

<p>
	сохраняем файл. открываем браузер и вызываем <strong><a href="https://site.com/redis_test.php" rel="external nofollow">https://site.com/redis_test.php</a></strong>
</p>

<p>
	если видим <strong>REDIS WORK FINE</strong> то сразу к следующему пункту
</p>

<p>
	ошибки, которые могут говорить о
</p>

<ul><li>
		криво установленном редисе =&gt; пункт 1
	</li>
	<li>
		отсутствии файла =&gt; пункт 2
	</li>
	<li>
		не забывайте. что редис должен быть включен и установлен пхп модуль редис
	</li>
</ul><p>
	 
</p>

<p>
	 
</p>

<p>
	4. этот пункт выполняем только в случае, если в п3 видим <strong>REDIS WORK FINE</strong>
</p>

<p>
	в конфиге по пути <strong>ocs23/system/config/default.php </strong>
</p>

<p>
	находим строку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">$_['cache_type']           = 'file'; // apc, file or mem</span></pre>

<p>
	и меняем на 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">$_['cache_type']           = 'redis'; // apc, file or mem</span></pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>]]></description><guid isPermaLink="false">384</guid><pubDate>Mon, 11 Jan 2021 13:25:00 +0000</pubDate></item><item><title>&#x43A;&#x43E;&#x440;&#x43E;&#x431;&#x43E;&#x447;&#x43D;&#x44B;&#x439; cache</title><link>https://opencartforum.com/blogs/entry/379-korobochnyy-cache/</link><description><![CDATA[<p>
	использовать родной кеш можно следующим образом
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">$this-&gt;cache-&gt;get($key);
$this-&gt;cache-&gt;set($key);
$this-&gt;cache-&gt;delete($key);</span></pre>

<p>
	настройки родного кеша хранятся тут <strong><em>system/config/default.php</em></strong>
</p>

<p>
	по умолчанию в ocstore 2.3 кеш файловый, который живет один час
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">$_['cache_type']           = 'file'; // apc, file or mem
$_['cache_expire']         = 3600;</span></pre>

<p>
	 
</p>

<p>
	<strong>file       </strong>- файловый кеш (значения хранятся в файлах). ссдшник кстати поди ускоряет работу этого кеша
</p>

<p>
	<strong>mem    </strong>- кеш хранящийся в оперативной памяти, етесно он быстрее чем файловый
</p>

<p>
	<strong>apc      </strong>- честно не знаю, что это за тип, но гугл говорит - <span style="background-color:#ffffff;color:#4d5156;font-size:14px;text-align:left;">APC (Alternative<span> </span></span><em style="background-color:#ffffff;color:#5f6368;font-size:14px;text-align:left;">PHP Cache</em><span style="background-color:#ffffff;color:#4d5156;font-size:14px;text-align:left;">) - бесплатный и открытый opcode кэшер для PHP.</span>
</p>

<p>
	 
</p>

<p>
	инициализируется родной кеш в файле <strong><em>system/framework.php</em></strong> для того, чтобы он был доступен для использования в любом контроллере
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">$registry-&gt;set('cache', new Cache($config-&gt;get('cache_type'), $config-&gt;get('cache_expire')));</span></pre>

<p>
	чтобы использовать своей кеш, который будет жить сутки, можно сделать так
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">$mycache = new Cache('file', 60*60*24);
$mycache-&gt;set('test',1);</span></pre>

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

<p>
	 
</p>]]></description><guid isPermaLink="false">379</guid><pubDate>Sat, 19 Dec 2020 20:45:24 +0000</pubDate></item><item><title>&#x43E;&#x442;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x430;&#x44F; &#x43C;&#x43E;&#x434;&#x430;&#x43B;&#x43A;&#x430; &#x43D;&#x430; &#x434;&#x436;&#x441;&#x435;</title><link>https://opencartforum.com/blogs/entry/377-otlozhennaya-modalka-na-dzhse/</link><description><![CDATA[<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="kwd">var</span><span class="pln"> delay_sec </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">60</span><span class="pun">;</span><span class="pln"> </span><span class="com">// 10 min</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> init_delayed_modal</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">var</span><span class="pln"> first_visit_time </span><span class="pun">=</span><span class="pln"> get_cookie</span><span class="pun">(</span><span class="str">'first_visit_time'</span><span class="pun">);</span><span class="pln">
	</span><span class="kwd">var</span><span class="pln"> current_time </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Date</span><span class="pun">().</span><span class="pln">getTime</span><span class="pun">()</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">var</span><span class="pln"> time_passed</span><span class="pun">;</span><span class="pln">

	</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">first_visit_time </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">)</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
		</span><span class="com">// first time visit</span><span class="pln">
		create_cookie</span><span class="pun">(</span><span class="str">'first_visit_time'</span><span class="pun">,</span><span class="pln"> current_time</span><span class="pun">);</span><span class="pln">
		setTimeout</span><span class="pun">(</span><span class="pln">show_modal</span><span class="pun">,</span><span class="pln">delay_sec </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
	</span><span class="kwd">else</span><span class="pln"> 
	</span><span class="pun">{</span><span class="pln">
		</span><span class="com">// two and more time visit</span><span class="pln">
		time_passed </span><span class="pun">=</span><span class="pln"> current_time </span><span class="pun">-</span><span class="pln"> first_visit_time</span><span class="pun">;</span><span class="pln">

		</span><span class="com">//if time left</span><span class="pln">
		</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">time_passed</span><span class="pun">&gt;</span><span class="pln">delay_sec</span><span class="pun">)</span><span class="pln">
			show_modal</span><span class="pun">();</span><span class="pln">
		</span><span class="kwd">else</span><span class="pln">
			setTimeout</span><span class="pun">(</span><span class="pln">show_modal</span><span class="pun">,(</span><span class="pln">delay_sec </span><span class="pun">-</span><span class="pln"> time_passed</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> show_modal</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="com">// set cookie and show modal</span><span class="pln">
	create_cookie</span><span class="pun">(</span><span class="str">'modal_alredy_show'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
	alert</span><span class="pun">(</span><span class="str">'modal'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">//https://stackoverflow.com/questions/1458724/how-do-i-set-unset-a-cookie-with-jquery</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> get_cookie</span><span class="pun">(</span><span class="pln">name</span><span class="pun">)</span><span class="pln"> 
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">var</span><span class="pln"> matches </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">cookie</span><span class="pun">.</span><span class="pln">match</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">RegExp</span><span class="pun">(</span><span class="pln">
		</span><span class="str">"(?:^|; )"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> name</span><span class="pun">.</span><span class="pln">replace</span><span class="pun">(</span><span class="str">/([\.$?*|{}\(\)\[\]\\/\+^])/</span><span class="pln">g</span><span class="pun">,</span><span class="pln"> </span><span class="str">'\$1'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">"=([^;]*)"</span><span class="pln">
		</span><span class="pun">));</span><span class="pln">
	</span><span class="kwd">return</span><span class="pln"> matches </span><span class="pun">?</span><span class="pln"> decodeURIComponent</span><span class="pun">(</span><span class="pln">matches</span><span class="pun">[</span><span class="lit">1</span><span class="pun">])</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">//https://stackoverflow.com/questions/1458724/how-do-i-set-unset-a-cookie-with-jquery</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> create_cookie</span><span class="pun">(</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> value</span><span class="pun">,</span><span class="pln"> days</span><span class="pun">)</span><span class="pln"> 
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">var</span><span class="pln"> expires</span><span class="pun">;</span><span class="pln">

	</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">days</span><span class="pun">)</span><span class="pln"> 
	</span><span class="pun">{</span><span class="pln">
		</span><span class="kwd">var</span><span class="pln"> date </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Date</span><span class="pun">();</span><span class="pln">
		date</span><span class="pun">.</span><span class="pln">setTime</span><span class="pun">(</span><span class="pln">date</span><span class="pun">.</span><span class="pln">getTime</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">days </span><span class="pun">*</span><span class="pln"> </span><span class="lit">24</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">60</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">60</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">));</span><span class="pln">
		expires </span><span class="pun">=</span><span class="pln"> </span><span class="str">"; expires="</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> date</span><span class="pun">.</span><span class="pln">toGMTString</span><span class="pun">();</span><span class="pln">
	</span><span class="pun">}</span><span class="pln"> 
	</span><span class="kwd">else</span><span class="pln"> 
		expires </span><span class="pun">=</span><span class="pln"> </span><span class="str">""</span><span class="pun">;</span><span class="pln">

	document</span><span class="pun">.</span><span class="pln">cookie </span><span class="pun">=</span><span class="pln"> encodeURIComponent</span><span class="pun">(</span><span class="pln">name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">"="</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> encodeURIComponent</span><span class="pun">(</span><span class="pln">value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> expires </span><span class="pun">+</span><span class="pln"> </span><span class="str">"; path=/"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">get_cookie</span><span class="pun">(</span><span class="str">'modal_alredy_show'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">)</span><span class="pln">
	init_delayed_modal</span><span class="pun">();</span></pre>

<p>
	 
</p>

<p>
	допустим нам необходимо однократно показать юзеру сообщение спустя 10 минут нахождения на сайте. чистый джс
</p>]]></description><guid isPermaLink="false">377</guid><pubDate>Sat, 12 Dec 2020 22:57:00 +0000</pubDate></item></channel></rss>
