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

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

【问题讨论】:

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

标签: php codeigniter


【解决方案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,',');
        

        }

        在哪里

        1. FindFurnishName 是在您的控制器中定义的函数名称。
        2. $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 应用程序的视图中调用函数,我只是建议你保持它的简洁和最小化。以下是我从视图中调用控制器函数的方式:

                  1. 在您的控制器文件中添加此代码
                  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)
                  }
                  
                  1. 在您看来,像这样调用控制器:
                  <?php $something = $callfromview->fetch_data($id);?>
                  
                  
                  1. 最后在控制器中,创建 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>
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-07-02
                      • 1970-01-01
                      • 1970-01-01
                      • 2016-05-23
                      • 1970-01-01
                      相关资源
                      最近更新 更多