PIM разработка

Pimcore - это мощная open‑source MDM-система, которая решает задачу централизованного управления данными, их контроля и обогащения. Pimcore можно расширять, добавляя свой функционал, адаптируя систему под свои нужды и безнес-процессы. Более подробно о PIM разработке, читайте на нашем сайте.

В данной статье мы разберёмся, как создавать собственные пакеты (бандлы) в Pimcore, опишем структуру бандла, расскажем как создать installer для бандла и как подключить собственные JS и CSS файлы.

Для начала выясним, что такое бандл. 

Бандл - это модульная единица, которая позволяет расширять функциональность основного приложения. Бандлы в Pimcore построены на основе концепции бандлов Symfony, что делает их мощным инструментом для добавления новых функций, интеграции сторонних сервисов и организации кода.

Создание структуры папок

1) В папке bundles создаем папку с названием компании, например -  bundles/Astrio (можете использовать любое свое название). 

2) Далее нужно создать папку с названием нашего бандла. Наш тестовый бандл будет называться -  TestCreateBundle.



3) Далее создаем папку src - последующие файлы и папки будут создаваться в ней. 

4) Создаем папку DependencyInjection - данная папка используется для хранения файлов конфигурации и сервисов, которые относятся к инъекции зависимостей.

Создание файлов и классов

В уже готовой папке DependencyInjection необходимо создать два класса:

1) Configuration.php - файл, который содержит конфигурацию сервисов для инъекции зависимостей. Он будет  определять, какие сервисы будут доступны в  общем контейнере и как они должны быть настроены.

<?php

declare(strict_types=1);

namespace Astrio\TestCreateBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

class Configuration implements ConfigurationInterface
{
    /**
     * {@inheritdoc}
     */
    public function getConfigTreeBuilder(): TreeBuilder
    {
        return new TreeBuilder('test_create_bundle');
    }
}

2) Далее создадаем класс bundles\Astrio\TestCreateBundle\src\DependencyInjection\AstrioTestCreateExtension.



В методе load создается экземпляр YamlFileLoader, который используется для загрузки YAML-файла конфигурации сервисов из папки Resources/config. Затем метод load загружает файл services.yaml, который должен содержать определения сервисов для инъекции зависимостей.

<?php

namespace Astrio\TestCreateBundle\DependencyInjection;

use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;

class AstrioTestCreateExtension extends Extension
{
    /**
     * {@inheritdoc}
     */
    public function load(array $configs, ContainerBuilder $container): void
    {
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
        $loader->load('services.yaml');

    }
}

3) Теперь создадим класс AstrioTestCreateBundle в папке src. Пока оставим его пустым, так как он будет наследоваться от Pimcore\Extension\Bundle\AbstractPimcoreBundle. В нём мы можем прописать зависимость от других бандлов, задать пути для css и js, но об этом мы расскажем в следующей статье.

4) Далее создаем папку src/Resources/config, в которой будет лежать файл services.yaml. В этом файле мы опишем конфигурацию по умолчанию:

services:
    # конфигурация по умолчанию для служб в *этом* файле
    _defaults:
        # автоматически внедряет зависимости в ваши сервисы
        autowire: true
        # автоматически регистрирует ваши сервисы как команды, подписчики событий и т. д.
        autoconfigure: true
        # это означает, что вы не можете получать сервисы напрямую из контейнера через $container->get()
        # Если вам нужно это сделать, вы можете переопределить этот параметр для отдельных сервисов.
        public: false

5) Также нужно добавить наш бандл в файл config/bundles.php

<?php

return [
    ...
    \Astrio\TestCreateBundle\AstrioTestCreateBundle::class => ['all' => true],
];

6) Теперь необходимо прописать зависимость в composer,json файле

"autoload": {
  "psr-4": {
    "Astrio\\TestCreateBundle\\": "bundles/Astrio/TestCreateBundle/src"
  }
}

7) Затем применем shell команду

composer dump-autoload

Готово! Вы справились и содали свой собственный бандл! 
Чтобы точно знать, что всё работает, используйте команду:

php bin/console pimcore:bundle:list

В списке должен быть ваш созданный бандл.

