【问题标题】:Sonata Admin : get dropdown list of all pagesSonata Admin:获取所有页面的下拉列表
【发布时间】:2017-11-01 00:51:53
【问题描述】:

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

考虑到该网站将是双语的(包括 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')),
            )
        ))
    ;
}

有什么想法吗?

【问题讨论】:

    标签: symfony sonata-admin sonata


    【解决方案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 等...)

    【讨论】:

      猜你喜欢
      • 2018-05-29
      • 2012-10-28
      • 2018-07-22
      • 2016-12-18
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      相关资源
      最近更新 更多