Sonata Admin :获取所有页面的下拉列表
Sonata Admin : get dropdown list of all pages
我为 sonata 页面创建了一个块,其中包含标题、文本、图像(来自 sonata media)并且应该包含 link 到网站上的另一个页面。
考虑到该网站将是双语的(包括 URL),我不能让用户在管理员中输入 link。最好的选择可能是网站上所有活动页面的下拉列表,但我没能做到。
在奏鸣曲页面管理中,当你创建(或编辑)一个页面时,实际上有这样一个列表,即"Destination"字段。所以我稍微研究了一下,发现 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')),
)
))
;
}
有什么想法吗?
知道了,可能有更好(更清洁)的解决方案,但至少它有效。这里
步骤是:
在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 等...)
我为 sonata 页面创建了一个块,其中包含标题、文本、图像(来自 sonata media)并且应该包含 link 到网站上的另一个页面。
考虑到该网站将是双语的(包括 URL),我不能让用户在管理员中输入 link。最好的选择可能是网站上所有活动页面的下拉列表,但我没能做到。
在奏鸣曲页面管理中,当你创建(或编辑)一个页面时,实际上有这样一个列表,即"Destination"字段。所以我稍微研究了一下,发现 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')),
)
))
;
}
有什么想法吗?
知道了,可能有更好(更清洁)的解决方案,但至少它有效。这里 步骤是:
在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 等...)