Sonata Admin:获取所有页面的下拉列表

时间:2017-05-31 09:33:10

标签: symfony sonata-admin sonata

我为奏鸣曲页面创建了一个块,其中包含标题,文本,图像(来自奏鸣曲媒体),并且应包含指向该网站上其他页面的链接。

考虑到网站将是双语(包括URL),我不能让用户在管理员中键入链接。最好的选择可能是拥有网站上所有活动页面的下拉列表,但我没有设法做到。

在奏鸣曲页面管理员中,当您创建(或编辑)页面时,实际上存在这样的列表,即“目的地”字段。所以我挖了一点,发现了PageSelectorType,它使用了一个名为getChoices()的函数来完成这个工作。但是我没有设法在我的块的管理员中使用该功能(或那个字段)。

到目前为止,这是我的阻止形式:

public function buildEditForm(FormMapper $formMapper, BlockInterface $block)
{
    $formMapper
        ->add('settings', 'sonata_type_immutable_array', array(
            'keys' => array(
                array('title', 'text', array('required' => false)),
                array('texte', 'text', array('required' => false)),
                array($this->getMediaBuilder($formMapper), null, array('context' => 'media_accueil')),
            )
        ))
    ;
}

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

知道了,可能有一个更好(更清洁)的解决方案,但至少它有效。这里 是步骤:

在services.yml中,将页面管理器服务添加为参数:

sonata.block.service.text_with_link:
    class: Application\Sonata\PageBundle\Block\TextWithLinkBlockService
    arguments:
        - sonata.block.service.text_with_link
        - "@templating"
        - @sonata.page.manager.page
    tags:
        - { name: sonata.block }

在你的BlockService php文件中,添加__construct方法,如下所示初始化页面管理器:

class TexteTitreBlockService extends BaseBlockService
{
    /**
     * @var PageManagerInterface
     */
    protected $pageManager;

    /**
     * @param string               $name
     * @param EngineInterface      $templating
     * @param PageManagerInterface $pageManager
     */
    public function __construct($name, EngineInterface $templating, PageManagerInterface $pageManager)
    {
        parent::__construct($name, $templating);

        $this->pageManager = $pageManager;
    }
}

然后您需要做的就是获取页面列表:

$pageList = $this->pageManager->findBy(array(
    'routeName' => Page::PAGE_ROUTE_CMS_NAME,
));

然后你可以使用该变量的内容在ChoiceType :: class中使用(对你有用的东西,页面名称,页面slug等等)。

相关问题