2010-04-27 198 views
2

編輯1. 查詢從我的數據庫中的結果顯示我的視圖頁面上。旁邊的每個獨特的結果是一個按鈕:傳遞信息從一個視圖到另一個

// first_view.php  
<?php echo form_open('controller/method'); ?> 
<?php foreach($results_found as $item): ?> 
<p><?php echo $item->name ?></p> 
<p><?php form_submit('buy','Buy This'); ?></p> 

當用戶點擊這些按鈕中的一個(可以說按鈕4),我想顯示從陣列用戶的選擇到另一個視圖。

我已經使用這個嘗試:

// first_view.php 
<?php echo $this->session->set_userdata('choice',$item); ?> 

立即

認爲用戶的最終選擇將被存儲在那裏,所以我可以在這樣的另一視圖中顯示它之前
// first_view.php  
<?php echo form_close(); ?> 

// second_controller.php 
$c = $this->session->userdata('choice'); 


// second_view.php 
echo 'Your Choose: '. $c; 

但是,實際顯示的是first_view.php上顯示的最後一個結果,而不是用戶選擇。

我的問題是,如果用戶點擊了按鈕4,我該如何將特定的選項顯示到另一個視圖上? EDIT1

原來的問題

我的視圖頁面(笨)JOURNAL

END顯示的幾個鏈接形式的數組的內容。如果用戶點擊鏈接,我希望用戶被帶到另一個查看頁面(通過控制器),該頁面提供了有關該特定鏈接(存儲在陣列中該特定位置)的更多信息。

我的問題是,如何在第二個視圖文件中訪問和顯示數組內特定位置的內容,而不在第二個視圖上獲得「未定義的變量錯誤」?

這裏是我試圖以代碼的形式做

// my_controller.php 
$array_name['variable_name']; 
$this->load->view('first_view.php'); 

// first_view.php 
<?php foreach($variable_name as $vn): ?> 
<?php echo anchor('controller_name' $vn->info ?> // if user clicks on 3rd link 
<?php endforeach ?>        // I want to beable to access 
               // index 2 of the array in the 
               // second view file so I can 
               // display more info 
// second_view.php 
<?php $vn[2]->info ?> 

回答

1

你做什麼(我看到它)是你創建表單,生成row sumbit按鈕,然後關閉該表單。

如果您想要使用表單作爲用戶想要購買的指示,您必須從結果中爲每行生成表單,如下所示(它生成html,但需要對其進行編輯以滿足您的需求):

編輯(僞不夠:):

<!-- repeat row times --> 
<?php foreach($items as $item): ?> 
<p><?php echo $item->name; //echo name ?> 
    <?php form_open(/*your settings*/); ?> 
    <input type="hidden" name="idToAdd" value="<?php echo $item->id;?>" /> 
    <input type="submit" value="Buy this" /> 
    </form> 
</p> 
<?php endforeach; ?> 
<!-- end repeat --> 

這樣,每次用戶點擊「百易得」按鈕,不同的表單提交,並在控制器/視圖,你可以得到什麼id用戶想通過$this->input->post('idToAdd')購買。

+0

+1 TYVM爲您的有益答覆。你的建議讓我更接近我的目標。我在循環中包含了form_open()和form_close()標籤(CodeIgniter)。然而,有兩件事情發生:首先,所有按鈕上的文字變爲「1」,而我希望按鈕上的文字爲「購買」。其次,在控制器中用這個語句打印「1」:$ result = $ this-> input-> post('idToAdd');回聲'你的選擇:'。$ result;值得注意的是,如果我用value = $ item-> id替換value =「1」;我找回用戶選擇的主鍵,這是我想要的,但我不想要按鈕名稱上的id – Anthony 2010-05-02 22:46:18

+0

已編輯的代碼。 15c – 2010-05-02 23:41:53

+0

它工作!謝謝你,先生!這些行做了訣竅: id;?>」/> Anthony 2010-05-03 01:14:57

1

您可以使用參數的URL將信息傳遞給第二個觀點。

+0

+1。感謝Jon的回覆。我現在會研究這個 – Anthony 2010-04-27 15:51:05

1

數組最初來自哪裏?我假設它來自數據庫或來自其他「可預測」數據源?在這種情況下,您可以簡單地將引用傳遞給該數據(例如數據庫中的主鍵),然後鏈接到第二頁。如果你沒有足夠的信息來做到這一點,你可能需要重新考慮你的設計。有一個視圖訪問另一個不同視圖的內容將是一個壞主意。您當然可以創建視圖片段(只是您在其他模板中包含的PHP文件),以最大限度地減少代碼重複。

我不熟悉CodeIgniter的工作原理,但這只是一般的Web開發邏輯。

編輯

希望發生的事情是,你的形式提交自己的控制器。您的控制器然後檢查POST數據並決定用戶從列表中選擇什麼。然後它重定向到第二個控制器,在URL中傳遞參數,以便第二個控制器可以從數據庫中查找項目。

一個簡單的例子,不使用你的具體用例,只是一些語義僞代碼。我希望你能在這裏跟隨。該例子是一個虛構的多語言書店,用戶在查看該語言的書籍列表之前選擇一種語言。框架代碼純粹是虛構的。我省略了一切,包括理智純粹檢查簡潔,所以你只能看到,使這個工作流程中的部分發生:

語言選擇控制器

class LanguagesController ... { 
    public function selectLanguage() { 
    // If the user submitted the form, collect the language_id 
    // and redirect to the BooksController 
    if ($this->_request->get('language_id')) { 
     return $this->_response->redirect(array(
     'controller' => 'BooksController', 
     'action' => 'viewBooks', 
     'language_id' => $this->_request->get('language_id') 
    )); 
    } 

    $languages = Language::findAllWithBooksInStock(); 
    $this->_view->set('languages', $languages); 
    } 
} 

選擇語言形式

<form method="post"> 
    <fieldset> 
    <label for="language">Select a language</label> 
    <select name="language_id" id="language"> 
     <?php foreach ($languages as $lang): ?> 
     <option value="<?php escape($lang->id); ?>"><?php escape($lang->name); ?></option> 
     <?php endforeach; ?> 
    </select> 
    </fieldset> 
    <fieldset> 
    <input type="submit" name="submit" value="Continue" /> 
    </fieldset> 
</form> 

獲取language_id值的BooksController

class BooksController ... { 
    public function viewBooks() { 
    $language = Language::findById($this->_request->get('language_id')); 
    $books = Book::findAllWithLanguage($language); 

    $this->_view->set('language', $language) 
       ->set('books', $books); 
    } 
} 

現在BooksController可以實現一個視圖,該視圖顯示在前一個控制器中選擇的語言的所有書籍。所有這些都是爲了在兩個控制器之間的URL中傳遞語言的主鍵。 PS:不要使用會話這樣的事情。這是一個不好的習慣。是RESTful。

+0

+1。這是第一次創建一個網站,所有這些對我來說都是新的,我相信我必須在完成時重新思考所有這些。我想我的原始數組來自我的控制器,就在我加載視圖之前的那行:first_view.php – Anthony 2010-04-27 15:14:44

+0

好吧,假設你剛剛將這些數據硬編碼到控制器中,並且沒有從數據庫中取出它,第一步將會把這個數組從Controller中取出並放入它自己的類中,這將是一個模型類。現在,您連接的第二個控制器可以加載相同的模型類並從中獲取數據。 MVC設計中的另一個一般原則。保持您的模型邏輯不在您的控制器中;) 儘管數據庫處於等式中,但它更有意義。 – d11wtq 2010-04-28 00:05:09

