<?xml version="1.0"?>
<rss version="2.0"><channel><title/><link>https://opencartforum.com/blogs/275-pro-opencart/</link><description/><language>uk</language><item><title>Opencart 5</title><link>https://opencartforum.com/blogs/entry/513-opencart-5/</link><description><![CDATA[<p>
	Щось в останній час мене включило кодити, давно такого не було з початку вторгнення. Зайнявся <abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">Opencart</abbr></abbr> 4, наваяв багато крутих штук для нього, і майже дописав підтримку доповнень від <abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">Opencart</abbr></abbr> 3 (принаймні на рівні доставок-оплат). І тут виникло відчуття розвилки - можна намагатися врятувати <abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">Opencart</abbr></abbr> 4, або дати йому потонути.
</p>

<p>
	 
</p>

<p>
	По факту <abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">Opencart</abbr></abbr> 4 "не взлітає". Вялі інновації, переускладнений код, всі старі проблеми не вирішені. До цього плюсується абсолютна неадекватність Даніеля і його одноосібний контроль на репозиторієм. Проект, який би міг яскраво рухатись вперед силами ком'юніті, ледь ворушиться по міліметру за півроку.
</p>

<p>
	 
</p>

<p>
	Зашквару ситуації додає те, що люди качають на <abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">opencart</abbr></abbr>.com <abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">Opencart</abbr></abbr> 4, як актуальну версію, а на форумах та й сам Даніель кажуть, що це бета і використовуйте <abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">Opencart</abbr></abbr> 3 (причому не з сайту, а з гітхабу). Люди чухають потилицю і йдуть собі далі.
</p>

<p>
	 
</p>

<p>
	Як на мене, розклад з Opencartом зараз один з найгірших за всі роки, і треба щось робити. Можна почати ваяти публічний <abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">Opencart</abbr></abbr> 5, взявши за базу <abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">Opencart</abbr></abbr> 3 (а калічну четвірку лишити Даніелю). У людей купа класних ідей, персонально у мене теж є немало крутих наробок.
</p>

<p>
	 
</p>

<p>
	Цим постом я хочу прощупати, чи є у нас ентузіазм? )
</p>

<p>
	 
</p>

<p>
	<span style="font-size:24px;">Ніша <abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">Opencart</abbr></abbr></span>
</p>

<p>
	<abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">Opencart</abbr></abbr> вирізняється серед інших рішень простотою коду, який можна читати, розуміти і правити. Абсолютна прозорість, процедурність та голі SQL запити цьому допомагають. Це його і слабкість, і сила. І тільки у цій ніші він може жити. vQmod/ocMod є вираженням ідеї "я бачу, що мені треба поміняти в коді, і я просто міняю". Будь-які спроби від цього піти одразу переводять проект в іншу категорію, де і так є свої давні гравці - Prestashop, Magento, Woo.
</p>

<p>
	 
</p>

<p>
	Загалом, треба починати з основ. І перше питання, яке треба вирішити - це code style. <strong>Я зробив трансформацію кодової бази <abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">Opencart</abbr></abbr> 3</strong> з своїм баченням основ, хочу вам це показати і почути вашу думку. Ось збірка, у ній можна подивитись, як виглядає новий код - <a href="https://devs.mx/down/opencart_experiment1.zip" rel="external nofollow">https://devs.mx/down/opencart_experiment1.zip</a>
</p>

<p>
	 
</p>

<p>
	<span style="font-size:24px;">Що зроблено?</span>
</p>

<p>
	<span style="color:#8e44ad;"><strong>1. </strong></span><span style="color:#2980b9;"><strong>$registry</strong></span><span style="color:#8e44ad;"><strong> "упразднен", всі об'єкти переведені на статичні класи</strong>.</span>
</p>

<p>
	Це дає можливість доступатися до них з любого місця без всякої додаткової магії. Раніше було:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted"><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">url</span><span class="pun">-&gt;</span><span class="pln">link</span><span class="pun">(</span><span class="str">'product/product'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'product_id='</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">request</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">[</span><span class="str">'product_id'</span><span class="pun">])</span></pre>

<p>
	Стало:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted"><span class="pln">url</span><span class="pun">::</span><span class="pln">link</span><span class="pun">(</span><span class="str">'product/product'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'product_id='</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> request</span><span class="pun">::</span><span class="kwd">get</span><span class="pun">[</span><span class="str">'product_id'</span><span class="pun">])</span></pre>

