2010-02-25 82 views
2

我有一個組件,一直在愉快地構建和呈現菜單一段時間。現在我必須提供一個共享所有相同邏輯的特殊情況,但需要在已存在的情況下進行一些工作。我想要做的是創建一個新的組件動作,它將執行必要的預處理,通過共享邏輯來完成計算側,然後通過現有模板部分渲染(當所有事情都說完之後,它仍然是一個像任何其他 - 它只需要更多的工作來構建它)。Symfony:在兩個組件動作之間共享部分

不幸的是,我找不到任何這樣做的方式。

這裏是高層次的文件/代碼崩潰,我現在所擁有的:

# 
# navigation/actions/components.class.php 
# 
public function executeMenu() { 
    /** 
    * This method runs most of the menus and does most of the work 
    * that's required of the special case. 
    * 
    * Once complete, of course, it renders through navigation/templates/_menu.php 
    */ 
} 

public function executeSpecialMenu() { 
    /** 
    * Do some preparatory work and delegate to executeMenu() 
    * to finish up and render the menu. I'd like this action 
    * to render through the _menu.php partial as well. 
    */ 
} 

# 
# templates/layout.php 
# 
<?php include_component('navigation', 'menu', array('menu' => 'Entity Type')) ?> 

/** SNIP */ 

<?php include_component('navigation', 'SpecialMenu') ?> 

任何輸入將不勝感激。

回答

3

一個簡單的,如果不能以最佳方式將是創建_SpecialMenu.php部分,只是放置一個包括裏面:

<?php include_partial('navigation/menu', array('menu' => 'Entity Type', 'other_var' => $other_var) ?> 

其中每個變量都需要被傳遞到部分作爲$ other_var。這至少能解決問題嗎?

+1

解決了功能級別的問題,這是我最初實施的解決方案。對我來說,這感覺真的很火,所以我希望那裏有更多的手術方案。不過,我確實選擇了一個直接的'include()',這樣變量就可以運行了,而且每次添加/刪除變量時,我都不必更改2個文件。 – 2010-02-25 15:04:29

+0

是的,'sfComponents'沒有提供一個簡單的方法來實現這個功能,所以你堅持使用你的'include()',這是最簡單也是最有前途的方法。 – 2010-02-25 15:25:04

0

在動作/模板模式中,存在$ this-> setTemplate('xxx')方法(在動作類中),它可以針對不同的動作使用相同的模板。 (例如新的或編輯操作的相同模板)。在組件類中是否會有這樣的方法?

1

另外存在的RenderPartial(「XXX」)在操作類時,需要它來生成的情況下,如的XmlHttpRequest•不用模板的一部分,這是有用的方法:

if ($request->isXmlHttpRequest()) 
{ 
    return $this->renderPartial('module/action', array('param' => 'value')); 
} 

我沒有測試這是否適用於組件執行方法。如果這不起作用,向symfony sfComponent類添加這樣的功能是個好主意。

2

一個更優雅的解決方案是使用get_partial的「第二」組件的執行函數裏,像這樣:

public function executeSpecialMenu() { 
    //forces SpecialMenu to render _menu.php 
    echo get_partial('menu', $this->varHolder->getAll()); 

    return sfView::NONE; 
} 

到varHolder-> GETALL呼叫被所有人都將被傳遞給變量「正常」的部分,因爲get_partial要求。

或者,作爲一種新的方法:

public function executeSpecialMenu() { 
    return $this->renderAlternatePartial('menu'); 
} 

protected function renderAlternatePartial($partial) { 
    echo get_partial($partial, $this->varHolder->getAll()); 
    return sfView::NONE; 
} 
0

我不會建議使用不同的動作來呈現相同的實體。嘗試將它們組合起來,並調用具有不同參數的組件,如果它很重,則將所有邏輯移至單獨的類。