如何从视图中调用 codeigniter 控制器功能

Posted

技术标签:

【中文标题】如何从视图中调用 codeigniter 控制器功能【英文标题】:How to call codeigniter controller function from view 【发布时间】:2012-04-16 17:01:00 【问题描述】:

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

【问题讨论】:

你能用这种方式解释你的目标是什么吗? 问题已解决。原因在于 config base url 设置 虽然我同意下面的 cmets 关于这不是好的 MVC 做法,但这仍然是一个好问题, 你可以为此编写助手 【参考方案1】:

您可以通过以下方式从视图中调用控制器函数:

控制器:

public function read() 
    $object['controller'] = $this; 
    $this->load->view('read', $object);

查看:

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

【讨论】:

+1 因为我知道最好的方法是不要在视图中调用控制器,但知道这些打破规则的技巧有时可能很有用。 另一种更简单的方法是将函数设为静态(即public static function myOtherFunct() 并从视图中调用它:ControllerName::myOtherFunct() 无需将类实例或其他任何内容传递给视图。跨度> 【参考方案2】:

Codeigniter 是一个 MVC(模型 - 视图 - 控制器)框架。从视图中调用函数确实不是一个好主意。视图应该仅用于演示,所有逻辑都应该在您到达控制器和模型中的视图之前发生。

了解最佳实践的良好开端是遵循本教程:

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

这很简单,但它确实列出了一个很好的操作方法。

我希望这会有所帮助!

【讨论】:

当然,我已经按照教程进行了操作,但对于这个问题完全没有结果。 您的链接现在不可用 这是可接受的答案吗?我本可以自己去他们的页面。朋友,我们需要做得更好。 投反对票,因为这不是问题的答案。在某些情况下,从视图调用控制器中的方法可能非常相关。 是的,在视图中使用函数有很多很好的理由。保持简单并且仍然与演示相关,但不要完全排除功能。【参考方案3】:

您可以在视图上使用 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>

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

【讨论】:

【参考方案4】:

我想回答这个问题,因为这在搜索中总是出现 --

您可以在视图中调用控制器方法,但请注意,这在包括 codeigniter 在内的任何 MVC 中都不是一个好的做法。

您的控制器可能类似于下面的类 --

<?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) ;

?>

【讨论】:

【参考方案5】:
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();

【讨论】:

【参考方案6】:

试试这个。

将此代码添加到您的视图文件中

$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,',');

在哪里

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

【讨论】:

【参考方案7】:

我可以给出的一个想法是,

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

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']);【参考方案8】:

视图不能调用控制器函数。

【讨论】:

@Anupama:是的,您可以从请求中控制控制器,但不能从视图中控制。 顺便说一句,你可以这样做:ControllerName::methodname();【参考方案9】:

我知道这很糟糕.. 但是我一直处于无法将其放回控制器或模型的困境中。

我的解决方案是在模型上调用一个函数。 它可以在视图内完成。 但是你必须先确保模型已经加载到你的控制器中。

说你的模型 main_model,你可以在你的视图上像这样调用模型上的函数: $this->main_model->your_function();

希望对您有所帮助。 :)

【讨论】:

【参考方案10】:

我们也可以在视图页面中将控制器函数作为变量传递。

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

【讨论】:

【参考方案11】:

这很简单,只需在控制器类中正确编写函数并使用标签指定控制器类和方法名称,或任何其他必要参数..

<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Iris extends CI_Controller 
    function __construct()
        parent::__construct();
        $this->load->model('script');
        $this->load->model('alert');

    public function pledge_ph()
        $this->script->phpledge();
    

?>

这是控制器类Iris.php 以及具有从控制器类指向的函数的模型类。

<?php 
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Script extends CI_Model 
    public function __construct() 
        parent::__construct();
        // Your own constructor code
    public function ghpledge()
        $gh_id = uniqid(rand(1,11));
        $date=date("y-m-d");
        $gh_member = $_SESSION['member_id'];
        $amount= 10000;
        $data = array(
            'gh_id'=> $gh_id,
            'gh_member'=> $gh_member,
            'amount'=> $amount,
            'date'=> $date
        );
        $this->db->insert('iris_gh',$data);
     

?>

在视图而不是按钮上,只需使用带有控制器名称和方法名称的锚链接。

<html>
    <head></head>
    <body>
        <a href="<?php echo base_url(); ?>index.php/iris/pledge_ph" class="btn btn-success">PLEDGE PH</a>
    </body>
</html>

【讨论】:

【参考方案12】:

我也遇到过同样的问题,但经过几次研究后我发现它很简单,

在您的 Codeigniter 项目中找到此 URL:application/helpers/util_helper.php

在下面添加代码

//you can define any kind of function but I have queried database in my case

//check if the function exist
 if (!function_exists('yourfunctionname')) 
    function yourfunctionname($param (if neccesary)) 
        
        //get the instance
        $ci = & get_instance();
    
        // write your query with the instance class

        $data =  $ci->db->select('*');
        $data =  $ci->db->from('table');  
        $data =  $ci->db->where('something', 'something');

        //you can return anythting

        $data =  $ci->db->get()->num_rows(); 

        if ($data > 0) 
            return $data;
          else 
            return 0;
          
    

【讨论】:

另一种更简单的方法是将函数设为静态(即 public static function myOtherFunct() 并从视图中调用它:ControllerName::myOtherFunct() 无需将类实例或其他任何内容传递给视图。跨度> 【参考方案13】:

如果您需要从视图中调用控制器, 也许加载部分视图, 你认为是模块化编程, 你应该实现 HMVC 结构来代替平面 MVC。 CodeIgniter 没有原生实现 HMVC, 但是您可以使用这个有用的库来实现 HMVC。 https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc

设置后 请记住:您的所有控制器都应该从 MX_Controller 扩展才能使用此功能。

【讨论】:

【参考方案14】:

我知道这个问题很老,但它仍然是一个相关的问题。根据我的经验,在某些情况下需要从 Codeigniter 4 应用程序的视图中调用函数,我只是建议你保持它的简洁和最小化。以下是我从视图中调用控制器函数的方式:

    在您的控制器文件中添加此代码
public function index()

  $data = [];
  $model = new UsersModel();
  $data['users'] = $model->findAll();

  // $this refers to the  controller to be called from view
  $data['callfromview'] = $this;

  return view('users', $data)

    在您看来,像这样调用控制器:
<?php $something = $callfromview->fetch_data($id);?>

    最后在控制器中,创建 fetch_data 函数

public function fetch_data($id)

    $image = new ImageModel();
    return $image->find($id);


结束!

【讨论】:

【参考方案15】:

转到查看代码的顶部并像这样:

  <?php
     $this->load->model('MyModelName');
     $MyFunctionReturnValue = $this->MyModelName->MyFunctionName($param));
?>

<div class="row">
    Your HTML CODE
</div>

【讨论】:

以上是关于如何从视图中调用 codeigniter 控制器功能的主要内容,如果未能解决你的问题,请参考以下文章

在codeigniter中没有从视图中调用控制器

Codeigniter:从视图中调用视图时的变量范围。奇怪的

Codeigniter 4 如何在视图中调用控制器方法?

在 codeigniter 中使用 AJAX 从视图调用控制器函数并从 db 检索行

从 codeigniter 中的视图调用模型是不是不好?

在 ajax 调用后加载视图,CodeIgniter