{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Блог Антона Кима: заметки с тегом OpenCart 3",
    "_rss_description": "Чему жизнь меня научила",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/antonkim.ru\/blog\/tags\/opencart-3\/",
    "feed_url": "https:\/\/antonkim.ru\/blog\/tags\/opencart-3\/json\/",
    "icon": "https:\/\/antonkim.ru\/blog\/user\/userpic@2x.jpg?1710573986",
    "author": {
        "name": "Антон Ким",
        "url": "https:\/\/antonkim.ru\/blog\/",
        "avatar": "https:\/\/antonkim.ru\/blog\/user\/userpic@2x.jpg?1710573986"
    },
    "items": [
        {
            "id": "81",
            "url": "https:\/\/antonkim.ru\/blog\/all\/sku-and-upc\/",
            "title": "OpenCart: как на странице товара вывести SKU и UPC",
            "content_html": "<p>Эти значения вводятся в админке, но на странице товара не отображаются. А иногда нужно, чтобы отображались.<\/p>\n<h2>Что делать<\/h2>\n<ol start=\"1\">\n<li>Открываем <tt>сайт\/catalog\/controller\/product\/product.php<\/tt><\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Находим код (~240 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$data['model'] = $product_info['model'];<\/code><\/pre><ol start=\"3\">\n<li>После вставляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$data['sku'] = $product_info['sku'];\r\n$data['upc'] = $product_info['upc'];<\/code><\/pre><ol start=\"4\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"5\">\n<li>Открываем <tt>сайт\/catalog\/view\/theme\/тема\/template\/product\/product.twig<\/tt><\/li>\n<\/ol>\n<ol start=\"6\">\n<li>Находим место для выведения и вписываем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">{{ sku }}\r\n{{ upc }}<\/code><\/pre><ol start=\"7\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"8\">\n<li>Готово.<\/li>\n<\/ol>\n",
            "date_published": "2020-07-17T05:49:36+00:00",
            "date_modified": "2021-02-24T08:50:58+00:00",
            "_date_published_rfc2822": "Fri, 17 Jul 2020 05:49:36 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "81",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "80",
            "url": "https:\/\/antonkim.ru\/blog\/all\/sku-filter\/",
            "title": "OpenCart: как добавить фильтр по артикулу в админке",
            "content_html": "<p>В стандартном фильтре в админке нельзя «фильтровать» товары по артикулу. Когда у вас тысячи товаров, такой фильтр в разы ускоряет поиск конкретного товара.<\/p>\n<h2>Что делать<\/h2>\n<ol start=\"1\">\n<li>Открываем <tt>сайт\/admin\/controller\/catalog\/product.php<\/tt><\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Находим код (~227 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">protected function getList() {<\/code><\/pre><ol start=\"3\">\n<li>После фигурной скобки вставляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">if (isset($this-&gt;request-&gt;get['filter_sku'])) {\r\n\t$filter_sku = $this-&gt;request-&gt;get['filter_sku'];\r\n} else {\r\n\t$filter_sku = '';\r\n}\r\n$data['filter_sku'] = $filter_sku;<\/code><\/pre><ol start=\"4\">\n<li>В том же файле находим (~276 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$url = ''<\/code><\/pre><ol start=\"5\">\n<li>После вставляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">if (isset($this-&gt;request-&gt;get['filter_sku'])) {\r\n\t$url .= '&amp;filter_sku=' . $this-&gt;request-&gt;get['filter_sku'];\r\n}<\/code><\/pre><ol start=\"6\">\n<li>В том же файле находим (~324 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$filter_data = array(<\/code><\/pre><ol start=\"7\">\n<li>После скобки вставляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">'filter_sku' =&gt; isset($filter_sku) ? $filter_sku : '',<\/code><\/pre><ol start=\"8\">\n<li>Сохраняем, обновляеем кэш.<\/li>\n<\/ol>\n<ol start=\"9\">\n<li>Открываем <tt>сайт\/admin\/model\/catalog\/product.php<\/tt><\/li>\n<\/ol>\n<ol start=\"10\">\n<li>Находим код (~361 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">if (!empty($data['filter_name'])) {\r\n\t$sql .= &quot; AND pd.name LIKE '&quot; . $this-&gt;db-&gt;escape($data['filter_name']) . &quot;%'&quot;;\r\n}<\/code><\/pre><ol start=\"11\">\n<li>После него вставляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">if (isset($this-&gt;request-&gt;get['filter_sku']) &amp;&amp; !empty($data['filter_sku'])) {\r\n\t$sql .= &quot; AND p.sku = '&quot; . $this-&gt;db-&gt;escape($data['filter_sku']) . &quot;'&quot;;\r\n}<\/code><\/pre><ol start=\"12\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"13\">\n<li>Открываем <tt>сайт\/admin\/view\/template\/catalog\/product_list.twig<\/tt><\/li>\n<\/ol>\n<ol start=\"14\">\n<li>Находим код (~68 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;div class=&quot;form-group&quot;&gt;\r\n\t&lt;label class=&quot;control-label&quot; for=&quot;input-quantity&quot;&gt;{{ entry_quantity }}&lt;\/label&gt;\r\n\t&lt;input type=&quot;text&quot; name=&quot;filter_quantity&quot; value=&quot;{{ filter_quantity }}&quot; id=&quot;input-quantity&quot; class=&quot;form-control&quot; \/&gt;\r\n&lt;\/div&gt;<\/code><\/pre><ol start=\"15\">\n<li>После него вставляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;div class=&quot;form-group&quot;&gt;\r\n\t&lt;label class=&quot;control-label&quot; for=&quot;input-sku&quot;&gt;Артикул&lt;\/label&gt;\r\n\t&lt;input type=&quot;text&quot; name=&quot;filter_sku&quot; value=&quot;{{ filter_sku }}&quot; id=&quot;input-sku&quot; class=&quot;form-control&quot; \/&gt;\r\n&lt;\/div&gt;<\/code><\/pre><ol start=\"16\">\n<li>В том же файле находим (~227 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">var filter_status = $('select[name=\\'filter_status\\']').val();<\/code><\/pre><ol start=\"17\">\n<li>После него вставляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">var filter_sku = $('input[name=\\'filter_sku\\']').val();\r\n\r\nif (filter_sku) {\r\n\turl += '&amp;filter_sku=' + encodeURIComponent(filter_sku);\r\n}<\/code><\/pre><ol start=\"18\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"19\">\n<li>Готово.<\/li>\n<\/ol>\n",
            "date_published": "2020-07-17T05:01:13+00:00",
            "date_modified": "2021-02-24T08:51:25+00:00",
            "_date_published_rfc2822": "Fri, 17 Jul 2020 05:01:13 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "80",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "79",
            "url": "https:\/\/antonkim.ru\/blog\/all\/buy-button-disabled\/",
            "title": "OpenCart: как отключить кнопку покупки, когда товара нет в наличии",
            "content_html": "<p>Когда товара нет в наличии, его, по умолчанию, можно добавить в корзину. В таком сценарии нет необходимости.<\/p>\n<h2>Что делать<\/h2>\n<ol start=\"1\">\n<li>Открываем <tt>сайт\/catalog\/controller\/product\/product.php<\/tt><\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Находим код (~251 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">if ($product_info['quantity'] &lt;= 0) {\r\n\t$data['stock'] = $product_info['stock_status'];\r\n} elseif ($this-&gt;config-&gt;get('config_stock_display')) {\r\n\t$data['stock'] = $product_info['quantity'];\r\n} else {\r\n\t$data['stock'] = $this-&gt;language-&gt;get('text_instock');\r\n}<\/code><\/pre><ol start=\"3\">\n<li>Перед ним добавляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$data['stock_quantity'] = $product_info['quantity'];\r\n$data['text_out_of_stock'] = $product_info['stock_status'];<\/code><\/pre><ol start=\"4\">\n<li>В том же файле находим (~436 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$data['products'][] = array(\r\n…\r\n);<\/code><\/pre><ol start=\"5\">\n<li>После скобки добавляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">'quantity' =&gt; $result['quantity'],\r\n'text_out_of_stock' =&gt; $result['stock_status'],<\/code><\/pre><ol start=\"6\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"7\">\n<li>Открываем <tt>сайт\/catalog\/theme\/тема\/template\/product\/product.twig<\/tt><\/li>\n<\/ol>\n<ol start=\"8\">\n<li>Находим код:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;button type=&quot;button&quot; id=&quot;button-cart&quot; data-loading-text=&quot;{{ text_loading }}&quot; class=&quot;btn button-cart&quot;&gt;{{ button_cart }}&lt;\/button&gt;<\/code><\/pre><ul>\n<li>В завимости от темы, код может отличаться, но <tt>button-cart<\/tt> остаётся константой.<\/li>\n<\/ul>\n<ol start=\"9\">\n<li>Заменяем его на:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">{% if stock_quantity &lt; 1 %} \r\n    &lt;button type=&quot;button&quot; id=&quot;button-outstock&quot; disabled=&quot;disabled&quot; data-loading-text=&quot;{{ text_loading }}&quot; class=&quot;btn button-cart&quot;&gt;&lt;i class=&quot;fa fa-exclamation-triangle&quot;&gt;&lt;\/i&gt; {{ text_out_of_stock }}&lt;\/button&gt;\r\n{% else %}\r\n    &lt;button type=&quot;button&quot; id=&quot;button-cart&quot; data-loading-text=&quot;{{ text_loading }}&quot; class=&quot;btn button-cart&quot;&gt;{{ button_cart }}&lt;\/button&gt;\r\n{% endif %}<\/code><\/pre><ol start=\"10\">\n<li>В том же файле находим:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;input type=&quot;text&quot; name=&quot;quantity&quot; value=&quot;{{ minimum }}&quot; size=&quot;2&quot; id=&quot;input-quantity&quot; class=&quot;form-control&quot; \/&gt;<\/code><\/pre><ol start=\"11\">\n<li>Заменяем его на:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">{% if stock_quantity &gt; 1 %} \r\n    &lt;input type=&quot;text&quot; name=&quot;quantity&quot; value=&quot;{{ minimum }}&quot; size=&quot;2&quot; id=&quot;input-quantity&quot; class=&quot;form-control&quot; \/&gt;\r\n{% endif %}<\/code><\/pre><ol start=\"12\">\n<li>В том же файле находим:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;label class=&quot;control-label&quot; for=&quot;input-quantity&quot;&gt;{{ entry_qty }}&lt;\/label&gt;<\/code><\/pre><ol start=\"13\">\n<li>Заменяем его на:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">{% if stock_quantity &gt; 1 %} \r\n    &lt;label class=&quot;control-label&quot; for=&quot;input-quantity&quot;&gt;{{ entry_qty }}&lt;\/label&gt;\r\n{% endif %}<\/code><\/pre><ol start=\"14\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"15\">\n<li>Готово. На странице товара, когда его не будет в наличии, кнопка «Купить» станет неактивной.<\/li>\n<\/ol>\n<p>Возникает вопрос. Вот мы отключили кнопку на странице товара. Славно. Но как быть, если кнопка есть ещё и в категориях, поиске, страницах производителей?<\/p>\n<p>Всё зависит от конкретной темы. Но шаги остаются теми же, — меняются только редактируемые файлы. Например, <tt>category.php<\/tt>, <tt>manufacturer.php<\/tt>, <tt>search.php<\/tt> и пр.<\/p>\n",
            "date_published": "2020-07-16T10:15:05+00:00",
            "date_modified": "2021-03-15T12:05:24+00:00",
            "_date_published_rfc2822": "Thu, 16 Jul 2020 10:15:05 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "79",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "74",
            "url": "https:\/\/antonkim.ru\/blog\/all\/hide-goods\/",
            "title": "OpenCart: как скрыть товары, которых нет в наличии",
            "content_html": "<p>Чтобы были доступны и по ссылке, и в поисковиках.<\/p>\n<h2>В чём проблема<\/h2>\n<p>Представим, что у нас много тысяч товаров на сайте. Многих уже нет в наличии. Но они по-прежнему отображаются и в поиске сайта, и в категориях, и на страницах производителей. А мы знаем, что их больше не будет и они просто так «висят».<\/p>\n<h2>Что делать<\/h2>\n<ol start=\"1\">\n<li>Открыть <kbd>сайт\/catalog\/model\/catalog\/product.php<\/kbd><\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Открыть поиск и найти все условия:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">AND p.status = '1'<\/code><\/pre><ul>\n<li>Это условие отвечает за показ товара, когда он включён.<\/li>\n<\/ul>\n<ol start=\"3\">\n<li>Заменить все найденные условия (кроме одного ↓) на:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">AND p.status = '1' AND p.stock_status_id != '5'<\/code><\/pre><ul>\n<li>Это условие, при котором товар не будет отображаться: включён и нет в наличии.<\/li>\n<\/ul>\n<ol start=\"4\">\n<li>Не заменять условие в самом начале файла:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">public function getProduct($product_id) {\r\n…\r\n}<\/code><\/pre><ol start=\"5\">\n<li>Сохранить, обновить кэш.<\/li>\n<\/ol>\n<ol start=\"6\">\n<li>Готово. Товары, которых нет в наличии, не отображаются, но доступны по прямой ссылке и отображаются в поисковиках.<\/li>\n<\/ol>\n<h2>Другой вариант<\/h2>\n<p>Допустим, что товара нет в наличии временно. И нам нужно, чтобы его видели на сайте. Тогда можно всё немного переиграть.<\/p>\n<h2>Что делать<\/h2>\n<ol start=\"1\">\n<li>В том же файле открыть поиск и найти те же условия.<\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Заменить их (также, кроме одного) на:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">AND p.status = '1' AND p.minimum != '0'<\/code><\/pre><ol start=\"3\">\n<li>Сохранить, обновить кэш.<\/li>\n<\/ol>\n<ol start=\"4\">\n<li>Готово. Товары, которых нет в наличии, будут отображаться как обычно. Но товары, у которых минимальное количество будет равно нулю, отображаться не будут. Для них можно создать и отдельный статус, например «Снят с производства».<\/li>\n<\/ol>\n",
            "date_published": "2020-06-26T06:02:44+00:00",
            "date_modified": "2021-02-19T08:38:46+00:00",
            "_date_published_rfc2822": "Fri, 26 Jun 2020 06:02:44 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "74",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "73",
            "url": "https:\/\/antonkim.ru\/blog\/all\/automatic-related-products\/",
            "title": "OpenCart: автогенерация сопутствующих товаров",
            "content_html": "<p>Все сопутствующие товары, по умолчанию, добавляются вручную. Когда на сайте тысячи товаров, это становится проблемой.<\/p>\n<h2>Что делать<\/h2>\n<ol start=\"1\">\n<li>Открываем <tt>сайт\/catalog\/model\/catalog\/product.php<\/tt><\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Находим код (~392 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$query = $this-&gt;db-&gt;query(&quot;SELECT * FROM &quot; . DB_PREFIX . &quot;product_related pr LEFT JOIN &quot; . DB_PREFIX . &quot;product p ON (pr.related_id = p.product_id) LEFT JOIN &quot; . DB_PREFIX . &quot;product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pr.product_id = '&quot; . (int)$product_id . &quot;' AND p.status = '1' AND p.date_available &lt;= NOW() AND p2s.store_id = '&quot; . (int)$this-&gt;config-&gt;get('config_store_id') . &quot;'&quot;);<\/code><\/pre><ol start=\"3\">\n<li>Заменяем его на:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$query = $this-&gt;db-&gt;query(&quot;SELECT *, (p.product_id) AS related_id FROM\r\n  &quot; . DB_PREFIX . &quot;product_to_category p2c \r\n    LEFT JOIN &quot; . DB_PREFIX . &quot;product p ON (p2c.product_id = p.product_id)\r\n    LEFT JOIN &quot; . DB_PREFIX . &quot;product_to_store p2s ON (p.product_id = p2s.product_id)\r\n  WHERE \r\n    p2c.category_id IN (SELECT p2c2.category_id FROM &quot; . DB_PREFIX . &quot;product_to_category p2c2 WHERE p2c2.product_id = &quot; . (int) $product_id . &quot;)\r\n      AND p.product_id &lt;&gt; &quot; . (int) $product_id . &quot;\r\n      AND p.status = '1'\r\n      AND p.stock_status_id != '5'\r\n      AND p.date_available &lt;= NOW()\r\n      AND p2s.store_id = '&quot; . (int)$this-&gt;config-&gt;get('config_store_id') . &quot;'\r\n    ORDER BY RAND() ASC\r\n  LIMIT 0,8&quot;);<\/code><\/pre><ol start=\"4\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"5\">\n<li>Готово.<\/li>\n<\/ol>\n<p>Сопутствующие товары начнут генерироваться случайным образом — из подкатегорий родительской категории. И только те, которые есть в наличии.<\/p>\n",
            "date_published": "2020-06-26T02:07:37+00:00",
            "date_modified": "2021-02-24T08:52:37+00:00",
            "_date_published_rfc2822": "Fri, 26 Jun 2020 02:07:37 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "73",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "72",
            "url": "https:\/\/antonkim.ru\/blog\/all\/admin-protection\/",
            "title": "OpenCart: как защитить админку",
            "content_html": "<p>Админка, по умолчанию, находится по адресу сайт.ру\/admin. Это проблема.<\/p>\n<h2>Что делать<\/h2>\n<ol start=\"1\">\n<li>Открываем <tt>сайт\/admin\/controller\/common\/login.php<\/tt><\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Находим код:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$this-&gt;load-&gt;language('common\/login');<\/code><\/pre><ol start=\"3\">\n<li>После него вставляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$pass = null;\r\nif (!isset($_GET[PASS_KEY]) || $_GET[PASS_KEY] != PASS) {\r\n    $this-&gt;response-&gt;redirect('http:\/\/'.$_SERVER['HTTP_HOST'].&quot;\/&quot;);\r\n}\r\nelse {\r\n    $pass = '&amp;'.PASS_KEY.'='.PASS;\r\n}<\/code><\/pre><ol start=\"4\">\n<li>Находим код:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$data['action'] = $this-&gt;url-&gt;link('common\/login', '', true);<\/code><\/pre><ol start=\"5\">\n<li>Заменяем его на:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$data['action'] = $this-&gt;url-&gt;link('common\/login', '', true).$pass;<\/code><\/pre><ol start=\"6\">\n<li>Открываем <tt>сайт\/admin\/config.php<\/tt><\/li>\n<\/ol>\n<ol start=\"7\">\n<li>После тега <&#63;php, на новой строке, вставляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">define('PASS_KEY', 'ключ');\r\ndefine('PASS', 'пароль');<\/code><\/pre><ol start=\"8\">\n<li>Заменяем ключ, например, на <tt>access<\/tt>, а пароль на <tt>hellohacker<\/tt>.<\/li>\n<\/ol>\n<ol start=\"9\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"10\">\n<li>Готово.<\/li>\n<\/ol>\n<ol start=\"11\">\n<li>Админка будет находиться по адресу <tt>сайт.ру\/admin?access=hellohacker<\/tt>.<\/li>\n<\/ol>\n<ol start=\"12\">\n<li>Если адрес ввести неверно, произойдёт переадресация на главную страницу.<\/li>\n<\/ol>\n",
            "date_published": "2020-06-25T17:26:34+00:00",
            "date_modified": "2021-02-24T08:53:04+00:00",
            "_date_published_rfc2822": "Thu, 25 Jun 2020 17:26:34 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "72",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "71",
            "url": "https:\/\/antonkim.ru\/blog\/all\/html-minification\/",
            "title": "OpenCart: как минифицировать HTML",
            "content_html": "<p>Для более быстрой загрузки страниц.<\/p>\n<h2>Что делать<\/h2>\n<ol start=\"1\">\n<li>Открываем <tt>сайт\/system\/library\/response.php<\/tt><\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Находим код (~108 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">public function output() {\r\n\tif ($this-&gt;output) {\r\n\t\t$output = $this-&gt;level ? $this-&gt;compress($this-&gt;output, $this-&gt;level) : $this-&gt;output;\r\n\t\t\r\n\t\tif (!headers_sent()) {\r\n\t\t\tforeach ($this-&gt;headers as $header) {\r\n\t\t\t\theader($header, true);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\techo $output;\r\n\t}\r\n}<\/code><\/pre><ol start=\"3\">\n<li>Заменяем на:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">public function output() {\r\n \r\nif ($this-&gt;output) {\r\n    $this-&gt;output = preg_replace(&quot;\/(\\n)+\/&quot;, &quot;\\n&quot;, $this-&gt;output);\r\n    $this-&gt;output = preg_replace(&quot;\/\\r\\n+\/&quot;, &quot;\\n&quot;, $this-&gt;output);\r\n    $this-&gt;output = preg_replace(&quot;\/\\n(\\t)+\/&quot;, &quot;\\n&quot;, $this-&gt;output);\r\n    $this-&gt;output = preg_replace(&quot;\/\\n(\\ )+\/&quot;, &quot;\\n&quot;, $this-&gt;output);\r\n    $this-&gt;output = preg_replace(&quot;\/\\&gt;(\\n)+&lt;\/&quot;, '&gt;&lt;', $this-&gt;output);\r\n    $this-&gt;output = preg_replace(&quot;\/\\&gt;\\r\\n&lt;\/&quot;, '&gt;&lt;', $this-&gt;output);\r\n}\r\n\r\nif ($this-&gt;output) {\r\n\t$output = $this-&gt;level ? $this-&gt;compress($this-&gt;output, $this-&gt;level) : $this-&gt;output;\r\n\t\r\n\tif (!headers_sent()) {\r\n\t\tforeach ($this-&gt;headers as $header) {\r\n\t\t\theader($header, true);\r\n\t\t}\r\n\t}\r\n\t\r\n\techo $output;\r\n}\r\n}<\/code><\/pre><ol start=\"4\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"5\">\n<li>Готово.<\/li>\n<\/ol>\n",
            "date_published": "2020-05-04T16:49:45+00:00",
            "date_modified": "2021-02-24T08:53:24+00:00",
            "_date_published_rfc2822": "Mon, 04 May 2020 16:49:45 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "71",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "70",
            "url": "https:\/\/antonkim.ru\/blog\/all\/attribute-sorting\/",
            "title": "OpenCart: как сделать сортировку атрибутов по порядку сортировки",
            "content_html": "<p>Потратил кучу времени на поиски решения, а оно оказалось до смешного простым.<\/p>\n<h2>В чём проблема<\/h2>\n<p>Вот мы создали группу атрибутов. Затем создали атрибуты, привязали к группе атрибутов, задали порядок сортировки. На сайте всё отображается нормально — согласно порядку сортировки. В админке же — всё сортируется по названиям, и это очень сбивает.<\/p>\n<h2>Что делать<\/h2>\n<ol start=\"1\">\n<li>Открываем <tt>сайт\/admin\/model\/catalog\/attribute.php<\/tt>.<\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Находим код (~53 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">if (isset($data['sort']) &amp;&amp; in_array($data['sort'], $sort_data)) {\r\n\t$sql .= &quot; ORDER BY &quot; . $data['sort'];\r\n} else {\r\n\t$sql .= &quot; ORDER BY attribute_group, ad.name&quot;;\r\n}<\/code><\/pre><ol start=\"3\">\n<li>Изменяем последнюю строку:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$sql .= &quot; ORDER BY attribute_group, a.sort_order, ad.name&quot;;<\/code><\/pre><ol start=\"4\">\n<li>То есть, по умолчанию, в карточке товара в админке, стоит сортировка по названию. Мы же сделали по порядку сортировки, а затем по названию.<\/li>\n<\/ol>\n<ol start=\"5\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"6\">\n<li>Готово.<\/li>\n<\/ol>\n",
            "date_published": "2020-05-04T16:46:27+00:00",
            "date_modified": "2021-02-24T08:53:37+00:00",
            "_date_published_rfc2822": "Mon, 04 May 2020 16:46:27 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "70",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "69",
            "url": "https:\/\/antonkim.ru\/blog\/all\/title-autogenerate\/",
            "title": "OpenCart: автогеренация тайтла",
            "content_html": "<p>Чтобы получилось вот так:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/antonkim.ru\/blog\/pictures\/generate-title.gif\" width=\"1000\" height=\"410\" alt=\"\" \/>\n<\/div>\n<p>При этом, чтобы иметь возможность отдельно редактировать сам тайтл.<\/p>\n<h2>Что делать<\/h2>\n<ol start=\"1\">\n<li>Открываем <tt>сайт\/admin\/view\/template\/catalog\/product_form.twig<\/tt><\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Находим код (~67 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;input type=&quot;text&quot; name=&quot;product_description[{{ language.language_id }}][meta_title]&quot; value=&quot;{{ product_description[language.language_id] ? product_description[language.language_id].meta_title }}&quot; placeholder=&quot;{{ entry_meta_title }}&quot; id=&quot;input-meta-title{{ language.language_id }}&quot; class=&quot;form-control&quot; \/&gt;<\/code><\/pre><ol start=\"3\">\n<li>После него вставляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;script type=&quot;text\/javascript&quot;&gt;\r\n$(function() {\r\n  var $name_input = $(&quot;input[name='product_description[{{ language.language_id }}][name]']&quot;);\r\n  var $meta_title = $(&quot;input[name='product_description[{{ language.language_id }}][meta_title]']&quot;);\r\n\r\n  $name_input.keyup(function() {\r\n  $meta_title.val($name_input.val());\r\n  });\r\n});\r\n&lt;\/script&gt;<\/code><\/pre><ol start=\"4\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"5\">\n<li>Готово.<\/li>\n<\/ol>\n<ol start=\"6\">\n<li>Можно пойти дальше. Например, чтобы после названия автоматически генерировалось «купить в „магазине“».<\/li>\n<\/ol>\n<ol start=\"7\">\n<li>Изменяем одну строку:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$meta_title.val($name_input.val() + 'Тут какой-то текст');<\/code><\/pre><ol start=\"8\">\n<li>Готово — 2.<\/li>\n<\/ol>\n<p>Ту же самую процедуру можно провернуть и с категориями.<\/p>\n<p>Спасибо за помощь <a href=\"https:\/\/usnko.pp.ua\/?utm_source=antonkim.com&utm_medium=article\">Ярославу Усенко<\/a>.<\/p>\n",
            "date_published": "2020-04-27T16:40:17+00:00",
            "date_modified": "2021-02-24T08:53:49+00:00",
            "image": "https:\/\/antonkim.ru\/blog\/pictures\/generate-title.gif",
            "_date_published_rfc2822": "Mon, 27 Apr 2020 16:40:17 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "69",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/antonkim.ru\/blog\/pictures\/generate-title.gif"
                ]
            }
        },
        {
            "id": "68",
            "url": "https:\/\/antonkim.ru\/blog\/all\/sort-by-availability\/",
            "title": "OpenCart: как сделать сортировку товаров по наличию",
            "content_html": "<p>И в магазине, и в админке.<\/p>\n<h2>В чём проблема<\/h2>\n<p>По умолчанию, все товары в категориях, страницах производителей, поиске — сортируются по названиям в алфавитном порядке. И даже те товары, которых нет в наличии, могут отображаться в начале списка. А когда таких товаров много — это становится проблемой.<\/p>\n<h2>Что делать<\/h2>\n<ol start=\"1\">\n<li>Открываем <tt>сайт\/catalog\/model\/catalog\/product.php<\/tt><\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Находим код (~168 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">if (isset($data['sort']) &amp;&amp; in_array($data['sort'], $sort_data)) {\r\n\tif ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {\r\n\t\t$sql .= &quot; ORDER BY LCASE(&quot; . $data['sort'] . &quot;)&quot;;\r\n\t} elseif ($data['sort'] == 'p.price') {\r\n\t\t$sql .= &quot; ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)&quot;;\r\n\t} else {\r\n\t\t$sql .= &quot; ORDER BY &quot; . $data['sort'];\r\n\t}\r\n} else {\r\n\t$sql .= &quot; ORDER BY p.sort_order&quot;;\r\n}<\/code><\/pre><ol start=\"3\">\n<li>Заменяем его на:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">if (isset($data['sort']) &amp;&amp; in_array($data['sort'], $sort_data)) {\r\n    if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {\r\n        $sql .= &quot; ORDER BY p.stock_status_id DESC, LCASE(&quot; . $data['sort'] . &quot;)&quot;;\r\n    } elseif ($data['sort'] == 'p.price') {\r\n        $sql .= &quot; ORDER BY p.stock_status_id DESC, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)&quot;;\r\n    } else {\r\n        $sql .= &quot; ORDER BY p.stock_status_id DESC, &quot; . $data['sort'];\r\n    }\r\n} else {\r\n    $sql .= &quot; ORDER BY p.stock_status_id DESC, p.sort_order&quot;;\r\n}<\/code><\/pre><ol start=\"4\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"5\">\n<li>Готово. Товары будут сортироваться по наличию. Товаров, которых нет в наличии, будут отображаться в конце списка.<\/li>\n<\/ol>\n<ol start=\"6\">\n<li>Можно сортировать и по количеству, а уже затем по наличию. Для этого заменяем на:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">if (isset($data['sort']) &amp;&amp; in_array($data['sort'], $sort_data)) {\r\n    if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {\r\n        $sql .= &quot; ORDER BY p.quantity DESC, p.stock_status_id DESC, LCASE(&quot; . $data['sort'] . &quot;)&quot;;\r\n    } elseif ($data['sort'] == 'p.price') {\r\n        $sql .= &quot; ORDER BY p.quantity DESC, p.stock_status_id DESC, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)&quot;;\r\n    } else {\r\n        $sql .= &quot; ORDER BY p.quantity DESC, p.stock_status_id DESC, &quot; . $data['sort'];\r\n    }\r\n} else {\r\n    $sql .= &quot; ORDER BY p.quantity DESC, p.stock_status_id DESC, p.sort_order&quot;;\r\n}<\/code><\/pre><ol start=\"7\">\n<li>Можно использовать разные комбинации: сортировать по стоимости, рейтингу, дате добавления. Нужно лишь подменить значения в коде выше. Вот они:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$sort_data = array(\r\n    'pd.name',\r\n    'p.model',\r\n    'p.quantity',\r\n    'p.price',\r\n    'rating',\r\n    'p.sort_order',\r\n    'p.date_added'\r\n);<\/code><\/pre><h2>Как сделать в админке<\/h2>\n<ol start=\"1\">\n<li>Открываем сайт\/admin\/model\/catalog\/product.php.<\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Делаем тоже самое, что и наверху.<\/li>\n<\/ol>\n<ol start=\"3\">\n<li>Готово.<\/li>\n<\/ol>\n<h2>По теме<\/h2>\n<p><a href=\"http:\/\/old.code.mu\/sql\/order-by.html\">Сортировка данных в SQL (ORDER BY<\/a>).<\/p>\n",
            "date_published": "2020-04-26T16:30:06+00:00",
            "date_modified": "2021-02-26T15:21:08+00:00",
            "_date_published_rfc2822": "Sun, 26 Apr 2020 16:30:06 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "68",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "67",
            "url": "https:\/\/antonkim.ru\/blog\/all\/opencart-lazyload\/",
            "title": "OpenCart: как подключить LazyLoad",
            "content_html": "<p>На страницы товаров, в категориях, результаты поиска, страницы производителей.<\/p>\n<h2>Что это<\/h2>\n<p>Это ленивая загрузка изображений, которая ускоряет загрузку сайта.<\/p>\n<h2>Что делать<\/h2>\n<p>Примечание: для работы скрипта нужна подключённая библиотека jquery.<\/p>\n<ol start=\"1\">\n<li>Скачать <a href=\"https:\/\/antonkim.ru\/blog\/download\/lazyload.min.js\" download>lazyload.min.js<\/a>.<\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Можно подключить и ссылкой:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;script src=&quot;https:\/\/cdn.jsdelivr.net\/npm\/vanilla-lazyload@15.1.1\/dist\/lazyload.min.js&quot;&gt;&lt;\/script&gt;<\/code><\/pre><ol start=\"3\">\n<li>Загрузить файл в <tt>catalog\/view\/javascript\/<\/tt>. Или куда удобно.<\/li>\n<\/ol>\n<ol start=\"4\">\n<li>Подключить в <tt>header.twig<\/tt> в своей теме.<\/li>\n<\/ol>\n<ol start=\"5\">\n<li>В <tt>footer.twig<\/tt>, перед закрывающим тегом <tt>body<\/tt>, вставить:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;script&gt;\r\nvar lazyLoadInstance = new LazyLoad({\r\n    elements_selector: &quot;.lazy&quot;\r\n});\r\n&lt;\/script&gt;<\/code><\/pre><ol start=\"6\">\n<li>Переходим в <tt>сайт\/catalog\/view\/тема\/product\/category.twig<\/tt><\/li>\n<\/ol>\n<ol start=\"7\">\n<li>К каждому тегу img добавляем класс lazy, а вместо src — data-src. Вот так:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;img class=&quot;lazy&quot; data-src=&quot;ссылка на изображение&quot; alt=&quot;&quot;&gt;<\/code><\/pre><ol start=\"8\">\n<li>Тоже самое нужно проделать в файлах <tt>product.twig<\/tt>, <tt>search.twig<\/tt>, <tt>manufacturer_info.twig<\/tt>.<\/li>\n<\/ol>\n<ol start=\"9\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"10\">\n<li>Готово.<\/li>\n<\/ol>\n<p>У скрипта много настроек и возможностей, взгляните <a href=\"https:\/\/github.com\/verlok\/lazyload\">на гитхабе<\/a>.<\/p>\n",
            "date_published": "2020-04-24T11:37:07+00:00",
            "date_modified": "2021-02-26T15:20:48+00:00",
            "_date_published_rfc2822": "Fri, 24 Apr 2020 11:37:07 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "67",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "66",
            "url": "https:\/\/antonkim.ru\/blog\/all\/opencart-responsive-bug\/",
            "title": "OpenCart: как исправить баг с адаптивность в админке",
            "content_html": "<p>И начать нормально жить.<\/p>\n<h2>В чём проблема<\/h2>\n<p>Не знаю как у других, но когда я заходил в админку, было вот так:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/antonkim.ru\/blog\/pictures\/opencart-admin-1.jpg\" width=\"393\" height=\"851\" alt=\"\" \/>\n<\/div>\n<p>Приходилось включать десктоп режим, что не вызывало восторга.<\/p>\n<p>Потратил много времени прежде чем найти решение. А оно — до смешного простое.<\/p>\n<h2>Что делать<\/h2>\n<ol start=\"1\">\n<li>Открываем <tt>сайт\/admin\/system\/tweak.ocmod.xml<\/tt><\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Находим код (~13 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;operation&gt;\r\n\t&lt;search&gt;&lt;![CDATA[\r\n\t{% for link in links %}\r\n\t]]&gt;&lt;\/search&gt;\r\n\t&lt;add position=&quot;before&quot;&gt;&lt;![CDATA[\r\n\t&lt;script type=&quot;text\/javascript&quot; src=&quot;view\/javascript\/jquery\/translit.js&quot;&gt;&lt;\/script&gt;\r\n\r\n\t&lt;style&gt;\r\n\t#column-left {width: 260px !important;}\r\n\t#column-left + #content {margin-left: 260px !important;}\r\n\t.bimage {margin:0;}\r\n\t&lt;\/style&gt;\r\n\t]]&gt;&lt;\/add&gt;\r\n&lt;\/operation&gt;<\/code><\/pre><ol start=\"3\">\n<li>Удаляем из него вот эту часть:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;style&gt;\r\n#column-left {width: 260px !important;}\r\n#column-left + #content {margin-left: 260px !important;}\r\n.bimage {margin:0;}\r\n&lt;\/style&gt;<\/code><\/pre><ol start=\"4\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"5\">\n<li>Готово.<\/li>\n<\/ol>\n<ol start=\"6\">\n<li>Результат:<\/li>\n<\/ol>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/antonkim.ru\/blog\/pictures\/opencart-admin-3.jpg\" width=\"393\" height=\"851\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Человеческий вид<\/div>\n<\/div>\n",
            "date_published": "2020-04-24T11:24:30+00:00",
            "date_modified": "2021-02-26T15:20:34+00:00",
            "image": "https:\/\/antonkim.ru\/blog\/pictures\/opencart-admin-1.jpg",
            "_date_published_rfc2822": "Fri, 24 Apr 2020 11:24:30 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "66",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/antonkim.ru\/blog\/pictures\/opencart-admin-1.jpg",
                    "https:\/\/antonkim.ru\/blog\/pictures\/opencart-admin-3.jpg"
                ]
            }
        },
        {
            "id": "65",
            "url": "https:\/\/antonkim.ru\/blog\/all\/source-code-in-editor\/",
            "title": "OpenCart: как сделать нормальную разметку в исходном коде редактора товаров",
            "content_html": "<p>Двумя строчками кода.<\/p>\n<h2>В чём проблема<\/h2>\n<p>Когда вы заходите в исходный код описания, всё выглядит вот так:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/antonkim.ru\/blog\/pictures\/source-code-in-editor-3.png\" width=\"1920\" height=\"969\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Всё в одну строку, с прокруткой, без нормальной разметки<\/div>\n<\/div>\n<h2>Что делать<\/h2>\n<ol start=\"1\">\n<li>Открываем скрипт <tt>сайт\/admin\/view\/javascript\/summernote\/opencart.js<\/tt><\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Находим код:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$(element).summernote({\r\n    lang: $(this).attr('data-lang'),\r\n    disableDragAndDrop: true,\r\n    height: 500,\r\n    emptyPara: '',\r\n    codemirror: { \/\/ codemirror options\r\n        mode: 'text\/html',\r\n        htmlMode: true,\r\n        lineNumbers: true,\r\n        theme: 'monokai'\r\n\t},<\/code><\/pre><ol start=\"3\">\n<li>После строки <tt>lineNumbers<\/tt> вставляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">lineWrapping: true,<\/code><\/pre><ol start=\"4\">\n<li>Это уберёт прокрутку, и разметка начнёт переноситься на новые строки.<\/li>\n<\/ol>\n<ol start=\"5\">\n<li>После строки <tt>emptyPara<\/tt> вставляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">prettifyHtml: true,<\/code><\/pre><ol start=\"6\">\n<li>Это превратит кашу с разметкой в человеческий вид.<\/li>\n<\/ol>\n<ol start=\"7\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"8\">\n<li>Готово.<\/li>\n<\/ol>\n<ol start=\"9\">\n<li>Результат на выходе:<\/li>\n<\/ol>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/antonkim.ru\/blog\/pictures\/source-code-in-editor-4.png\" width=\"1920\" height=\"969\" alt=\"\" \/>\n<\/div>\n",
            "date_published": "2020-04-23T11:15:41+00:00",
            "date_modified": "2021-02-26T15:20:18+00:00",
            "image": "https:\/\/antonkim.ru\/blog\/pictures\/source-code-in-editor-3.png",
            "_date_published_rfc2822": "Thu, 23 Apr 2020 11:15:41 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "65",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/antonkim.ru\/blog\/pictures\/source-code-in-editor-3.png",
                    "https:\/\/antonkim.ru\/blog\/pictures\/source-code-in-editor-4.png"
                ]
            }
        },
        {
            "id": "64",
            "url": "https:\/\/antonkim.ru\/blog\/all\/remove-text-formatting\/",
            "title": "OpenCart: как отключить форматирование при копировании",
            "content_html": "<p>Когда вы копируете откуда-то текст, он копируется целиком — вместе со стилями источника. Есть два решения.<\/p>\n<p>Первое — копировать и вставлять не через <nobr><kbd>Ctrl + V<\/kbd><\/nobr>, а через <nobr><kbd>Ctrl + Shift + V<\/kbd><\/nobr>. Второе — отключить форматирование при копировании вообще.<\/p>\n<h2>Что делать<\/h2>\n<ol start=\"1\">\n<li>Открываем <tt>сайт\/admin\/view\/javascript\/summernote\/opencart.js<\/tt><\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Находим код:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$(element).summernote({\r\n    lang: $(this).attr('data-lang'),\r\n    disableDragAndDrop: true,\r\n    height: 400,\r\n    emptyPara: '',\r\n    codemirror: { \/\/ codemirror options\r\n        mode: 'text\/html',\r\n        htmlMode: true,\r\n        lineNumbers: true,\r\n        theme: 'monokai'\r\n    },<\/code><\/pre><ol start=\"3\">\n<li>После него вставляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">callbacks: {\r\n    onPaste: function(e) {\r\n        var bufferText = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');\r\n        e.preventDefault();\r\n        setTimeout(function() {\r\n            document.execCommand('insertText', false, bufferText);\r\n            }, 10);\r\n        }\r\n},<\/code><\/pre><ol start=\"4\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"5\">\n<li>Готово.<\/li>\n<\/ol>\n",
            "date_published": "2020-04-22T10:38:36+00:00",
            "date_modified": "2021-02-26T15:20:02+00:00",
            "_date_published_rfc2822": "Wed, 22 Apr 2020 10:38:36 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "64",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "63",
            "url": "https:\/\/antonkim.ru\/blog\/all\/embed-responsive-video\/",
            "title": "OpenCart: как сделать видео адаптивным по умолчанию",
            "content_html": "<p>Не залезая в исходный код редактора товаров.<\/p>\n<h2>В чём проблема<\/h2>\n<p>Когда вы вставляете видео с ютюба (кнопка «Видео»), оно имеет размеры 640х360. Чтобы сделать его адаптивным, приходится лезть в код и дополнять его. Это неудобно и неприятно.<\/p>\n<h2>Что делать<\/h2>\n<p>Примечание: у меня по умолчанию установлен редактор summernote, поэтому инструкция для него.<\/p>\n<ol start=\"1\">\n<li>Открываем <tt>сайт\/admin\/view\/javascript\/summernote\/summernote.js<\/tt><\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Находим код (~6372 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">$video.addClass('note-video-clip');\r\n\r\nreturn $video[0];<\/code><\/pre><ol start=\"3\">\n<li>Заменяем его на:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">var $embed;\r\nvar $embed = $('&lt;div&gt;').addClass('embed-responsive').addClass('embed-responsive-16by9');\r\n\r\n$video.addClass('note-video-clip').addClass('embed-responsive-item');\r\n$video.appendTo($embed);\r\n\r\nreturn $embed[0];<\/code><\/pre><ol start=\"4\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"5\">\n<li>Теперь при добавлении видео оно сразу будет адаптивным.<\/li>\n<\/ol>\n<ol start=\"6\">\n<li>Это не всё. Добавим возможность включать полноэкранный режим.<\/li>\n<\/ol>\n<ol start=\"7\">\n<li>В этом же файле находим код (~6327 строка):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">var $video;\r\nif (ytMatch &amp;&amp; ytMatch[1].length === 11) {\r\n    var youtubeId = ytMatch[1];\r\n    $video = $('&lt;iframe&gt;')\r\n        .attr('frameborder', 0)\r\n        .attr('src', '\/\/www.youtube.com\/embed\/' + youtubeId)\r\n        .attr('width', '640').attr('height', '360');<\/code><\/pre><ol start=\"8\">\n<li>После последнего <tt>.attr<\/tt> добавляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">.attr('allowfullscreen', '');<\/code><\/pre><ol start=\"9\">\n<li>Сохраняем, обновляем кэш.<\/li>\n<\/ol>\n<ol start=\"10\">\n<li>Готово.<\/li>\n<\/ol>\n",
            "date_published": "2020-04-22T10:31:14+00:00",
            "date_modified": "2021-09-27T06:01:21+00:00",
            "_date_published_rfc2822": "Wed, 22 Apr 2020 10:31:14 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "63",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 3849,
    "_e2_ua_string": "E2 (v3849; Aegea)"
}