2014-01-13 41 views
6

我想從數據庫中的表中檢索城市名稱,並將它們作爲選項放置在'layout.html.twig'中定義的選擇輸入(組合框)中, 。我的所有視圖都擴展了'layout.html.twig',那麼我怎樣才能訪問每個頁面中的城市名稱?symfony2 - 如何在每個頁面全局檢索數據庫中的數據

[解決方法]

我不能對我的話題進行了迴應,我並沒有太多的聲譽,所以我修改我的話題

我已經找到了解決方案,使用"embedding controllers"

  • 首先我創建了一個動作中檢索所有的城市名稱:

    public function listCitiesAction(){ 
    // retreiving cities 
    $entities = $this->getDoctrine()->getRepository("MedAdBundle:City")->findAll(); 
    
    return $this->render('MedAdBundle:Ville:list_cities.html.twig', 
        array('entities' => $entities)); 
    
    } 
    
  • 這個動作渲染list_cities.html.twig定義爲:

    <select class="form-control"> 
    {% for entity in entities %} 
    <option>{{ entity.name}}</option> 
    {% endfor %} 
    </select> 
    
  • finnaly編輯我layout.html.twig

    <div> 
    {{ render(controller('MedAdBundle:City:listCities'))}} 
    </div> 
    

這樣我可以訪問到城市中的組合框我的應用程序中的每一頁;)

+0

您可以使用全局樹枝變量http://symfony.com/doc/current/cookbook/templating/global_variables。相反,你應該在你的窗體中使用自動完成,例如參見:http://stackoverflow.com/questions/11962613/how-to-add-an-autocomplete-field-in-a-symfony2-form-for-a-收集和使用p – dbrumann

回答

1

我會去這些步驟:

  • 寫託管配置與城市臺
  • 工作一個symfony的實體領域的形式定義這種形式作爲DIC
  • 定義一個樹枝延伸暴露的函數輸出HTML表單
  • 使用的服務由所有其他模板擴展的layout.html.twig中的樹枝函數

作爲一種優化,我會看看如何用一些緩存系統來連接Doctrine(例如memcached)以避免在每個頁面加載時觸擊數據庫。

在這裏您可以找到有關實體領域的文檔:http://symfony.com/doc/current/reference/forms/types/entity.html

使用的Symfony文檔以瞭解如何定義形式的服務,以及如何編寫自己的樹枝延伸。

10

另一個好方法是使用render

這可以讓你調用一個控制器出你layout.html.twig

{{ render(controller("AcmeDemoBundle:Helper:citySelector")) }} 

,你也可以緩存的輸出與ESI

+0

夥計這是偉大的。我不知道這一點。沒有服務,每個控制器上都沒有代碼重複。太好了。 – pregmatch

+0

這不會造成性能問題嗎?渲染2個動作? – Sparkup

+0

@Sparkup爲什麼如果你有脂肪吹控制器肯定..另一方面的好處是,你可以使用緩存(ESI)或HINClude(片段的JavaScript異步加載)http://symfony.com/doc/current /book/http_cache.html#using-esi-in-symfony2 – Flask

相關問題