CodeIgniter:将参数从视图传递到控制器?
Posted
技术标签:
【中文标题】CodeIgniter:将参数从视图传递到控制器?【英文标题】:CodeIgniter: Passing Arguments from View to Controller? 【发布时间】:2011-09-12 21:20:42 【问题描述】:编辑:现在使用下面的代码,我不确定如何正确打印出书签和标签
我对 CI 完全陌生,最近遇到了障碍。我非常不确定如何将视图文件中的函数参数传递给控制器,以便在函数上使用它?
我在视图上有一个 foreach 循环,遍历函数 get_latest_bookmarks 传递的所有项目。该函数为每个项目返回一个 ID,我想将它与另一个名为 get_bookmark_tags 的函数一起使用,该函数将从另一个表中获取书签的标签。我在下面提供了到目前为止我所做的代码。
型号:
<?php
class Bookmark_model extends CI_Model
function __construct()
parent::__construct();
function get_latest_bookmarks($limit)
// Load Database
$this->load->database();
// Query Database
$query = $this->db->get('Bookmark', $limit);
// Return Result
return $query;
function get_bookmark_tags($id)
// Load Database
$this->load->database();
$query = $this->db->query('SELECT Tag.Title
FROM `Tag`
INNER JOIN BookmarkTag
WHERE BookmarkTag.BookmarkID = "'.$id.'" AND Tag.TagID = BookmarkTag.TagID');
return $query;
控制器:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Welcome extends CI_Controller
public function index()
// Load URL Helper
$this->load->helper('url');
// Load User Library
$this->load->library('ion_auth');
// Is User Logged In
if ($this->ion_auth->logged_in())
$data['user'] = $this->ion_auth->get_user_array();
else
redirect('auth/login');
// Load Bookmark Model
$this->load->model('Bookmark_model');
// Create Arrays
$bookmarks = array();
$tags = array();
// Query Database
$query = $this->Bookmark_model->get_latest_bookmarks(4);
//
foreach ($query->result() as $row)
array_push($tags, $this->Bookmark_model->get_bookmark_tags($row->BookmarkID));
array_push($bookmarks, $row);
$data['tags_latest'] = $tags;
$data['bookmarks_latest'] = $bookmarks;
$this->load->view('welcome_message', $data);
查看:
<h1>Latest Bookmarks</h1>
<?php foreach ($bookmarks_latest as $bookmark): ?>
<?php print_r($bookmark); ?>
<?php print_r($tags_latest->result()); ?>
<?php endforeach; ?>
【问题讨论】:
可能有办法做到这一点,但数据应该从控制器流向视图,而不是相反。 谁能回答如何将参数从视图传递到控制器,例如在视图中写这个不起作用<?=form_open("Welcome/bookmark_tags($id)";?>
如果$id参数是一个数组,那么我们将如何传递
【参考方案1】:
在将数据传递给视图之前,您应该在控制器中执行此操作。 试试这样的:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Welcome extends CI_Controller
public function index()
// Load Model
$this->load->model('Bookmarks');
// Get Latest Bookmarks
$query = $this->Bookmarks->get_latest_bookmarks(4);
$bookmarks = array();
$tags = array();
foreach ($query->result() as $row)
$bookmark_query = $this->Bookmarks->get_bookmark_tags($row->id);
$bookmark_arr = array();
foreach (bookmark_query->result() as $bookm)
array_push($bookmark_arr, $bookm);
array_push($tags, $bookmark_arr);
array_push($bookmarks, $row);
$data['tags'] = $tags;
$data['bookmarks'] = $bookmarks;
// Load and Pass Data into View
$this->load->view('welcome_message', $data);
【讨论】:
@ritch:不,但如果需要,您可以在加载视图之前使用$data['query'] = $bookmarks;
添加它。
如何打印标签?我已将上面的编辑代码添加到最新。
@ritch:我已经更新了我的代码。现在在您的视图中尝试print_r($tags);
和print_r($bookmarks);
。你可以循环它们。【参考方案2】:
你没有。
使用框架的重点是默认为适当的标准。 CodeIgniter 遵循松散的 MVC 模式,但您不应该将视图从视图传递到控制器。
你可以做到,但如果你做到了,你很快就会陷入意大利面的混乱中。
获取控制器上的 ID。即使它暗示两次运行相同的循环。以后你会感谢自己的。
【讨论】:
您好,您是在编辑后回答问题吗? @ritch 我的回答与您的代码并没有真正的关系,所以无论是在编辑之前还是之后都无关紧要。只是不要将视图中的东西传递给控制器。现在,如果您对其他事情有疑问,只需为这些问题打开一个新问题。 我不同意。您可以将“事物”传递给控制器,否则您将如何实现说登录,当然您需要从视图中获取 POST 数据,这个答案是无稽之谈。 @Undermine2k,我可以理解您的观点,但在 Web 应用程序中它不能那样工作。客户端(用户)将数据提交给 apache(服务器),然后它将解释您的 PHP 代码(CI 应用程序)。随着 CI 应用程序的加载,您的数据很容易从 $_SERVER、$_POST 等... 并且 CI 运行的第一件事是您的控制器,然后您执行您必须做的事情并将数据传递给查看器以解释它并将其作为一个漂亮的网页提供给客户端。在这种情况下,查看器意味着与您的浏览器 UI 完全不同的东西。以上是关于CodeIgniter:将参数从视图传递到控制器?的主要内容,如果未能解决你的问题,请参考以下文章
Codeigniter 数据没有从控制器传递到视图 [重复]
将数组数据从视图传递到控制器并反向 php codeigniter