编辑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 ?>
答案 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”。
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。
您可以在显示第一页时存储数据。然后,您可以在下一个视图中检索它。