pimcore
Pimcore platform development - bundles, data objects, class definitions, CoreExtensions, events, workflows, documents, assets
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Pimcore platform development - bundles, data objects, class definitions, CoreExtensions, events, workflows, documents, assets
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Set up Contributor License Agreement (CLA) for CORS open source repositories on GitHub
Set up or migrate a Pimcore project/bundle to use the cors/dev Docker Compose development environment
Upgrade Pimcore 11 projects and bundles to Pimcore 12 - composer, config, PHP 8.3, Symfony 7, Docker, CI/CD, cors/dev, cors/saml
Extend and customize CoreShop eCommerce - custom rules, payment gateways, entity extensions, workflows, Studio v2 plugins, notifications
Migrate any Pimcore ExtJS admin UI to Studio v2 React/TypeScript - panels, grids, forms, trees, stores, plugins
Build Pimcore Studio v2 features - React/TypeScript, Ant Design, plugins, modules, dynamic types, DI container, widgets
| name | pimcore |
| description | Pimcore platform development - bundles, data objects, class definitions, CoreExtensions, events, workflows, documents, assets |
| allowed-tools | Read, Grep, Glob, Bash, Edit, Write, Task |
You are helping develop on the Pimcore platform. Before writing any code, load context about Pimcore's architecture and patterns.
Pimcore has three fundamental element types, all extending Pimcore\Model\Element\AbstractElement:
Every element has: id, path, key, creationDate, modificationDate, userOwner, properties, dependencies.
All Pimcore bundles extend Pimcore\Extension\Bundle\AbstractPimcoreBundle (not plain Symfony Bundle):
use Pimcore\Extension\Bundle\AbstractPimcoreBundle;
class MyBundle extends AbstractPimcoreBundle
{
public function getNiceName(): string { return 'My Bundle'; }
public function getDescription(): string { return 'Description'; }
public function getInstaller(): ?InstallerInterface { return $this->container->get(Installer::class); }
}
class MyBundleExtension extends ConfigurableExtension implements PrependExtensionInterface
{
public function loadInternal(array $config, ContainerBuilder $container): void
{
$loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../config'));
$loader->load('services.yaml');
}
}
Used heavily for tag collection, registry building, service decoration:
public function build(ContainerBuilder $container): void
{
parent::build($container);
$container->addCompilerPass(new MyRegistryPass());
}
Class Definitions define the structure of Data Objects (like database schemas).
Pimcore\Model\DataObject\ClassDefinition\Data\*)Basic: Input, Textarea, Wysiwyg, Numeric, Slider, Date, DateTime, Checkbox, Select, Multiselect, Email, Country, Language
Relations: ManyToOneRelation, ManyToManyRelation, AdvancedManyToManyRelation
Complex: Block (repeating groups), Fieldcollection, Localizedfields (i18n), ObjectBrick (extendable), Classificationstore (dynamic attributes), QuantityValue
Add custom field types to the Class Definition editor:
namespace MyBundle\CoreExtension;
use Pimcore\Model\DataObject\ClassDefinition\Data\Select;
class MyCustomField extends Select
{
public string $fieldtype = 'myCustomField';
public function getFieldType(): string {
return $this->fieldtype;
}
}
The $fieldtype string must match the frontend dynamic type ID exactly.
Pimcore uses Symfony EventDispatcher with predefined event constants:
use Pimcore\Event\DataObjectEvents;
use Pimcore\Event\Model\DataObjectEvent;
class MySubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
DataObjectEvents::POST_UPDATE => 'onPostUpdate',
DataObjectEvents::PRE_DELETE => 'onPreDelete',
];
}
}
Event types per element: PRE_ADD, POST_ADD, PRE_UPDATE, POST_UPDATE, PRE_DELETE, POST_DELETE, POST_LOAD, PRE_COPY, POST_COPY
Event classes: AssetEvents, DataObjectEvents, DocumentEvents
Built on Symfony Workflow Component, configured via YAML:
pimcore:
workflows:
product_approval:
enabled: true
type: state_machine
supports:
- Pimcore\Model\DataObject\Product
places: [draft, review, approved]
transitions:
submit_for_review:
from: draft
to: review
The new admin UI is React/TypeScript with:
pimcore/studio-backend-bundle — REST API (OpenAPI)pimcore/studio-ui-bundle — React app with InversifyJS DI containerpimcore/generic-data-index-bundleStudio plugins register via IAbstractPlugin:
const plugin: IAbstractPlugin = {
name: 'my-plugin',
onInit() { /* DI bindings, dynamic types */ },
onStartup({ moduleSystem }) { /* module/widget registration */ }
}
Custom field types need frontend registration:
import { DynamicTypeObjectDataAbstractSelect } from '@pimcore/studio-ui-bundle/modules/element'
export class DynamicTypeMyField extends DynamicTypeObjectDataAbstractSelect {
readonly id = 'myCustomField' // Must match PHP $fieldtype
}
Main config via config/config.yaml:
pimcore:
general:
domain: "example.com"
documents:
default_controller: 'App\Controller\DefaultController::default'
objects:
class_definitions:
data:
map: {}
use Pimcore\Cache;
// Core cache (Redis/Memcached/Filesystem)
Cache::save($data, 'my_key', ['tag1', 'tag2'], 3600);
Cache::load('my_key');
Cache::clearTag('tag1');
// In-memory runtime cache (current request only)
use Pimcore\Cache\RuntimeCache;
RuntimeCache::save('key', $data);
use Pimcore\Extension\Bundle\Installer\AbstractInstaller;
class Installer extends AbstractInstaller
{
public function install(): void { /* SQL migrations, permissions, configs */ }
public function uninstall(): void { /* cleanup */ }
public function isInstalled(): bool { /* check state */ }
}
bin/console lint:yaml srcbin/console lint:twig srcbin/console lint:containerbin/console cache:clearSee .claude/skills/pimcore/reference.md for directory structure templates and common patterns.