<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x41F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x44B;&#x435; &#x434;&#x43E;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x445; &#x442;&#x435;&#x43C;</title><link>http://opencartpascha.ru/forum/79-poleznye-dorabotki/</link><description>&#x41F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x44B;&#x435; &#x434;&#x43E;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x438; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x445; &#x442;&#x435;&#x43C;</description><language>ru</language><item><title>&#x41A;&#x430;&#x43A; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x43D;&#x43E;&#x432;&#x43E;&#x433;&#x43E; &#x430;&#x434;&#x43C;&#x438;&#x43D;&#x430; Opencart  &#x447;&#x435;&#x440;&#x435;&#x437; &#x431;&#x430;&#x437;&#x443; SQL</title><link>http://opencartpascha.ru/topic/2568-%D0%BA%D0%B0%D0%BA-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-%D0%B0%D0%B4%D0%BC%D0%B8%D0%BD%D0%B0-opencart-%D1%87%D0%B5%D1%80%D0%B5%D0%B7-%D0%B1%D0%B0%D0%B7%D1%83-sql/</link><description><![CDATA[<p>Вам нужно войти в админку Opencart, но вы не знаете пароля и имеете доступ к базе данных сайта? Тогда вам нужно выполнить простой SQL-запрос, который добавт нового админа для вашего сайта на Opencart.</p><p></p><p>Выполнив этот запрос к базе данных вы создадите админа с данными:<br><em>Логин </em>- <strong>admin2</strong><br><em>Пароль</em> - <strong>admin</strong></p><p></p><pre spellcheck="" class="ipsCode language-plaintext" data-language="Plain Text"><code>INSERT INTO oc_user VALUES (9999, 1, 'admin2', '21232f297a57a5a743894a0e4a801fc3', '', 'firstname', 'lastname', 'myemail@site.com', ' ', ' ', '0.0.0.0', 1, CURDATE());
</code></pre>]]></description><guid isPermaLink="false">2568</guid><pubDate>Mon, 20 Apr 2026 05:53:11 +0000</pubDate></item><item><title>&#x41A;&#x430;&#x43A; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x441;&#x43A;&#x438;&#x434;&#x43A;&#x443; &#x432; &#x43F;&#x440;&#x43E;&#x446;&#x435;&#x43D;&#x442;&#x430;&#x445; &#x434;&#x43B;&#x44F; &#x43A;&#x430;&#x442;&#x435;&#x433;&#x43E;&#x440;&#x438;&#x439; &#x438; &#x43C;&#x43E;&#x434;&#x443;&#x43B;&#x435;&#x439;</title><link>http://opencartpascha.ru/topic/1868-%D0%BA%D0%B0%D0%BA-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D1%81%D0%BA%D0%B8%D0%B4%D0%BA%D1%83-%D0%B2-%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D0%BD%D1%82%D0%B0%D1%85-%D0%B4%D0%BB%D1%8F-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B9-%D0%B8-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5%D0%B9/</link><description><![CDATA[<p>
	Для первого раза можно взять любой файл модуля, категории, либо страницы товаров со скидкой.
</p>

<p>
	 
</p>

<p>
	В этой статье будем использовать файлы:
</p>

<p>
	<strong>/catalog/controller/module/special.php</strong>
</p>

<p>
	<strong>/catalog/view/theme/default/template/module/special.tpl</strong>
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<strong>Шаг №1. Вносим коррективы в контроллер - (/catalog/controller/module/special.php)</strong>
</p>

<p>
	 
</p>

<p>
	Находим:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if ((float)$result['special']) {$special = $this-&gt;currency-&gt;format($this-&gt;tax-&gt;calculate($result['special'], $result['tax_class_id'], $this-&gt;config-&gt;get('config_tax')));} else {$special = false;}</span></pre>

<p>
	И заменяем на:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if ((float)$result['special']) {$special = $this-&gt;currency-&gt;format($this-&gt;tax-&gt;calculate($result['special'], $result['tax_class_id'], $this-&gt;config-&gt;get('config_tax')));$skidka = round(100-($result['special']/($result['price']/100)));} else {$skidka = false;$special = false;}</span></pre>

<p>
	После находим:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['products'][] = array(</span></pre>

<p>
	Под строкой:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'special' =&gt; $special,</span></pre>

<p>
	Вставляем:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'skidka' =&gt; $skidka,</span></pre>

<p>
	Внимание! Некоторые модули место $result используют $product_info, в таком случае меняем строку:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$skidka = round(100-($result['special']/($result['price']/100)));</span></pre>

<p>
	на
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$skidka = 100-($product_info['special']/($product_info['price']/100));</span></pre>

<p>
	Шаг №2. Вносим правки в шаблон (/catalog/view/theme/default/template/module/special.tpl)
</p>

<p>
	 
</p>

<p>
	Ищем:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"price-old"</span><span class="tag">&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $product</span><span class="pun">[</span><span class="str">'price'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/span&gt;&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"price-new"</span><span class="tag">&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $product</span><span class="pun">[</span><span class="str">'special'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/span&gt;</span></pre>

<p>
	Добавляем:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"procent"</span><span class="tag">&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $product</span><span class="pun">[</span><span class="str">'skidka'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">%</span><span class="tag">&lt;/span&gt;</span></pre>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<strong>Как добавить скидку в процентах для карточки товара?</strong>
</p>

<p>
	 
</p>

<p>
	<strong>Шаг №1. Меняем код в контроллере - (/catalog/controller/product/product.php)</strong>
</p>

<p>
	 
</p>

<p>
	Находим:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if ((float)$product_info['special']) {$this-&gt;data['special'] = $this-&gt;currency-&gt;format($this-&gt;tax-&gt;calculate($product_info['special'], $product_info['tax_class_id'], $this-&gt;config-&gt;get('config_tax')));} else {$this-&gt;data['special'] = false;}</span></pre>

<p>
	И заменяем на:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if ((float)$product_info['special']) {$this-&gt;data['special'] = $this-&gt;currency-&gt;format($this-&gt;tax-&gt;calculate($product_info['special'], $product_info['tax_class_id'], $this-&gt;config-&gt;get('config_tax')));$this-&gt;data['skidka'] = round(100-($product_info['special']/($product_info['price']/100)));} else {$this-&gt;data['special'] = false;$this-&gt;data['skidka'] = false;}</span></pre>

<p>
	<strong><span style="color:#d35400;">Внимание! </span></strong>Для Opencart 2.x меняем строку:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$this-&gt;data['skidka'] = round(100-($product_info['special']/($product_info['price']/100)));</span></pre>

<p>
	на:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['skidka'] = 100-($product_info['special']/($product_info['price']/100));</span></pre>

<p>
	Шаг №2. Редактируем шаблон карточки товара (/catalog/view/theme/default/template/product/product.tpl)
</p>

<p>
	 
</p>

<p>
	Находим:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"price-old"</span><span class="tag">&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $product</span><span class="pun">[</span><span class="str">'price'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/span&gt;&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"price-new"</span><span class="tag">&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $product</span><span class="pun">[</span><span class="str">'special'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/span&gt;</span></pre>

<p>
	И добавляем ниже или выше:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"procent"</span><span class="tag">&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $product</span><span class="pun">[</span><span class="str">'skidka'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">%</span><span class="tag">&lt;/span&gt;</span></pre>

<p>
	После чего Вы можете смело настраивать остальные модули и страницы, которые выводят товар.
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">1868</guid><pubDate>Fri, 27 Sep 2024 14:37:05 +0000</pubDate></item><item><title>&#x41A;&#x430;&#x43A; &#x432;&#x44B;&#x432;&#x435;&#x441;&#x442;&#x438; &#x43A;&#x43E;&#x43B;&#x438;&#x447;&#x435;&#x441;&#x442;&#x432;&#x43E; &#x43F;&#x43E;&#x43A;&#x443;&#x43F;&#x43E;&#x43A; &#x442;&#x43E;&#x432;&#x430;&#x440;&#x430; &#x432; Opencart 2.x</title><link>http://opencartpascha.ru/topic/1840-%D0%BA%D0%B0%D0%BA-%D0%B2%D1%8B%D0%B2%D0%B5%D1%81%D1%82%D0%B8-%D0%BA%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE-%D0%BF%D0%BE%D0%BA%D1%83%D0%BF%D0%BE%D0%BA-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0-%D0%B2-opencart-2x/</link><description><![CDATA[<p style="background-color:#ffffff;color:#333333;font-size:14px;">
	У нас стоит задача: вывести в списке товаров или в карточке товара "Куплено N раз". Для этого мы напишем функцию которую пропишем в catalog/model/catalog/product.php
</p>

<p style="background-color:#ffffff;color:#333333;font-size:14px;">
	 
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">public function getCountPurchased($product_id) {
<span>		</span>$sql = "SELECT SUM(quantity) as qty FROM " . DB_PREFIX . "order_product  WHERE product_id='$product_id'";
<span>		</span>$query = $this-&gt;db-&gt;query($sql);
<span>		</span>$qty = $query-&gt;rows;
<span>		</span>return $qty[0]['qty'];
<span>	</span>}</pre>

<p style="background-color:#ffffff;color:#333333;font-size:14px;">
	Теперь нам можно обращаться к этой функции из любого контроллера.
</p>
]]></description><guid isPermaLink="false">1840</guid><pubDate>Wed, 28 Aug 2024 00:57:17 +0000</pubDate></item><item><title>&#x41A;&#x430;&#x43A; &#x432;&#x44B;&#x432;&#x435;&#x441;&#x442;&#x438; &#x43D;&#x430;&#x437;&#x432;&#x430;&#x43D;&#x438;&#x435; &#x433;&#x440;&#x443;&#x43F;&#x43F;&#x44B; &#x43A;&#x43B;&#x438;&#x435;&#x43D;&#x442;&#x430; &#x432; &#x43B;&#x438;&#x447;&#x43D;&#x43E;&#x43C; &#x43A;&#x430;&#x431;&#x438;&#x43D;&#x435;&#x442;&#x435; Opencart 2.x.</title><link>http://opencartpascha.ru/topic/1839-%D0%BA%D0%B0%D0%BA-%D0%B2%D1%8B%D0%B2%D0%B5%D1%81%D1%82%D0%B8-%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0-%D0%B2-%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D0%BC-%D0%BA%D0%B0%D0%B1%D0%B8%D0%BD%D0%B5%D1%82%D0%B5-opencart-2x/</link><description><![CDATA[<h2 style="background-color:#ffffff;color:#333333;font-size:19px;">
	Это делается очень просто, так как уже существует модель, которая возвращает название группы пользователя, то мы обратимся к ней из контроллера и выведем в представлении.
</h2>

<p style="background-color:#ffffff;color:#333333;font-size:14px;">
	 
</p>

<h3 style="background-color:#ffffff;color:#333333;font-size:19px;">
	Делается это так:
</h3>

<p style="background-color:#ffffff;color:#333333;font-size:14px;">
	1. Открываем файл catalog/controller/account/account.php и перед строкой:
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">$this-&gt;load-&gt;language('account/account');</pre>

<p style="background-color:#ffffff;color:#333333;font-size:14px;">
	вставляем:
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">$customer_group_id = $this-&gt;config-&gt;get('config_customer_group_id');
$this-&gt;load-&gt;model('account/customer_group');
$customer_group_info = $this-&gt;model_account_customer_group-&gt;getCustomerGroup($customer_group_id);
$data['customer_group'] = $customer_group_info['name'];</pre>

<p style="background-color:#ffffff;color:#333333;font-size:14px;">
	2. В файле catalog/view/theme/ваша_тема/template/account/account.tpl в нужном месте выводим название группы:
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">&lt;div&gt;Группа: &lt;?php echo $customer_group; ?&gt;&lt;/div&gt;</pre>
]]></description><guid isPermaLink="false">1839</guid><pubDate>Wed, 28 Aug 2024 00:55:55 +0000</pubDate></item><item><title>C&#x43A;&#x440;&#x438;&#x43F;&#x442; &#x434;&#x43B;&#x44F; &#x43F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x438; &#x43E;&#x442;&#x43F;&#x440;&#x430;&#x432;&#x43A;&#x438; &#x43F;&#x43E;&#x447;&#x442;&#x44B; &#x432; PHP</title><link>http://opencartpascha.ru/topic/1838-c%D0%BA%D1%80%D0%B8%D0%BF%D1%82-%D0%B4%D0%BB%D1%8F-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8-%D0%BE%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B8-%D0%BF%D0%BE%D1%87%D1%82%D1%8B-%D0%B2-php/</link><description><![CDATA[<p>
	Существует ли скрипт, чтобы проверить отправляются ли письма с домена? Конечно существует и не один! Лично я использую этот, пусть не самый навороченный, но в 95% его вполне хватает для того, чтобы выяснить — пашет отправка сообщений через php или нет.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$to = "mail@yandex.ru"; // Тут указываем свою почту

$subject = "e-mail тест"; // Тема письма

// Сообщение

$message = "Это тестовое сообщение.

Если ты можешь его прочитать, значит все ОК?

Конец сообщения.";

// Перенос строк

$message = wordwrap($message, 70);

// возратит TRUE, если письмо успешно передано

// почтовой программе например exim

if (mail($to, $subject, $message)) {

echo("Почта была отправлена … вроде бы");

} else { echo("Увы, но почта не отправлена!");

}</span></pre>

<p>
	Пояснений особо не требуется. Сохраняете код в кодировке UTF-8 без BOM (чтобы иероглифы не вылезали) в php-файл на всякий случай обернув сам код в &lt;?php  ?&gt;, меняете в первой строке email на свой собственный, заливаете на сервак и запускаете.
</p>

<p>
	Если есть явные проблемы — скрипт сразу сообщит. Если же вы получите сообщение об успешной отправке, но при этом письма не будет даже в СПАМе — значит придется копать глубже и искать причину.
</p>

<p>
	 
</p>

<p>
	Так же вы можете воспользоваться сайтом https://www.mail-tester.com/ для тестирования отправки почты.
</p>
]]></description><guid isPermaLink="false">1838</guid><pubDate>Wed, 28 Aug 2024 00:53:37 +0000</pubDate></item><item><title>&#x414;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x44F;&#x435;&#x43C; &#x42D;&#x43C;&#x43E;&#x434;&#x437;&#x438; (Emoji) &#x432; CMS Opencart &#x438;&#x43B;&#x438; OcStore</title><link>http://opencartpascha.ru/topic/1837-%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC-%D1%8D%D0%BC%D0%BE%D0%B4%D0%B7%D0%B8-emoji-%D0%B2-cms-opencart-%D0%B8%D0%BB%D0%B8-ocstore/</link><description><![CDATA[<p style="background-color:#ffffff;color:#333333;font-size:14px;">
	По умолчанию CMS не имеет такой возможности и нам потребуется создать SQL запрос для изменения кодировки в нужных полях, данные пример приведен для версии OcStore.
</p>

<p style="background-color:#ffffff;color:#333333;font-size:14px;">
	Для начала сменим кодировку в файле /system/library/db/mysqli.php,  на
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">$this-&gt;connection-&gt;set_charset("utf8mb4");</pre>

<p style="background-color:#ffffff;color:#333333;font-size:14px;">
	Далее мы делаем SQL запрос в базе данных:
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">ALTER TABLE oc_review CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE oc_review_article CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE oc_article_description CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE oc_blog_category_description CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE oc_category_description CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE oc_information_description CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE oc_product_description CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;</pre>

<p style="background-color:#ffffff;color:#333333;font-size:14px;">
	Проверяем возможность сохранения в тексте и отображение на фронте.
</p>

<p style="background-color:#ffffff;color:#333333;font-size:14px;">
	<font color="#ff0000">Не забываем предварительно сделать бэкап БД и файлов.</font>
</p>
]]></description><guid isPermaLink="false">1837</guid><pubDate>Wed, 28 Aug 2024 00:50:05 +0000</pubDate></item><item><title>&#x41F;&#x43E;&#x43B;&#x435;&#x437;&#x43D;&#x44B;&#x435; SQL &#x437;&#x430;&#x43F;&#x440;&#x43E;&#x441;&#x44B; &#x434;&#x43B;&#x44F; Opencart</title><link>http://opencartpascha.ru/topic/1836-%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D1%8B%D0%B5-sql-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D1%8B-%D0%B4%D0%BB%D1%8F-opencart/</link><description><![CDATA[<h2 style="color:inherit;font-size:19px;">
	Мы собрали полезные SQL запросы для Opencart 2 и Opencart 3
</h2>

<p>
	<font color="#ff0000"><b><span style="font-size:18px;">Важно!!!</span></b><span style="font-size:18px;"><span> </span>Перед любым изменением в базе данных, необходимо делать бэкап базы данных!!! (как сделать бэкап базы данных- на каждом хостинге по своему).</span></font>
</p>

<h4 style="color:inherit;font-size:15px;">
	1. SQL запрос для Opencart, что бы установить количество для всех товаров 0, либо другое кол-во
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE `oc_product` SET `quantity` = 0</pre>

<h4 style="color:inherit;font-size:15px;">
	2. SQL запрос для Opencart, что бы удалить производителей не связанных с товарами
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">DELETE m
FROM oc_manufacturer m
LEFT JOIN oc_product p ON
m.manufacturer_id = p.manufacturer_id
WHERE p.manufacturer_id IS NULL</pre>

<h4 style="color:inherit;font-size:15px;">
	3. Установить количество бонусных баллов для покупки товара равное цене в Opencart
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE `product` SET points = round(price);</pre>

<h4 style="color:inherit;font-size:15px;">
	4. Запрос на удаление всех акций с ценой = 0 в Opencart 3 и Opencart 2
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">DELETE FROM `oc_product_special` WHERE price = 0</pre>

<h4 style="color:inherit;font-size:15px;">
	5. Как изменить количество товара в существующих опциях в opencart:
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE `oc_product_option_value` set `quantity` = 100</pre>

<p>
	 - или с дополнительными условиями
</p>

<p>
	<span style="color:#8e44ad;"><strong>фиолетовым</strong></span><span> </span>добавил строчки с условиями-привязкой к id конкретной категории товаров, конкретных опций или конкретных значений опций. На случай, если Вам нужно эти изменения сделать только для товаров какой-то конкретной группы. если нужно для всех товаров - можете просто убрать фиолетовые строки или проигнорировать (сейчас они закомментированы)
</p>

<p>
	<strong><span style="color:#2ecc71;">100 зеленым</span></strong><span> </span>- новое количество товара этой опции
</p>

<p>
	<strong><span style="color:#2ecc71;">0 зеленым</span></strong><span> </span>- старое количество товара этой опции. изменится на 100.
</p>

<p>
	 
</p>

<p>
	UPDATE oc_product_option_value pov<br />
	LEFT JOIN oc_product_to_category p2c<br />
	  ON pov.product_id = p2c.product_id<br />
	LEFT JOIN oc_option o<br />
	  ON o.option_id = pov.product_option_id<br />
	LEFT JOIN oc_option_value ov<br />
	  ON ov.option_value_id = pov.option_value_id<br />
	SET pov.quantity = <strong><span style="color:#2ecc71;">100</span></strong><br />
	WHERE pov.quantity = <strong><span style="color:#2ecc71;">0</span></strong><br />
	<strong><span style="color:#8e44ad;">-- AND p2c.category_id = 69<br />
	-- AND o.option_id = 14<br />
	-- AND ov.option_value_id = 51 </span></strong>
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	 
</p>

<h4 style="color:inherit;font-size:15px;">
	6. Как привязать все товары в мультимагазине для магазинов в Opencart. Вместо xx - id нужного магазина. Категории, производители.. по этому же принципу
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">INSERT IGNORE INTO `oc_product_to_store` (product_id, store_id) SELECT p.product_id, xx as store_id FROM `oc_product` p</pre>

