Допустим, есть entity Product, к которому привязаны ProductCharacteristic. В Sonata Admin последние вводятся / вводятся при помощи Sonata\Form\Type\CollectionType. Выглядит это примерно так:
А в коде так:
$formMapper
->add('characteristics', CollectionType::class, [
'label' => 'Характеристики',
'required' => false,
'type_options' => [
'delete' => true,
],
], [
'edit' => 'inline',
'inline' => 'table',
'sortable' => 'position',
])
;
Обратите внимание на ‘sortable’ => ‘position’. Это поле, в которое записывается порядок вывода.
И «из коробки» эта конструкция ПОЧТИ работает. То есть мышью все таскается, но при сохранении возвращается на исходную позицию.
class ProductCharacteristic
{
...
/**
* @ORM\Column(type="integer")
*/
private $position = 0;
...
}
class Product
{
...
/**
* @ORM\OneToMany(targetEntity="App\Entity\ProductCharacteristic", mappedBy="product", cascade={"persist", "remove"})
* @ORM\OrderBy({"position" = "ASC"})
*/
private $characteristics;
...
}
final class ProductCharacteristicAdmin extends AbstractAdmin
{
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
...
->add('position', HiddenType::class, [
'label' => 'Порядок',
])
...
}
}