Witam w drugiej części praktycznego poradnika dla Magento Developerów. Tutaj jest pierwsza część, w której opisuję funkcjonalnoć jaką będę robił na potrzeby tej serii artykułów. Dzisiaj pokażę jak utworzyć moduł i dodać tabelę do bazy danych wykrzystując Declarative Schema

Jak utworzyć nowy moduł?

Mój moduł będzie się nazywał Mkwiatkowski_CatalogBanners. Zaczynam od utworzenia pliku registration.php w folderze app/code/Mkwiatkowski/CatalogBanners

<?php
/**
 * @copyright Copyright (C) 2020 Marcin Kwiatkowski (http://marcin-kwiatkowski.com)
 */

use \Magento\Framework\Component\ComponentRegistrar;

ComponentRegistrar::register(
    ComponentRegistrar::MODULE,
    'Mkwiatkowski_CatalogBanners',
    __DIR__
);

Następnie tworzę plik etc/module.xml

<?xml version="1.0"?>
<!--
/**
 * @copyright Copyright (C) 2020 Marcin Kwiatkowski (http://marcin-kwiatkowski.com)
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Mkwiatkowski_CatalogBanners">
    </module>
</config>

Trzecim i ostatnim plikiem, który muszę utworzyć jest plik composer.json

{
    "name": "mkwiatkowski/module-catalog-banners",
    "description": "Module for managing category banners",
    "type": "magento2-module",
    "version": "1.0.0",
    "autoload": {
        "files": [
            "registration.php"
        ],
        "psr-4": {
            "Mkwiatkowski\\CatalogBanners\\": ""
        }
    }
}

Protip: tworzenie modułów to chleb powszedni w pracy z Magento. Istnieje wiele narzędzi, które to ułatwiają np. Pestle lub Magicento. Zalecam korzystanie z tych narzędzi dopiero wtedy, gdy manualne tworzenie plików potrzebnych do zbudowania modułu (lub czegoś innego np. Ui Componentu) będzie dla Ciebie już jasne jak słońce. Gdy nie umiesz tego robić z pamięci i zaczniesz używać dodatkowych narzędzi, to tak naprawdę nigdy się tego nie nauczysz.

Jeśli korzystasz z PHP Storm to możesz porobić sobie szablony plików dla najczęściej używanych np.:

PHp Storm file tempalte

Dzięki takiemu szablonowi możesz od razu utworzyć plik w prosty sposób, wpisując nazwę pliku i nazwę modułu w okienku dialogowym.

Magento 2 PHP Storm create new module.xml file

Utworzyłem już wszystkie pliki potrzebne do uruchomienia mojego modułu.

Modyfikacja listy produktów - pliki

Jak włączyć moduł?

Aby włączyć moduł w Magento użyję komendy CLI.

$ bin/magento module:enable Mkwiatkowski_CatalogBanners

Moduł jest włączony. Można to sprawdzić w pliku app/etc/config.php gdzie dodawany jest wpis:

Teraz jeszcze trzeba wykonać jedną komendę, aby mieć pewność, że moduł będzie działał prawidłowo:

$ bin/magento setup:upgrade

Jak dodać tabelę do bazy danych?

Potrzebujemy tabelę gdzie będziemy zapisywać nasze banery. Wymyśliłem, że potrzebuję takie kolumny:

  • banner_id – id naszego baneru, będzie to primary key
  • category_id – id kategorii do której baner jest przypisany
  • is_active – czy baner jest aktywny
  • content – zawartość naszego baneru.

Declarative Schema

Pracuję na Magento 2.3, więc skorzystam z Declarative Schema aby dodać tabalę do bazy dancyh. Tworzę plik etc/db_schema w swoim module.

<?xml version="1.0"?>
<!--
/**
 * @copyright Copyright (C) 2020 Marcin Kwiatkowski (http://marcin-kwiatkowski.com)
 */
-->
<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
    <table name="catalog_banners">
        <column xsi:type="int" name="banner_id" padding="10" unsigned="true" nullable="false" comment="Entity Id"/>
        <column xsi:type="int" name="category_id" padding="10" unsigned="true" nullable="false"
                comment="Category id to which the banner is assigned"/>
        <column xsi:type="boolean" name="is_active" nullable="false" comment="Is banner active" />
        <column xsi:type="mediumtext" name="content" nullable="false" comment="Banner content" />
        <constraint xsi:type="primary" referenceId="PRIMARY">
            <column name="banner_id"/>
        </constraint>
    </table>
</schema>

Dokumentacja Magento mówi o tym, że po utworzeniu nowej tabeli przy pomocy declerative schema należy wygenerować plik db_schema_whitelist.json. Użyję komendy CLI, aby to zrobić.

$ bin/magento setup:db-declaration:generate-whitelist --module-name="Mkwiatkowski_CatalogBanners"

Po wykonaniu tej komendy w app/code/Mkwiatkowski/CatalogBanners/etc ukazał się moim oczom plik db_schema_whitelist.json.

{
    "catalog_banners": {
        "column": {
            "banner_id": true,
            "category_id": true,
            "is_active": true,
            "content": true
        },
        "constraint": {
            "PRIMARY": true
        }
    }
}

Ok, zadeklarowałem nową tabelę. Teraz chcę ją „zainstalować” w bazie danych. Jak to zrobić?

Poszedłem po pomoc do bin/magento i znalazłem tam taką komendę:

$ bin/magento setup:db-schema:upgrade

Po wykonaniu tej komendy tabela zainstalowała się w bazie danych

Declarative Schema

Podsumowanie

Dzisiaj utworzyłem moduł i zainstalowałem tabelę, w której będą zapisywane banery. Zmiany możesz zobaczyć w repozytorium projektu. W następnej części zajmę się zamodelowaniem danych w Magento.