将信息从一个视图传递到另一个视图

时间:2010-04-27 13:56:36

标签: php codeigniter

编辑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,我如何将该特定选项显示在另一个视图上?

END OF EDIT1

原始问题

我的视图页面(CodeIgniter)以多个链接的形式显示数组的内容。如果用户点击链接,我希望用户被带到另一个视图页面(通过控制器),该页面提供有关该特定链接的更多信息(存储在数组中的特定位置)

我的问题是,如何在第二个视图文件中访问和显示数组中特定位置的内容,而不会在第二个视图中出现“未定义变量错误”?

以下是我尝试以代码形式进行的操作

// 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 ?>

5 个答案:

答案 0 :(得分:1)

您可以使用URL中的参数将信息传递到第二个视图。

答案 1 :(得分:1)

阵列最初来自哪里?我假设它来自数据库或来自其他一些“可预测”的数据源?在这种情况下,您可以在链接到第二页时通过URL简单地传递对该数据的引用(例如,数据库中的主键)。如果您没有足够的信息来执行此操作,则可能需要重新考虑您的设计。让一个视图访问另一个不同视图的内容将是一个坏主意。您当然可以创建视图片段(只是您在其他模板中包含的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:不要将会话用于此类事情。进入这是一个坏习惯。保持安静。

答案 2 :(得分:1)

听起来你需要两个控制器和两个视图。

Controller 1查询数据库以获取事物列表。调用控制器“list”和方法“index”。

http://mysite.com/list/

Controller 2查询数据库以获取有关某个特定事物的更多信息。调用控制器“item”,方法“detail”,第三个URL参数将是项目的名称或您可以传递到数据库的其他标识符。

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

第三个参数提供用于查询数据库以查找有关该书的更多信息的信息。完成此查询作为控制器2的一部分,并将数据传递给视图2.

其他答案建议使用会话数据。我认为这是一个奇怪的想法,因为会话数据是针对特定于用户的信息,而有关书籍的详细信息并非特定于用户。

答案 3 :(得分:1)

您所做的(我认为)是您创建表单,生成row个sumbit按钮,然后关闭该表单。

如果您想使用表单作为用户想要购买的内容的指示,您必须为结果中的每一行生成表单,如下所示(它是生成的html,但您需要编辑它以满足您的需求):< / p>

编辑(伪代码不够:):

<!-- 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')

答案 4 :(得分:0)

您可以随时使用会话或flashdata

您可以在显示第一页时存储数据。然后,您可以在下一个视图中检索它。