diff --git a/src/Sylius/Bundle/AdminBundle/Resources/config/app/twig_hooks/product_option/create.yaml b/src/Sylius/Bundle/AdminBundle/Resources/config/app/twig_hooks/product_option/create.yaml
index 9118c4210b..fe1635d2b8 100644
--- a/src/Sylius/Bundle/AdminBundle/Resources/config/app/twig_hooks/product_option/create.yaml
+++ b/src/Sylius/Bundle/AdminBundle/Resources/config/app/twig_hooks/product_option/create.yaml
@@ -49,6 +49,9 @@ sylius_twig_hooks:
code:
template: '@SyliusAdmin/product_option/form/sections/values/value/code.html.twig'
priority: 200
+ position:
+ template: '@SyliusAdmin/product_option/form/sections/values/value/position.html.twig'
+ priority: 150
translations:
template: '@SyliusAdmin/product_option/form/sections/values/value/translations.html.twig'
priority: 100
diff --git a/src/Sylius/Bundle/AdminBundle/Resources/config/app/twig_hooks/product_option/update.yaml b/src/Sylius/Bundle/AdminBundle/Resources/config/app/twig_hooks/product_option/update.yaml
index aa55a233cd..a3211e296d 100644
--- a/src/Sylius/Bundle/AdminBundle/Resources/config/app/twig_hooks/product_option/update.yaml
+++ b/src/Sylius/Bundle/AdminBundle/Resources/config/app/twig_hooks/product_option/update.yaml
@@ -51,6 +51,9 @@ sylius_twig_hooks:
code:
template: '@SyliusAdmin/product_option/form/sections/values/value/code.html.twig'
priority: 200
+ position:
+ template: '@SyliusAdmin/product_option/form/sections/values/value/position.html.twig'
+ priority: 150
translations:
template: '@SyliusAdmin/product_option/form/sections/values/value/translations.html.twig'
priority: 100
diff --git a/src/Sylius/Bundle/AdminBundle/templates/product_option/form/sections/values/value/position.html.twig b/src/Sylius/Bundle/AdminBundle/templates/product_option/form/sections/values/value/position.html.twig
new file mode 100644
index 0000000000..f6859af5ef
--- /dev/null
+++ b/src/Sylius/Bundle/AdminBundle/templates/product_option/form/sections/values/value/position.html.twig
@@ -0,0 +1,3 @@
+
+ {{ form_row(hookable_metadata.context.value_form.position, sylius_test_form_attribute('position')) }}
+
diff --git a/src/Sylius/Bundle/ApiBundle/Resources/config/api_platform/resources/admin/ProductOptionValue.xml b/src/Sylius/Bundle/ApiBundle/Resources/config/api_platform/resources/admin/ProductOptionValue.xml
index 7b8e4fed4b..919dd5a3a7 100644
--- a/src/Sylius/Bundle/ApiBundle/Resources/config/api_platform/resources/admin/ProductOptionValue.xml
+++ b/src/Sylius/Bundle/ApiBundle/Resources/config/api_platform/resources/admin/ProductOptionValue.xml
@@ -59,6 +59,9 @@
+
+ sylius_api.order_filter.admin.product_option_value
+
diff --git a/src/Sylius/Bundle/ApiBundle/Resources/config/serialization/ProductOptionValue.xml b/src/Sylius/Bundle/ApiBundle/Resources/config/serialization/ProductOptionValue.xml
index a62e884f09..8f5e7032c4 100644
--- a/src/Sylius/Bundle/ApiBundle/Resources/config/serialization/ProductOptionValue.xml
+++ b/src/Sylius/Bundle/ApiBundle/Resources/config/serialization/ProductOptionValue.xml
@@ -34,6 +34,14 @@
sylius:shop:product_option_value:index
sylius:shop:product_option_value:show
+
+ sylius:admin:product_option_value:index
+ sylius:admin:product_option_value:show
+ sylius:admin:product_option:index
+ sylius:admin:product_option:show
+ sylius:admin:product_option:create
+ sylius:admin:product_option:update
+
sylius:admin:product_option_value:show
sylius:admin:product_option:create
diff --git a/src/Sylius/Bundle/ApiBundle/Resources/config/services/admin/filters.xml b/src/Sylius/Bundle/ApiBundle/Resources/config/services/admin/filters.xml
index dd1fb1754a..fc6cc3e722 100644
--- a/src/Sylius/Bundle/ApiBundle/Resources/config/services/admin/filters.xml
+++ b/src/Sylius/Bundle/ApiBundle/Resources/config/services/admin/filters.xml
@@ -393,6 +393,13 @@
+
+
+
+
+
+
+
partial
diff --git a/src/Sylius/Bundle/CoreBundle/Migrations/Version20260623000000.php b/src/Sylius/Bundle/CoreBundle/Migrations/Version20260623000000.php
new file mode 100644
index 0000000000..d3607bb6f5
--- /dev/null
+++ b/src/Sylius/Bundle/CoreBundle/Migrations/Version20260623000000.php
@@ -0,0 +1,57 @@
+hasTable(self::TABLE_NAME)) {
+ return;
+ }
+
+ $table = $schema->getTable(self::TABLE_NAME);
+
+ if ($table->hasColumn('position')) {
+ return;
+ }
+
+ $this->addSql('ALTER TABLE ' . self::TABLE_NAME . ' ADD position INT NOT NULL DEFAULT 0');
+ }
+
+ public function down(Schema $schema): void
+ {
+ if (!$schema->hasTable(self::TABLE_NAME)) {
+ return;
+ }
+
+ $table = $schema->getTable(self::TABLE_NAME);
+
+ if (!$table->hasColumn('position')) {
+ return;
+ }
+
+ $this->addSql('ALTER TABLE ' . self::TABLE_NAME . ' DROP COLUMN position');
+ }
+}
diff --git a/src/Sylius/Bundle/CoreBundle/Migrations/Version20260623000001.php b/src/Sylius/Bundle/CoreBundle/Migrations/Version20260623000001.php
new file mode 100644
index 0000000000..b8f66be694
--- /dev/null
+++ b/src/Sylius/Bundle/CoreBundle/Migrations/Version20260623000001.php
@@ -0,0 +1,57 @@
+hasTable(self::TABLE_NAME)) {
+ return;
+ }
+
+ $table = $schema->getTable(self::TABLE_NAME);
+
+ if ($table->hasColumn('position')) {
+ return;
+ }
+
+ $this->addSql('ALTER TABLE ' . self::TABLE_NAME . ' ADD position INT NOT NULL DEFAULT 0');
+ }
+
+ public function down(Schema $schema): void
+ {
+ if (!$schema->hasTable(self::TABLE_NAME)) {
+ return;
+ }
+
+ $table = $schema->getTable(self::TABLE_NAME);
+
+ if (!$table->hasColumn('position')) {
+ return;
+ }
+
+ $this->addSql('ALTER TABLE ' . self::TABLE_NAME . ' DROP COLUMN position');
+ }
+}
diff --git a/src/Sylius/Bundle/ProductBundle/Form/Type/ProductOptionValueType.php b/src/Sylius/Bundle/ProductBundle/Form/Type/ProductOptionValueType.php
index df7d3db4ae..d112a5270c 100644
--- a/src/Sylius/Bundle/ProductBundle/Form/Type/ProductOptionValueType.php
+++ b/src/Sylius/Bundle/ProductBundle/Form/Type/ProductOptionValueType.php
@@ -16,6 +16,7 @@ namespace Sylius\Bundle\ProductBundle\Form\Type;
use Sylius\Bundle\ResourceBundle\Form\EventSubscriber\AddCodeFormSubscriber;
use Sylius\Bundle\ResourceBundle\Form\Type\AbstractResourceType;
use Sylius\Bundle\ResourceBundle\Form\Type\ResourceTranslationsType;
+use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\FormBuilderInterface;
final class ProductOptionValueType extends AbstractResourceType
@@ -27,6 +28,10 @@ final class ProductOptionValueType extends AbstractResourceType
'entry_type' => ProductOptionValueTranslationType::class,
'label' => 'sylius.form.option.name',
])
+ ->add('position', IntegerType::class, [
+ 'label' => 'sylius.form.option_value.position',
+ 'required' => false,
+ ])
->addEventSubscriber(new AddCodeFormSubscriber())
;
}
diff --git a/src/Sylius/Bundle/ProductBundle/Resources/config/doctrine/model/ProductOptionValue.orm.xml b/src/Sylius/Bundle/ProductBundle/Resources/config/doctrine/model/ProductOptionValue.orm.xml
index 1db0ced238..a95f6a7ece 100644
--- a/src/Sylius/Bundle/ProductBundle/Resources/config/doctrine/model/ProductOptionValue.orm.xml
+++ b/src/Sylius/Bundle/ProductBundle/Resources/config/doctrine/model/ProductOptionValue.orm.xml
@@ -20,6 +20,8 @@
+
+
diff --git a/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.en.yml b/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.en.yml
index 1cc05f9773..4759a37471 100644
--- a/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.en.yml
+++ b/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.en.yml
@@ -29,3 +29,4 @@ sylius:
option_value:
add_value: Add value
value: Value
+ position: Position
diff --git a/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.en_GB.yml b/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.en_GB.yml
index b22d0cb796..e7dd515441 100644
--- a/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.en_GB.yml
+++ b/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.en_GB.yml
@@ -26,3 +26,4 @@ sylius:
option_value:
add_value: Add value
value: Value
+ position: Position
diff --git a/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.fr.yml b/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.fr.yml
index c384935793..c45282154c 100644
--- a/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.fr.yml
+++ b/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.fr.yml
@@ -29,3 +29,4 @@ sylius:
option_value:
add_value: Ajouter une valeur
value: Valeur
+ position: Emplacement
diff --git a/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.fr_BE.yml b/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.fr_BE.yml
index c384935793..c45282154c 100644
--- a/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.fr_BE.yml
+++ b/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.fr_BE.yml
@@ -29,3 +29,4 @@ sylius:
option_value:
add_value: Ajouter une valeur
value: Valeur
+ position: Emplacement
diff --git a/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.fr_CA.yml b/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.fr_CA.yml
index afc1f5de99..14c151a044 100644
--- a/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.fr_CA.yml
+++ b/src/Sylius/Bundle/ProductBundle/Resources/translations/messages.fr_CA.yml
@@ -29,3 +29,4 @@ sylius:
option_value:
add_value: Ajouter une valeur
value: Valeur
+ position: Emplacement
diff --git a/src/Sylius/Component/Product/Model/ProductOptionValue.php b/src/Sylius/Component/Product/Model/ProductOptionValue.php
index dd044bfdaa..4b82a8d993 100644
--- a/src/Sylius/Component/Product/Model/ProductOptionValue.php
+++ b/src/Sylius/Component/Product/Model/ProductOptionValue.php
@@ -32,6 +32,9 @@ class ProductOptionValue implements ProductOptionValueInterface, \Stringable
/** @var ProductOptionInterface|null */
protected $option;
+ /** @var int|null */
+ protected $position;
+
public function __construct()
{
$this->initializeTranslationCollection();
@@ -67,6 +70,16 @@ class ProductOptionValue implements ProductOptionValueInterface, \Stringable
$this->option = $option;
}
+ public function getPosition(): ?int
+ {
+ return $this->position;
+ }
+
+ public function setPosition(?int $position): void
+ {
+ $this->position = $position;
+ }
+
public function getValue(): ?string
{
return $this->getTranslation()->getValue();
diff --git a/src/Sylius/Component/Product/Model/ProductOptionValueInterface.php b/src/Sylius/Component/Product/Model/ProductOptionValueInterface.php
index a00abd17cc..addf83f5a7 100644
--- a/src/Sylius/Component/Product/Model/ProductOptionValueInterface.php
+++ b/src/Sylius/Component/Product/Model/ProductOptionValueInterface.php
@@ -32,6 +32,10 @@ interface ProductOptionValueInterface extends ResourceInterface, CodeAwareInterf
public function getName(): ?string;
+ public function getPosition(): ?int;
+
+ public function setPosition(?int $position): void;
+
/**
* @return ProductOptionValueTranslationInterface
*/