<h4 style="color:inherit;font-size:15px;">
	7. Как отключить доставку для всех товаров в Opencart. Массово поменять значение параметра "Необходима доставка" на "Нет":
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE oc_product SET shipping=0;</pre>

<h4 style="color:inherit;font-size:15px;">
	8. Как заполнить поле модель (код товара) для всех товаров в Opencart. Модель будет сформирована на основе id товаров с добавлением ведущих нулей до шестизначного вида:
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE oc_product SET model = LPAD(product_id,6,'000000')</pre>

<h4 style="color:inherit;font-size:15px;">
	9. Как заполнить поле SKU (Артикул) для всех товаров в Opencart. Артикул будет сформирован на основе id товаров с добавлением ведущих нулей до шестизначного вида:
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE oc_product SET sku = LPAD(product_id,6,'000000');</pre>

<h4 style="color:inherit;font-size:15px;">
	10. Массовое изменение цены в Opencart:
</h4>

<p>
	- этот пример разделит все цены на 75.99, так мы можем перевести цены в рублях на евро.
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE `oc_product` SET `price` = `price` / 95.99;</pre>

<p>
	- так мы сделаем те же действий, но для тех товаров, у которых цена больше 1. Аналогично, Вы можете добавить свои условия, по другим полям.
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE `oc_product` SET `price` = `price` / 65.99 WHERE `oc_product`.`price` &gt; 1;</pre>

<p>
	- нужно увеличить цену на все товары в opencart на 7%. Т.е в рамках запроса, мы можем производить математические действия +-*/.
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE `oc_product` SET `price` = `price` + (`price`/100*7) WHERE `oc_product`.`price` &gt; 1;</pre>

<p>
	- вычитаем 8% от товаров определенного производителя
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE `oc_product` SET `price` = `price` - (`price`/100*8) WHERE `oc_product`.`manufacturer_id` = 54;</pre>

<p>
	<span style="color:inherit;font-size:15px;">11. Отключает товары у которых цена = 0 в Opencart</span>
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE oc_product SET oc_product.status = 0 WHERE price = 0</pre>

<h4 style="color:inherit;font-size:15px;">
	12. Мультимагазин на opencart 3, скопировать seo url (сео чпу), для всех магазинов. Где 1 - это id магазина куда копируем, а нуль - id магазина по умолчанию (отметил зеленым цветом).
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">INSERT INTO `oc_seo_url`(`store_id`, `language_id`, `query`, `keyword`)
SELECT , temp.language_id, temp.query, temp.keyword
FROM oc_seo_url temp
WHERE  temp.store_id = </pre>

<h4 style="color:inherit;font-size:15px;">
	13. Массово отключить товары у которых нет изображения в opencart
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE `oc_product` SET `status`=0 WHERE `image`='' OR `image`='no_image.png' OR `image`='no_image.jpg' OR `image` IS NULL;
</pre>

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

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE oc_product SET status = 1 WHERE status = 0 AND image &gt; ''
</pre>

<h4 style="color:inherit;font-size:15px;">
	14. Удалить все товары с количеством равным 0... opencart 2
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">DELETE p1,       p2,       p3,       p4,       p5,       p6,       p7,       p8,       p9,       p10,       p11,       p12,       p13,       p14,       p15,       p16FROM `oc_product` p1LEFT JOIN `oc_product_attribute` p2 ON (p2.product_id = p1.product_id)LEFT JOIN `oc_product_description` p3 ON (p3.product_id = p1.product_id)LEFT JOIN `oc_product_discount` p4 ON (p4.product_id = p1.product_id)LEFT JOIN `oc_product_filter` p5 ON (p5.product_id = p1.product_id)LEFT JOIN `oc_product_image` p6 ON (p6.product_id = p1.product_id)LEFT JOIN `oc_product_option` p7 ON (p7.product_id = p1.product_id)LEFT JOIN `oc_product_option_value` p8 ON (p8.product_id = p1.product_id)LEFT JOIN `oc_product_recurring` p9 ON (p9.product_id = p1.product_id)LEFT JOIN `oc_product_related` p10 ON (p10.product_id = p1.product_id)LEFT JOIN `oc_product_reward` p11 ON (p11.product_id = p1.product_id)LEFT JOIN `oc_product_special` p12 ON (p12.product_id = p1.product_id)LEFT JOIN `oc_product_to_category` p13 ON (p13.product_id = p1.product_id)LEFT JOIN `oc_product_to_download` p14 ON (p14.product_id = p1.product_id)LEFT JOIN `oc_product_to_layout` p15 ON (p15.product_id = p1.product_id)LEFT JOIN `oc_product_to_store` p16 ON (p16.product_id = p1.product_id)WHERE p1.quantity = 999
</pre>

<h4 style="color:inherit;font-size:15px;">
	15. Сделать все опции не обязательными в опенкарт
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">update oc_product_option set required = '0'
</pre>

<h4 style="color:inherit;font-size:15px;">
	16. Как отключить категории без товаров в opencart 3
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE oc_category c 
LEFT JOIN oc_product_to_category pc ON c.category_id = pc.category_id
LEFT JOIN oc_product p ON pc.product_id = p.product_id
SET c.status = 0
WHERE pc.product_id IS NULL 
OR pc.product_id=p.product_id AND p.status = 0</pre>

<h4 style="color:inherit;font-size:15px;">
	17. Как удалить определенный атрибут из всех товаров в opencart - в скобках указываем id атрибута, через запятую
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">DELETE FROM oc_product_attribute WHERE attribute_id IN (1, 2, 3, 4, 5, 6)</pre>

<h4 style="color:inherit;font-size:15px;">
	18. Как отключить индексацию товаров у определенной категории в OcStore 3
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE `oc_product` SET `noindex`= 0 WHERE product_id IN (SELECT product_id FROM `oc_product_to_category` WHERE category_id = 1)</pre>

<h4 style="color:inherit;font-size:15px;">
	19. Как массово включить индексацию у категорий в OcStore 3
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE `oc_category` SET `noindex` = 0</pre>

<h4 style="color:inherit;font-size:15px;">
	20. Как в Opencart увеличить максимальное количество символов в метатеге description
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">ALTER TABLE oc_product_description MODIFY meta_description VARCHAR(1000);
ALTER TABLE oc_information_description MODIFY meta_description VARCHAR(1000);
ALTER TABLE oc_category_description MODIFY meta_description VARCHAR(1000);
ALTER TABLE oc_manufacturer_description MODIFY meta_description VARCHAR(1000);</pre>

<h4 style="color:inherit;font-size:15px;">
	21. Как в opencart через SQL запрос присвоить всем товарам НДС
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE `oc_product` SET `tax_class_id`=10</pre>

<h4 style="color:inherit;font-size:15px;">
	22. Как массово изменить цену опций в Opencart
</h4>

<p>
	* уменьшить цену, например на 20%
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE oc_product p 
INNER JOIN oc_product_option_value pov ON p.product_id = pov.product_id 
SET pov.price = pov.price - (pov.price * 0.20);</pre>

<p>
	* увеличить цену, например на 20%
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE `oc_product` p INNER JOIN `oc_product_option_value` pov ON p.`product_id` = pov.`product_id` SET pov.`price` = pov.`price` + (pov.`price`/100*20)</pre>

<p>
	* увеличить цену у определенного производителя, например на 20%
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE `oc_product` p INNER JOIN `oc_product_option_value` pov ON p.`product_id` = pov.`product_id` SET pov.`price` = pov.`price` + (pov.`price`/100*20) WHERE p.`manufacturer_id` = 111</pre>

<p>
	* увеличить цену у перечисленных производителей
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE `oc_product` p INNER JOIN `oc_product_option_value` pov ON p.`product_id` = pov.`product_id` SET pov.`price` = pov.`price` + (pov.`price`/100*10) WHERE p.`manufacturer_id` IN (111, 112, 113)</pre>

<h4 style="color:inherit;font-size:15px;">
	23. Как массово добавить к цене акции процент через SQL запрос в Opencart
</h4>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">update oc_product_special set price=price*1.07</pre>

<h4 style="color:inherit;font-size:15px;">
	24. Как массово скопировать из значений атрибута в поле location, upc, isbn... через SQL запрос в Opencart
</h4>

<p>
	*WHERE pa.attribute_id = 1; указываем id атрибута из которого переносим значения
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">UPDATE oc_product p
INNER JOIN oc_product_attribute pa ON p.product_id = pa.product_id
SET p.location = pa.text
WHERE pa.attribute_id = 26;</pre>

<h4 style="color:#545454;font-size:15px;">
	25. Как добавить товар во все родительские категории в OpenCart через SQL запрос
</h4>

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

<p>
	Рассмотрим пример товара «Точечный светильник №1» и следующую иерархию категорий:
</p>

<p>
	Светильники-Точечные светильники-Встроенные
</p>

<p>
	Сейчас товар отображается только в категории «Встроенные», но мы хотим, чтобы он был доступен и в других связанных категориях. Если у нас много товаров и различных категорий с иерархиями, добавление товаров в родительские категории вручную становится трудоемким и времязатратным процессом.
</p>

<p>
	делаем SQL запрос:
</p>

<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">INSERT INTO oc_product_to_category (product_id, category_id)
SELECT p.product_id, c2.category_id
FROM oc_product p
INNER JOIN oc_product_to_category ptc ON p.product_id = ptc.product_id
LEFT JOIN oc_category_path cp ON ptc.category_id = cp.category_id
LEFT JOIN oc_category c1 ON cp.category_id = c1.category_id
LEFT JOIN oc_category c2 ON cp.path_id = c2.category_id
WHERE c1.category_id &lt;&gt; c2.category_id;</pre>

<p>
	Для улучшения производительности запроса можно создать индексы на столбцах, которые используются в операторах JOIN и WHERE, например:
</p>

<div>
	<pre style="background-color:#f5f5f5;border:1px solid #cccccc;color:#333333;font-size:13px;padding:9.5px;">CREATE INDEX idx_product_id ON oc_product (product_id);
CREATE INDEX idx_category_id ON oc_product_to_category (category_id);
CREATE INDEX idx_path_id ON oc_category_path (path_id);
CREATE INDEX idx_category_id_2 ON oc_category (category_id);</pre>

	<div>
		Применение этих индексов может существенно сократить время выполнения запроса, особенно если таблицы содержат большое количество записей. Обратите внимание, что префикс таблиц базы данных может отличаться, поэтому его следует заменить на ваш собственный. В приведенных запросах используется префикс «oc_».
	</div>

	<div>
		 
	</div>
</div>
]]></description><guid isPermaLink="false">1836</guid><pubDate>Wed, 28 Aug 2024 00:32:58 +0000</pubDate></item><item><title>&#x423;&#x431;&#x438;&#x440;&#x430;&#x435;&#x43C; &#x432;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x43D;&#x43E;&#x441;&#x442;&#x44C; &#x43A;&#x430;&#x442;&#x435;&#x433;&#x43E;&#x440;&#x438;&#x439; &#x43D;&#x430; &#x41E;&#x421; 2.3</title><link>http://opencartpascha.ru/topic/1784-%D1%83%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC-%D0%B2%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B9-%D0%BD%D0%B0-%D0%BE%D1%81-23/</link><description><![CDATA[<p>
	Часто возникает необходимость перехода на seo_pro на ранее запущенном сайте. При этом не желательно менять адресацию, во избежании просадок, как минимум на несколько месяцев, а порой сайт и вовсе не восстанавливается полностью.
</p>

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

<p>
	<strong>Канонические адреса имеют вид:</strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">site.com/product

site.com/last_category</span></pre>

<p>
	После установки seo_pro же важно активировать в настройках "Товары без категории".
</p>

<p>
	Однако для категорий такой настройки нет - они имеют вложенность, плюс в конце добавляется слеш.
</p>

<p>
	Для исправления данной ситуации потребуется правка кода seo_pro
</p>

<p>
	Убираем слеш
</p>

<p>
	Находим в коде
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$seo_url .= '/';</span></pre>

<p>
	и закомментируем строку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">//$seo_url .= '/';</span></pre>

<p>
	почему комментируем, а не удаляем? - есть вероятность попытки привязки модов
</p>

<p>
	<strong>Убираем вложенность</strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">case 'path':
    $categories = explode('_', $value);
    foreach ($categories as $category) {
        $queries[] = 'category_id=' . $category;
    }
    unset($data[$key]);
    break;</span></pre>

<p>
	приводим к виду
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">case 'path':
    $categories = explode('_', $value);
    //foreach ($categories as $category) {
        $queries[] = 'category_id=' . end($categories);
    //}
    unset($data[$key]);
    break;</span></pre>

<p>
	Сохраняем хлебные крошки
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">} elseif (isset($this-&gt;request-&gt;get['path'])) {
    $this-&gt;request-&gt;get['route'] = 'product/category';
}</span></pre>

<p>
	добавляем просчет пути
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">} elseif (isset($this-&gt;request-&gt;get['path'])) {
    $this-&gt;request-&gt;get['route'] = 'product/category';                
        $category = explode('_', $this-&gt;request-&gt;get['path']);
        $category_id = (int)end($category);
        $path = $this-&gt;getPathByCategory($category_id);
        if ($path) $this-&gt;request-&gt;get['path'] = $path;                
}</span></pre>

<p>
	 
</p>
]]></description><guid isPermaLink="false">1784</guid><pubDate>Tue, 13 Aug 2024 18:19:00 +0000</pubDate></item><item><title>&#x418;&#x43D;&#x442;&#x435;&#x433;&#x440;&#x430;&#x446;&#x438;&#x44F; &#x441;&#x430;&#x439;&#x442;&#x430; &#x43D;&#x430; Opencart &#x441; CDN</title><link>http://opencartpascha.ru/topic/1747-%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F-%D1%81%D0%B0%D0%B9%D1%82%D0%B0-%D0%BD%D0%B0-opencart-%D1%81-cdn/</link><description><![CDATA[<p>
	Важно! Интеграция с  CDN в Opencart производится не с помощью модулей или плагинов, а путем изменения трех файлов по FTP/SSH. Вначале убедитесь, что у вас есть возможность подключиться к вашему сайту через FTP или SSH (туда, где лежат файлы сайта).
</p>

<p>
	 
</p>

<p>
	Вы получили адрес проекта в CDN.
</p>

<p>
	<strong>Подключение CDN к Opencart версии 2.x</strong>
</p>

<p>
	Обязательно сохраните резервную копию этих файлов вашего сайта:<br />
	<strong>/config.php</strong><br />
	<strong>/catalog/model/tool/image.php</strong><br />
	<strong>/catalog/view/theme/default/template/common/header.tpl</strong>
</p>

<p>
	Редактируем файл<strong> /config.php</strong>, который находится в корне сайта. Здесь мы укажем адрес CDN.
</p>

<p>
	Добавьте в любом месте файла строку:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">define('CDN_HTTPS_SERVER', 'https://cdn.example-domain.ru');</span></pre>

<p>
	 Слэш в конце обязателен. Протокол https можно заменить на http в URL, если ваш сайт работает только по http.
</p>

<p>
	Редактируем файл<strong> /catalog/model/tool/image.php</strong> (здесь мы будем задавать путь до изображений на сайте).
</p>

<p>
	Найдите в коде файла следующий фрагмент:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if ($this-&gt;request-&gt;server['HTTPS']) { return $this-&gt;config-&gt;get('config_ssl') . 'image/' . $new_image; } else { return $this-&gt;config-&gt;get('config_url') . 'image/' . $new_image; }</span></pre>

<p>
	Замените его на этот фрагмент кода:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if (defined('CDN_HTTPS_SERVER') and ! empty(CDN_HTTPS_SERVER)) { return CDN_HTTPS_SERVER . 'image/' . $new_image; } else { if ($this-&gt;request-&gt;server['HTTPS']) { return $this-&gt;config-&gt;get('config_ssl') . 'image/' . $new_image; } else { return $this-&gt;config-&gt;get('config_url') . 'image/' . $new_image; } }</span></pre>

<p>
	Редактируем файл <strong>/catalog/view/theme/default/template/common/header.tpl</strong>.
</p>

<p>
	Здесь определяются пути до стилей и скриптов. По умолчанию в этом файле прописаны относительные пути до этих файлов, начинающиеся с директории catalog. Пример кода сайта до подключения CDN:
</p>

<p>
	Вставьте перед словом catalog код:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">defined</span><span class="pun">(</span><span class="str">'CDN_HTTPS_SERVER'</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">and</span><span class="pln"> </span><span class="pun">!</span><span class="pln"> empty</span><span class="pun">(</span><span class="pln">CDN_HTTPS_SERVER</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> echo CDN_HTTPS_SERVER</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<p>
	Получится строка вида (скрипт подключен через CDN):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">&lt;script src="</span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">defined</span><span class="pun">(</span><span class="str">'CDN_HTTPS_SERVER'</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">and</span><span class="pln"> </span><span class="pun">!</span><span class="pln"> empty</span><span class="pun">(</span><span class="pln">CDN_HTTPS_SERVER</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> echo CDN_HTTPS_SERVER</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">catalog</span><span class="pun">/</span><span class="pln">view</span><span class="pun">/</span><span class="pln">javascript</span><span class="pun">/</span><span class="pln">jquery</span><span class="pun">/</span><span class="pln">jquery</span><span class="pun">-</span><span class="lit">2.1</span><span class="pun">.</span><span class="lit">1.min</span><span class="pun">.</span><span class="pln">js</span><span class="str">" type="</span><span class="pln">text</span><span class="pun">/</span><span class="pln">javascript</span><span class="str">"&gt;</span><span class="tag">&lt;/script&gt;</span></pre>

<p>
	Также поступите с остальными скриптами js и стилями css в этом файле.
</p>

<p>
	Загрузите измененные файлы по FTP и обновите страницу вашего сайта. Проверьте, что сайт отображается корректно.
</p>

<p>
	Удостоверьтесь, что в HTML-коде сайта URL адреса до скриптов, стилей и изображений содержат адрес CDN.
</p>

<p>
	На этом настройка Opencart 2.x завершена и CDN готов к использованию.
</p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<strong>Подключение CDN к Opencart версии 3.x</strong>
</p>

<p>
	Обязательно сохраните резервную копию этих файлов вашего сайта:<br />
	<strong>/config.php<br />
	/catalog/model/tool/image.php<br />
	/catalog/view/theme/default/template/common/header.twig</strong>
</p>

<p>
	Редактируем файл <strong>/config.php</strong>, который находится в корне сайта. Здесь мы укажем адрес CDN.
</p>

<p>
	Добавьте в любом месте файла строку:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">define('CDN_HTTPS_SERVER', 'https://cdn.example-domain.ru/');</span></pre>

<p>
	Слэш в конце обязателен. Протокол https можно заменить на http, если ваш сайт работает только по http.
</p>

<p>
	Редактируем файл <strong>/catalog/model/tool/image.php</strong> (здесь мы будем задавать путь до изображений на сайте)
</p>

<p>
	Найдите в коде файла следующий фрагмент:
</p>

<p>
	i
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">f ($this-&gt;request-&gt;server['HTTPS']) { return $this-&gt;config-&gt;get('config_ssl') . 'image/' . $image_new; } else { return $this-&gt;config-&gt;get('config_url') . 'image/' . $image_new; }</span></pre>

<p>
	Замените его на этот фрагмент кода:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if (defined('CDN_HTTPS_SERVER') and ! empty(CDN_HTTPS_SERVER)) { return CDN_HTTPS_SERVER . 'image/' . $image_new; } else { if ($this-&gt;request-&gt;server['HTTPS']) { return $this-&gt;config-&gt;get('config_ssl') . 'image/' . $image_new; } else { return $this-&gt;config-&gt;get('config_url') . 'image/' . $image_new; } }</span></pre>

<p>
	Обратите внимание, если вы переходили с версии Opencart 2.x на 3.x, в этом файле поменялось написание переменной $image_new (в версии 2.x она называлась $new_image).
</p>

<p>
	Редактируем файл<strong> /catalog/view/theme/default/template/common/header.twig</strong> (здесь определяются пути до стилей и скриптов).
</p>

<p>
	Обратите внимание, если вы переходили с версии Opencart 2.x на 3.x: в версии 3.х Opencart перешли с шаблонов tpl на twig, поэтому синтаксис относительно второй версии CMS изменится.
</p>

<p>
	По умолчанию в этом файле прописаны относительные пути до js и css, начинающиеся с директории catalog.
</p>

<p>
	Пример кода сайта до подключения CDN:
</p>

<p>
	Вставьте перед словом catalog код:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">{{ constant('CDN_HTTPS_SERVER') }}</span></pre>

<p>
	Получится строка вида (скрипт подключен через CDN):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"{{ constant('CDN_HTTPS_SERVER') }}catalog/view/javascript/jquery/jquery-2.1.1.min.js"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text/javascript"</span><span class="tag">&gt;&lt;/script&gt;</span></pre>

<p>
	Также поступите с остальными скриптами js и стилями css в этом файле.
</p>

<p>
	Загрузите измененные файлы по FTP и обновите страницу вашего сайта. Проверьте, что сайт отображается корректно.
</p>

<p>
	Удостоверьтесь, что в HTML-коде сайта URL адреса до скриптов, стилей и изображений содержат адрес CDN.
</p>

<p>
	На этом настройка Opencart 3.x завершена и CDN готов к использованию.
</p>

<p>
	Если вы хотите использовать свой домен для подключения CDN  в файле <strong>/config.php</strong>:
</p>

<p>
	втавьте строку:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">define('CDN_HTTPS_SERVER', 'https://cdn.example-domain.ru/');</span></pre>

<p>
	 
</p>
]]></description><guid isPermaLink="false">1747</guid><pubDate>Tue, 06 Aug 2024 01:51:14 +0000</pubDate></item><item><title>&#x423;&#x434;&#x430;&#x43B;&#x44F;&#x435;&#x43C; &#x434;&#x443;&#x431;&#x43B;&#x438; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446; &#x432; Opencart</title><link>http://opencartpascha.ru/topic/26-udalyaem-dubli-stranic-v-opencart/</link><description><![CDATA[<p>
	В CMS Opencart очень много есть преимуществ перед аналогами. Однако эта система имеет и свои недостатки. Самым серьезным из которых, как я считаю, являются – дубли страниц.
