3

LogEntryエンティティ( Loggable Behavioralから)を管理し、エンティティの復帰を処理して、管理者が一部のエンティティを古いバージョンに復元できるようにするための特別なフォームを作成したいと思います。

次のFormTypeを試して、その特定のLogEntryに割り当てられたエンティティのバージョンのリストを含むフォームを生成しました。

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

use Gedmo\Loggable\Entity\Repository\LogEntryRepository as EntityRepository;

class LogItemVersionsType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // In that point, I would need the entity assigned to that specific LogEntry to be able to load the diferent versions
        $entity = $builder->getData();
        //var_dump($data);
        $builder
            ->add('version', 'entity', array(
                'class' => 'Gedmo\Loggable\Entity\LogEntry',
                'property' => 'version',
                'query_builder' => function(EntityRepository $er) {
                    return $er->getLogEntriesQuery($entity);
                },
            ))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Gedmo\Loggable\Entity\LogEntry'
        ));
    }

    public function getName()
    {
        return 'zashost_zaspanelbundle_logitemversionstype';
    }
}

しかし、私には次の疑問があります。

  • LogEntryには、ログに記録されたオブジェクトを取得するメソッドがありません。LogEntryを継承するミドルクラスを作成して、そのメソッドを追加する必要がありますか?LogEntryに割り当てられたエンティティは可変であることに注意してください。そのため、そのメソッドをLogEntryエンティティクラスに配置する必要がありますか?
4

1 に答える 1

4

それが誰かを助けることができるならば、私が最終的にしたこと:

フォームタイプでは、エンティティを__constructメソッドのパラメーターとしてロールバックするように設定しました。これにより、この特定のオブジェクトがフォームを構築するために必要なバージョンを取得できます。

class LogItemVersionsType extends AbstractType
{
    protected $entity;

    public function __construct($entity = null)
    {
        $this->entity = $entity;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $entity = $this->entity;
        $builder
            ->add('version', 'entity', array(
                'mapped' => false,
                'class' => 'Gedmo\Loggable\Entity\LogEntry',
                'property' => 'version',
                'query_builder' => function(EntityRepository $er) use ($entity) {
                    return $er->createQueryBuilder('le')->where('le.objectId = ?1')->setParameter('1', $entity->getId());
                },
            ))
        ;
    }
}

コントローラで、関連付けられたエンティティを取得してから、FormTypeコンストラクタに渡します。その後、updateActionで、オブジェクトとバージョンを取得して、revertメソッドに渡します。

/**
 * LogItem controller.
 *
 */
class LogItemController extends Controller
{
    /**
     * Finds and displays a LogItem entity versions form.
     *
     */
    public function versionsAction($id)
    {
        $em = $this->getDoctrine()->getManager();

        $entity = $em->getRepository('GedmoLoggable:LogEntry')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find HttpdHost entity.');
        }

        $loggedobject = $em->getRepository($entity->getObjectClass())->find($entity->getObjectId());

        $editForm = $this->createForm(new LogItemVersionsType($loggedobject), $entity);

        return $this->render('ZashostZaspanelBundle:LogItem:versions.html.twig', array(
            'entity'      => $entity,
            'edit_form'   => $editForm->createView(),
        ));

    }

    /**
     * Edits an existing LogItem entity.
     *
     */
    public function updateAction(Request $request, $id)
    {
        $em = $this->getDoctrine()->getManager();

        $entity = $em->getRepository('GedmoLoggable:LogEntry')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find LogItem entity.');
        }

        $refobjrepo = $em->getRepository($entity->getObjectClass());

        $refobject = $refobjrepo->find($entity->getObjectId());

        $editForm = $this->createForm(new LogItemVersionsType($refobject), $entity);
        $editForm->bind($request);

        if ($editForm->isValid()) {
            $repo = $em->getRepository('GedmoLoggable:LogEntry');
            $values = $request->request->get('zashost_zaspanelbundle_logitemversionstype');

            $version = intval($values['version']);

            $repo->revert($refobject , $version);

            $em->persist($refobject);
            $em->flush();

            return $this->redirect($this->generateUrl('logs'));
        }

        return $this->render('ZashostZaspanelBundle:LogItem:versions.html.twig', array(
            'entity'      => $entity,
            'edit_form'   => $editForm->createView(),
        ));
    }


}
于 2013-02-10T17:50:16.237 に答える