+0

感謝您的回覆d11wtq。事實上,我已將數據從數據庫中取出並顯示在視圖中。有關更多信息,請參閱編輯1。 – Anthony 2010-05-02 03:14:13

0

您可以隨時使用會話或flashdata

當您顯示第一頁時,您可以存儲數據。然後您可以在下一個視圖中檢索它。

+0

+1感謝您的回覆。我新來這個,但這聽起來像解決方案。好吧,我已經有會議自動加載。現在,我試圖弄清楚的是(i)如何將數組的索引獲取到會話數據中,以及(ii)我在哪裏寫入(在控制器或視圖中)。用戶點擊的鏈接表示存儲在數組中的書的信息,並且該書在該特定位置具有標題,作者姓名等。如何將這些信息存儲在會話數據中?我是否會這樣做:$ this-> session-> set_userdata($ newdata);如果是這樣,我如何獲得$ newdata中數組位置的細節? – Anthony 2010-04-27 15:44:08

+0

我有一個存儲幾本書的數組,每本書都有一個標題,作者的名字等,每本書都會在視圖頁面上生成一個鏈接。我仍然無法弄清楚如何根據用戶點擊的鏈接來存儲用戶選擇的圖書。 – Anthony 2010-04-27 15:56:26

+0

我在想,當用戶點擊鏈接時,該鏈接應該返回一些信息,然後我可以將其放入此會話數據,可能是這樣的:$ this-> session-> set_userdata('some_name','some_value 「);如果這是有道理的,如何在用戶點擊鏈接時返回信息? – Anthony 2010-04-27 16:02:55

1

這聽起來像你需要兩個控制器和兩個視圖。

控制器1查詢數據庫以獲取事物列表。調用控制器「列表」和方法「索引」。

http://mysite.com/list/

控制器2查詢數據庫,以獲取有關一個特別的事情更多的信息。調用控制器「item」,方法「detail」,第三個URL參數將是項目的名稱或其他可以傳入數據庫的標識符。

http://mysite.com/item/detail/436
http://mysite.com/item/detail/the-name-of-book-436

這第三個參數提供您用來查詢數據庫來查找有關這本書的詳細信息的信息。完成此查詢作爲控制器2的一部分,並將數據傳遞到視圖2.

其他答案建議使用會話數據。我認爲這是一個奇怪的想法,因爲會話數據是針對用戶的特定信息,而有關書籍的詳細信息不是用戶特定的。

相關問題