</p>

<p>
	В CMS Opencart очень много есть преимуществ перед аналогами. Это простота кода, множество шаблонов, модулей, великолепное сообщество, где с вероятностью до 80% (мое мнение) можно найти нужную информацию или доработку. Однако эта система имеет и свои недостатки. Самым серьезным из которых, как я считаю, являются – дубли страниц.
</p>

<p>
	Почему он самый страшный – да потому что из-за повторяющегося контента на сайте поисковые системы, мягко говоря, не в восторге. Индексировать ваш сайт они будут, но на каких местах в выдаче вы будете — это уже вопрос.
</p>

<p>
	Что такое дубли страниц? Это одинаковый контент на сайте, который доступен по разным адресам. Например, карточка товара «Ноутбук Asus» доступна по адресу сайт/ноутбуки/для работы/Ноутбук-Asus. Но в случае, если вы настроите модуль рекомендуемые, новинки или другой подобный модуль, который есть с коробки в Opencart, вы получите целую дюжину дублей на сайте. Уверяю, что в выдаче вы просядете, не факт опять же, но вероятность огромная. Любой из модулей вывода товаров генерирует неправильную “Прямую” ссылку вида сайт/Ноутбук-Asus производя при этом разные адреса для одной и той же страницы.
</p>

<p>
	Еще мне не понятно, зачем делать ссылку в хлебных крошках на главную страницу вида сайт/index.php?route=common/home, если намного проще ставить тот же слеш «/» и получилась бы та же ссылка без лишних параметров, которые совершенно не нужны. Та же проблема есть при переходе на главную страницу кликая на логотип.
</p>

<p>
	Итак, подытожим и опишем список всех дублей в Opencart:
</p>

<p>
	Доступность одного товара по разным адресам. (модули последние, рекомендуемые и т.д.)
</p>

<p>
	Ссылки на главную в виде сайт/index.php?route=common/homе
</p>

<p>
	Доступность главной страницы сайта по адресам<br />
	— http://сайт<br />
	— http://сайт/<br />
	— http://сайт/index.php<br />
	— http://сайт/index.php?route=common/homе
</p>

<p>
	Ссылки при пейджинге страницы (как следствие одинаковые мета теги и описание категории, чего лучше не допускать)
</p>

<p>
	Другие (исследую)
</p>

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

<p>
	Самый простой вариант, но не совсем правильный, это поставить в админке в настройках «ЧПУ товаров с категориями» в положение нет. В таком случае в адресах страниц у нас не будет иерархии вложенности. Такой вариант еще подходит для магазинов, которым специально нужны короткие ссылки на товар, без соблюдения категорий.
</p>

<p>
	Но по правилам хорошего тона для поисковых систем, как и для людей, удобнее будет использовать URL с соблюдением вложенности (иерархии).
</p>

<p>
	Для удаления разных адресов на один и тот же товар нам нужно внести поправки в модулях и местах, которые генерируют «прямые» ссылки. Из модулей будем редактировать: Хиты продаж, Рeкомендуемые, Последние и Aкции. Все эти модули есть в стандартной комплектации Opencart и OcStore. Для полноценного избавления нам надо будет отредактировать еще места неправильных ссылок: страница производителя, блок рекомендуемых в описании товара, страница акций (product/special), страница с результатами поска, страница сравнения товаров.
</p>

<p>
	В выше перечисленных модулях не предусмотрена ссылка с учетом категории, в котором находится товар, нам же надо её сделать, да и еще с соблюденной иерархией категорий. В моем методе можно получить ссылки с уровнем вложенности до 5 — чего для 95% магазинов хватит.
</p>

<p>
	Для определения категории товара нам надо добавить функцию в catalog/model/catalog/category.php
</p>

<p>
	Перед
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">public function getCategoryLayoutId($category_id) {</span></pre>

<p>
	Добавляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">public function getProductPath($product_id) {
	$category_id = $this-&gt;db-&gt;query("SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "'");
	if(isset($category_id-&gt;rows[0]['category_id']) &amp;&amp; ($category_id-&gt;rows[0]['category_id'] != 0)){
		$parent_id = $this-&gt;db-&gt;query("SELECT parent_id FROM " . DB_PREFIX . "category WHERE category_id = '" . (int)$category_id-&gt;rows[0]['category_id'] . "'");
		if(isset($parent_id-&gt;rows[0]['parent_id']) &amp;&amp; ($parent_id-&gt;rows[0]['parent_id'] != 0)){
			$category = $parent_id-&gt;rows[0]['parent_id'] . "_" . $category_id-&gt;rows[0]['category_id'];
			$path_id_2 = $this-&gt;db-&gt;query("SELECT parent_id FROM " . DB_PREFIX . "category WHERE category_id = '" . $parent_id-&gt;rows[0]['parent_id'] . "'");
			if(isset($path_id_2-&gt;rows[0]['parent_id']) &amp;&amp; ($path_id_2-&gt;rows[0]['parent_id'] != 0)){
				$category = $path_id_2-&gt;rows[0]['parent_id'] . "_" . $parent_id-&gt;rows[0]['parent_id'] . "_" . $category_id-&gt;rows[0]['category_id'];
				$path_id_3 = $this-&gt;db-&gt;query("SELECT parent_id FROM " . DB_PREFIX . "category WHERE category_id = '" . (int)$path_id_2-&gt;rows[0]['parent_id'] . "'");
				if(isset($path_id_3-&gt;rows[0]['parent_id']) &amp;&amp; ($path_id_3-&gt;rows[0]['parent_id'] != 0)){
					$category = $path_id_3-&gt;rows[0]['parent_id'] . "_" . $path_id_2-&gt;rows[0]['parent_id'] . "_" . $parent_id-&gt;rows[0]['parent_id'] . "_" . $category_id-&gt;rows[0]['category_id'];
					$path_id_4 = $this-&gt;db-&gt;query("SELECT parent_id FROM " . DB_PREFIX . "category WHERE category_id = '" . (int)$path_id_3-&gt;rows[0]['parent_id'] . "'");
					if(isset($path_id_4-&gt;rows[0]['parent_id']) &amp;&amp; ($path_id_4-&gt;rows[0]['parent_id'] != 0)){
						$category = $path_id_4-&gt;rows[0]['parent_id'] . "_" . $path_id_3-&gt;rows[0]['parent_id'] . "_" . $path_id_2-&gt;rows[0]['parent_id'] . "_" . $parent_id-&gt;rows[0]['parent_id'] . "_" . $category_id-&gt;rows[0]['category_id'];	
					}						
				}				
			}
		}else{
			$category = $category_id-&gt;rows[0]['category_id'];
		}
	}else{
		$category = false;
	}

	return $category;
}</span></pre>

<p>
	Далее переходим в контроллер нужного нам модуля и делаем изменения в URL с учетом категории товара.
</p>

<p>
	Итак по модулям:
</p>

<p>
	<strong>Хиты продаж</strong>
</p>

<p>
	Открываем контроллер (catalog/controller/module/bestseller.php)
</p>

<p>
	В начало функции подключаем модель:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$this-&gt;load-&gt;model('catalog/category');</span></pre>

