在管理类中预填充创建表单

时间:2017-11-21 13:22:30

标签: php symfony sonata-admin

我有两个实体CrawlerCustomerCrawler包含从远程URL解析的条目,Customer包含来自Crawler数据的手动创建的条目。

我分别创建了CrawlerAdminCustomerAdmin。现在,为了创建新的Customer条目,我希望在CrawlerAdmin列表视图中进行自定义操作,例如"创建客户"。通过单击按钮,应显示CustomerAdmin创建视图,其中字段预先填充了所选Crawler条目的值。

我该如何产生这种结果?

编辑: 作为一种可能的替代方案,我创建了一个"克隆"自定义CRUDController中的函数。它需要Crawler条目,并根据它自动创建一个新的Customer条目。然后,只需要重定向到编辑新创建的Customer条目的视图。

如何使用新创建的条目的ID将自定义控制器重定向到CustomerAdmin编辑视图?

这是控制器:

<?php
// src/CrawlerBundle/Controller/CRUDController.php

namespace CrawlerBundle\Controller;

use FrontendBundle\Entity\Customer;
use Sonata\AdminBundle\Controller\CRUDController as Controller;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class CRUDController extends Controller
{
    /**
     * @param $id
     * @return RedirectResponse
     */
    public function cloneAction($id)
    {
        $object = $this->admin->getSubject();

        if (!$object) {
            throw new NotFoundHttpException'unable to find object');
        }

        $newObject = new Customer();
        $newObject->setCompanyName($object->getCompanyName().' (Clone)');
        $newObject->setRegisterNumber($object->getRegisterNumber().' (Clone)');
        $newObject->setFields(array()); // ignore this

        $this->admin->create($newObject);

        $this->addFlash('sonata_flash_success', 'Cloned successfully');

        // return new RedirectResponse($this->admin->generateUrl('list'));

        // if you have a filtered list and want to keep your filters after the redirect
        return new RedirectResponse($this->admin->generateUrl('list', array('filter' => $this->admin->getFilterParameters())));
        // just redirects to the class list view
    }
}

我的服务定义:

crawler.admin.crawler:
    class: CrawlerBundle\Admin\CrawlerAdmin
    arguments: [~, CrawlerBundle\Entity\Crawler, CrawlerBundle:CRUD]
    tags:
         - { name: sonata.admin, manager_type: orm, group: admin, label: Crawler, pager_type: "simple" }

如果您需要更多信息,请发表评论。

提前谢谢大家!

1 个答案:

答案 0 :(得分:0)

因此,在创建新子项的链接中,只需传递一个带有父ID的url参数,之后在您的Child Admin中,只需获取此参数并设置新对象。例子:configureFormFields函数:

protected function configureFormFields(FormMapper $formMapper)
{
    $object = $formMapper->getFormBuilder()->getData();
    $parentId = $this->getRequest()->get('objectId');

    if (null === $object || null === $object->getParentDocument()) {
        $object = new ChildEntity();
        $parentDoc = $this->getParentAdmin()->getObject($parentId);
        if (null !== $parentDoc) {
            $object->setParentDocument($parentDoc);
        }
        $formMapper->getFormBuilder()->setData($object);
    }

    ....
}