Подключение JS / CSS

Допустим, что далее мы хотим добавить свои css или js файлы. Способов для этого есть нескольно, но пока сосредоточемся на одном из них. 

Чтобы это сделать, нам нужно:

1) В классе src\AstrioTestCreateBundle.php добавить имплементирование от интерфейса:

Pimcore\Extension\Bundle\PimcoreBundleAdminClassicInterface и используем трейт Pimcore\Extension\Bundle\Traits\BundleAdminClassicTrait

<?php

namespace Astrio\TestCreateBundle;

use Pimcore\Extension\Bundle\AbstractPimcoreBundle;
use Pimcore\Extension\Bundle\PimcoreBundleAdminClassicInterface;
use Pimcore\Extension\Bundle\Traits\BundleAdminClassicTrait;

class AstrioTestCreateBundle extends AbstractPimcoreBundle implements PimcoreBundleAdminClassicInterface
{
    use BundleAdminClassicTrait;

    public function getJsPaths(): array
    {
        return [
            '/bundles/astriotestcreate/js/customjs/custom.js',
        ];
    }

    public function getCssPaths(): array
    {
        return [];
    }
}

В функции getJsPath указываем путь до нашей js.
В папке Resources создаем public/js/customjs/custom.js

console.log("Добавили свой js файл")

После этого необходимо использовать команду:

php bin/console asset:install

Теперь, если вы зайдете в  админку пимкора и откроете консоль, то увидете ваш вывод в консоль:



Таким же путём можно переопределять другие js , нужно просто соблюдать такой-же путь файла.
С CSS файлами всё то-же самое, что и с js.

Использование установщика

А что если складывается такая ситуация, что нам нужно использовать установщик, чтобы бандл сразу не активировался? 

1) Для этого дополним класс Astrio\TestCreateBundle\AstrioTestCreateBundle

<?php

namespace Astrio\TestCreateBundle;

use Astrio\TestCreateBundle\Tools\Installer;
use Pimcore\Extension\Bundle\AbstractPimcoreBundle;
use Pimcore\Extension\Bundle\PimcoreBundleAdminClassicInterface;
use Pimcore\Extension\Bundle\Traits\BundleAdminClassicTrait;

class AstrioTestCreateBundle extends AbstractPimcoreBundle implements PimcoreBundleAdminClassicInterface
{
    use BundleAdminClassicTrait;

    public function getInstaller(): Installer
    {
        /** @var Installer $installer */
        $installer = $this->container->get(Installer::class);

        return $installer;
    }

    public function getJsPaths(): array
    {
        return [
            '/bundles/astriotestcreate/js/customjs/custom.js',
        ];
    }

    public function getCssPaths(): array
    {
        return [];
    }
}

2) После чего, надо будет создать Astrio\TestCreateBundle\Tools\Installer

<?php

namespace Astrio\TestCreateBundle\Tools;

use Pimcore\Extension\Bundle\Installer\SettingsStoreAwareInstaller;

class Installer extends SettingsStoreAwareInstaller
{
    public function install(): void
    {
        //Описываем логику для установки
        parent::install();
    }

    public function uninstall(): void
    {
        //Описываем логику для удаления
        parent::uninstall();
    }
}

3) И добавить в наш services.yaml определения нашего сервиса:

Astrio\TestCreateBundle\Tools\Installer:
    public: true
    arguments:
        $bundle: "@=service('kernel').getBundle('AstrioTestCreateBundle')"

Теперь при использовании команды:

php bin/console pimcore:bundle:list

мы видим, что наш бандл может быть устанавливаемым и удаляемым.
На данном этапе он может быть устанавливаемым (Installable = true).

Далее мы можем установить или удалить наш бандл

bin/console pimcore:bundle:install AstrioTestCreateBundle<br/>
bin/console pimcore:bundle:uninstall AstrioTestCreateBundle<br/>

Друзья, в этой статье мы постарались научить вас создавать собственные бандлы. Теперь у вас есть свой пустой бандл со своим установщиком. Далее эта "заготовка" будет использована для дальнейшего расширения функционала системы, следите за апдейтами в нашем блоге!