<p>
	Так, <span><strong>::</strong> естетично виглядає гірше, ніж <strong>-&gt;</strong>, але крім цього одні плюси, і в швидкодії теж. Нарешті IDE повністю розуміє, що звідки береться, працює підсвітка параметрів, code completion та переходи по Ctrl-клік.</span>
</p>

<p>
	 
</p>

<p>
	<span style="color:#8e44ad;"><strong>2. Моделі уже не треба завантажувати</strong> в явному вигляді перед використанням. Із звертання для лаконічності забрано префікс </span><span style="color:#2980b9;"><strong>model_</strong></span><span style="color:#8e44ad;">.</span>
</p>

<p>
	Було:
</p>

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

$product_info </span><span class="pun">=</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">model_catalog_product</span><span class="pun">-&gt;</span><span class="pln">getProduct</span><span class="pun">(</span><span class="pln">$product_id</span><span class="pun">);</span></pre>

<p>
	Стало:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted"><span class="pln">$product_info </span><span class="pun">=</span><span class="pln"> catalog_product</span><span class="pun">::</span><span class="pln">getProduct</span><span class="pun">(</span><span class="pln">$product_id</span><span class="pun">);</span></pre>

<p>
	 
</p>

<p>
	<span style="color:#8e44ad;"><strong>3. Моделі адмінки мають префікс </strong></span><span style="color:#2980b9;"><strong>admin_</strong></span><span style="color:#8e44ad;">, що дає можливість завантажувати адмінські моделі в каталозі і навпаки:</span>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted"><span class="pln">$product_id </span><span class="pun">=</span><span class="pln"> admin_catalog_product</span><span class="pun">::</span><span class="pln">addProduct</span><span class="pun">(</span><span class="pln">request</span><span class="pun">::</span><span class="pln">post</span><span class="pun">);</span><span class="pln">
$preview </span><span class="pun">=</span><span class="pln"> catalog_product</span><span class="pun">::</span><span class="pln">getProduct</span><span class="pun">(</span><span class="pln">$product_id</span><span class="pun">);</span></pre>

<p>
	 
</p>

<p>
	<span style="color:#8e44ad;"><strong>4. Забрано </strong></span><span style="color:#2980b9;"><strong>DB_PREFIX</strong></span><span style="color:#8e44ad;">.</span>
</p>

<p>
	Ситуації, коли в одну базу треба поставити 2 магазини - супер-рідкі і вирішуються створенням нової бази.
</p>

<p>
	Було:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted"><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">db</span><span class="pun">-&gt;</span><span class="pln">query</span><span class="pun">(</span><span class="str">"SELECT * FROM "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> DB_PREFIX </span><span class="pun">.</span><span class="pln"> </span><span class="str">"category c LEFT JOIN "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> DB_PREFIX </span><span class="pun">.</span><span class="pln"> </span><span class="str">"category_description cd 
ON (c.category_id = cd.category_id) LEFT JOIN "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> DB_PREFIX </span><span class="pun">.</span><span class="pln"> </span><span class="str">"category_to_store ... "</span><span class="pun">)</span></pre>

<p>
	Стало:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted"><span class="pln">db</span><span class="pun">::</span><span class="pln">query</span><span class="pun">(</span><span class="str">"SELECT * FROM category c LEFT JOIN category_description cd 
ON (c.category_id = cd.category_id) LEFT JOIN category_to_store ... "</span><span class="pun">)</span></pre>

<p>
	 
</p>

<p>
	<span style="color:#8e44ad;"><strong>5. Додано коротку функцію </strong></span><span style="color:#2980b9;"><strong>esc()</strong></span><span style="color:#8e44ad;">, яка екранує та додає одинарні лапки.</span> Було:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted"><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">db</span><span class="pun">-&gt;</span><span class="pln">query</span><span class="pun">(</span><span class="str">"INSERT INTO "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> DB_PREFIX </span><span class="pun">.</span><span class="pln"> </span><span class="str">"category_description SET category_id = $category_id, name = '"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">db</span><span class="pun">-&gt;</span><span class="pln">escape</span><span class="pun">(</span><span class="pln">$value</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">])</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">"', 
description = '"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $this</span><span class="pun">-&gt;</span><span class="pln">db</span><span class="pun">-&gt;</span><span class="pln">escape</span><span class="pun">(</span><span class="pln">$value</span><span class="pun">[</span><span class="str">'description'</span><span class="pun">])</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">"'"</span><span class="pun">);</span></pre>

