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.