<p>
	Перед
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if ($result['image']) {</span></pre>

<p>
	Вставляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$product_path = $this-&gt;model_catalog_category-&gt;getProductPath($result['product_id']);
if($product_path){
	$href = $this-&gt;url-&gt;link('product/product', 'path=' . $product_path . '&amp;product_id=' . $result['product_id']);
}else{
	$href = $this-&gt;url-&gt;link('product/product', 'product_id=' . $result['product_id']);
}</span></pre>

<p>
	И строку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $this-&gt;url-&gt;link('product/product', 'product_id=' . $result['product_id'])</span></pre>

<p>
	Заменяем на:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $href</span></pre>

<p>
	<strong>Pекомендуемые</strong>
</p>

<p>
	Открываем контроллер (catalog/controller/module/featured.php)
</p>

<p>
	В начало функции подключаем модель:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$this-&gt;load-&gt;model('catalog/category');</span></pre>

<p>
	Перед
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if ($product_info['image']) {</span></pre>

<p>
	Вставляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$product_path = $this-&gt;model_catalog_category-&gt;getProductPath($product_id);
if($product_path){
	$href = $this-&gt;url-&gt;link('product/product', 'path=' . $product_path . '&amp;product_id=' . $product_info['product_id']);
}else{
	$href = $this-&gt;url-&gt;link('product/product', 'product_id=' . $product_info['product_id']);
}</span></pre>

<p>
	И строку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $this-&gt;url-&gt;link('product/product', 'product_id=' . $product_info['product_id'])</span></pre>

<p>
	Заменяем на:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $href</span></pre>

<p>
	<strong>Последние товары</strong><br />
	Открываем контроллер (catalog/controller/module/latest.php)
</p>

<p>
	В начало функции подключаем модель:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$this-&gt;load-&gt;model('catalog/category');</span></pre>

<p>
	Перед
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if ($result['image']) {</span></pre>

<p>
	Вставляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$product_path = $this-&gt;model_catalog_category-&gt;getProductPath($result['product_id']);
if($product_path){
	$href = $this-&gt;url-&gt;link('product/product', 'path=' . $product_path . '&amp;product_id=' . $result['product_id']);
}else{
	$href = $this-&gt;url-&gt;link('product/product', 'product_id=' . $result['product_id']);
}</span></pre>

<p>
	И строку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $this-&gt;url-&gt;link('product/product', 'product_id=' . $result['product_id'])</span></pre>

<p>
	Заменяем на:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $href</span></pre>

<p>
	<strong>Aкции</strong>
</p>

<p>
	Открываем контроллер (catalog/controller/module/special.php)
</p>

<p>
	В начало функции подключаем модель:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$this-&gt;load-&gt;model('catalog/category');</span></pre>

<p>
	Перед
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if ($result['image']) {</span></pre>

<p>
	Вставляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$product_path = $this-&gt;model_catalog_category-&gt;getProductPath($result['product_id']);
if($product_path){
	$href = $this-&gt;url-&gt;link('product/product', 'path=' . $product_path . '&amp;product_id=' . $result['product_id']);
}else{
	$href = $this-&gt;url-&gt;link('product/product', 'product_id=' . $result['product_id']);
}</span></pre>

<p>
	И строку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $this-&gt;url-&gt;link('product/product', 'product_id=' . $result['product_id'])</span></pre>

<p>
	Заменяем на:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $href</span></pre>

<p>
	Стандартные модули в Opencart мы избавили от возможности генерировать дубли страниц в магазине. Далее переходим на отдельные места, где неправильные ссылки.
</p>

<p>
	<strong>Страница производителя</strong>
</p>

<p>
	Открываем контроллер (catalog/controller/product/manufacturer.php)
</p>

<p>
	В начало функции подключаем модель:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$this-&gt;load-&gt;model('catalog/category');</span></pre>

<p>
	Перед
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$this-&gt;data['categories'][$key]['manufacturer'][] = array(</span></pre>

<p>
	Вставляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$product_path = $this-&gt;model_catalog_category-&gt;getProductPath($result['product_id']);
if($product_path){
	$href = $this-&gt;url-&gt;link('product/product', 'path=' . $product_path . '&amp;product_id=' . $result['product_id']);
}else{
	$href = $this-&gt;url-&gt;link('product/product', 'product_id=' . $result['product_id']);
}</span></pre>

<p>
	И строку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href' =&gt; $this-&gt;url-&gt;link('product/manufacturer/info', 'manufacturer_id=' . $result['manufacturer_id'])</span></pre>

<p>
	Заменяем на:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $href</span></pre>

<p>
	<strong>Блок рекомендуемых на странице товара</strong>
</p>

<p>
	Открываем контроллер (catalog/controller/product/product.php)
</p>

<p>
	Перед
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if ($result['image']) {</span></pre>

<p>
	Вставляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$product_path = $this-&gt;model_catalog_category-&gt;getProductPath($result['product_id']);
if($product_path){
	$href = $this-&gt;url-&gt;link('product/product', 'path=' . $product_path . '&amp;product_id=' . $result['product_id']);
}else{
	$href = $this-&gt;url-&gt;link('product/product', 'product_id=' . $result['product_id']);
}</span></pre>

<p>
	И строку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $this-&gt;url-&gt;link('product/product', 'product_id=' . $result['product_id'])</span></pre>

<p>
	Заменяем на:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $href</span></pre>

<p>
	<strong>Страница акций(product/special)</strong>
</p>

<p>
	Открываем контроллер (catalog/controller/product/special.php)
</p>

<p>
	В начало функции подключаем модель:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$this-&gt;load-&gt;model('catalog/category');</span></pre>

<p>
	Перед
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if ($result['image']) {</span></pre>

<p>
	Вставляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$product_path = $this-&gt;model_catalog_category-&gt;getProductPath($result['product_id']);
if($product_path){
	$href = $this-&gt;url-&gt;link('product/product', 'path=' . $product_path . '&amp;product_id=' . $result['product_id']);
}else{
	$href = $this-&gt;url-&gt;link('product/product', 'product_id=' . $result['product_id']);
}</span></pre>

<p>
	И строку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $this-&gt;url-&gt;link('product/product', 'product_id=' . $result['product_id'])</span></pre>

<p>
	Заменяем на:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $href</span></pre>

<p>
	<strong>Страница результатов поиска</strong><br />
	Открываем контроллер (catalog/controller/product/search.php)
</p>

<p>
	В начало функции подключаем модель:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$this-&gt;load-&gt;model('catalog/category');</span></pre>

<p>
	Перед
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if ($result['image']) {</span></pre>

<p>
	Вставляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$product_path = $this-&gt;model_catalog_category-&gt;getProductPath($result['product_id']);
if($product_path){
	$href = $this-&gt;url-&gt;link('product/product', 'path=' . $product_path . '&amp;product_id=' . $result['product_id']);
}else{
	$href = $this-&gt;url-&gt;link('product/product', 'product_id=' . $result['product_id']);
}</span></pre>

<p>
	И строку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $this-&gt;url-&gt;link('product/product', 'product_id=' . $result['product_id'])</span></pre>

<p>
	Заменяем на:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $href</span></pre>

<p>
	<strong>Страница сравнения товаров</strong>
</p>

<p>
	Открываем контроллер (catalog/controller/product/compare.php)
</p>

<p>
	В начало функции подключаем модель:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$this-&gt;load-&gt;model('catalog/category');</span></pre>

<p>
	Перед
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if ($product_info['image']) {</span></pre>

<p>
	Вставляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$product_path = $this-&gt;model_catalog_category-&gt;getProductPath($product_info['product_id']);
if($product_path){
	$href = $this-&gt;url-&gt;link('product/product', 'path=' . $product_path . '&amp;product_id=' . $product_info['product_id']);
}else{
	$href = $this-&gt;url-&gt;link('product/product', 'product_id=' . $product_info['product_id']);
}</span></pre>

<p>
	И строку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $this-&gt;url-&gt;link('product/product', 'product_id=' . $product_info['product_id'])</span></pre>

<p>
	Заменяем на:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'href'    	 =&gt; $href</span></pre>

<p>
	 
</p>
]]></description><guid isPermaLink="false">26</guid><pubDate>Sat, 12 Mar 2022 12:33:08 +0000</pubDate></item><item><title>&#x41A;&#x43E;&#x43B;&#x438;&#x447;&#x435;&#x441;&#x442;&#x432;&#x43E; &#x440;&#x435;&#x43A;&#x43E;&#x43C;&#x435;&#x43D;&#x434;&#x43E;&#x432;&#x430;&#x43D;&#x43D;&#x44B;&#x445; &#x442;&#x43E;&#x432;&#x430;&#x440;&#x43E;&#x432; &#x43D;&#x430; &#x43A;&#x430;&#x440;&#x442;&#x43E;&#x447;&#x43A;&#x435; &#x442;&#x43E;&#x432;&#x430;&#x440;&#x430;</title><link>http://opencartpascha.ru/topic/1410-kolichestvo-rekomendovannyh-tovarov-na-kartochke-tovara/</link><description><![CDATA[<p>
	<strong>Актуально для Opencart 2.</strong>
</p>

<p>
	Открываем файл <strong>catalog\controller\product\product.php</strong>
</p>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$results = $this-&gt;model_catalog_product-&gt;getProductRelated($this-&gt;request-&gt;get[‘product_id’]);</span></pre>

<p>
	И после нее добавляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$results = array_slice($results, 0, 7);</span></pre>

<p>
	<br />
	Где 7 — и есть то самое количество выводимых рекомендуемых товаров (лимит).
</p>

<p>
	После добавления обязательно обновить кеш модификаторов!!!
</p>

<p>
	Чтобы они показывались в случайном порядке (рандомно)<br />
	Помните в старом добром винампе была кнопка шаффл (shuffle), для рандомного воспроизведения музыки?))
</p>

<p>
	Короче нам нужно добавить между ними одну строку — заключить резалтс в шаффл, то бишь вот так:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$results = $this-&gt;model_catalog_product-&gt;getProductRelated($this-&gt;request-&gt;get['product_id']);
shuffle($results); 
$results = array_slice($results, 0, 4);</span></pre>

<p>
	<br /><strong>Со статусом в наличии</strong>
</p>

<p>
	<br />
	Если нужно исключить отсутствующие товары, то делаем так:
</p>

<p>
	Всё тот же файл <strong>catalog\model\catalog\product.php</strong>
</p>

<p>
	Находим метод <strong>getProductRelated</strong>
</p>

<p>
	И после
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">AND p.status = ‘1’</span></pre>

<p>
	добавляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">AND p.quantity &gt; 0</span></pre>

<p>
	 
</p>
]]></description><guid isPermaLink="false">1410</guid><pubDate>Sun, 11 Feb 2024 06:07:45 +0000</pubDate></item><item><title>&#x41A;&#x430;&#x43A; &#x432;&#x44B;&#x432;&#x435;&#x441;&#x442;&#x438; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x44C; &#x438;&#x43B;&#x438; &#x430;&#x440;&#x442;&#x438;&#x43A;&#x443;&#x43B; (sku) &#x432; &#x43A;&#x430;&#x442;&#x435;&#x433;&#x43E;&#x440;&#x438;&#x438; &#x442;&#x43E;&#x432;&#x430;&#x440;&#x43E;&#x432; Opencart</title><link>http://opencartpascha.ru/topic/1409-kak-vyvesti-model-ili-artikul-sku-v-kategorii-tovarov-opencart/</link><description><![CDATA[<p>
	Сначала в контроллере нужно прописать (зарегистрировать) переменную. То есть открываем файл catalog/controller/product/category.php, находим строчку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'name'     =&gt; $result['name'],</span></pre>

<p>
	<br />
	и после нее вставляет, то что нам необходимо зарегистрировать, то есть:
</p>

<p>
	для модели вставляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'model'     =&gt; $result['model'],</span></pre>

<p>
	<br />
	а для артикула вставляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'sku'     =&gt; $result['sku'],</span></pre>

<p>
	<br />
	Сохраняем, закрываем.
</p>

<p>
	Теперь открываем сам файл шаблона страницы категории catalog/view/theme/ВАША_ТЕМА/template/product/category.tpl
</p>

<p>
	И там, где нам нужно вывести модель, пишем:
</p>

<p>
	для 2-ки
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pun">&lt;?</span><span class="pln">php echo $product</span><span class="pun">[</span><span class="str">'model'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<p>
	для 3-ки
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">{{ product.model }}</span></pre>

<p>
	<br />
	а там, где нужен артикул, пишем:
</p>

<p>
	для 2-ки
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pun">&lt;?</span><span class="pln">php echo $product</span><span class="pun">[</span><span class="str">'sku'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<p>
	для 3-ки
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">{{ product.sku }}</span></pre>

<p>
	<br />
	Сохраняем, закрываем.
</p>

<p>
	Обазятельно!!! Очистите кеш модификаторов, а-то не заработает!
</p>

<p>
	По сути всё. Должно работать.
</p>

<p>
	Вывести артикул или модель на странице производителей — аналогично.<br />
	 
</p>
]]></description><guid isPermaLink="false">1409</guid><pubDate>Sun, 11 Feb 2024 06:02:59 +0000</pubDate></item><item><title>&#x41A;&#x430;&#x43A; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x441;&#x442;&#x440;&#x430;&#x43D;&#x438;&#x446;&#x443; &#x43A;&#x430;&#x442;&#x435;&#x433;&#x43E;&#x440;&#x438;&#x438; &#x433;&#x43B;&#x430;&#x432;&#x43D;&#x43E;&#x439;. Opencart</title><link>http://opencartpascha.ru/topic/1408-kak-sdelat-stranicu-kategorii-glavnoy-opencart/</link><description><![CDATA[<p>
	Чтобы в Opencart определить страницу категории как главную (домашнюю), надо проделать следующее.
</p>

<p>
	Открываем файл <strong>.htaccess</strong> и после строки
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">RewriteBase /</span></pre>

<p>
	Вставляем следующую строку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">RewriteRule ^/?$ index.php?route=product/category&amp;path=111/ [L]</span></pre>

<p>
	<br />
	где, 111 — это id категории, которую нужно определить как главную страницу, то есть нужно указать свою.
</p>

<p>
	<strong>Если установлен SeoPro</strong>
</p>

<p>
	<br />
	Если установлен модуль SeoPro и правило не работает, а сервер отдает код ответа 301 вместо «внутреннего» редиректа с кодом 200, необходимо сделать следующее:
</p>

<p>
	Открываем файл <strong>\catalog\controller\common\seo_pro.php</strong>, метод <strong>validate()</strong>.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">private function validate() {
        if (isset($this-&gt;request-&gt;get['route']) &amp;&amp; $this-&gt;request-&gt;get['route'] == 'error/not_found') {
            return;
        }
        if(empty($this-&gt;request-&gt;get['route'])) {
            $this-&gt;request-&gt;get['route'] = 'common/home';
        }
        if (isset($this-&gt;request-&gt;server['HTTP_X_REQUESTED_WITH']) &amp;&amp; strtolower($this-&gt;request-&gt;server['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
            return;
        }
        if (isset($this-&gt;request-&gt;server['HTTPS']) &amp;&amp; (($this-&gt;request-&gt;server['HTTPS'] == 'on') || ($this-&gt;request-&gt;server['HTTPS'] == '1'))) {
            $url = str_replace('&amp;amp;', '&amp;', $this-&gt;config-&gt;get('config_ssl') . ltrim($this-&gt;request-&gt;server['REQUEST_URI'], '/'));
            $seo = str_replace('&amp;amp;', '&amp;', $this-&gt;url-&gt;link($this-&gt;request-&gt;get['route'], $this-&gt;getQueryString(array('route')), 'SSL'));
        } else {
            $url = str_replace('&amp;amp;', '&amp;',
                substr($this-&gt;config-&gt;get('config_url'), 0, strpos($this-&gt;config-&gt;get('config_url'), '/', 10)) // leave only domain
                . $this-&gt;request-&gt;server['REQUEST_URI']);
            $seo = str_replace('&amp;amp;', '&amp;', $this-&gt;url-&gt;link($this-&gt;request-&gt;get['route'], $this-&gt;getQueryString(array('route')), 'NONSSL'));
        }
        if (rawurldecode($url) != rawurldecode($seo)) {
            $this-&gt;response-&gt;redirect($seo, 301);
        }
    }</span></pre>

<p>
	<br />
	И добавляем исключение:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$array_exclusion = [
            'http://site.com/'
        ];
        if (rawurldecode($url) != rawurldecode($seo) &amp;&amp; !in_array($url, $array_exclusion)) {
            $this-&gt;response-&gt;redirect($seo, 301);
        }</span></pre>

<p>
	<br />
	Где site.com — это УРЛ вашей главной страницы сайта.
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">1408</guid><pubDate>Sun, 11 Feb 2024 05:53:10 +0000</pubDate></item><item><title>&#x427;&#x435;&#x43A;&#x431;&#x43E;&#x43A;&#x441; &#x441;&#x43E;&#x433;&#x43B;&#x430;&#x441;&#x438;&#x44F; &#x43D;&#x430; &#x43E;&#x431;&#x440;&#x430;&#x431;&#x43E;&#x442;&#x43A;&#x443; &#x43F;&#x435;&#x440;&#x441;&#x43E;&#x43D;&#x430;&#x43B;&#x44C;&#x43D;&#x44B;&#x445; &#x434;&#x430;&#x43D;&#x43D;&#x44B;&#x445; (&#x441;&#x43A;&#x440;&#x438;&#x43F;&#x442;, &#x441;&#x442;&#x438;&#x43B;&#x438;&#x437;&#x430;&#x446;&#x438;&#x44F;)</title><link>http://opencartpascha.ru/topic/1042-chekboks-soglasiya-na-obrabotku-personalnyh-dannyh-skript-stilizaciya/</link><description><![CDATA[<p>
	Теперь всегда нужно чтоб на вашем сайте в любой форме обратной связи присутствовал чекбокс  согласия на обработку персональных данных.<br>
	Зачастую разработчики уже предусматривают данную приблуду в своих дополнениях... но что если нет? Что если для Вас проблематично поменять код самого модуля по каким то причинам? <br>
	Самое простое- вставить несложный скрипт и сделать пару правок.<br>
	Вот этим мы и займемся. <br>
	Итак... мы открыли код вывода формы обратной связи и ориентируясь на кнопку кода отправки сообщения:<br>
	как правило это кнопка (ссылка или button )
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">type="submit" </span></pre>

<p>
	*можно использовать для поиска по документу.<br>
	<br>
	Где то чуть выше вставляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"form-chek"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"checkbox"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"politics"</span><span class="pln"> </span><span class="atn">onclick</span><span class="pun">=</span><span class="atv">"</span><span class="pln">check</span><span class="pun">();</span><span class="atv">"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">""</span><span class="pln"> </span><span class="atn">autocomplete</span><span class="pun">=</span><span class="atv">"off"</span><span class="tag">/&gt;</span><span class="pln">
Я согласен (-на) на обработку персональных данных
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	тем самым мы сделали то что требуется....
</p>

<p>
	<img alt="01.png.7aeeeaf57030a2834d33766adc723e83.png" class="ipsImage ipsImage_thumbnailed" data-fileid="290" style="height:auto;" width="385" src="http://opencartpascha.ru/uploads/monthly_2023_04/01.png.7aeeeaf57030a2834d33766adc723e83.png" loading="lazy" height="46.2">
</p>

<p>
	<br>
	но... <br>
	отправка сообщения возможна что при активном чекбоксе, что при неактивном.... <br>
	"факир был пьян- и фокус не удался" ))))<br>
	<br>
	Потому мы еще не закончили и поработаем с самой кнопкой отправки сообщения из формы<br>
	<br>
	к примеру мы имеем 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"submit"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"btn btn-lg btn-primary"</span><span class="tag">&gt;</span><span class="pln">Оставить заявку</span><span class="tag">&lt;/button&gt;</span></pre>

<p>
	чуть видоизменим ее на 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"submit"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"submit"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"submit btn btn-lg btn-primary"</span><span class="pln"> </span><span class="atn">disabled</span><span class="pun">=</span><span class="atv">""</span><span class="tag">&gt;</span><span class="pln">Оставить заявку</span><span class="tag">&lt;/button&gt;</span></pre>

<p>
	и вставим скрипт
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;script&gt;</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> check</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"> submit </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementsByName</span><span class="pun">(</span><span class="str">'submit'</span><span class="pun">)[</span><span class="lit">0</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">document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">'politics'</span><span class="pun">).</span><span class="pln">checked</span><span class="pun">)</span><span class="pln">
submit</span><span class="pun">.</span><span class="pln">disabled </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">else</span><span class="pln">
submit</span><span class="pun">.</span><span class="pln">disabled </span><span class="pun">=</span><span class="pln"> </span><span class="str">'disabled'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span><span class="pln">	</span></pre>

<p>
	тем самым... пока чекбокс не активен - кнопка отправки сообщений так же не кликабельна...
</p>

<p>
	<img alt="02.png.7fb0042c97d603b36c8f19414e17f423.png" class="ipsImage ipsImage_thumbnailed" data-fileid="291" style="height:auto;" width="380" src="http://opencartpascha.ru/uploads/monthly_2023_04/02.png.7fb0042c97d603b36c8f19414e17f423.png" loading="lazy" height="243.2">
</p>

<p>
	 
</p>

<p>
	и при активном/отмеченном чекбоксе кнопка отправки становится работоспособной...
</p>

<p>
	 
</p>

<p>
	<img alt="03.png.84d5f32f1fbe73e95067594674890138.png" class="ipsImage ipsImage_thumbnailed" data-fileid="292" style="height:auto;" width="390" src="http://opencartpascha.ru/uploads/monthly_2023_04/03.png.84d5f32f1fbe73e95067594674890138.png" loading="lazy" height="222.3"><br>
	<br>
	казалось бы мы уже можем остановиться на этом)))<br>
	но....<br>
	есть и другие задачи: <br>
	к примеру такие, как стилизовать собственно чекбокс под дизайн сайта ( по умолчанию активный чекбокс - синего цвета ( так его определяют браузеры и подтягивают стандартные стили)<br>
	исправим это недоразумение одной строчкой 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">#politics {
    accent-color: #FFCB4A;
}</span></pre>

<p>
	и вот она уже стала того цвета что нам требовалось.
</p>

<p>
	<img alt="04.png.47a5fb486fac05de3352f7a909a55363.png" class="ipsImage ipsImage_thumbnailed" data-fileid="293" style="height:auto;" width="397" src="http://opencartpascha.ru/uploads/monthly_2023_04/04.png.47a5fb486fac05de3352f7a909a55363.png" loading="lazy" height="226.29"><br>
	<br>
	 
</p>
]]></description><guid isPermaLink="false">1042</guid><pubDate>Sat, 22 Apr 2023 09:03:59 +0000</pubDate></item><item><title>&#x414;&#x43E;&#x43F;&#x43E;&#x43B;&#x43D;&#x438;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x444;&#x43E;&#x442;&#x43E; &#x432; &#x43A;&#x430;&#x442;&#x435;&#x433;&#x43E;&#x440;&#x438;&#x438; - &#x433;&#x430;&#x43B;&#x435;&#x440;&#x435;&#x44F; &#x438;&#x437;&#x43E;&#x431;&#x440;&#x430;&#x436;&#x435;&#x43D;&#x438;&#x439;</title><link>http://opencartpascha.ru/topic/1089-dopolnitelnye-foto-v-kategorii-galereya-izobrazheniy/</link><description><![CDATA[<p>
	Дополнительные фото в категории как в товаре. Делаем галерею на странице категории
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="294" width="888" alt="011.png.2dd040b8c07b6de7af2e0b6d4d854cf6.png" src="http://opencartpascha.ru/uploads/monthly_2023_07/011.png.2dd040b8c07b6de7af2e0b6d4d854cf6.png" loading="lazy" height="355.2">
</p>

<p>
	Сегодня речь пойдет о небольшой доработке — вывод дополнительных фотографий категории. Зачем это нужно? Если у вас в магазине продается плитка или же ламинат, покупателю будет интересно посмотреть в самой категории фото интерьеров или коллекции, если категория идет как "коллекция". Для этого возьмем уже готовый функционал с товара. В форме редактирования товара есть вкладка Изображения в которой можно добавить дополнительные фото и они будут отображены в карточке товара.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="http://opencartpascha.ru/uploads/monthly_2023_07/012.png.ed68e03f2bbf1412f91d400a0b75c9a2.png" data-fileid="295" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="295" width="1000" alt="012.thumb.png.85e8d7a408615c75597b6439d55dce8f.png" src="http://opencartpascha.ru/uploads/monthly_2023_07/012.thumb.png.85e8d7a408615c75597b6439d55dce8f.png" loading="lazy" height="490"></a>
