Клонирование элементов
Используйте
$new = Pimcore\Model\Element\Service::cloneMe($source)
чтобы получить безопасную копию исходного элемента (для любого объекта, реализующего ElementInterface). Обратите внимание, что это не обновит внутренние ссылки. Например: Связь внутри исходного элемента, указывающая на сам исходный элемент, в копии по-прежнему будет ссылаться на исходный элемент.
Если вам нужна персистентная копия, используйте метод copyAsChild соответствующего сервиса.
E.g.
$user = \Pimcore\Model\User::getById(123);
$assetService = new \Pimcore\Model\Asset\Service($user);
$assetService->copyAsChild($target, $source);
$documentService = new \Pimcore\Model\Document\Service($user);
$documentService->copyAsChild($target, $source); // доступны дополнительные аргументы для наследования и др.
$objectService = new \Pimcore\Model\DataObject\Service($user);
$objectService->copyAsChild($target, $source);
Здесь $source— исходный элемент, а $target — родительский элемент, в который будет помещена новая копия.
Метод copyAsChild также создаст уникальный ключ элемента (или имя файла для элементов типа asset).
Если нужно также обновить ссылки/референсы в копии, есть вспомогательный метод, который выполняет это за вас.
Вызовите метод rewriteIds соответствующего сервиса и передайте конфигурацию маппера.
Пример:
$rewriteConfig = array(
"object" => array(
176 => 190
)
);
$object = DataObject\Service::rewriteIds($object, $rewriteConfig);
В этом примере в копии все ссылки, указывавшие на объект с ID 176, будут заменены ссылками на объект с ID 190.
Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.