2011-04-11 55 views
0

我有4個物體(小說,短篇小說,非小說,科幻),所有這些都是從一本書基類中擴展而來的。用戶可以查看書籍詳細信息頁面,該頁面應根據書籍類型顯示不同的詳細信息。所以,理想情況下,我可以有4個差異視圖腳本,根據所選圖書的類型調用它們。我將如何做到這一點?我應該在每個對象中存儲指向視圖腳本的鏈接嗎?我應該在控制器操作中使用switch語句來確定正確的視圖嗎?如何根據對象類型選擇視圖?

+0

考慮我理解你的話,我想我會建議去爲開關。 – Khez 2011-04-11 01:44:27

+0

Rails和類似的框架不是通過類名的靜態映射 - >某些文件,而是通過一個通常涉及多元化和基礎路由器的約定實現的。例如,route/novel /:novel_id映射到novel.tpl.php視圖和NovelController.php以及Novel.php模型文件。 – canuckistani 2011-04-11 02:56:48

回答

1

爲視圖腳本/文件命名爲具有詳細後綴的對象(例如novel_details.php)。

所以,當你顯示/渲染視圖,您解析對象的名稱,詳情sufix

$this->render($object->name."_details.php");* 

編輯:*這一切都取決於雖然其MVC框架您使用。

0

您是在自己實現MVC還是使用預先存在的框架?導軌型構架通常都會有類/方法和要求,例如:

GET /book/view/id/1 --> Book::view(1)

根據您的模型的結構之間一個很好的映射,這可以映射到一本書GUID;其中,ID是指小說,而不是一本書,ID

GET /book/view/type/novel/id/3 --> Novel::view(3)

:或者,如果你堅持這樣一個類型層次,你可能會喜歡的東西等。另外:

GET /novel/view/id/3 --> Novel::view(3)

將相同的工作。

也許更有針對性的,你應該贊成組成繼承;有沒有任何理由有4種類型的書籍?他們真的有什麼不同?如果它們僅僅根據它們包含的元數據的類型而不同,那麼可以考慮以某種方式封裝該差異,而不是按照類型層次結構移動(例如,如果影響各種類型書籍的方法類似,則可能會只需將適用於特定書籍類型的任何算法分解出來,然後使用對象組合將該功能包含在您的類中)。我認爲這也可以讓你簡化你的視圖結構,間接地給你一個更清晰的解決方案來解決這個問題。

0

你可以有...

$bookTypeToView = array(
    'novel' => 'novel.php', 
    'short_story' => 'short.php' 
    ... 
); 

然後做類似的東西...

$this->view = isset($bookTypeToView[$book['type']]) ? $bookTypeToView[$book['type']] : 'default'; 
相關問題