Pimcore Bundle
Installation
$ composer require coreshop/pimcore-bundle:^4.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\PimcoreBundle\DependencyInjection\Extension\AbstractPimcoreExtension;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
class AppExtension extends AbstractPimcoreExtension
{
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\CoreShop\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');
}
}
Pimcore Link Generation
Pimcore includes a versatile Link Generator feature, designed for creating links associated with Pimcore Objects.
CoreShop enhances this capability by introducing support for generating links for Sluggable entities.
To leverage this extended functionality, modify the class definitions Link Generator
setting to use
@CoreShop\Component\Pimcore\Slug\SluggableLinkGenerator
.
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');