</p>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">CREATE TABLE IF NOT EXISTS `oc_category_image` (
`category_image_id` int(11) NOT NULL AUTO_INCREMENT,
`category_id` int(11) NOT NULL,
`image` varchar(255) DEFAULT NULL,
`sort_order` int(3) NOT NULL DEFAULT '0',
PRIMARY KEY (`category_image_id`),
KEY `category_id` (`category_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;</span></pre>

<p>
	В данном примере создается таблица с префиксом oc_ посмотрите, у вас может быть другой!
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="296" width="808" alt="013.png.124022a0a6799c0f34639fc613c1ed45.png" src="http://opencartpascha.ru/uploads/monthly_2023_07/013.png.124022a0a6799c0f34639fc613c1ed45.png" loading="lazy" height="347.44">
</p>

<p>
	После этого открываем файл модели admin/model/catalog/category.php и добавляем возможность сохранения фотографий в базу данных. Для этого ищем в функции addCategory и editCategory строку:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if (isset($data['image'])) {</span></pre>

<p>
	перед ней вставляем:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if (isset($data['category_image'])) {
	foreach ($data['category_image'] as $category_image) {
		$this-&gt;db-&gt;query("INSERT INTO " . DB_PREFIX . "category_image SET category_id = '" . (int)$category_id . "', image = '" . $this-&gt;db-&gt;escape($category_image['image']) . "', sort_order = '" . (int)$category_image['sort_order'] . "'");
	}
}</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">public function getCategory($category_id) {</span></pre>

<p>
	Вставляем:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">public function getCategoryImages($category_id) {
	$query = $this-&gt;db-&gt;query("SELECT * FROM " . DB_PREFIX . "category_image WHERE category_id = '" . (int)$category_id . "' ORDER BY sort_order ASC");	
	return $query-&gt;rows;
}</span></pre>

<p>
	После этого у нас изображения уже записываются в базу с формы редактирования товара. Далее открываем контроллер admin/controller/catalog/category.php находим строку:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['placeholder'] = $this-&gt;model_tool_image-&gt;resize('no_image.png', 100, 100);</span></pre>

<p>
	и после нее вставляем код обработки фото:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">// Images
if (isset($this-&gt;request-&gt;post['category_image'])) {
	$category_images = $this-&gt;request-&gt;post['category_image'];
} elseif (isset($this-&gt;request-&gt;get['category_id'])) {
	$category_images = $this-&gt;model_catalog_category-&gt;getCategoryImages($this-&gt;request-&gt;get['category_id']);
} else {
	$category_images = array();
}

$data['category_images'] = array();

foreach ($category_images as $category_image) {
	if (is_file(DIR_IMAGE . $category_image['image'])) {
		$image = $category_image['image'];
		$thumb = $category_image['image'];
	} else {
		$image = '';
		$thumb = 'no_image.png';
	}

	$data['category_images'][] = array(
		'image'      =&gt; $image,
		'thumb'      =&gt; $this-&gt;model_tool_image-&gt;resize($thumb, 100, 100),
		'sort_order' =&gt; $category_image['sort_order']
	);
}</span></pre>

<p>
	После этого открываем форму редактирования категории admin/view/template/catalog/category_form.tpl и ищем строку:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#tab-data"</span><span class="pln"> </span><span class="atn">data-toggle</span><span class="pun">=</span><span class="atv">"tab"</span><span class="tag">&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $tab_data</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/a&gt;&lt;/li&gt;</span></pre>

<p>
	после нее добавляем код вкладки:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;li&gt;&lt;a</span><span class="pln"> </span><span class="atn">href</span><span class="pun">=</span><span class="atv">"#tab-image"</span><span class="pln"> </span><span class="atn">data-toggle</span><span class="pun">=</span><span class="atv">"tab"</span><span class="tag">&gt;</span><span class="pln">Изображения</span><span class="tag">&lt;/a&gt;&lt;/li&gt;</span></pre>

<p>
	Далее ищем строку:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;p</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"tab-pane"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"tab-design"</span><span class="tag">&gt;</span></pre>

<p>
	И перед ней вставляем блок вкладки с формой добавления изображений:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"tab-pane"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"tab-image"</span><span class="tag">&gt;</span><span class="pln">
	 </span><span class="pun">&lt;?</span><span class="pln">php $button_remove </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Удалить'</span><span class="pun">;</span><span class="pln"> $button_image_add </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Добавить'</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
	</span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"table-responsive"</span><span class="tag">&gt;</span><span class="pln">
		</span><span class="tag">&lt;table</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"images"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"table table-striped table-bordered table-hover"</span><span class="tag">&gt;</span><span class="pln">
			</span><span class="tag">&lt;thead&gt;</span><span class="pln">
				</span><span class="tag">&lt;tr&gt;</span><span class="pln">
					</span><span class="tag">&lt;td</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"text-left"</span><span class="tag">&gt;</span><span class="pln">Изображение</span><span class="tag">&lt;/td&gt;</span><span class="pln">
					</span><span class="tag">&lt;td</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"text-right"</span><span class="tag">&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $entry_sort_order</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/td&gt;</span><span class="pln">
					</span><span class="tag">&lt;td&gt;&lt;/td&gt;</span><span class="pln">
				</span><span class="tag">&lt;/tr&gt;</span><span class="pln">
			</span><span class="tag">&lt;/thead&gt;</span><span class="pln">
			</span><span class="tag">&lt;tbody&gt;</span><span class="pln">
				</span><span class="pun">&lt;?</span><span class="pln">php $image_row </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">?&gt;</span><span class="pln">
				</span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$category_images </span><span class="kwd">as</span><span class="pln"> $category_image</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
					&lt;tr id="image-row</span><span class="pun">&lt;?</span><span class="pln">php echo $image_row</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">"&gt;
					</span><span class="tag">&lt;td</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"text-left"</span><span class="tag">&gt;</span><span class="pln">&lt;a href="" id="thumb-image</span><span class="pun">&lt;?</span><span class="pln">php echo $image_row</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" data-toggle="image" class="img-thumbnail"&gt;&lt;img src="</span><span class="pun">&lt;?</span><span class="pln">php echo $category_image</span><span class="pun">[</span><span class="str">'thumb'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" alt="" title="" data-placeholder="</span><span class="pun">&lt;?</span><span class="pln">php echo $placeholder</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" /&gt;</span><span class="tag">&lt;/a&gt;</span><span class="pln">&lt;input type="hidden" name="category_image[</span><span class="pun">&lt;?</span><span class="pln">php echo $image_row</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">][image]" value="</span><span class="pun">&lt;?</span><span class="pln">php echo $category_image</span><span class="pun">[</span><span class="str">'image'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" id="input-image</span><span class="pun">&lt;?</span><span class="pln">php echo $image_row</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" /&gt;</span><span class="tag">&lt;/td&gt;</span><span class="pln">
					</span><span class="tag">&lt;td</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"text-right"</span><span class="tag">&gt;</span><span class="pln">&lt;input type="text" name="category_image[</span><span class="pun">&lt;?</span><span class="pln">php echo $image_row</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">][sort_order]" value="</span><span class="pun">&lt;?</span><span class="pln">php echo $category_image</span><span class="pun">[</span><span class="str">'sort_order'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" placeholder="</span><span class="pun">&lt;?</span><span class="pln">php echo $entry_sort_order</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" class="form-control" /&gt;</span><span class="tag">&lt;/td&gt;</span><span class="pln">
					</span><span class="tag">&lt;td</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"text-left"</span><span class="tag">&gt;</span><span class="pln">&lt;button type="button" onclick="$('#image-row</span><span class="pun">&lt;?</span><span class="pln">php echo $image_row</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">').remove();" data-toggle="tooltip" title="</span><span class="pun">&lt;?</span><span class="pln">php echo $button_remove</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" class="btn btn-danger"&gt;</span><span class="tag">&lt;i</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"fa fa-minus-circle"</span><span class="tag">&gt;&lt;/i&gt;&lt;/button&gt;&lt;/td&gt;</span><span class="pln">
				</span><span class="tag">&lt;/tr&gt;</span><span class="pln">
				</span><span class="pun">&lt;?</span><span class="pln">php $image_row</span><span class="pun">++;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
				</span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
			</span><span class="tag">&lt;/tbody&gt;</span><span class="pln">
			</span><span class="tag">&lt;tfoot&gt;</span><span class="pln">
				</span><span class="tag">&lt;tr&gt;</span><span class="pln">
					</span><span class="tag">&lt;td</span><span class="pln"> </span><span class="atn">colspan</span><span class="pun">=</span><span class="atv">"2"</span><span class="tag">&gt;&lt;/td&gt;</span><span class="pln">
					</span><span class="tag">&lt;td</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"text-left"</span><span class="tag">&gt;</span><span class="pln">&lt;button type="button" onclick="addImage();" data-toggle="tooltip" title="</span><span class="pun">&lt;?</span><span class="pln">php echo $button_image_add</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" class="btn btn-primary"&gt;</span><span class="tag">&lt;i</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"fa fa-plus-circle"</span><span class="tag">&gt;&lt;/i&gt;&lt;/button&gt;&lt;/td&gt;</span><span class="pln">
				</span><span class="tag">&lt;/tr&gt;</span><span class="pln">
			</span><span class="tag">&lt;/tfoot&gt;</span><span class="pln">
		</span><span class="tag">&lt;/table&gt;</span><span class="pln">
	</span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text/javascript"</span><span class="tag">&gt;</span><span class="com">&lt;!--</span></pre>

<p>
	Вставляем этот код:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text/javascript"</span><span class="tag">&gt;</span><span class="pun">&lt;!--</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> image_row </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&lt;?</span><span class="pln">php echo $image_row</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;;</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> addImage</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
html  </span><span class="pun">=</span><span class="pln"> </span><span class="str">'&lt;tr id="image-row'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> image_row </span><span class="pun">+</span><span class="pln"> </span><span class="str">'"&gt;'</span><span class="pun">;</span><span class="pln">
html </span><span class="pun">+=</span><span class="pln"> </span><span class="str">'  &lt;td class="text-left"&gt;&lt;a href="" id="thumb-image'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> image_row </span><span class="pun">+</span><span class="pln"> </span><span class="str">'"data-toggle="image" class="img-thumbnail"&gt;&lt;img src="&lt;?php echo $placeholder; ?&gt;" alt="" title="" data-placeholder="&lt;?php echo $placeholder; ?&gt;" /&gt;&lt;/a&gt;&lt;input type="hidden" name="category_image['</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> image_row </span><span class="pun">+</span><span class="pln"> </span><span class="str">'][image]" value="" id="input-image'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> image_row </span><span class="pun">+</span><span class="pln"> </span><span class="str">'" /&gt;&lt;/td&gt;'</span><span class="pun">;</span><span class="pln">
html </span><span class="pun">+=</span><span class="pln"> </span><span class="str">'  &lt;td class="text-right"&gt;&lt;input type="text" name="category_image['</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> image_row </span><span class="pun">+</span><span class="pln"> </span><span class="str">'][sort_order]" value="" placeholder="&lt;?php echo $entry_sort_order; ?&gt;" class="form-control" /&gt;&lt;/td&gt;'</span><span class="pun">;</span><span class="pln">
html </span><span class="pun">+=</span><span class="pln"> </span><span class="str">'  &lt;td class="text-left"&gt;&lt;button type="button" onclick="$(\'#image-row'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> image_row  </span><span class="pun">+</span><span class="pln"> </span><span class="str">'\').remove();" data-toggle="tooltip" title="&lt;?php echo $button_remove; ?&gt;" class="btn btn-danger"&gt;&lt;i class="fa fa-minus-circle"&gt;&lt;/i&gt;&lt;/button&gt;&lt;/td&gt;'</span><span class="pun">;</span><span class="pln">
html </span><span class="pun">+=</span><span class="pln"> </span><span class="str">'&lt;/tr&gt;'</span><span class="pun">;</span><span class="pln">

$</span><span class="pun">(</span><span class="str">'#images tbody'</span><span class="pun">).</span><span class="pln">append</span><span class="pun">(</span><span class="pln">html</span><span class="pun">);</span><span class="pln">

image_row</span><span class="pun">++;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">//--&gt;</span><span class="tag">&lt;/script&gt;</span><span class="pln"> </span></pre>

<p>
	После таких правок у нас уже есть возможность в админке добавлять, редактировать и сохранять изображения в категории. После любых изменений в коде не забывайте обновлять кеш модификаторов (Дополнения — Менеджер дополнений — кнопка Обновить)
</p>

<p>
	Вывод фото на странице категории.
</p>

<p>
	Для вывода фото на странице категорий нам необходимо добавить функцию выборки изображений из базы данных в модель. Для этого открываем файл catalog/model/catalog/category.php и, например перед строкой:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">public function getCategories($parent_id = 0) {</span></pre>

<p>
	вставляем нашу функцию
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">public function getCategoryImages($category_id) {
$query = $this-&gt;db-&gt;query("SELECT * FROM " . DB_PREFIX . "category_image WHERE category_id = '" . (int)$category_id . "' ORDER BY sort_order ASC");
return $query-&gt;rows;
}</span></pre>

<p>
	После этого полученные данные надо обработать в контроллере, для этого идем в файл catalog/controller/product/category.php и перед строкой:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['description'] = html_entity_decode($category_info['description'], ENT_QUOTES, 'UTF-8');</span></pre>

<p>
	вставляем код обработки:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['images'] = array();

$results = $this-&gt;model_catalog_category-&gt;getCategoryImages($category_id);

if($results){
	$this-&gt;document-&gt;addScript('catalog/view/javascript/jquery/magnific/jquery.magnific-popup.min.js');
	$this-&gt;document-&gt;addStyle('catalog/view/javascript/jquery/magnific/magnific-popup.css');
	foreach ($results as $result) {
		$data['images'][] = array(
			'popup' =&gt; $this-&gt;model_tool_image-&gt;resize($result['image'], $this-&gt;config-&gt;get($this-&gt;config-&gt;get('config_theme') . '_image_popup_width'), $this-&gt;config-&gt;get($this-&gt;config-&gt;get('config_theme') . '_image_popup_height')),
			'thumb' =&gt; $this-&gt;model_tool_image-&gt;resize($result['image'], $this-&gt;config-&gt;get($this-&gt;config-&gt;get('config_theme') . '_image_additional_width'), $this-&gt;config-&gt;get($this-&gt;config-&gt;get('config_theme') . '_image_additional_height'))
		);
	}
}</span></pre>

<p>
	После этого у нас в шаблон идет массив $images в котором находятся фотографии категории. Для отображения их на сайте надо сделать вывод в шаблоне. Для этого открываем файл catalog/view/theme/default/template/product/category.tpl и в нужном месте вставляем код:
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln"> </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$images</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
	   </span><span class="tag">&lt;p</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"row images"</span><span class="tag">&gt;</span><span class="pln">
		</span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$images </span><span class="kwd">as</span><span class="pln"> $image</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
		</span><span class="tag">&lt;p</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"col-xs-6 col-sm-6 col-md-3"</span><span class="tag">&gt;</span><span class="pln">&lt;a class="thumbnail" href="</span><span class="pun">&lt;?</span><span class="pln">php echo $image</span><span class="pun">[</span><span class="str">'popup'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" title="</span><span class="pun">&lt;?</span><span class="pln">php echo $heading_title</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">"&gt; &lt;img src="</span><span class="pun">&lt;?</span><span class="pln">php echo $image</span><span class="pun">[</span><span class="str">'thumb'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" title="</span><span class="pun">&lt;?</span><span class="pln">php echo $heading_title</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" alt="</span><span class="pun">&lt;?</span><span class="pln">php echo $heading_title</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" /&gt;</span><span class="tag">&lt;/a&gt;&lt;/p&gt;</span><span class="pln">
		</span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
	   </span><span class="tag">&lt;/p&gt;</span><span class="pln">
		</span><span class="tag">&lt;hr&gt;</span><span class="pln">
		</span><span class="tag">&lt;script&gt;</span><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="pun">(</span><span class="str">'.images'</span><span class="pun">).</span><span class="pln">magnificPopup</span><span class="pun">({</span><span class="pln">
					type</span><span class="pun">:</span><span class="str">'image'</span><span class="pun">,</span><span class="pln">
					delegate</span><span class="pun">:</span><span class="pln"> </span><span class="str">'a'</span><span class="pun">,</span><span class="pln">
					gallery</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
						enabled</span><span class="pun">:</span><span class="kwd">true</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="tag">&lt;/script&gt;</span><span class="pln">
 </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<p>
	Учтите, что у вас может быть другой шаблон. В примере указан шаблон default (выделен выше). После всех правок можете чистить кеш модификаторов, кеш модуля кеширования (если он есть) и радоваться результатам.
</p>
]]></description><guid isPermaLink="false">1089</guid><pubDate>Fri, 07 Jul 2023 13:57:09 +0000</pubDate></item><item><title>&#x43A;&#x430;&#x43A; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x433;&#x43E;&#x440;&#x43E;&#x434;&#x430; &#x432; &#x433;&#x435;&#x43E;&#x433;&#x440;&#x430;&#x444;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x435; &#x437;&#x43E;&#x43D;&#x44B;</title><link>http://opencartpascha.ru/topic/967-kak-dobavit-goroda-v-geograficheskie-zony/</link><description><![CDATA[<p>
	Всем привет. Подскажите пожалуйста как добавить города в географические зоны и также при оформления заказа выпадал нужный город при выборе региона ?
</p>

<p>
	<img class="ipsImage" data-ratio="56.67" height="566" style="height:auto;width:750px;" width="1000" alt="spacer.png" src="https://zaitsevsergey.ru/image/dfgfdsa4.jpg" loading="lazy">
</p>
]]></description><guid isPermaLink="false">967</guid><pubDate>Wed, 01 Feb 2023 15:48:49 +0000</pubDate></item><item><title>&#x41A;&#x430;&#x43A; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x432;&#x442;&#x43E;&#x440;&#x443;&#x44E; &#x446;&#x435;&#x43D;&#x443; &#x432; &#x411;&#x438;&#x442;&#x43A;&#x43E;&#x438;&#x43D;&#x430;&#x445; (bitcoin, btc).</title><link>http://opencartpascha.ru/topic/727-kak-sdelat-vtoruyu-cenu-v-bitkoinah-bitcoin-btc/</link><description><![CDATA[<p>
	Криптовалюты все больше и больше входят в нашу жизнь. И если еще пару лет назад многие воспринимали их как «пустышку», то сегодня уже начинают понимать перспективу. Многие магазины начинают принимать в качестве оплаты за свои услуги криптовалюту, в частности bitcoin.
</p>

<p>
	Я сегодня не буду рассматривать как добавить BTC в качестве валюты и как получать их курсы в автоматическом режиме. Сегодня речь пойдет как вывести рядом с основной ценой в категориях и в карточке товара цену в биткоинах.
</p>

<p>
	Доработки будем делать в контроллерах, добавив новую переменную. Для получения курса будем использовать сервис bitpay.com, в частности его API. Я не буду детально разбирать сам скрипт. Он ниже
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$url = "https://bitpay.com/api/rates";
		$json = json_decode(file_get_contents($url));
		$dollar = $btc = 0;
		foreach($json as $obj){
	      if ($obj-&gt;code=='USD') {
			$kursbtc = (1/$obj-&gt;rate)*$result['price'];
			$kursbtc = number_format($kursbtc, 8, ".", "");
	      }
		}</span></pre>

<p>
	Идем в<strong> /catalog/product/category.php</strong> и после строки
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$price = $this-&gt;currency-&gt;format($this-&gt;tax-&gt;calculate($result['price'], $result['tax_class_id'], $this-&gt;config-&gt;get('config_tax')), $this-&gt;session-&gt;data['currency']);</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$url = "https://bitpay.com/api/rates";
$json = json_decode(file_get_contents($url));
$dollar = $btc = 0;
foreach($json as $obj){
      if ($obj-&gt;code=='USD') {
$kursbtc_spec = (1/$obj-&gt;rate)*$result['special'];
$kursbtc_spec = number_format($kursbtc_spec, 8, ".", "");
      }
}</span></pre>

<p>
	Далее после
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'price'       =&gt; $price,
'special'     =&gt; $special,</span></pre>

<p>
	Добавляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'kursbtc'       =&gt; $kursbtc,
'kursbtc_spec'     =&gt; $kursbtc_spec,</span></pre>

<p>
	По аналогии доработки делаются и для модулей Последние, Новинки, Рекомендуемые, Акционные
</p>

<p>
	В темплейте этих модулей в необходимом месте добавляем код вывода цены в bitcoin
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pun">&lt;?</span><span class="pln">php echo $product</span><span class="pun">[</span><span class="str">'kursbtc'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php echo $product</span><span class="pun">[</span><span class="str">'kursbtc_spec'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<p>
	Как вывести цену товара в BTC в карточке товара
</p>

<p>
	Теперь переходим к варточке товара.
</p>

<p>
	Опять идем в контроллер по адресу /catalog/product/product.php и после
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['price'] = $this-&gt;currency-&gt;format($this-&gt;tax-&gt;calculate($product_info['price'], $product_info['tax_class_id'], $this-&gt;config-&gt;get('config_tax')), $this-&gt;session-&gt;data['currency']);</span></pre>

<p>
	добавляем код
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$url = "https://bitpay.com/api/rates";
$json = json_decode(file_get_contents($url));
$dollar = $btc = 0;
foreach($json as $obj){
      if ($obj-&gt;code=='USD') {
$data['kursbtc'] = (1/$obj-&gt;rate)*$result['special'];
$data['kursbtc'] = number_format($data['kursbtc'], 8, ".", "");
      }
}</span></pre>

<p>
	И так же по аналогии делаем доработку для товаров со скидкой
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$url = "https://bitpay.com/api/rates";
$json = json_decode(file_get_contents($url));
$dollar = $btc = 0;
foreach($json as $obj){
      if ($obj-&gt;code=='USD') {
$data['kursbtc_spec'] = (1/$obj-&gt;rate)*$result['special'];
$data['kursbtc_spec'] = number_format($data['kursbtc_spec'], 8, ".", "");
      }
}</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pun">&lt;?</span><span class="pln">php echo $kursbtc</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php echo $kursbtc_spec</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<p>
	Не забываем после всех этих изменений обновить или почистить кеш модификаторов.
</p>

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

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="257" width="561" alt="cart15.png.fbe427261c187d2b2500d5b04ab0c30b.png" src="http://opencartpascha.ru/uploads/monthly_2022_11/cart15.png.fbe427261c187d2b2500d5b04ab0c30b.png" loading="lazy" height="330.99">
</p>
]]></description><guid isPermaLink="false">727</guid><pubDate>Sun, 06 Nov 2022 20:24:09 +0000</pubDate></item><item><title>&#x41A;&#x430;&#x43A; &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x43F;&#x435;&#x440;&#x435;&#x445;&#x43E;&#x434; &#x43D;&#x430; &#x43E;&#x444;&#x43E;&#x440;&#x43C;&#x43B;&#x435;&#x43D;&#x438;&#x435; &#x437;&#x430;&#x43A;&#x430;&#x437;&#x430; &#x43F;&#x43E;&#x441;&#x43B;&#x435; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x43B;&#x435;&#x43D;&#x438;&#x44F; &#x432; &#x43A;&#x43E;&#x440;&#x437;&#x438;&#x43D;&#x443; &#x43D;&#x430; Opencart</title><link>http://opencartpascha.ru/topic/726-kak-sdelat-perehod-na-oformlenie-zakaza-posle-dobavleniya-v-korzinu-na-opencart/</link><description><![CDATA[<p>
	Предположим, вы продаете в своем интернет магазине какой то штучный товар, который покупается исключительно в единичном экземпляре. В таком случае для увеличения вероятности покупки, желательно снизить количество действий, которые надо выполнить пользователя для перехода на страницу оформления заказа. В идеале, сразу после добавления товара в корзину, отправлять покупателя на оформление.
</p>

<p>
	Сегодня я разберу два варианта, как это можно сделать: исправим существующую кнопку добавления в корзину и добавим отдельно кнопку для быстрой покупки (Важно! Для товаров, у которых есть опции, данное решение в текущем виде не подойдет, так как перед этим необходимо вывести выбор опций в товары в категориях)
</p>

<p>
	Переход на страницу оформления заказа по нажатию на стандартную кнопку «Купить»
</p>

<p>
	Изменения будут вноситься в файле common.js (рассматривается на примере стандартного шаблона) для категорий, модулей, поиска и т.д. и в темплейте карточки товара (непосредственно для товара)
</p>

<p>
	Открываем файл
</p>

<p>
	<strong>/catalog/view/javascript/common.js</strong>
</p>

<p>
	Находим примерно на строке 140 функцию добавления в корзину
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'add': function(product_id, quantity) {</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$('html, body').animate({ scrollTop: 0 }, 'slow');</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">window.location.href = '/index.php?route=checkout/checkout';</span></pre>

<p>
	Если у Вас установлен модуль упрощенного оформления заказа Simple, то код будет немного отличаться
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">window.location.href = '/index.php?route=checkout/simplecheckout';</span></pre>

<p>
	Сохраняем и обновляем кеш модификаторов.
</p>

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

<p>
	Чтобы это работало и в карточке товара, открываем темплейт по адресу
</p>

<p>
	<strong>/catalog/view/theme/default/template/product/product.tpl</strong>
</p>

<p>
	И примерно на 459 строке
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$('html, body').animate({ scrollTop: 0 }, 'slow');</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">window.location.href = '/index.php?route=checkout/checkout';</span></pre>

<p>
	Если у Вас установлен модуль упрощенного оформления заказа Simple, то код будет немного отличаться
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">window.location.href = '/index.php?route=checkout/simplecheckout';</span></pre>

<p>
	Так же не забываем обновлять модификаторы.
</p>

<p>
	Добавляем новую кнопку перехода на страницу оформления заказа при покупке
</p>

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

<p>
	Прежде всего добавим новую функцию в
</p>

<p>
	<strong>/catalog/view/javascript/common.js</strong>
</p>

<p>
	А именно после функции
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'add': function(product_id, quantity) {</span></pre>

<p>
	после 176 строки добавляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'addnew': function(product_id, quantity) {
$.ajax({
url: 'index.php?route=checkout/cart/add',
type: 'post',
data: 'product_id=' + product_id + '&amp;quantity=' + (typeof(quantity) != 'undefined' ? quantity : 1),
dataType: 'json',
beforeSend: function() {
$('#cart &gt; button').button('loading');
},
complete: function() {
$('#cart &gt; button').button('reset');
},
success: function(json) {
$('.alert, .text-danger').remove();
if (json['redirect']) {
location = json['redirect'];
}
if (json['success']) {
$('#content').parent().before('</span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"alert alert-success"</span><span class="tag">&gt;&lt;i</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"fa fa-check-circle"</span><span class="tag">&gt;&lt;/i&gt;</span><span class="pln"> ' + json['success'] + ' </span><span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"button"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"close"</span><span class="pln"> </span><span class="atn">data-dismiss</span><span class="pun">=</span><span class="atv">"alert"</span><span class="tag">&gt;</span><span class="pln">&amp;times;</span><span class="tag">&lt;/button&gt;&lt;/div&gt;</span><span class="pln">');
// Need to set timeout otherwise it wont update the total
setTimeout(function () {
$('#cart &gt; button').html('</span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"cart-total"</span><span class="tag">&gt;</span><span class="pln">' + json['total'] + '</span><span class="tag">&lt;/span&gt;</span><span class="pln">');
}, 100);
window.location.href = '/index.php?route=checkout/checkout';
$('#cart &gt; ul').load('index.php?route=common/cart/info ul li');
}
},
error: function(xhr, ajaxOptions, thrownError) {
alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
}
});
},</span></pre>

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

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

<p>
	Рассмотрим на примере категорий
</p>

<p>
	<strong>/catalog/view/theme/default/template/product/category.tpl</strong>
</p>

<p>
	Находим примерно на строке 131 код
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">&lt;button type="button" onclick="cart.add('</span><span class="pun">&lt;?</span><span class="pln">php echo $product</span><span class="pun">[</span><span class="str">'product_id'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">', '</span><span class="pun">&lt;?</span><span class="pln">php echo $product</span><span class="pun">[</span><span class="str">'minimum'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">');"&gt;</span><span class="tag">&lt;i</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"fa fa-shopping-cart"</span><span class="tag">&gt;&lt;/i&gt;</span><span class="pln"> </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"hidden-xs hidden-sm hidden-md"</span><span class="tag">&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $button_cart</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/span&gt;&lt;/button&gt;</span></pre>

<p>
	и перед ним или после добавляем такой
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">&lt;button type="button" onclick="cart.addnew('</span><span class="pun">&lt;?</span><span class="pln">php echo $product</span><span class="pun">[</span><span class="str">'product_id'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">', '</span><span class="pun">&lt;?</span><span class="pln">php echo $product</span><span class="pun">[</span><span class="str">'minimum'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">');"&gt;</span><span class="tag">&lt;i</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"fa fa-plane"</span><span class="tag">&gt;&lt;/i&gt;</span><span class="pln"> </span><span class="tag">&lt;span</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"hidden-xs hidden-sm hidden-md"</span><span class="tag">&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $button_cart</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/span&gt;&lt;/button&gt;</span></pre>

<p>
	Сохраняем, обновляем модификаторы и проверяем. Если все сделали верно, то должно работать. Для модулей и других страниц дейтвия идентичны.
</p>

<p>
	Для карточки товара в
</p>

<p>
	<strong>/catalog/view/theme/default/template/product/product.tpl</strong>
</p>

<p>
	также добавляем новую функцию на строке 470 после стандартной функции добавления в корзину
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"text/javascript"</span><span class="tag">&gt;</span><span class="pun">&lt;!--</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'#button-cartnew'</span><span class="pun">).</span><span class="pln">on</span><span class="pun">(</span><span class="str">'click'</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">
$</span><span class="pun">.</span><span class="pln">ajax</span><span class="pun">({</span><span class="pln">
url</span><span class="pun">:</span><span class="pln"> </span><span class="str">'index.php?route=checkout/cart/add'</span><span class="pun">,</span><span class="pln">
type</span><span class="pun">:</span><span class="pln"> </span><span class="str">'post'</span><span class="pun">,</span><span class="pln">
data</span><span class="pun">:</span><span class="pln"> $</span><span class="pun">(</span><span class="str">'#product input[type=\'text\'], #product input[type=\'hidden\'], #product input[type=\'radio\']:checked, #product input[type=\'checkbox\']:checked, #product select, #product textarea'</span><span class="pun">),</span><span class="pln">
dataType</span><span class="pun">:</span><span class="pln"> </span><span class="str">'json'</span><span class="pun">,</span><span class="pln">
beforeSend</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">
$</span><span class="pun">(</span><span class="str">'#button-cart'</span><span class="pun">).</span><span class="pln">button</span><span class="pun">(</span><span class="str">'loading'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">},</span><span class="pln">
complete</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">
$</span><span class="pun">(</span><span class="str">'#button-cart'</span><span class="pun">).</span><span class="pln">button</span><span class="pun">(</span><span class="str">'reset'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">},</span><span class="pln">
success</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">json</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'.alert, .text-danger'</span><span class="pun">).</span><span class="pln">remove</span><span class="pun">();</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'.form-group'</span><span class="pun">).</span><span class="pln">removeClass</span><span class="pun">(</span><span class="str">'has-error'</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">json</span><span class="pun">[</span><span class="str">'error'</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">json</span><span class="pun">[</span><span class="str">'error'</span><span class="pun">][</span><span class="str">'option'</span><span class="pun">])</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">i in json</span><span class="pun">[</span><span class="str">'error'</span><span class="pun">][</span><span class="str">'option'</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"> element </span><span class="pun">=</span><span class="pln"> $</span><span class="pun">(</span><span class="str">'#input-option'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> i</span><span class="pun">.</span><span class="pln">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">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">element</span><span class="pun">.</span><span class="pln">parent</span><span class="pun">().</span><span class="pln">hasClass</span><span class="pun">(</span><span class="str">'input-group'</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
element</span><span class="pun">.</span><span class="pln">parent</span><span class="pun">().</span><span class="pln">after</span><span class="pun">(</span><span class="str">'&lt;div class="text-danger"&gt;'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> json</span><span class="pun">[</span><span class="str">'error'</span><span class="pun">][</span><span class="str">'option'</span><span class="pun">][</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">'&lt;/div&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">
element</span><span class="pun">.</span><span class="pln">after</span><span class="pun">(</span><span class="str">'&lt;div class="text-danger"&gt;'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> json</span><span class="pun">[</span><span class="str">'error'</span><span class="pun">][</span><span class="str">'option'</span><span class="pun">][</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">'&lt;/div&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="pun">}</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">json</span><span class="pun">[</span><span class="str">'error'</span><span class="pun">][</span><span class="str">'recurring'</span><span class="pun">])</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'select[name=\'recurring_id\']'</span><span class="pun">).</span><span class="pln">after</span><span class="pun">(</span><span class="str">'&lt;div class="text-danger"&gt;'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> json</span><span class="pun">[</span><span class="str">'error'</span><span class="pun">][</span><span class="str">'recurring'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">'&lt;/div&gt;'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">// Highlight any found errors</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'.text-danger'</span><span class="pun">).</span><span class="pln">parent</span><span class="pun">().</span><span class="pln">addClass</span><span class="pun">(</span><span class="str">'has-error'</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">json</span><span class="pun">[</span><span class="str">'success'</span><span class="pun">])</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'.breadcrumb'</span><span class="pun">).</span><span class="pln">after</span><span class="pun">(</span><span class="str">'&lt;div class="alert alert-success"&gt;'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> json</span><span class="pun">[</span><span class="str">'success'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">'&lt;button type="button" class="close" data-dismiss="alert"&gt;&amp;times;&lt;/button&gt;&lt;/div&gt;'</span><span class="pun">);</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'#cart &gt; button'</span><span class="pun">).</span><span class="pln">html</span><span class="pun">(</span><span class="str">'&lt;span id="cart-total"&gt;&lt;i class="fa fa-shopping-cart"&gt;&lt;/i&gt; '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> json</span><span class="pun">[</span><span class="str">'total'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">'&lt;/span&gt;'</span><span class="pun">);</span><span class="pln">
window</span><span class="pun">.</span><span class="pln">location</span><span class="pun">.</span><span class="pln">href </span><span class="pun">=</span><span class="pln"> </span><span class="str">'/index.php?route=checkout/checkout'</span><span class="pun">;</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'#cart &gt; ul'</span><span class="pun">).</span><span class="pln">load</span><span class="pun">(</span><span class="str">'index.php?route=common/cart/info ul li'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">},</span><span class="pln">
        error</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">xhr</span><span class="pun">,</span><span class="pln"> ajaxOptions</span><span class="pun">,</span><span class="pln"> thrownError</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            alert</span><span class="pun">(</span><span class="pln">thrownError </span><span class="pun">+</span><span class="pln"> </span><span class="str">"\r\n"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> xhr</span><span class="pun">.</span><span class="pln">statusText </span><span class="pun">+</span><span class="pln"> </span><span class="str">"\r\n"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> xhr</span><span class="pun">.</span><span class="pln">responseText</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="com">//--&gt;</span><span class="tag">&lt;/script&gt;</span></pre>

<p>
	Ну и после этого добавляем новую кнопку. Примерно на строке 296 после или перед
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">&lt;button type="button" id="button-cart" data-loading-text="</span><span class="pun">&lt;?</span><span class="pln">php echo $text_loading</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" class="btn btn-primary btn-lg btn-block"&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $button_cart</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/button&gt;</span></pre>

<p>
	Добавляем новую кнопку
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">&lt;button type="button" id="button-cartnew" data-loading-text="</span><span class="pun">&lt;?</span><span class="pln">php echo $text_loading</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">" class="btn btn-primary btn-lg btn-block"&gt;</span><span class="tag">&lt;i</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"fa fa-plane"</span><span class="tag">&gt;&lt;/i&gt;&lt;/button&gt;</span></pre>

<p>
	Так же сохраняем, обновляем модификаторы и радуемся результату.
</p>
]]></description><guid isPermaLink="false">726</guid><pubDate>Sun, 06 Nov 2022 20:17:07 +0000</pubDate></item><item><title>&#x423;&#x442;&#x43E;&#x447;&#x43D;&#x438;&#x442;&#x44C; &#x446;&#x435;&#x43D;&#x443; &#x43F;&#x440;&#x438; &#x43D;&#x443;&#x43B;&#x435;&#x432;&#x43E;&#x439; &#x441;&#x442;&#x43E;&#x438;&#x43C;&#x43E;&#x441;&#x442;&#x438; &#x442;&#x43E;&#x432;&#x430;&#x440;&#x430; Opencart</title><link>http://opencartpascha.ru/topic/725-utochnit-cenu-pri-nulevoy-stoimosti-tovara-opencart/</link><description><![CDATA[<p>
	Не редко в интернет магазине бывает такая ситуация, когда указать актуальную цену невозможно. Например, товар идет только под заказ или цена на товар меняется довольно часто. У таких товаров цену обычно ставят нулевой и указывают что товар может быть только под заказ. Для клиента цена в ниже нуля выглядит не особо красиво и в ряде случаев может привести к тому, что потенциальный клиент просто уйдет от Вас.
</p>

<p>
	Лучшим решением данной проблемы будет вывод «заглушки», т.е. какой то надписи, например «Уточняйте цену». В идеале конечно делать интерактивное окно запроса уточнения цены, однако это не тема сегодняшней статьи.
</p>

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

<p>
	Заменяем нулевую цену в категориях опенкарт на «Уточнить цену»
</p>

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

<p>
	<strong>catalog/controller/product/category.php</strong>
</p>

<p>
	после
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['text_limit'] = $this-&gt;language-&gt;get('text_limit');</span></pre>

<p>
	Добавим
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['text_nullpprice'] = $this-&gt;language-&gt;get('text_nullpprice');</span></pre>

<p>
	Тут же добавим новую переменную, чтобы определять «чистую» цену. Находим
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$price = $this-&gt;currency-&gt;format($this-&gt;tax-&gt;calculate($result['price'], $result['tax_class_id'], $this-&gt;config-&gt;get('config_tax')), $this-&gt;session-&gt;data['currency']);</span></pre>

<p>
	И под ней добавляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$pricenull = $result['price'];</span></pre>

<p>
	Далее ищем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'price'       =&gt; $price,</span></pre>

<p>
	и сразу за нм добавляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'pricenull'       =&gt; $pricenull,</span></pre>

<p>
	Теперь добавим переменную в языковой файлах
</p>

<p>
	<strong>catalog/language/ru-ru/product/category.php</strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$_['text_limit']        = 'Показывать:';</span></pre>

<p>
	Добавляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$_['text_nullpprice']        = 'Уточняйте цену';</span></pre>

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

<p>
	После переходим непосредственно к темплейту категорий по адресу
</p>

<p>
	<strong>catalog/view/theme/default/template/product/category.tpl(category.twig)</strong>
</p>

<p>
	Находим примерно на 108 строке конструкцию               
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">$product</span><span class="pun">[</span><span class="str">'special'</span><span class="pun">])</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
  </span><span class="pun">&lt;?</span><span class="pln">php echo $product</span><span class="pun">[</span><span class="str">'price'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php </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="pun">?&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">$product</span><span class="pun">[</span><span class="str">'special'</span><span class="pun">])</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
 </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">product</span><span class="pun">[</span><span class="str">'pricenull'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="str">'0'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
   </span><span class="pun">&lt;?</span><span class="pln">php echo product</span><span class="pun">[</span><span class="str">'price'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
    </span><span class="pun">&lt;?</span><span class="pln">php </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="pun">?&gt;</span><span class="pln">
   </span><span class="pun">&lt;?</span><span class="pln">php echo $text_nullpprice</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
 </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php </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="pun">?&gt;</span></pre>

<p>
	Для версии опенкарт 3.х
</p>

<p>
	Находим первое вхождение
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">{{ product.price }}</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">{% if (product.pricenull &gt; '0') %}
{{ product.price }}
 {% else %}
{{ product.text_nullpprice }}
{% endif %}</span></pre>

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

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

<p>
	Заменяем нулевую цену в карточке опенкарт на «Уточнить цену»
</p>

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

<p>
	<strong>catalog/controller/product/product.php</strong>
</p>

<p>
	и добавляем языковую переменную. После
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['text_loading'] = $this-&gt;language-&gt;get('text_loading');</span></pre>

<p>
	Добавляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['text_nullpprice'] = $this-&gt;language-&gt;get('text_nullpprice');</span></pre>

<p>
	Тут же находим
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['price'] = $this-&gt;currency-&gt;format($this-&gt;tax-&gt;calculate($product_info['price'], $product_info['tax_class_id'], $this-&gt;config-&gt;get('config_tax')), $this-&gt;session-&gt;data['currency']);</span></pre>

<p>
	И снизу добавляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['pricenull'] = $product_info['price'];</span></pre>

<p>
	Далее ищем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$price = $this-&gt;currency-&gt;format($this-&gt;tax-&gt;calculate($result['price'], $result['tax_class_id'], $this-&gt;config-&gt;get('config_tax')), $this-&gt;session-&gt;data['currency']);</span></pre>

<p>
	И так же снизу добавляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$pricenull = $product_info['price'];</span></pre>

<p>
	И дальше ищем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'price'       =&gt; $price,</span></pre>

<p>
	и ниже добавляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'pricenull'       =&gt; $pricenull,</span></pre>

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

<p>
	<strong>catalog/language/ru-ru/product/product.php</strong>
</p>

<p>
	После
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$_['text_year']  = 'год';</span></pre>

<p>
	Добавляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$_['text_nullpprice']  = 'Уточняйте цену';</span></pre>

<p>
	Для других языков делаем то же самое.
</p>

<p>
	Далее можно переходить к темплейту карточки товара
</p>

<p>
	<strong>catalog/view/theme/default/template/product/product.tpl(product.twig)</strong>
</p>

<p>
	Здесь изменения будем делать как для самого товара, так и для рекомендуемых товаров. Находим            
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">$special</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
  </span><span class="tag">&lt;li&gt;</span><span class="pln">
   </span><span class="tag">&lt;h2&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $price</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
  </span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php </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="pun">?&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln"> </span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">$special</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
   </span><span class="tag">&lt;li&gt;</span><span class="pln">
   </span><span class="tag">&lt;h2&gt;</span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">pricenull </span><span class="pun">&gt;</span><span class="pln"> </span><span class="str">'0'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;&lt;?</span><span class="pln">php echo $price</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;&lt;?</span><span class="pln">php </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="pun">?&gt;&lt;?</span><span class="pln">php echo $text_nullpprice</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
   </span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php </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="pun">?&gt;</span></pre>

<p>
	Для версии 3.х
</p>

<p>
	Находим            
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">{% if not special %}
 </span><span class="tag">&lt;li&gt;</span><span class="pln">
   </span><span class="tag">&lt;h2&gt;</span><span class="pln">{{ price }}</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
 </span><span class="tag">&lt;/li&gt;</span><span class="pln">
{% else %}</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">{% if not special %}
 </span><span class="tag">&lt;li&gt;</span><span class="pln">
  </span><span class="tag">&lt;h2&gt;</span><span class="pln">{% if (pricenull &gt; '0') %}{{ price }}{% else %}{{ text_nullpprice }}{% endif %} </span><span class="tag">&lt;/h2&gt;</span><span class="pln">
 </span><span class="tag">&lt;/li&gt;</span><span class="pln">
{% else %}</span></pre>

<p>
	Теперь добавим доработку для рекомендуемых.
</p>

<p>
	Находим
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">$product</span><span class="pun">[</span><span class="str">'special'</span><span class="pun">])</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
  </span><span class="pun">&lt;?</span><span class="pln">php echo $product</span><span class="pun">[</span><span class="str">'price'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php </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="pun">?&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">$product</span><span class="pun">[</span><span class="str">'special'</span><span class="pun">])</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">

</span><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">product</span><span class="pun">[</span><span class="str">'pricenull'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="str">'0'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">

</span><span class="pun">&lt;?</span><span class="pln">php echo product</span><span class="pun">[</span><span class="str">'price'</span><span class="pun">];</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">

</span><span class="pun">&lt;?</span><span class="pln">php </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="pun">?&gt;</span><span class="pln">

</span><span class="pun">&lt;?</span><span class="pln">php echo $text_nullpprice</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">

</span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">

</span><span class="pun">&lt;?</span><span class="pln">php </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="pun">?&gt;</span></pre>

<p>
	Для версии опенкарт 3.х
</p>

<p>
	Находим первое вхождение
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">{{ product.price }}</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">{% if (product.pricenull &gt; '0') %}
{{ product.price }}
{% else %}
{{ product.text_nullpprice }}
{% endif %}</span></pre>

<p>
	Сохраняем, обновляем модификаторы и проверяем результат.
</p>

<p>
	Если все сделано верно, вместо нулевой цены будет написано «Уточняйте цены».
</p>
]]></description><guid isPermaLink="false">725</guid><pubDate>Sun, 06 Nov 2022 20:04:28 +0000</pubDate></item><item><title>&#x41A;&#x430;&#x43A; &#x432;&#x44B;&#x432;&#x435;&#x441;&#x442;&#x438; &#x43E;&#x441;&#x43D;&#x43E;&#x432;&#x43D;&#x443;&#x44E; &#x438; &#x43E;&#x43F;&#x442;&#x43E;&#x432;&#x443;&#x44E; &#x446;&#x435;&#x43D;&#x443; &#x432; opencart</title><link>http://opencartpascha.ru/topic/724-kak-vyvesti-osnovnuyu-i-optovuyu-cenu-v-opencart/</link><description><![CDATA[<p>
	Думаю все в курсе, что в опенкарт можно задавать скидочные цены. При чем их можно задавать для разных групп покупателей. Обычно скидочная цена задается в зависимости от количества товара. Выводятся эти цены обычно под основной ценой в виде таблицы
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="255" width="500" alt="cart1.png.dde8a9a628193ef7ee0986686dfe0d12.png" src="http://opencartpascha.ru/uploads/monthly_2022_11/cart1.png.dde8a9a628193ef7ee0986686dfe0d12.png" loading="lazy" height="465">
</p>

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

<p>
	Сегодня сделаем реализацию вывода розничной и оптовой цены для магазина, который помимо розничной торговли, занимается оптовой. Т.е. на сайте есть группа покупателей Оптовики. Все дело в том, что если для оптовых покупателей указать скидочную цену от 1 единицы товара, то будет выводиться только скидочная цена, и оптовик не будет видеть сколько он экономит, по сравнению с розничным покупателем.
</p>

<p>
	Сложного ничего нет и работа займет не больше пяти минут.
</p>

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

<p>
	Прежде всего переходим в модель товара
</p>

<p>
	<strong>/catalog/model/catalog/product.php</strong>
</p>

<p>
	 
</p>

<p>
	Примерно на 33 строке после
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'price'            =&gt; ($query-&gt;row['discount'] ? $query-&gt;row['discount'] : $query-&gt;row['price']),</span></pre>

<p>
	Добавляем
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">'standart_price'   =&gt; $query-&gt;row['price'],</span></pre>

<p>
	Сохраняем и переходим к контроллеру по адресу
</p>

<p>
	<strong>/catalog/controller/product/product.php</strong>
</p>

<p>
	и после строки
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['price'] = $this-&gt;currency-&gt;format($this-&gt;tax-&gt;calculate($product_info['price'], $product_info['tax_class_id'], $this-&gt;config-&gt;get('config_tax')));</span></pre>

<p>
	нам необходимо добавить основную цену.
</p>

<p>
	Назовем ее standart_price. Вывод стандартной цены будет выглядеть так
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['standart_price'] = $this-&gt;currency-&gt;format($this-&gt;tax-&gt;calculate($product_info['standart_price'], $product_info['tax_class_id'], $this-&gt;config-&gt;get('config_tax')));</span></pre>

<p>
	Однако это не все. Так как шаблон карточки товара для всех групп пользователей один, то необходимо задать условие, при котором мы будем или не будем отдавать стандартную цену. Так как если этого не сделать, то в карточке товара для оптового покупателя все будет работать правильно, а вот для розничного будет выводиться две одинаковые цены на с разным названием)
</p>

<p>
	В итоге добавляемая конструкция будет выглядеть так
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if ($product_info['standart_price']==$product_info['price']) {
$data['standart_price'] = false;
} else {
$data['standart_price'] = $this-&gt;currency-&gt;format($this-&gt;tax-&gt;calculate($product_info['standart_price'], $product_info['tax_class_id'], $this-&gt;config-&gt;get('config_tax')));
}</span></pre>

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

<p>
	<strong>/catalog/view/theme/default/template/product/product.tpl</strong>
</p>

<p>
	Перед
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$tax</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>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$standart_price</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
            </span><span class="tag">&lt;li&gt;</span><span class="pln">
              </span><span class="tag">&lt;h2&gt;</span><span class="pln">Розничная цена: </span><span class="pun">&lt;?</span><span class="pln">php echo $standart_price</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
            </span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php </span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<p>
	Такая конструкция верна для магазина с одним языком. Если же у Вас мультиязычный магазин, тогда вместо «Розничная цена:» необходимо добавить языковую переменную, прописать ее в контроллере, а в языковых файлах прописать значение. 
</p>

<p>
	Сохраняем все изменения, обновляем модификаторы и если все сделано верно, то Вы должны увидеть что то такое
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="256" width="743" alt="skidochnaya2.jpg.6618e852b82d2dc21ff943730d55b8a7.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_11/skidochnaya2.jpg.6618e852b82d2dc21ff943730d55b8a7.jpg" loading="lazy" height="364.07">
</p>
]]></description><guid isPermaLink="false">724</guid><pubDate>Sun, 06 Nov 2022 19:52:06 +0000</pubDate></item><item><title>&#x41D;&#x430;&#x43F;&#x438;&#x441;&#x430;&#x43D;&#x438;&#x435; &#x43C;&#x43E;&#x434;&#x438;&#x444;&#x438;&#x43A;&#x430;&#x442;&#x43E;&#x440;&#x430; &#x434;&#x43B;&#x44F; OpenCart</title><link>http://opencartpascha.ru/topic/695-napisanie-modifikatora-dlya-opencart/</link><description><![CDATA[<p>
	<strong>Модификаторы в OpenCart</strong> - это разновидность модулей, позволяющих вносить изменения в функционал или внешний вид, при этом не затрагивая оригинальные файлы. Таким образом обеспечивается неизменность файлов самого opencart-а, но при этом мы можем менять или добавлять функционал. В этой статье я расскажу как создать свой модификатор для OpenCart и какие есть возможности у модификаторов.
</p>

<p>
	Изначально, история появления модификаторов началась с vQmod в версии 1.5 opencart-а, а затем его усовершенствовали и преобразовали в OCMOD, который стал постоянным стандартным функционалом OpenCart-а начиная с 2.1 версии. Итак, попробую дать определение понятию модификатор в OpenCart.
</p>

<p>
	<strong>Модификатор в OpenCart</strong> - это модуль представляющий собой XML-файл, содержащий набор инструкций о том в каких оригинальных файлах OpenCart-а, в каких местах, какой код нужно заменить, добавить или удалить. OpenCart при выполнении инструкций xml-файла создает копии исходных файлов в специальную директорию (кэш модификаторов) и вносит изменения в этих копиях. В результате, при работе сайта используются измененные файлы, а не оригиналы.
</p>

<p>
	<strong>Модификатор OCMOD</strong> может быть как самостоятельным модулем, изменяющим или дополняющим стандартный функционал, так и входить в состав полноценного модуля с дополнительными php, twig и другими файлами. О написании полного модуля читайте в предыдущей статье.
</p>

<p>
	<strong>Имена файлов и директории</strong>
</p>

<p>
	<strong>Имя файла модификатора</strong> - должно быть задано в соответствии с шаблоном &lt;имя_файла&gt;.ocmod.xml , где вместо &lt;имя_файла&gt; вы пишите свое название. Таким образом имя файла всегда должно заканчиваться ".ocmod.xml", иначе система не "увидит" модификатор и проигнорирует его.<br />
	Исключение: когда предполагается использовать модификатор в составе полного модуля в виде архива - в этом случае имя файла-модификатора в архиве должно быть install.xml.
</p>

<p>
	<strong>Расположение файла модификатора </strong>- папка system в корне сайта. Файл-модификатор так же можно загрузить в базу данных на постоянное размещение с помощью загрузки расширений. Тем не менее, во время разработки удобнее записать файл в system и редактировать его там, проверяя какой получается результат, а когда разработка завершена, модификатор загружают как модуль в базу данных.
</p>

<p>
	<strong>Расположение кэша модификаторов</strong> - папка /storage/modification с такой же структурой, как корень сайта. Т.е. если вы сделали модификатор для файла /admin/controller/catalog/product.php то его измененная копия будет находится в /storage/modification/admin/controller/catalog/product.php. В нем вы и увидите те изменения которые производит ваш модификатор.
</p>

<p>
	<strong>Расположение логов</strong> - папка /storage/logs В ней есть 2 основных лог-фала: ocmod.log - который показывает как обрабатывались файлы-модификаторы, в какой последовательности и как выполнялись инструкции и лог-файл error.log - который содержит ошибки, произошедшие при преобразовании.
</p>

<p>
	Обновление кэша модификаторов
</p>

<p>
	Для того, чтобы система увидела файлы-модификаторы и выполнила их инструкции, необходимо нажать кнопку "Обновить" на странице модификаторы.
</p>

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

<p>
	<strong>Синтаксис модификатора OCMOD</strong>
</p>

<p>
	Файл модификатора OCMOD должен содержать общую описательную часть и инструкции по изменению файлов. Начну разбор синтаксиса с простого примера, который добавляет слово "Test" в шапке администраторского раздела:
</p>

<pre class="ipsCode prettyprint lang-html 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">Test</span><span class="tag">&lt;/name&gt;</span><span class="pln">                </span><span class="com">&lt;!-- Название модификатора --&gt;</span><span class="pln">

  </span><span class="tag">&lt;code&gt;</span><span class="pln">Test</span><span class="tag">&lt;/code&gt;</span><span class="pln">                </span><span class="com">&lt;!-- Уникальный код модификатора --&gt;</span><span class="pln">

  </span><span class="tag">&lt;version&gt;</span><span class="pln">1.0</span><span class="tag">&lt;/version&gt;</span><span class="pln">           </span><span class="com">&lt;!-- Версия --&gt;</span><span class="pln">

  </span><span class="tag">&lt;author&gt;</span><span class="pln">Test</span><span class="tag">&lt;/author&gt;</span><span class="pln">            </span><span class="com">&lt;!-- Автор --&gt;</span><span class="pln">

  </span><span class="tag">&lt;link&gt;</span><span class="pln">http://www.test.ru</span><span class="tag">&lt;/link&gt;</span><span class="pln">  </span><span class="com">&lt;!-- Сайт разработчика --&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/view/template/common/header.twig"</span><span class="tag">&gt;</span><span class="pln">  </span><span class="com">&lt;!-- Какой файл будет модифицироваться --&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">                           </span><span class="com">&lt;!-- Найти код в файле --&gt;</span><span class="pln">

      &lt;![CDATA[

        </span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"container-fluid"</span><span class="tag">&gt;</span><span class="pln">

      ]]&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">             </span><span class="com">&lt;!-- Добавление модификации (после найденного кода) --&gt;</span><span class="pln">

      &lt;![CDATA[

        </span><span class="tag">&lt;p&gt;</span><span class="pln">Тест</span><span class="tag">&lt;/p&gt;</span><span class="pln">

      ]]&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>
	Итак, данный пример модификатора меняет файл header.twig.
</p>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"container-fluid"</span><span class="tag">&gt;</span></pre>

<p>
	и после нее добавляет
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;p&gt;</span><span class="pln">Тест</span><span class="tag">&lt;/p&gt;</span></pre>

<p>
	В одном xml-файле может быть любое количество секций &lt;file&gt; и соответственно, мы можем менять множество файлов одним модификатором.
</p>

<p>
	Разберем каждый тег модификатора и его возможности поподробнее.
</p>

<p>
	<strong>File</strong>
</p>

<p>
	Указывает в каком файле или файлах нужно внести изменения. Обязательный атрибут path содержит путь до изменяемого файла. Может указывать на один файл или на несколько. Для указания нескольких файлов используется символ "|". Например, внести изменения в action.php и в loader.php
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;file</span><span class="pln"> </span><span class="atn">path</span><span class="pun">=</span><span class="atv">"system/engine/action.php|system/engine/loader.php"</span><span class="tag">&gt;</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;file</span><span class="pln"> </span><span class="atn">path</span><span class="pun">=</span><span class="atv">"system/engine/{action,loader}.php"</span><span class="tag">&gt;</span></pre>

<p>
	Так же можно использовать символы "*" и "?", чтобы указать путь по "маске". Часто бывает полезно для модификации файлов-шаблонов.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;file</span><span class="pln"> </span><span class="atn">path</span><span class="pun">=</span><span class="atv">"catalog/view/theme/*/template/product/product.twig"</span><span class="tag">&gt;</span></pre>

<p>
	Т.к. мы не знаем заранее, какие именно темы установлены в OpenCart, мы указали "*" после "theme" и тогда будут модифицироваться все product.twig во всех темах.
</p>

<p>
	<strong>Operation</strong>
</p>

<p>
	Указывает начало секции производимой модификации. Внутри File секций &lt;operation&gt; может быть несколько. Т.е мы можем делать сразу несколько изменений в одном файле. Тег Operation может иметь необязательный атрибут error, который может принимать значения:
</p>

<p>
	<strong>skip</strong> - в случае ошибки пропустить текущую секцию &lt;operation&gt; и перейти к следующей &lt;operation&gt;
</p>

<p>
	<strong>log</strong> (по-умолчанию) - в случае ошибки пропустить всю секцию &lt;file&gt; и перейти к следующему &lt;file&gt;
</p>

<p>
	<strong>abort</strong> - в случае ошибки прервать все модификации в xml-файле
</p>

<p>
	Например, найти в файле header.twig текст "navbar-rightnav" и если его нет, тогда пропустить и перейти к следующей операции и найти "navbar-right":
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;file</span><span class="pln"> </span><span class="atn">path</span><span class="pun">=</span><span class="atv">"admin/view/template/common/header.twig"</span><span class="tag">&gt;</span><span class="pln">

  </span><span class="tag">&lt;operation</span><span class="pln"> </span><span class="atn">error</span><span class="pun">=</span><span class="atv">"skip"</span><span class="tag">&gt;</span><span class="pln">

    </span><span class="tag">&lt;search&gt;</span><span class="pln">&lt;![CDATA[ navbar-rightnav ]]&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[

       </span><span class="tag">&lt;li&gt;</span><span class="pln">Test1</span><span class="tag">&lt;/li&gt;</span><span class="pln">

    ]]&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;operation</span><span class="pln"> </span><span class="atn">error</span><span class="pun">=</span><span class="atv">"skip"</span><span class="tag">&gt;</span><span class="pln">

    </span><span class="tag">&lt;search&gt;</span><span class="pln">&lt;![CDATA[ navbar-right ]]&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[

       </span><span class="tag">&lt;li&gt;</span><span class="pln">Test2</span><span class="tag">&lt;/li&gt;</span><span class="pln">

    ]]&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>
	Если не указывать атрибут error="skip", тогда на первом поиске текста "navbar-rightnav" вся секция &lt;file&gt; была бы прервана и проигнорирована.
</p>

<p>
	<strong>Search</strong>
</p>

<p>
	Указывает какой текст необходимо найти в текущей операции. Есть несколько правил использования тега:
</p>

<p>
	Тег Search может быть использован только 1 раз внутри секции Operation.
</p>

<p>
	Поиск можно делать только 1 строки целиком или части строки (нельзя искать несколько строк одновременно).
</p>

<p>
	Искомый текст необходимо размещать между &lt;![CDATA[ и ]]&gt;.
</p>

<p>
	Пробелы и переносы строки до искомого текста и после искомого текста игнорируются (поэтому искомый текст можно написать или сразу после CDATA или с новой строки после CDATA, как больше нравится), если только не указан атрибут trim="false" (описание ниже).
</p>

<p>
	Изменения выполняются над всеми найденными в файле строками (или частями строк), если только не указан атрибут index (описание ниже).
</p>

<p>
	Специальные теги &lt;![CDATA[ и ]]&gt; - используются в xml-файлах для указания любых символьных данных, что означает, что между ними может находиться какой угодно текст, содержащий скобки, значи больше, меньше и другие, в т.ч. и php-код, html-код и т.д.
</p>

<p>
	Для более точного определения места внесения изменений в теге Search могут использоваться атрибуты:
</p>

<p>
	<strong>index</strong> - указывает в каком по-порядку найденном тексте сделать изменения. Т.е. если в файле искомый текст встречается несколько раз, тогда index позволяет указать номер найденного по порядку текста (0 - первый найденный текст, 1 - второй и т.д.) Можно так же указать несколько номеров через запятую.
</p>

<p>
	<strong>trim</strong> - указывает игнорировать (true) или нет (false) пробелы и переносы строк до и после искомого текста.
</p>

<p>
	<strong>regex</strong> - если установлено значении true, значит искомый текст представляет собой регулярное выражение для поиска.
</p>

<p>
	Пример: добавить пункт меню "ТЕСТ".
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><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/column_left.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</span><span class="pln"> </span><span class="atn">index</span><span class="pun">=</span><span class="atv">"0"</span><span class="pln"> </span><span class="atn">trim</span><span class="pun">=</span><span class="atv">"true"</span><span class="tag">&gt;</span><span class="pln">&lt;![CDATA[

      $data['menus'][] = array(

    ]]&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">"before"</span><span class="tag">&gt;</span><span class="pln">&lt;![CDATA[

      $data['menus'][] = array(

        'id'       =&gt; 'menu-test',

        'icon'     =&gt; 'fa-play',

        'name'     =&gt; 'TEST',

        'href'     =&gt; '#'

      );

    ]]&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>
	В данном примере находим первое "$data['menus'][] = array(" и перед ним добавляем свой код.
</p>

<p>
	<strong>Add</strong>
</p>

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

<p>
	Так же как и тег Search, должен содержать &lt;![CDATA[ и ]]&gt; между которыми пишется текст кода, который будет добавляться/заменяться.
</p>

<p>
	В теге Add могут использоваться атрибуты:
</p>

<p>
	<strong>position</strong> - может принимать значения:
</p>

<p>
	<strong>replace</strong> (по умолчанию) - замена найденного текста
</p>

<p>
	<strong>before</strong> - добавить текст перед найденным текстом
</p>

<p>
	<strong>after</strong> - добавить текст после найденного текста
</p>

<p>
	<strong>offset</strong> - означает смещение относительно найденного текста на указанное количество строк. Если position="before", тогда смещение будет вверх от найденного текста, если position="after" или position="replace", тогда смещение будет вниз от найденного текста.
</p>

<p>
	<strong>trim</strong> - указывает игнорировать (true) или нет (false) пробелы и переносы строк до и после искомого текста.
</p>

<p>
	Пример: Добавить слово "Test" в админ-панели в списке товаров.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;file</span><span class="pln"> </span><span class="atn">path</span><span class="pun">=</span><span class="atv">"admin/view/template/catalog/product_list.twig"</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</span><span class="pln"> </span><span class="atn">index</span><span class="pun">=</span><span class="atv">"1"</span><span class="pln"> </span><span class="atn">trim</span><span class="pun">=</span><span class="atv">"true"</span><span class="tag">&gt;</span><span class="pln">&lt;![CDATA[

      panel-body

    ]]&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="pln"> </span><span class="atn">offset</span><span class="pun">=</span><span class="atv">"1"</span><span class="pln"> </span><span class="atn">trim</span><span class="pun">=</span><span class="atv">"true"</span><span class="tag">&gt;</span><span class="pln">&lt;![CDATA[

      </span><span class="tag">&lt;p&gt;</span><span class="pln">Test</span><span class="tag">&lt;/p&gt;</span><span class="pln">

    ]]&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>
	Находим 2-й по порядку текст "panel-body" (первый - это фильтр справа от товаров, а второй - сам список товаров) и затем добавляем код "&lt;p&gt;Test&lt;/p&gt;" на одну строку ниже найденного текста.
</p>

<p>
	Обратите внимание: position="before" и position="after" добавляют код не в середину строки, где было найдено "panel-body", а в следующую (или предыдущую) строку. Если нужно сделать добавление в середине строки, следует использовать position="replace" и повторив тот же самый найденный текст мы добавляем свой.
</p>

<p>
	Пример: Добавить текст перед версией opencart-а в футере
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;file</span><span class="pln"> </span><span class="atn">path</span><span class="pun">=</span><span class="atv">"admin/view/template/common/footer.twig"</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[

      {{ text_version }}

    ]]&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">"replace"</span><span class="pln"> </span><span class="atn">trim</span><span class="pun">=</span><span class="atv">"true"</span><span class="tag">&gt;</span><span class="pln">&lt;![CDATA[

      </span><span class="tag">&lt;p&gt;</span><span class="pln">Test</span><span class="tag">&lt;/p&gt;</span><span class="pln">{{ text_version }}

    ]]&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>
	Создав модификатор OCMOD в OpenCart-е можно изменить практически всю систему, расширить ее возможности, при этом исходные файлы не будут затронуты и вы можете всё вернуть в первоначальный вид, просто убрав файл-модификатор (или отключив его, если он был загружен в базу данных).
</p>
]]></description><guid isPermaLink="false">695</guid><pubDate>Wed, 19 Oct 2022 11:50:20 +0000</pubDate></item><item><title>&#x412;&#x44B;&#x432;&#x43E;&#x434; &#x430;&#x440;&#x442;&#x438;&#x43A;&#x443;&#x43B;&#x430; &#x432; OpenCart</title><link>http://opencartpascha.ru/topic/670-vyvod-artikula-v-opencart/</link><description><![CDATA[<p>
	Стандартное исполнение интернет-магазина на движке OpenCart позволяет выполнить покупателю и продавцу выполнить элементарные вещи, это найти интересующий товар в каталоге, положить его в корзину, и оформить заказ. Иногда этого бывает вполне достаточно для функционирование простого магазина на OpentCart. Однако рано или поздно те или иные доработки интернет-магазина приведут к тому, что возникнет необходимость оперировать дополнительными данными в системе. Как мы знаем в администраторской части по умолчанию предусмотрено множество полей с различными данными, однако не все из них показываются в публичной части сайта, далее речь пойдет о данных в карточки товара. В этом посту рассмотрим простой пример, как можно вывести артикул в OpenCart на карточке товара. Артикул товара вы можете заметить в администраторской части, на форме редактирования товара.
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="248" width="450" alt="articul.png.45a392bc0f9a6dae965a7f1a308d8f78.png" src="http://opencartpascha.ru/uploads/monthly_2022_10/articul.png.45a392bc0f9a6dae965a7f1a308d8f78.png" loading="lazy" height="99">
</p>

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

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="249" width="445" alt="art.png.d3f392d59a89b87231e1d3bbb86b84cf.png" src="http://opencartpascha.ru/uploads/monthly_2022_10/art.png.d3f392d59a89b87231e1d3bbb86b84cf.png" loading="lazy" height="271.45">
</p>

<p>
	Итак, если вы немного знакомы с тем как работает движок, у вас уже есть представление о контроллере, и виде. Данная концепция разделения кода и отображения (MVC) в целом используется в подавляющем большинстве движков, по этой причине если вам уже приходилось сталкиваться с подобным, вам будет проще.
</p>

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

<p>
	Откройте файл контроллера:<br>
	catalog/controller/product/product.php
</p>

<p>
	Далее следует найти строку вида:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['model'] = $product_info['model'];</span></pre>

<p>
	Добавьте перед этой строкой или после строку:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['sku'] = $product_info['sku'];</span></pre>

<p>
	Передавая в массив данные с ключом sku в шаблоне отображения страницы, мы теперь получим переменную $sku, в которой собственно и будет находиться значение артикула. Таким образом, при надобности можно производить какие-либо манипуляции с данными, мы же просто выведем значение этой переменной в шаблоне активной темы.
</p>

<p>
	Откройте шаблон отображения страницы товара:<br>
	catalog/view/theme/mytheme/template/product/product.tpl
</p>

<p>
	Далее найдите следующую строку кода:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;li&gt;</span><span class="pun">&lt;?</span><span class="pln">php echo $text_model</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln"> </span><span class="pun">&lt;?</span><span class="pln">php echo $model</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="tag">&lt;/li&gt;</span></pre>

<p>
	Добавляем вывод значения переменной $sku:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pun">&lt;?</span><span class="pln">php </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">$sku</span><span class="pun">):</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
</span><span class="tag">&lt;li&gt;</span><span class="pln">Артикул: </span><span class="pun">&lt;?=</span><span class="pln">$sku</span><span class="pun">;?&gt;</span><span class="tag">&lt;/li&gt;</span><span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php endif</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span></pre>

<p>
	В примере мы название параметра «Артикул» прямо в самом шаблоне. Хорошим тоном является выводить данные значения в языковые файлы. Это избавить вас от лишней волокиты при переключении языков на сайте. Добавить значение в языковой файл не составляет большого труда, давайте это сделаем. Первым делом следует добавить значение в языковой файл, который располагается по следующему пути:<br>
	catalog/language/язык_сайта
</p>

<p>
	Добавляем в начале или в конце строку:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$_['text_sku'] = 'Vendor Code:'; // для анг. языка
$_['text_sku'] = 'Артикул:'; // для русского языка</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$data['text_sku'] = $this-&gt;language-&gt;get('text_sku');</span></pre>

<p>
	Имя параметра будет взято в соответствии с текущим языком сайта. В свою очередь в шаблоне отображения следует вписать переменную $text_sku таким образом:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="tag">&lt;li&gt;</span><span class="pun">&lt;?=</span><span class="pln"> $text_sku</span><span class="pun">;</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln"> </span><span class="pun">&lt;?=</span><span class="pln">$sku</span><span class="pun">;?&gt;</span><span class="tag">&lt;/li&gt;</span></pre>

<p>
	После сохранения изменений самое время проверить результаты правок. Если всё было верно, то в качестве значения в переменной $text_sku будет передано название параметра SKU на языке сайта, а в переменной $sku будет передано значение самого артикула.
</p>
]]></description><guid isPermaLink="false">670</guid><pubDate>Thu, 13 Oct 2022 15:14:58 +0000</pubDate></item><item><title>&#x41F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x441;&#x43A;&#x438;&#x435; &#x432;&#x441;&#x43F;&#x43E;&#x43C;&#x43E;&#x433;&#x430;&#x442;&#x435;&#x43B;&#x44C;&#x43D;&#x44B;&#x435; &#x444;&#x443;&#x43D;&#x43A;&#x446;&#x438;&#x438; &#x432; OpenCart</title><link>http://opencartpascha.ru/topic/669-polzovatelskie-vspomogatelnye-funkcii-v-opencart/</link><description><![CDATA[<p>
	При проектировании сайтов довольно часто приходится использовать некоторые функции, которые могут вызываться из разных частей сайтов. Не редко такие функции так же могут переносится между проектами, с их модификацией либо без них. В связи с этим удобном способом их можно выносить в отдельный файл, после чего подключать данный файл в нужных участках веб-приложения. Здесь мы рассмотрим похожую ситуацию, где требуется разместить некие функции в OpentCart так, чтобы они были доступны во всём проекте. Для этого можно воспользоваться возможностью создания хелпера (helper), который собственно прекрасно справляется с этой задачей. Термин хелпер может быть вам знаком, т.к. часто используется в различных фреймворках.<br />
	В OpenCart helper-ы размещаются в директории /system/helper. Для этого вам нужно создать файл, который в последующем вы будете подключать в скриптах. Добавим некую функцию для примера это будет функция token, которая будет генерировать некий случайные наборы символов.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">function</span><span class="pln"> token</span><span class="pun">(</span><span class="pln">$length </span><span class="pun">=</span><span class="pln"> </span><span class="lit">32</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// Create token to login with</span><span class="pln">
    $string </span><span class="pun">=</span><span class="pln"> </span><span class="str">'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'</span><span class="pun">;</span><span class="pln">
 
    $token </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">;</span><span class="pln">
 
    </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> $i </span><span class="pun">&lt;</span><span class="pln"> $length</span><span class="pun">;</span><span class="pln"> $i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        $token </span><span class="pun">.=</span><span class="pln"> $string</span><span class="pun">[</span><span class="pln">mt_rand</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> strlen</span><span class="pun">(</span><span class="pln">$string</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </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">return</span><span class="pln"> $token</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	Далее есть два способа включения хелпера в проект. Первый подразумевает постоянное включение хелпера при загрузке приложения. Второй можно включать в отдельных участках кода, что в свою очередь более предпочтительно в вопросе производительности приложения, если хелпер содержит значительное количество кода.<br />
	Подгружаем хелпер для всего проекта OpenCart<br />
	Чтобы подгрузить хелпер для всего проекта, можно подключить файл непосредственно в загрузчике /system/startup добавив строку:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">require_once(DIR_SYSTEM . 'library/myhelper.php');</span></pre>

<p>
	Файл myhelper.php в этом случае это ваш хелпер, который размещен в директории /library. После этого можно обращаться к функциям и классам, которые находятся в этом файле.
</p>

<p>
	<strong>Включение хелпера в отдельных скриптах OpenCart</strong><br />
	Если хелпер содержит значимый в вопросах производительности код, и не на всех частях сайта используется, то рекомендуется подключать хелпер используя встроенный загрузчик OpenCart.<br />
	В этом случае ваш хелпер следует разместить в директории /system/helper. В коде подключение хелпера будет выполняться таким образом:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$this-&gt;load-&gt;helper('helper_name');</span></pre>

<p>
	В качестве значения helper_name следует указать имя файла без расширения php, т.к. сам движок будет дописывать этот суффикс при загрузке. Обращение к функции следует выполнять напрямую, без использования переменной экземпляра класса $this.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$this-&gt;load-&gt;helper('myhelper'); 
token();</span></pre>

<p>
	В результате выполнения данного кода, будет подключен файл хелпера, который находится в файле /system/helper/myhelper.php, где объявлена функция token(), после чего будет произведено обращение к этой функции.
</p>
]]></description><guid isPermaLink="false">669</guid><pubDate>Thu, 13 Oct 2022 15:08:42 +0000</pubDate></item><item><title>&#x41A;&#x430;&#x43A; &#x434;&#x43E;&#x431;&#x430;&#x432;&#x438;&#x442;&#x44C; &#x43E;&#x43F;&#x446;&#x438;&#x44E; &#x442;&#x43E;&#x432;&#x430;&#x440;&#x430; &#x432; &#x43A;&#x43E;&#x440;&#x437;&#x438;&#x43D;&#x443; &#x447;&#x435;&#x440;&#x435;&#x437; cart.add? (OpentCart 2.x)</title><link>http://opencartpascha.ru/topic/668-kak-dobavit-opciyu-tovara-v-korzinu-cherez-cartadd-opentcart-2x/</link><description><![CDATA[<p>
	Перед тем как приступить к самому примеру, давайте разберемся что представляет из себя опция товара в системе OpenCart 2.x. Каждый товар в интернет магазине может иметь набор определённых свойств и характеристик. Ярким примером такой разновидности может быть цвет, размер, и другие параметры, которые так же могут характеризовать какую-либо разновидность товара. В каталоге, таким образом, отображается карточка товара, с возможностью выбора параметров для покупателя. В корзину товар попадает именно в таком виде, каким его выбрал пользователь. По умолчанию в стандартных шаблонах карточка товара этот функционал уже содержит, и производить манипуляции с кодом добавления товара в корзину как правило не возникает.
</p>

<p>
	Но как только вы отходите от стандартного функционала шаблонов, возникает необходимость находить решения различного рода задач.<br />
	Итак, товар в корзину добавляется через ajax посредством функции cart.add. Если посмотреть на код ajax-запроса, то мы можем заметить участок кода похожий на этот:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$.ajax({
    url: 'index.php?route=checkout/cart/add',
    type: 'post',
    data: 'product_id=' + product_id + '&amp;quantity=' + (typeof(quantity) != 'undefined' ? quantity : 1),
...</span></pre>

<p>
	В параметре data как раз и передаются все основные данные о товаре для POST-запроса. Всё что следует сделать для передачи опции товара, немного видоизменить передачу параметров, создав отдельный объект JS.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">var productData = {
        'product_id' : PRODUCT_IDS.CARD,
        'quantity': 1,
        'option': {
            '229': "Some option value"
        }
    };</span></pre>

<p>
	Как вы можете заметить в параметре запроса появилось значение option. Передавая это значение, в корзину попадает указанный товар, с обозначенной опцией. В остальном передача данных происходит аналогичным образом.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">$.ajax({
    url: 'index.php?route=checkout/cart/add',
    type: 'post',
    data: $.param(productData),
    dataType: 'json',
    success: function (json) {
     
    },
    error: function (xhr, ajaxOptions, thrownError) {
 
    }
});</span></pre>

<p>
	На стороне сервера в php-скрипте параметр option по умолчанию обрабатывается такой строкой:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted"><span class="pln">if (isset($this-&gt;request-&gt;post['option'])) {
    $option = array_filter($this-&gt;request-&gt;post['option']);
} else {
    $option = array();
}</span></pre>

<p>
	Изменять на стороне php-скрипта в этом случае ничего не нужно, код показан для информации. Администраторы сайта добавляют товары, а также опции товаров и их ценовое значение. После того как покупатель кладёт товар в корзину, цена так же будет пересчитываться в зависимости от выбранной им опции. Ценовая сетка так же предварительно проставляется при добавлении значений опций. Т.е. каждое значение опции может определять ценообразование товара.
</p>
]]></description><guid isPermaLink="false">668</guid><pubDate>Thu, 13 Oct 2022 15:04:35 +0000</pubDate></item><item><title>&#x41D;&#x430;&#x43B;&#x43E;&#x433;&#x438; &#x43D;&#x430; &#x442;&#x43E;&#x432;&#x430;&#x440;&#x44B; &#x432; OpenCart 2.x</title><link>http://opencartpascha.ru/topic/667-nalogi-na-tovary-v-opencart-2x/</link><description><![CDATA[<p>
	OpenCart как одна из популярных систем управления интернет-магазинами содержит в базовом наборе функционал налогообложения товаров. В большей части данный функционал широко используется европе и западных странах, где принято указывать так же налог на приобретаемый товар. Давайте рассмотрим возможность использования данного функционала в вашем интернет-магазине.<br>
	Всё что будет рассказываться далее, реализовано в базовом шаблоне OpenCart, мы поговорим о том, как это работает и как это настраивается.<br>
	Итак, цены у товаров в каталоге могут отображаться вместе с налогами и отдельно от налогов. Эта опция может использоваться, когда есть необходимость показывать налог для покупателей отдельно от стоимости товара.
</p>

<p>
	Отключение показа цен с налогами<br>
	Отключается эта опция в настройках магазина, параметр «Display prices with tax».<br>
	Admin &gt; System &gt; Settings &gt; Store &gt; Options<br>
	Админ &gt; Система &gt; Настройки &gt; Магазин &gt; Настройки
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="243" width="750" alt="display-price-with-taxes.jpg.b20043c97548c24c20500b1b7583e5d0.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_10/display-price-with-taxes.jpg.b20043c97548c24c20500b1b7583e5d0.jpg" loading="lazy" height="232.5">
</p>

<p>
	<strong>Геозоны для налогов</strong><br>
	Налоговые ставки в OpenCart могут разделяться по геозонам. Это применяется для магазинов, где есть необходимость разделения налогов в зависимости от локации покупателя. Если нет необходимости делить по геозонам, то вам достаточно создать одну запись которая послужит общей для всех налоговых ставок.<br>
	Admin -&gt; System -&gt; Localization -&gt; Geozones<br>
	Админ -&gt; Система -&gt; Локализация -&gt; Геозоны
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="244" width="750" alt="geo-zones.jpg.4664e0a08d88860ef56504a13997aca6.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_10/geo-zones.jpg.4664e0a08d88860ef56504a13997aca6.jpg" loading="lazy" height="285">
</p>

<p>
	<strong>Добавление ставки налога</strong><br>
	Теперь можно добавить налоговую ставку, с указанием типа наложения налога, к примеру, самое популярное — в виде процентов. В свою очередь налоговая ставка привязывается к геозоне, поле Geo Zone.
</p>

<p>
	Admin &gt; System &gt; Localisation &gt; Taxes<br>
	Админ &gt; Система &gt; Локализация &gt; Налоги
</p>

<p>
	 
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="245" width="750" alt="stavki-nalogov.jpg.839b0a77ee6ef241ceec78af58a46f43.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_10/stavki-nalogov.jpg.839b0a77ee6ef241ceec78af58a46f43.jpg" loading="lazy" height="420">
</p>

<p>
	<strong>Добавление класса налога</strong><br>
	Далее следует создать класс налогов. Налоговый класс подразумевает привязку налоговых ставок к местоположениям указываемым покупателем. В данном случае это Shipping Address – адрес доставки.
</p>

<p>
	Админ &gt; Система &gt; Локализация &gt; Налоги<br>
	Admin &gt; System &gt; Localization &gt; Taxes
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="246" width="750" alt="tax-classes-1.jpg.c9ca2f68c9262506ecc21ed16ab48312.jpg" src="http://opencartpascha.ru/uploads/monthly_2022_10/tax-classes-1.jpg.c9ca2f68c9262506ecc21ed16ab48312.jpg" loading="lazy" height="285">
</p>

<p>
	<strong>Указываем класс налога в товаре</strong><br>
	После того как налоги настроены, в самом товаре так же следует указать класс налога, который будет применяться при покупке товара пользователем.<br>
	Catalog &gt; Products &gt; [Product] &gt; Data<br>
	Каталог &gt; Товары &gt; [Товар] &gt; Данные
</p>

<p>
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="247" width="640" alt="tax-class-in-prod.png.1a9b0024050a72c5dcfa0da520ce4b73.png" src="http://opencartpascha.ru/uploads/monthly_2022_10/tax-class-in-prod.png.1a9b0024050a72c5dcfa0da520ce4b73.png" loading="lazy" height="115.2">
</p>

<p>
	Как правило, создаются один или несколько классов налога, которые в последующем указываются во всех товарах в пределах каталога. С первого взгляда, механизм работы налогообложения товара может показаться сложным, но стоит один раз понять, как это работает, то всё это довольно просто.
</p>
]]></description><guid isPermaLink="false">667</guid><pubDate>Thu, 13 Oct 2022 15:01:06 +0000</pubDate></item></channel></rss>
