CoreShop Pimcore Bundle

Installation

$ composer require coreshop/pimcore-bundle:^3.0

Activating Bundle

You need to enable the bundle inside the kernel or with the Pimcore Extension Manager.

<?php

// app/AppKernel.php

public function registerBundlesToCollection(BundleCollection $collection)
{
    $collection->addBundles([
        new \CoreShop\Bundle\PimcoreBundle\CoreShopPimcoreBundle()
    ]);
}

Usage

The CoreShopPimcoreBundle integrates the CoreShop Pimcore Component into Symfony automatically registers a lot of services for you.

JS/CSS Resource Loading

With Pimcore, every bundle needs to take care about loading static assets themselve. PimcoreBundle helps you out here, follow these steps to use it:

  • Create a DependencyInjection Extension class like:
<?php

namespace AppBundle\DependencyInjection;

use CoreShop\Bundle\ResourceBundle\DependencyInjection\Extension\AbstractModelExtension;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;

class AppExtension extends AbstractModelExtension
{
    public function load(array $config, ContainerBuilder $container)
    {
        $config = $this->processConfiguration($this->getConfiguration([], $container), $config);

        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');

        $this->registerPimcoreResources('coreshop', $config['pimcore_admin'], $container);
    }
}
  • Create a DependencyInjection Configuration class like:
<?php

namespace AppBundle\DependencyInjection;

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

final class Configuration implements ConfigurationInterface
{
    /**
     * {@inheritdoc}
     */
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('app');

        $this->addPimcoreResourcesSection($rootNode);

        return $treeBuilder;
    }

    /**
     * @param ArrayNodeDefinition $node
     */
    private function addPimcoreResourcesSection(ArrayNodeDefinition $node)
    {
        $node->children()
            ->arrayNode('pimcore_admin')
                ->addDefaultsIfNotSet()
                ->children()
                    ->arrayNode('js')
                        ->addDefaultsIfNotSet()
                        ->ignoreExtraKeys(false)
                        ->children()
                            ->scalarNode('test')->defaultValue('/bundles/app/pimcore/js/test.js')->end()
                        ->end()
                    ->end()
                    ->arrayNode('css')
                        ->addDefaultsIfNotSet()
                        ->ignoreExtraKeys(false)
                        ->children()
                            ->scalarNode('test')->defaultValue('/bundles/app/pimcore/css/pimcore.css')->end()
                        ->end()
                    ->end()
                ->end()
            ->end()
        ->end();
    }
}

  • That's it, PimcoreBundle now takes care about loading your resources and also bundles them in non DEV-Mode.

DataObject Extensions

Serialized Data

This extension allows you to store SerializedData inside a Pimcore DataObject.

Slug

Pimcore comes with quite useful objects slugs. But it doesn't come with a Slug Generator. CoreShop for the rescue. In Order to use it, your class needs to implement CoreShop\Component\Pimcore\Slug\SluggableInterface and CoreShop automatically generates slugs for you.

Extensions / Influence the slug generation

If you want to change the generated slug or prefix it, you can use the CoreShop\Component\Pimcore\Event\SlugGenerationEvent Event.

<?php

declare(strict_types=1);

namespace App\EventListener;

use CoreShop\Component\Pimcore\Event\SlugGenerationEvent;
use Pimcore\Model\DataObject\PressRelease;
use Pimcore\Model\Document;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

final class SlugEventListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            SlugGenerationEvent::class => 'onGenerate',
        ];
    }

    public function onGenerate(SlugGenerationEvent $event): void
    {
        $event->setSlug($event->getSlug() . '-bar');
    }
}

Data Object Features

Class Converter and Data Migrate

Class converter is a small utility, which lets you migrate all Data from one class to another. Usage:

<?php

use CoreShop\Component\Pimcore\Migrate;

$currentClassName = 'Product';
$newClassName = 'NewProduct';
$options = [
    'delete_existing_class' => true,
    'parentClass' => 'AppBundle\Model\MyProduct'
];

//Copies $currentClassName Definition to $newClassName
//$options can overwrite some properties like parentClass
Migrate::migrateClass($currentClassName, $newClassName, $options);

//This function migrates all data from $currentClassName to $newClassName
//It uses SQL Commands to increase performance of migration
Migrate::migrateData($currentClassName, $newClassName);

Class Installer

Class Installer helps you importing Classes/FieldCollections/ObjectBricks into Pimcore based of a JSON Definition:


use CoreShop\Component\Pimcore\ClassInstaller;

$installer = new ClassInstaller();

// For Bricks use
$installer->createBrick($pathToJson, $brickName);

// For Classes use
$installer->createClass($pathToJson, $className, $updateExistingClass);

// For FieldCollections use
$installer->createFieldCollection($pathToJson, $fcName);

Class/Brick/Field Collection Updater

Definition Updaters help you in migrating your Pimcore Class/Bricks or Field Collection Definitions to be properly migrated from Release to Release.

To update a Pimcore class use it like this:

use CoreShop\Component\Pimcore\DataObject\ClassUpdate;

$classUpdater = new ClassUpdate('Product');

//Your JSON Definition from Pimcore
$payment = [
    'fieldtype' => 'coreShopSerializedData',
    'phpdocType' => 'array',
    'allowedTypes' =>
        [
        ],
    'maxItems' => 1,
    'name' => 'paymentSettings',
    'title' => 'Payment Settings',
    'tooltip' => '',
    'mandatory' => false,
    'noteditable' => true,
    'index' => false,
    'locked' => null,
    'style' => '',
    'permissions' => null,
    'datatype' => 'data',
    'columnType' => null,
    'queryColumnType' => null,
    'relationType' => false,
    'invisible' => false,
    'visibleGridView' => false,
    'visibleSearch' => false,
];

//Check if field exists
if (!$classUpdater->hasField('paymentSettings')) {
    //If not insert field after a specific field and save the definition
    $classUpdater->insertFieldAfter('paymentProvider', $payment);
    $classUpdater->save();
}

Thats it, the same works for FieldCollections with the class CoreShop\Component\Pimcore\DataObject\FieldCollectionDefinitionUpdate and for Bricks with the class CoreShop\Component\Pimcore\DataObject\BrickDefinitionUpdate

Inheritance Helper

Inhertiance Helper is a small little but very useful helper class to enable Pimcore inheritance only with a closure function like this:


use CoreShop\Component\Pimcore\DataObject\InheritanceHelper;

$inheritedValue = InheritanceHelper::useInheritedValues(function() use($object) {
    return $object->getValueInherited();
}, true);

Version Helper

Version Helper is a small little but very useful helper class to disabling or enablind Pimcore Versioning.


use CoreShop\Component\Pimcore\DataObject\VersionHelper;

VersionHelper::useVersioning(function() use($object) {
    //Object will be saved without creating a new Version
    $object->save();
}, false);

Unpublished Helper

Unpublsihed Helper is a small little but very useful helper class to get unpublished objects in Pimcore Frontend.


use CoreShop\Component\Pimcore\DataObject\UnpublishedHelper;

$allProducts = UnpublishedHelper::hideUnpublished(function() use($object) {
    //Will return all products, even the unpbulished ones
    return $object->getProducts();
}, false);

Expression Language Features

CoreShop adds some features to the Symfony Expression language like:

  • PimcoreLanguageProvider: to get Pimcore Objects, Assets or Documents inside a Expression Language Query

Migration Features

Pimcore Shared Translations

Helps you to install new Shared Translations during Migration:

use CoreShop\Component\Pimcore\Migration\SharedTranslation;

SharedTranslation::add('key', 'en', 'value');