<p>
	Стало:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted"><span class="pln">db</span><span class="pun">::</span><span class="pln">query</span><span class="pun">(</span><span class="str">"INSERT INTO category_description SET category_id = $category_id, name = "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> esc</span><span class="pun">(</span><span class="pln">$value</span><span class="pun">[</span><span class="str">'name'</span><span class="pun">])</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">", 
description = "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> esc</span><span class="pun">(</span><span class="pln">$value</span><span class="pun">[</span><span class="str">'description'</span><span class="pun">]));</span></pre>

<p>
	 
</p>

<p>
	<strong><span style="color:#8e44ad;">6. Додана коротка функція </span><span style="color:#2980b9;">config()</span></strong>, яка повертає ключ конфігурації, що починається з префікса <strong>config_</strong>, та переводить його в int, якщо він закінчується на <strong>_id.</strong>
</p>

<p>
	<b>Було:</b>
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted"><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">db</span><span class="pun">-&gt;</span><span class="pln">query</span><span class="pun">(</span><span class="str">"SELECT * FROM "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> DB_PREFIX </span><span class="pun">.</span><span class="pln"> </span><span class="str">"category c LEFT JOIN "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> DB_PREFIX </span><span class="pun">.</span><span class="pln"> </span><span class="str">"category_description cd 
ON (c.category_id = cd.category_id) WHERE cd.language_id = '"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'config_language_id'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">"' 
AND c2s.store_id = '"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln">$this</span><span class="pun">-&gt;</span><span class="pln">config</span><span class="pun">-&gt;</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'config_store_id'</span><span class="pun">))</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">"'"</span><span class="pun">)</span></pre>

<p>
	Стало:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted"><span class="pln">db</span><span class="pun">::</span><span class="pln">query</span><span class="pun">(</span><span class="str">"SELECT * FROM category c LEFT JOIN category_description cd 
ON (c.category_id = cd.category_id) WHERE cd.language_id = "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> config</span><span class="pun">(</span><span class="str">'language_id'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="str">" 
AND c2s.store_id = "</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> config</span><span class="pun">(</span><span class="str">'store_id'</span><span class="pun">))</span></pre>

<p>
	 
</p>

<p>
	<span style="color:#8e44ad;"><strong>7. Повністю забраний механізм events, як непрозорий</strong>.</span>
</p>

<p>
	 
</p>

<p>
	<strong><span style="color:#8e44ad;">8. Більшість шляхів та URL тепер відносні. </span><span style="color:#2980b9;">config.php</span><span style="color:#8e44ad;"> тепер один</span></strong>, в ньому немає купи дублюючих визначень:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted"><span class="pun">&lt;?</span><span class="pln">php

</span><span class="kwd">const</span><span class="pln"> SITE_URL </span><span class="pun">=</span><span class="pln"> </span><span class="str">'http://localhost/opencart5/'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> DIR_STORAGE </span><span class="pun">=</span><span class="pln"> </span><span class="str">'system/storage/'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// DB</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> DB_HOSTNAME </span><span class="pun">=</span><span class="pln"> </span><span class="str">'localhost'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> DB_USERNAME </span><span class="pun">=</span><span class="pln"> </span><span class="str">'root'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> DB_PASSWORD </span><span class="pun">=</span><span class="pln"> </span><span class="str">'root'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> DB_DATABASE </span><span class="pun">=</span><span class="pln"> </span><span class="str">'opencart5'</span><span class="pun">;</span></pre>

<p>
	 
</p>

<p>
	<span style="color:#8e44ad;"><strong>9. З адмінської частини забрано </strong></span><span style="color:#2980b9;"><strong>user_token</strong></span><span style="color:#8e44ad;"><strong> в URL.</strong></span>
</p>

<p>
	Хтось знає реальний сценарій атаки, від якого він захищав?
</p>

<p>
	Якщо так, то є менш кодо-засираючі методи захиститись, наприклад автоматичне додавання IP, з якого логіняться, в білий список.
</p>

<p>
	 
</p>

<p>
	<span style="color:#8e44ad;"><strong>10. При цьому всьому за допомогою обгорток повністю підтримується старий синтаксис і працють доповлення <abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом"><abbr title="Бесплатная платформа для электронной коммерции с открытым исходным кодом">Opencart</abbr></abbr> 3</strong>.</span>
</p>

<p>
	Принаймні, я встановив модуль Нової Пошти і він нормально працює )
</p>

<p>
	 
</p>

<p>
	Поки більше нічого не поміняно, візуально все виглядає по старому. Як вам такий напрямок змін?
</p>
]]></description><guid isPermaLink="false">513</guid><pubDate>Thu, 27 Jul 2023 09:22:22 +0000</pubDate></item></channel></rss>
