我已经为奏鸣曲页面创建了一个块,其中包括标题,文本,图像(来自奏鸣曲媒体(,并应包括指向网站另一页的链接。
考虑到该网站是双语的(包括URL(,我无法在管理员中使用用户类型。最好的选择可能是在网站上显示所有活动页面的下拉列表,但我没有设法这样做。
在Sonata页面管理中,创建(或编辑(页面时,实际上有这样的列表,即"目标"字段。因此,我挖了一点,找到了使用称为getChoices((函数的PagesEletortype,该函数可以解决问题。但是,我没有在块的管理员中使用该功能(或该字段(。
到目前为止,这是我的块形式:
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: ApplicationSonataPageBundleBlockTextWithLinkBlockService
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等...(