2017-05-31 64 views
1

我已經創建了一個包含標題,文本,圖像(來自奏鳴曲媒體)的奏鳴曲頁面的塊,並且應該包含到該網站上另一個頁面的鏈接。索納塔管理員:獲取所有頁面的下拉列表

考慮到網站會是雙語(包括網址),我不能讓用戶在管理員中鍵入鏈接。最好的選擇可能是在網站上有所有活動頁面的下拉列表,但我沒有設法做到這一點。

在奏鳴曲頁面admin中,當您創建(或編輯)一個頁面時,實際上有這樣一個列表,即「目標」字段。所以我挖了一點,找到了使用名爲getChoices()的函數的PageSelectorType,它可以做到這一點。但是,我沒有設法在我的塊的管理員中使用該功能(或該字段)。

這裏是我的塊的形式至今:

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

明白了,可能會有更好的(更清潔)的解決方案,但至少它的工作原理。這裏 步驟如下:

在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中使用(無論對你有用,頁面名稱,頁面中斷等等)。