奏鸣曲管理员表格集合

时间:2012-11-06 14:41:06

标签: symfony symfony-2.1 sonata-admin

如何使用“ sonata_type_collection ”类型限制嵌入表单的数量?

$formMapper->add('phones', 'sonata_type_collection',
                        array(
                            'required' => true,
                            'by_reference' => false,
                            'label' => 'Phones',
                            ),
                        array(
                            'edit' => 'inline',
                            'inline' => 'table'
                            )

我想限制到最后五部手机,我现在只找到这个解决方案,限制模板枝条中的显示“ edit_orm_one_to_many ”,但我不喜欢。

1 个答案:

答案 0 :(得分:1)

我通过重写控制器中的编辑操作找到了解决方案, 在文档sonataAdminBundle中我创建了我的管理控制器类:

class ContactAdminController extends Controller
{

    public function editAction($id = null)
    {
        // the key used to lookup the template
        $templateKey = 'edit';

        $em = $this->getDoctrine()->getEntityManager();
        $id = $this->get('request')->get($this->admin->getIdParameter());

        // $object = $this->admin->getObject($id);
        // My custom method to reduce the queries number
        $object = $em->getRepository('GestionBundle:Contact')->findOneAllJoin($id);

        if (!$object)
        {
            throw new NotFoundHttpException(sprintf('unable to find the object with id : %s', $id));
        }

        if (false === $this->admin->isGranted('EDIT', $object))
        {
            throw new AccessDeniedException();
        }

        $this->admin->setSubject($object);

        /** @var $form \Symfony\Component\Form\Form */
        $form = $this->admin->getForm();
        $form->setData($object);

        // Trick is here ###############################################
        // Method to find the X last phones for this Contact (x = limit)
        // And set the data in form
        $phones = $em->getRepository('GestionBundle:Phone')->findLastByContact($object, 5);
        $form['phones']->setData($phones);
        // #############################################################

        if ($this->get('request')->getMethod() == 'POST')
        {
            $form->bindRequest($this->get('request'));

            $isFormValid = $form->isValid();

            // persist if the form was valid and if in preview mode the preview was approved
            if ($isFormValid && (!$this->isInPreviewMode() || $this->isPreviewApproved()))
            {
                $this->admin->update($object);
                $this->get('session')->setFlash('sonata_flash_success', 'flash_edit_success');

                if ($this->isXmlHttpRequest())
                {
                    return $this->renderJson(array(
                        'result'    => 'ok',
                        'objectId'  => $this->admin->getNormalizedIdentifier($object)
                    ));
                }

                // redirect to edit mode
                return $this->redirectTo($object);
            }

            // show an error message if the form failed validation
            if (!$isFormValid)
            {
                $this->get('session')->setFlash('sonata_flash_error', 'flash_edit_error');
            }
            elseif ($this->isPreviewRequested())
            {
                // enable the preview template if the form was valid and preview was requested
                $templateKey = 'preview';
            }
        }

        $view = $form->createView();

        // set the theme for the current Admin Form
        $this->get('twig')->getExtension('form')->renderer->setTheme($view, $this->admin->getFormTheme());

        return $this->render($this->admin->getTemplate($templateKey), array(
            'action' => 'edit',
            'form'   => $view,
            'object' => $object,
        ));
    }
}