如何从视图调用CodeIgniter控制器函数

39

如何从视图调用CodeIgniter控制器函数?在我调用控制器中的函数时,得到了一个404页面。


3
您能解释一下您以这种方式进行的目标是什么吗? - Jasonw
问题已经解决。原因在于配置基本URL设置。 - keerthi
1
虽然我同意下面评论中关于这不是良好的MVC实践的观点,但这仍然是一个好问题。 - tim peterson
你可以为此编写辅助程序。 - Gun2sh
15个回答

55
你可以通过以下方式从视图中调用控制器函数:
控制器:
public function read() {
    $object['controller'] = $this; 
    $this->load->view('read', $object);
}

视图:

// to call controller function from view, do
$controller->myOtherFunct();

12
+1 是因为我知道最佳方法是不在视图中调用控制器,但有时了解这些突破规则的技巧可能会很有用。 - Mojtaba Rezaeian
2
另一种更简单的方法是将函数设置为静态(即 public static function myOtherFunct()) 并从视图中调用它:ControllerName::myOtherFunct(),无需将类实例或任何其他内容传递给视图。 - pbarney
简直是太棒了的技巧.. - Mrugesh Mistry

16

Codeigniter是一个MVC(模型-视图-控制器)框架。从视图中调用函数并不是一个好主意。视图应该只用于展示,所有逻辑都应该在控制器和模型中发生。

想要澄清最佳实践的一个好的开始,是按照这个教程进行操作:

https://codeigniter.com/user_guide/tutorial/index.html

它很简单,但确实能够提供出色的操作指导。

希望这会有所帮助!


1
当然,我已经按照教程尝试了这个问题,但是没有任何结果。 - elvenbyte
您的链接目前不可用。 - Kamarul Anuar
4
这怎么能成为可以接受的答案呢?我自己本来就能够去他们的页面。我们需要做得更好,朋友。 - Webmaster G
1
因为它不是问题的答案,所以被踩了。在某些情况下,从视图中调用控制器中的方法可能非常相关。 - Kalle
是的,在视图中使用函数有很多好处。保持简单和与展示相关,但不要完全排除函数。 - elliottregan
最好提及一个具体的页面或URL来描述过程,而不是文档索引。如果有人要在干草堆中搜寻针,那么你的回答对于这个问题有什么帮助呢! - Debdutta Panda

11

您可以在视图中使用AJAX调用控制器函数。在这种情况下,我使用jQuery库进行调用。

<script type="text/javascript">
    $.ajax({
            url: "<?=site_url("controller/function")?>",
            type: "post", // To protect sensitive data
            data: {
               ajax:true,
               variableX: "string",
               variableY: 25
               //and any other variables you want to pass via POST
                   },
            success:function(response){
            // Handle the response object
            }
        });
</script>

通过使用 AJAX 方法,在 HTML 容器中重新加载代码部分(模块),您可以这样创建。


6
我希望能回答这个问题,因为这个问题一直出现在搜索结果中—
您可以在视图中调用控制器方法,但请注意,在任何MVC(包括codeigniter)中都不建议这样做。
您的控制器可能像下面这个类一样 —
<?php
    class VCI_Controller extends CI_Controller {
    ....
    ....
    function abc($id){
       return $id ;
    }

    }
?>

Now You can call this function in view files as below --
<?php
    $CI =& get_instance();
    $CI->abc($id) ;

?>

4
尝试这个。
在您的视图文件中添加此代码。
$CI     = & get_instance();
$result = $CI->FindFurnishName($pera);

在您的控制器文件中添加代码。
public function FindFurnishName($furnish_filter)

{

$FindFurnishName        = $this->index_modal->FindFurnishName($furnish_filter);  
$FindFurnishName_val    = '';
foreach($FindFurnishName as $AllRea)
{
    $FindFurnishName_val  .= ",".$AllRea->name;
}
return ltrim($FindFurnishName_val,',');

其中

  1. FindFurnishName是您的控制器中定义的函数名称。
  2. $pera是一个选项(根据您的需要)。

4
class MY_Controller extends CI_Controller {

    public $CI = NULL;

    public function __construct() {
        parent::__construct();
        $this->CI = & get_instance();
    }

    public function yourMethod() {

    }

}

// in view just call
$this->CI->yourMethod();

2

我可以给出一个建议,

在控制器本身调用该函数并将值返回到视图文件中。例如,

class Business extends CI_Controller {
    public function index() {
            $data['css'] = 'profile';

            $data['cur_url'] = $this->getCurrURL(); // the function called and store val
            $this->load->view("home_view",$data);
     }
     function getCurrURL() {
                $currURL='http://'.$_SERVER['HTTP_HOST'].'/'.ltrim($_SERVER['REQUEST_URI'],'/').'';
            return $currURL;
     }

}

在视图文件(home_view.php)中使用该变量。例如:

echo $cur_url;

或者可以创建模型函数,然后我们可以直接在视图文件中使用... $arr_fran = $this->reserv_model->experience_info($f['created_on']); - ShivarajRH

1
我们也可以在视图页面中将控制器函数作为变量传递。
class My_controller extends CI_Controller {
    public function index() {
           $data['val']=3;
           $data['square']=function($val){
                               return $val*$val;
                                   };
    $this->load->view('my-view',$data);
}
}

在视图页面中
<p>Square of <?=$val?>
   <?php 
     echo $square($val); 
   ?>
</p>

输出结果为9


1
我知道这样做不好,但是我处于一个难以将其放回控制器或模型的困境中。
我的解决方案是在模型上调用一个函数。 它可以在视图内部完成。 但是您必须确保该模型已被加载到您的控制器中。
假设您的模型为main_model,您可以在视图中像这样调用模型上的函数: $this->main_model->your_function();
希望这能有所帮助。 :)

1

视图无法调用控制器函数。


@Anupama:是的,你可以从请求中使用控制器,但不能从视图中使用。 - rechie
3
顺便提一下,你可以这样做:ControllerName::methodname(); - Dharmesh patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接