在管理员中预先填写创建表单 class
Pre-filled create form in admin class
我有两个实体 Crawler
和 Customer
。 Crawler
包含从远程 URL 解析的条目,Customer
包含从 Crawler
数据手动创建的条目。
我分别创建了一个 CrawlerAdmin
和一个 CustomerAdmin
。现在,为了创建一个新的 Customer
条目,我希望在 CrawlerAdmin
列表视图中进行自定义操作,例如 "Create Customer"。通过单击该按钮,CustomerAdmin
创建视图应该会显示,其中的字段预先填充了所选 Crawler
条目的值。
我怎样才能产生这种结果?
编辑:
作为一种可能的替代方法,我在自定义 CRUDController 中创建了一个 "clone" 函数。它获取 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" }
如果您需要更多信息,请发表评论。
提前谢谢大家!
所以,在你的 link 中创建一个新的 child,只需传递一个带有 parent id 的 url 参数,之后,在你的 Child 管理员,只需获取此参数并设置新的 object 即可。示例: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);
}
....
}
我有两个实体 Crawler
和 Customer
。 Crawler
包含从远程 URL 解析的条目,Customer
包含从 Crawler
数据手动创建的条目。
我分别创建了一个 CrawlerAdmin
和一个 CustomerAdmin
。现在,为了创建一个新的 Customer
条目,我希望在 CrawlerAdmin
列表视图中进行自定义操作,例如 "Create Customer"。通过单击该按钮,CustomerAdmin
创建视图应该会显示,其中的字段预先填充了所选 Crawler
条目的值。
我怎样才能产生这种结果?
编辑:
作为一种可能的替代方法,我在自定义 CRUDController 中创建了一个 "clone" 函数。它获取 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" }
如果您需要更多信息,请发表评论。
提前谢谢大家!
所以,在你的 link 中创建一个新的 child,只需传递一个带有 parent id 的 url 参数,之后,在你的 Child 管理员,只需获取此参数并设置新的 object 即可。示例: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);
}
....
}