使用 sonata admin bundle 将列表视图嵌入到 formview

Embbed listview to formview with sonata admin bundle

将 Sonata Admin 实体的数据网格列表嵌入到另一个实体 EditForm 的最佳方法是什么?

我在文档中找不到流程。

感谢您的帮助

以下是我如何使用 sonataBlockBundle 显示电子邮件列表:

阻止服务class:

namespace Librinfo\EmailBundle\Block;

use Doctrine\ORM\EntityManager;
use Librinfo\EmailBundle\Entity\Email;
use Sonata\BlockBundle\Block\BlockContextInterface;
use Sonata\BlockBundle\Block\Service\TextBlockService;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\HttpFoundation\Response;

class EmailsListBlock extends TextBlockService
{
    /**
     * @var EntityManager
     */
    protected $manager;

    /**
     * @param EntityManager $manager
     */
    public function setManager(EntityManager $manager) {
        $this->manager = $manager;
    }

    /**
     * {@inheritdoc}
     */
    public function execute(BlockContextInterface $blockContext, Response $response = null)
    {
        $settings = $blockContext->getSettings();
        $targetEntity = $settings['target_entity'];
        $maxResults = $settings['max_results'];
        $emails = $this->getEmails($targetEntity, $maxResults);

        return $this->renderResponse($blockContext->getTemplate(), array(
            'block' => $blockContext->getBlock(),
            'settings' => $settings,
            'emails' => $emails,
        ), $response);
    }

    /**
     * {@inheritdoc}
     */
    public function configureSettings(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'content' => 'Insert your custom content here',
            'template' => 'LibrinfoEmailBundle:Block:block_emails_list.html.twig',
            'target_entity' => null,
            'max_results' => 20,
        ));
    }

    /**
     * @param object $targetEntity
     * @param int $maxResults
     * @return array
     * @throws \Exception
     */
    private function getEmails($targetEntity, $maxResults)
    {
        if (!$targetEntity || !is_object($targetEntity))
            return [];
        $rc = new \ReflectionClass($targetEntity);
        if (!$rc->hasProperty('emailMessages'))
            return [];

        $repo = $this->manager->getRepository($rc->getName());
        if (method_exists($repo, 'getEmailMessagesQueryBuilder')) {
            $qb = $repo->getEmailMessagesQueryBuilder($targetEntity->getId());
        }
        else {
            $repo = $this->manager->getRepository(Email::class);
            $targets = strtolower($rc->getShortName()) . 's'; // ex. contacts
            $qb = $repo->createQueryBuilder('e')
                ->leftJoin('e.'.$targets, 't')
                ->where('t.id = :targetid')
                ->setParameter('targetid', $targetEntity->getId())
            ;
        }
        $qb->orderBy('e.updatedAt', 'desc')
            ->setMaxResults($maxResults);

        return $qb->getQuery()->getResult();
    }


}

服务定义:

librinfo.email.block.emails_list:
        class: Librinfo\EmailBundle\Block\EmailsListBlock
        arguments:
            - librinfo.email.block.emails_list
            - '@templating'
        calls:
            - [setManager, [@doctrine.orm.entity_manager]]
        tags: [{ name: sonata.block }]

和模板(缩写)

{% extends sonata_block.templates.block_base %}

{% block block %}
    <table class="table table-bordered table-striped sonata-ba-list emails-history">
        <thead>
            <tr>
                <th>Expéditeur</th>
                <th>Destinataires</th>
                <th>Objet</th>
                <th>Envoyé</th>
                <th>Date</th>
                <th>Actions</th>
            </tr>
        </thead>
        <tbody>
            {% for email in emails %}
                <tr data-email-id="{{ email.id }}">
then use it like this in your edit template: 

    {{ sonata_block_render({'type': 'librinfo.email.block.emails_list'}, {'target_entity': object}) }}

转到所需的列表。 从浏览器复制 url:

现在 jQuery :

$.get(url_you_just_copied, function(result){
   console.log(result);
};

查看您从 listAction 调用返回的内容并相应地调整请求参数(过滤器,...)以获得您想要的列表。

接下来要获得一个干净的解决方案,您需要使用 twig 助手生成 url: