Сторінка 2 - Ihor Vansach
- 1 хв читання
Іноді під час використання Magento 2 ви можете отримати помилку Таблиця catalog_product_super_link Magento не існує . Вона з'являється, тому що якийсь модуль намагається зробити SQL-запит із SQL-запитом, який містить таблицю "catalog_product_super_link", а сама таблиця не існує. Тож насправді помилка пояснюється сама собою.
Чому таблиця catalog_product_super_link може не існувати?
Ця таблиця визначена в модулі Magento 2 Magento_ConfigurableProduct. Тому переконайтеся, що вона ввімкнена в app/etc/config.php . Якщо ні, увімкніть його, змінивши 0 на 1 у правій частині, наприклад:
'Magento_ConfigurableProduct' => 1,
Потім виконайте такі команди:
bin/magento setup:upgradebin/magento setup:di:compilebin/magento setup:static-content:deploy
Якщо це не допоможе, ви можете створити таблицю за допомогою цих SQL-запитів (ви можете виконати їх, наприклад, у phpMyAdmin):
Увага! Замініть " prefix_ " та " PREFIX_ " на ваш фактичний префікс бази даних Magento 2 або просто видаліть їх, якщо ви не використовуєтеihor
- 1 хв читання
ОНОВЛЕННЯ: «Станом на ранок 22 лютого 2024 року, Внаслідок повномасштабного вторгнення Росії в Україні загинуло 528 дітей, а 1226 отримали поранення. України, згідно з Урядовий портал «Діти війни», " - Генеральна прокуратура України.
Російські війська вже вбили понад 100 українських дітей.
Таня, якій було 6 років, померла від зневоднення під завалами власного будинку.
Аліса з Охтирки, їй було 7 років, загинула під час обстрілу дитячого садка ракетами «Град».
Софію з Нової Каховки, якій було 6 років, розстріляли разом з родиною.
Скільки ще дітей має померти?
Скільки ще дітей має народитися в бомбосховищах?
Скільки ще днів матерям доведеться засинати, боячись, що їхні діти можуть не прокинутися завтра?
Ці вбивства – злочини проти людяності. Вони вбивають наше майбутнє – наших дітей.
Припиніть вбивати українських дітей!
Зупиніть цю війну!
- 2 хв читання
Magento 2 Registry – це клас, який використовується для обміну даними між об’єктами в Magento.
Наприклад, зберегти об’єкт до Registry у класі контролера та отримати його у класі блоку.
Починаючи з Magento 2.3, клас Registry був оголошений застарілим, але багато розробників, постачальників розширень і навіть основного коду Magento все ще використовують його.
Як це працює?
Щоб отримати об’єкт Registry у вашому класі, вам потрібно визначити його в конструкторі, наприклад:
/*** @var \Magento\Framework\Registry*/private $registry;/*** ...* @param \Magento\Framework\Registry $registry,*/public function __construct(...,\Magento\Framework\Registry $registry,...) {$this->registry = $registry;...}
або ви можете легко отримати його через для цілей тестування:
$registry = \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Framework\Registry::class);
Як встановити нове значення в Registry?
Щоб встановити нове значення в регістр, скористайтеся методом public function register($keyihor
- 2 хв читання
В адмініструванні Magento 2 є багато процесів, які потребують автоматизації та планування. Оновлення курсів валют, надсилання розсилок та сповіщень про продукти обробляються зручною функцією за замовчуванням — .
Крім того, багато розширень Magento 2 також постачаються з користувацькими завданнями cron для виконання різних завдань у модулі. Тож, якщо вам цікаво, як створити його для свого розширення, ви потрапили в потрібне місце.
Сьогодні ви дізнаєтеся, як крок за кроком створити завдання cron у Magento 2.
Примітка: перед створенням власного завдання cron переконайтеся, що у вас є crons, відкривши crontab як власник файлової системи Magento. Виконайте таку команду:
crontab -l
Результат має бути таким:
#~ MAGENTO START c5f9e5ed71cceaabc4d4fd9b3e827a2b
* * * * * /usr/bin/php /var/www/html/magento2/bin/magento cron:run 2>&1 | grep -v "Ran jobs by schedule" >> /var/www/html/magento2/var/log/magento.cron.log
#~ MAGENTO END c5f9e5ed71cceaabc4d4fd9b3e827a2b
1. Створення простогоihor
- 1 хв читання
Щоб налаштувати Elasticsearch 7 на Ubuntu 20.04, виконайте ці прості команди одну за одною в інтерфейсі командного рядка:
sudo apt -y install gnupgwget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -sudo apt -y install apt-transport-httpsecho "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.listsudo apt updatesudo apt -y install elasticsearch//To install a specific Elasticsearch version, specify it in the command:sudo apt -y install elasticsearch=7.10.2
За замовчуванням Elasticsearch використовує 2 ГБ оперативної пам'яті для JVM. Якщо ваш сервер має обмежений розмір пам'яті, ви можете зменшити його, наприклад, до 1 ГБ або 512 МБ. Для цього відредагуйте файл jvm.options, виконайте команду:
sudo nano /etc/elasticsearch/jvm.options
та змініть
-Xms2g-Xmx2g
на
-Xms1g-Xmx1g
. Збережіть файл jvm.options.
Далі увімкніть та запустіть службу elasticsearch, виконайте команди:
sudo systemctl enable elasticsearch.serviceihor
- 2 хв читання
Налаштування Magento 2 використовуються для розширення реалізації за замовчуванням. Ви можете використовувати налаштування в Magento 2 для реалізації деяких інтерфейсів або для переписування/перевизначення існуючих класів PHP та їхніх методів.
У цій статті ви дізнаєтесь, як це зробити, та знайдете корисні приклади, які допоможуть вам на цьому шляху.
Перевизначення класів у Magento 2
Якщо ви хочете переписати існуючі методи класу з налаштуваннями Magento, виконайте наведені нижче дії:
1. Створіть тощо/di.xml файл у вашій папці розширень:
app/code/MyCompany/ModuleName/etc/di.xml
2. Додайте до нього цей код:
<?xml version="1.0"?><config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Checkout\Block\Onepage\Success" type="MyCompany\ModuleName\Block\Onepage\Success" /></config>
Використати атрибут "дляу "перевага" для визначення класу PHP, який потрібно перевизначити. Використовуйтеihor
- 1 хв читання
Минулого тижня весь світ Magento був справді розчарований новинами від деяких постачальників розширень Magento про Перехід на модель передплати. Зараз ми можемо спостерігати хвилю обурення з боку їхніх клієнтів.
Якщо вас цікавить, чи Magefan також перейде на модель передплати, то ви знайдете відповіді в цьому листі, щоб знати, чого очікувати.
Зараз ми обговорюємо це в нашій команді. Ви, наші клієнти, ваш успіх і процвітання є нашим головним пріоритетом. Тож ви й надалі отримуватимете вигоду від наших продуктів і послуг, як і звикли.
Навіть якщо ми впровадимо будь-які зміни в майбутньому, ніхто з вас не буде розчарований чи стресований через це, оскільки ці зміни будуть впроваджені з урахуванням ідеї «що краще для наших клієнтів». Ми дотримаємося своїх слів і гарантій. І якщо будь-які з таких змін відбудуться в майбутньому, вони вас не бентежать.
Ми хочемо запевнити вас, що доступність наших продуктів та оновлень, якість наших продуктів та послуг залишаться незмінними.
Усі клієнти, які вжеihor
- 1 хв читання
Сьогодні у нас особливе оголошення – перша в історії конференція PWA розпочнеться незабаром!
Крім того, наш генеральний директор Magefan Ігор Вансач буде серед спікерів цього заходу, який відповість на деякі актуальні питання для розробників Magento:
Як підготувати ваше поточне PWA розширення Magento 2 та створити нове для бекенду PWA?
Ви отримаєте вичерпний посібник з підготовки розширень Magento до PWA, який також включає дорожню карту та підводні камені. Технологія PWA зараз більш трендова, ніж будь-коли раніше.
Отже, ви можете забронювати місце на онлайн-конференції GoPWA '21 , яка відбудеться 29-30 вересня 2021 року , щоб приєднатися до нашої дискусії. І це абсолютно безкоштовно!
- 1 хв читання
Під час встановлення нового пакета розширення в Magento 2 через composer ви можете отримати помилку:
[InvalidArgumentException] Package vendor/module-name exists in composer repo (https://repo.packagist.org) and composer repo (https://repo.magento.com) which has a higher repository priority. The packages with higher priority do not match your constraint and are therefore not installable. See https://getcomposer.org/repoprio for details and assistance.
Це повідомлення про помилку пояснює себе самостійно та містить посилання на документацію composer.
. Проблема полягає в тому, що модуль, який ви намагаєтеся встановити, має стару версію в репозиторії Magento composer та нову версію в безкоштовному публічному репозиторії packagist.org. Однак репозиторій Magento має вищий пріоритет, тому composer не може встановити останню версію та видає цю помилку.
Що вам потрібно зробити, щоб вирішити проблему:
1. Відкрийте файл composer.json у кореневому каталозі Magento 2.
2. Знайдіть розділ "repositories"ihor
- 2 хв читання
Magento 2 Менеджер об'єктів – це клас PHP, відповідальний за створення та отримання об'єктів у Magento 2. Він також керує створенням фабрик та проксі.
Як це працює?
Щоб отримати екземпляр менеджера об'єктів (наприклад, отримати менеджер об'єктів magento 2 у phtml), використовуйте код:
<?php $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
Щоб додати менеджер об'єктів до конструктора:
/
* @var \Magento\Framework\ObjectManagerInterface
*/
private $objectManager;
/
* @param \Magento\Framework\ObjectManagerInterface $objectmanager
*/
public function __construct(
\Magento\Framework\ObjectManagerInterface $objectmanager
) {
$this->objectManager = $objectmanager;
}
За допомогою ObjectManager ви можете отримати одиночний об'єкт (метод "get") класу PHP або створити новий (метод "create").
Приклад:
<?php $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); /* Create a new product object */ $product = $objectManager->create(\Magento\Catalog\Model\Product::class);ihor
- 1 хв читання
Іноді вам потрібно запустити код Magento 2 зовні, у таких випадках:
Інтеграція Magento 2 з іншими фреймворками або платформами, встановленими на тому ж веб-сервері,
швидке тестове виконання деякого методу, наприклад, завдання cron.
Наприклад, створіть файл test.php у кореневому каталозі Magento 2 та додайте до нього наступний код:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
use Magento\Framework\App\Bootstrap;require __DIR__ . '/app/bootstrap.php';
$bootstrap = Bootstrap::create(BP, $_SERVER);
$obj = $bootstrap->getObjectManager();
$state = $obj->get(Magento\Framework\App\State::class);$state->setAreaCode('adminhtml');
$object = $obj->create(\VendorName\ModuleName\Folder\Class::class);$object->someMethod();
VendorName\ModuleName\Folder\Class - назва класу, який ви хочете виконати;someMethod - назва методу, який ви хочете виконати;Увага!Переконайтеся, що__DIR__. '/app/bootstrap.php – це правильний шлях до файлу Magento 2 app/bootstrap.php.
Ви можете запустити test.php у веббраузеріihor
- 3 хв читання
У Magento 2 ви можете створювати плагіни (перехоплювачі), які дозволяють розширювати функціональність та виконувати власний код до, після або навколо будь-якого публічного методу PHP-класу.
Наприклад, є PHP-клас із публічними функціями "setName", "getName", "save":
<?phpnamespace VendorName\ModuleName\Folder;class SomeModel{ private $name; public function setName($name, $storeId = 0) { $this->name[0] = $name; } public function getName($storeId = 0) { return $this->name[$storeId]; } public function save($fields, $customData) { /* some save logic here */ }}
Як створити плагін у Magento 2?
1. Створіть файл etc/di.xml у папці та додайте туди наступний код:
<?xml version="1.0"?><config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="VendorName\ModuleName\Folder\SomeModel"> <plugin name="mycompany_mymodule_plugin_modulename_Folder_somemodel" type="MyCompany\MyModule\Plugin\ModuleName\Folder\SomeModelPlugin"ihor
- 3 хв читання
У розділі ви дізналися, як створювати нові таблиці в базі даних Magento 2. У цьому розділі ви дізнаєтеся більше про моделі, що використовуються для роботи з базою даних Magento 2, що дозволяє читати, редагувати та видаляти дані.
Magento 2 та Magento 1 використовують ORM Model/ResourceModel/Collection ( Об'єктно-реляційне відображення ) для цих цілей. Щоб реалізувати цю концепцію, вам потрібно створити 3 файли (model, resource model, collection).
1. Створіть файл моделі:
app/code/VendorName/ModuleName/Model/Somemodel.php
додайте до нього наступний код:
<?php
namespace VendorName\ModuleName\Model;
class Somemodel extends \Magento\Framework\Model\AbstractModel{ protected function _construct() { $this->_init('VendorName\ModuleName\Model\ResourceModel\Somemodel'); }}
Конструкція _ініціалізує модель ресурсу. Передайте назву класу моделі ресурсу (створіть його на наступному кроці) методу _init . Найчастіше ви будете працювати з
Model . Цей клас має бути успадкований відihor
- 1 хв читання
Під час розробки інтернет-магазину на базі Magento 2 ви можете зіткнутися з проблемою розширення стандартної функціональності Magento 2 або .
Редагування основних файлів або модулів Magento заборонено, оскільки ці зміни будуть перезаписані під час .
Отже, як внести зміни до файлу шаблону фронтенду (інтерфейсу), css, js?
УВАГА! Наступні інструкції не можна використовувати для перевизначення файлів макета.
Перевизначте файли view-файлів модулів у папці app/code.
Припустимо, вам потрібно змінити цей файл:
app/code/Magefan/Blog/view/frontend/templates/post/view.phtml
Зробіть його копію в папці теми за таким шляхом:
app/design/frontend/ThemeVendor/themename/Magefan_Blog/templates/post/view.phtml
Внесіть необхідні зміни до щойно створеного файлу теми.
Якщо вашої власної теми немає у вашій інсталяції Magento, створіть нову тему.
Перевизначте файли перегляду модулів у папці vendor.
Припустимо, вам потрібно змінити цей файл:
vendor/magefan/module-blog/view/frontend/web/css/blog-custom.css
Зробітьihor
- 1 хв читання
Якщо у вашому Magento 2 виникає помилка «Елемент з кореневим ідентифікатором вже існує», найімовірніше, це пов’язано зі стороннім розширенням, яке викликає методи для повторного рендерингу сторінки.
Щоб виправити помилку «Елемент з кореневим ідентифікатором вже існує»:
1. Знайдіть PHP-файл і рядок, який викидає виняток.
2. Відкрийте CLI (термінал), перейдіть до кореневого каталогу Magento та виконайте такі команди, щоб знайти потрібний файл:
grep vendor/ -re ' ID already exists'grep app/ -re ' ID already exists'
В результаті ви отримаєте результат, подібний до цього:
vendor/magento/framework/Data/Form.php: 'An element with a "' . $elementId . '" ID already exists.'vendor/magento/framework/Data/Test/Unit/FormTest.php: $this->expectExceptionMessage('An element with a "1" ID already exists.');vendor/magento/framework/Data/Structure.php: new \Magento\Framework\Phrase('An element with a "%1" ID already exists.', [$elementId])
3. Потім відкрийте кожен файл (крім *Test.php) та додайте та завершітьihor
- 1 хв читання
Якщо ви хочете змінити тип з випадаючого списку на текстовий у Magento 2, все, що вам потрібно зробити, це виконати такі SQL-запити (будь ласка, зробіть резервну копію бази даних перед виконанням):
1. Цей запит змінить налаштування атрибута та перетворить його на текстовий атрибут.
UPDATE eav_attribute SET backend_type = "varchar", frontend_input = "text", source_model = ""WHERE attribute_code = "MY_ATTRIBUTE_CODE";
2. Цей запит скопіює дані атрибута випадаючого списку до таблиці значень атрибута тексту та замінить ідентифікатори опцій їхніми фактичними мітками (текст).
INSERT INTO catalog_product_entity_varchar SELECT null as value_id, pei.attribute_id, pei.store_id, pei.entity_id, aov.value as value FROM catalog_product_entity_int pei LEFT JOIN eav_attribute_option ao ON pei.attribute_id = ao.attribute_id LEFT JOIN eav_attribute_option_value aov ON ao.option_id = aov.option_id WHERE pei.value IS NOT NULL AND pei.attribute_id = (SELECT attribute_id FROM eav_attribute WHERE attribute_codeihor
- 2 хв читання
Іноді під час вам потрібно отримати інформацію про магазин програмно. Вам може знадобитися отримати поточний ідентифікатор магазину, код магазину, назву, ідентифікатор веб-сайту або .
Щоб отримати ці дані, використовуйте екземпляр singleton наступного класу:
\Magento\Store\Model\StoreManagerInterface
Наприклад, ви можете включити його до конструктора класу, а потім викликати:
<?phpnamespace \MyCompany\ExampleModule\Model;class Example{ private $storeManager;
public function __construct(
...
\Magento\Store\Model\StoreManagerInterface $storeManager,
...
) { ...
$this->storeManager = $storeManager;
...
}
/** * Examples */ public function execute() { /* Get Current Store ID */ $storeId = $this->storeManager->getStore()->getId(); /* Get Current Store Code */ $storeCode = $this->storeManager->getStore()->getCode(); /* Get Current Store Name */ $storeName = $this->storeManager->getStore()->getName();ihor
- 1 хв читання
Отримати URL-адресу у файлах шаблонів .phtml
1. Отримати URL-адресу головної сторінки магазину (http://domain.com/):
<?= $this->getUrl() ?>
2. Отримати URL-адресу деякої сторінки, наприклад, "Зв'яжіться з нами" (http://domain.com/contacts/):
<?= $this->getUrl('contacts') ?>
3. Отримати URL-адресу статичного файлу теми, наприклад:
app/design/frontend/ThemeVendor/theme_name/web/css/custom.cssapp/design/frontend/ThemeVendor/theme_name/Magefan_Blog/web/js/lazyload.jsapp/code/Magefan_Blog/view/frontend/web/js/lazyload.jsvendor/magefan/module-blog/view/frontend/web/js/lazyload.js
використовуйте наступний код:
<?= $this->getViewFileUrl('css/custom.css') ?><?= $this->getViewFileUrl('Magefan_Blog::js/lazyload.js') ?>
4. Отримати URL-адресу статичного файлу в pub/media:
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();$mediaUrl = $objectManager->get(Magento\Store\Model\StoreManagerInterface::class) ->getStore() ->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA);
<?=ihor
- 2 хв читання
Назва меню [ідентифікатор]
Dashboard [Magento_Backend::dashboard]
Sales [Magento_Sales::sales]
Operations [Magento_Sales::sales_operation]
Orders [Magento_Sales::sales_order]
Invoices [Magento_Sales::sales_invoice]
Shipments [Magento_Sales::sales_shipment]
Credit Memos [Magento_Sales::sales_creditmemo]
Billing Agreements [Magento_Paypal::paypal_billing_agreement]
Transactions [Magento_Sales::sales_transactions]
Products [Magento_Catalog::catalog]
Inventory [Magento_Catalog::inventory]
Catalog [Magento_Catalog::catalog_products]
Categories [Magento_Catalog::catalog_categories]
Customers [Magento_Customer::customer]
All Customers [Magento_Customer::customer_manage]
Now Online [Magento_Customer::customer_online]
Marketing [Magento_Backend::marketing]
Promotions [Magento_CatalogRule::promo]
Catalog Price Rule [Magento_CatalogRule::promo_catalog]
Cart Price Rules [Magento_SalesRule::promo_quote]
Communications [Magento_Backend::marketing_communications]
Email Templates [Magento_Email::template]ihor
- 1 хв читання
Файлetc/adminhtml/menu.xml використовується для керування меню адміністративної панелі Magento 2 та додавання до нього нових елементів, зокрема.
Створіть цей файл у папці , щоб додати новий елемент меню:
etc/adminhtml/menu.xml
та додайте туди наступний код:
<?xml version="1.0"?><config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd"> <menu> <add id="VendorName_ModuleName::key1" title="Title 1" module="VendorName_ModuleName" parent="OtherVendorName_OtherModuleName::content" sortOrder="10" resource="VendorName_ModuleName::key1"/> <add id="VendorName_ModuleName::key2" title="Title 2" module="VendorName_ModuleName" parent="VendorName_ModuleName::key1" sortOrder="10" action="path/controllerName" resource="VendorName_ModuleName::key2"/> </menu></config>
id - унікальний ;title - текст елемента;module – визначає, до якого модуля належить елемент;parent – ідентифікатор батьківськогоihor
- 1 хв читання
У розділі ми описали, як створити власний розділ на сторінці конфігурації Magento 2 (Stores > Configuration).
Щоб встановити значення за замовчуванням для полів конфігурації, вам потрібно створити наступний файл у папці :
etc/config.xml
та додати цей код:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd"> <default> <section_id> <group_id> <field_id>default_value</field_id> </group_id> </section_id> </default></config>
Ієрархіяsection_id/group_id/field_id має відповідати структурі у файлі system.xml.
Щоб очистити кеш, виконайте команду CLI:
php bin/magento cache:clean
Перевірте результат.
У прикладах ми створюємо модуль для FAQ. Змінений код модуля можна переглянути на GitHub.
