在Sonata管理包中使用标签



我有几个实体在SonataAdminBundle(问题,文章,新闻),我想连接标签。对于每个实体,我通过与标签实体的多对多关系来实现它。但为此需要创建几个中间连接表,这很不方便。

我发现了一个bundle FPNTagBundle,它允许使用额外的ResourceType字段指定连接表。这正是我所需要的,我在另一个项目中做过同样的事情。

但是FPNTagBundle通过单独的TagManager建立通信,并且在SonataAdmin中不起作用。

你有什么建议吗?如何实现这个任务?

也许不用担心,留下几个单独的连接表?然而,我仍然会对其他六个实体进行标记…而且我担心在所有带标签的实体中按标签搜索将很难做到——它将跨多个表运行。

解决方法在保存钩子。

/**
 * @return FPNTagBundleEntityTagManager
 */
protected function getTagManager() {
    return $this->getConfigurationPool()->getContainer()
        ->get('fpn_tag.tag_manager');
}
public function postPersist($object) {
    $this->getTagManager()->saveTagging($object);
}
public function postUpdate($object) {
    $this->getTagManager()->saveTagging($object);
}
public function preRemove($object) {
    $this->getTagManager()->deleteTagging($object);
    $this->getDoctrine()->getManager()->flush();
}

My Admin class:

protected function configureFormFields(FormMapper $formMapper)
{
    $tags = $this->hasSubject()
        ? $this->getTagManager()->loadTagging($this->getSubject())
        : array();
    $formMapper
        // other fields
        ->add('tags', 'entity', array('class'=>'AppBundle:Tag', 'choices' => $tags, 'multiple' => true, 'attr'=>array('style'=>'width: 100%;')))
    ;
}

和一个已知的bug在SonataAdminBundle -当执行批量删除(在列表视图)钩子preRemove/postRemove不运行。我们需要扩展标准CRUD控制器:

namespace AppAppBundleController;
use SonataAdminBundleControllerCRUDController as Controller;
use SymfonyComponentHttpFoundationRedirectResponse;
use SonataAdminBundleDatagridProxyQueryInterface;
class CRUDController extends Controller
{
    public function batchActionDelete(ProxyQueryInterface $query)
    {
        if (method_exists($this->admin, 'preRemove')) {
            foreach ($query->getQuery()->iterate() as $object) {                
                $this->admin->preRemove($object[0]);
            }
        }
        $response = parent::batchActionDelete($query);
        if (method_exists($this->admin, 'postRemove')) {
            foreach ($query->getQuery()->iterate() as $object) {                
                $this->admin->postRemove($object[0]);
            }
        }
        return $response;
    }
}

相关内容

  • 没有找到相关文章

最新更新