2012-09-25 33 views
1

將項目列表2-3項目傳遞給控制器​​中的方法有什麼好方法? 我想的只是使用URL ....像這樣:如何將值列表傳遞給方法,Codeigniter樣式

http://myserver/myapp/mycontroller/mymethod/parm1/parm2/listitem1/listitem2/listitem3 

有沒有更好的方式來做到這一點?這些數據不是來自表單,而是來自數據庫查詢,我正在建立一個超鏈接。

我想這困擾我的是,我不會提前知道我有多少條目,當我解析這個網址的唯一部分。

其可能的,我會得到無,或所有3或兩者之間的某個值。因此,然後必須解析此url的方法將繼續循環,直到uri-> segment()返回false,表示它已經命中第一個空的uri段。 任何建議,將不勝感激。

感謝

編輯1:

以防萬一,目前還不清楚,我的模型是從數據庫中獲取數據,並且還將建設名單。 這個問題真的是解析未確定數量的uri段。 只是想知道是否有更好的方法來做到這一點。 謝謝!

EDIT 2

這裏的一些信息,以幫助您瞭解我的MVC應用程序。我不認爲我的問題是我已經儘量安排我的代碼,誰在做什麼的方式。但爲了以防萬一它可以幫助...

我有在了methodA我的模型,查詢數據庫,並回傳到我的控制器listitem1,listitem2和listitem2。 控制器隨後構建表示像URL的字符串:

http://myserver/myapp/mycontroller/methodB/parm1/parm2/listitem1/listitem2/listitem3 

然後視圖使用上述的URL顯示的超鏈接。 當用戶點擊這個超鏈接時,它調用methodB。 在methodB中,由於我不知道項目的數量,我只會遍歷所有的段,直到我打到第一個假。

至於爲什麼我需要做這個/我在做什麼...這裏是一些背景信息: 我正在查詢一個數據庫的交換機端口列表被視爲中繼線 - 應該是不被修改。這是A的方法。

的methodB運行鍼對的開關的命令,並返回一組數據的後面。顯示來自methodB的數據的視圖將允許最終用戶對交換機進行進一步的更改。在我顯示來自methodB的數據之前,我想過濾出我從methodA獲得的端口列表,以便它們不會被篡改。

希望這會有所幫助。

編輯3

我同時需要和了methodA因的methodB他們有兩個不同的目的。 methodA顯示有關來自我的數據庫的端口的摘要數據。將methodA視爲一個函數,顯示關於交換機的文檔。方法A的視圖反過來提供了「實時」鏈接,以便與實際交換機通信 - 這就是methodB進來的地方。methodB由其中一個活動鏈接觸發,並且它得到一個端口列表 - 類似於methodA - 除了它表示實際的內容,並且不包括有關端口的用戶定義信息。 我想我可以讓methodB與我的數據庫進行通信並在顯示數據之前過濾它的數據,但是如果我想將這兩個函數作爲單獨的API處理...又名 - 一組函數從數據庫中獲取數據,另一組是一個與交換機進行通信的工具... - 然後我不認爲我想直接與另一個交談。我希望GUI將它們綁在一起。事實上,我已經爲我所謂的數據庫接口創建了兩個獨立的模型和控制器,然後創建了交換機接口。 到目前爲止,我認爲表單的想法是最優雅的解決方案。 謝謝大家,閱讀。 listItems中的

+0

是否通過http從視圖(客戶端),或什麼? –

+0

@Esben Tind - 它來自模型。我想我提到它來自數據庫查詢。 – dot

+0

隨着你給我們的東西,沒有更好的方法來做到這一點 - 不知道爲什麼你需要這麼多的細分市場和/或他們的目的更多的細節,除了「重新設計之外,很難提供替代品或特定的建議一切「 – orourkek

回答

1

地方數作爲parametr 3

../mymethod/parm1/parm2/numberofitems/listitem1/listitem2/listitem3 

,把1,2或3根據需要。如果0沒有 - null,但是確保控制器知道如果null發生了什麼 - 不要期望項目。

+0

我剛剛在我的帖子中添加了關於如何解析網址的評論。有什麼想法嗎? – dot

+0

我不認爲向已經很複雜的URI添加*更多*參數是正確的方向... – orourkek

+0

@orourkek,你有什麼建議嗎?謝謝。 – dot

0

如果數據是從查詢未來應該在笨模型中,如果你想爲你的應用真正的MVC兼容。這可能意味着您的應用程序重組,這可能很困難,但將來您可以爲您的所有數據庫查詢創建一個模型真正有益。

您可以在這裏笨車型念起來: http://codeigniter.com/user_guide/general/models.html

而且你可以在這裏的數據庫類閱讀起來:http://codeigniter.com/user_guide/database/index.html

我真的建議你這樣做。

$this->load->model('model_name'); 
$response = $this->model_name->model_function(parameters); 

編輯:

如果您的數據已經從一個模型來,你可以通過包括模型稱之爲這也將解決未知數量的列表項的問題,因爲你可以簡單解析從模型函數返回的響應,而不是試圖找出uri黑客攻擊。

+0

感謝您的回覆。這是在我的模型中。 – dot

+0

您應該從控制器調用模型函數,而不是傳遞參數,這就是模型在codeigniter中的使用方式。 –

+0

雖然我同意SOC的概念,但是當您開始將模型限制爲僅僅是一個類時,「真正MVC兼容」這個短語完全不在窗口中... – orourkek

0

閱讀所有其他答案+編輯結束後,這絕對是而不是你想要做到這一點。

除非我誤解你的意見,這裏的問題:端口的列表是存儲在服務器上域數據。那麼,爲什麼你要將這些數據提取出來,發送到表示層,並將其展示給用戶,他們會將發送迴應用程序?跳過中間人並讓「MethodB」獲取該數據。

你的「MethodB」應該在處理它需要做的事情之前自己得到這個信息 - 域數據停留在域層,並且視圖永遠不會直接看到任何信息(用戶會直接看到一個鏈接到「MethodB 「)

或者,如果您的數據庫模式有利於這種聯接,則可以在一個查詢中執行此操作。

+0

檢出編輯3 – dot