我有两个实体Crawler
和Customer
。 Crawler
包含从远程URL解析的条目,Customer
包含来自Crawler
数据的手动创建的条目。
我分别创建了CrawlerAdmin
和CustomerAdmin
。现在,为了创建新的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" }
如果您需要更多信息,请发表评论。
提前谢谢大家!
答案 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);
}
....
}