从控制器功能调用模型方法的时间最长。几个小时后,阅读了许多关于“调用成员函数......非对象”和“未定义属性:Main :: $ form_model ”的文章“等等,我还没有找到任何解决方案(显然,或者我不会在这里找到)。只是让你知道我不想试着带着这个问题轻松过关。
我的模型文件夹包含此模型:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class Form_model extends CI_Model {
function __construct()
{
// Call the Model constructor
parent::__construct();
}
public function update_profile(){
$data = array();
$formValues = $this->input->post();
$this->db->where('member_id', $data['member_id']);
$this->db->update('members', $data);
}
}
在我的Main类控制器中,我正在加载这样的helpers / libraries / models:
class Main extends CI_Controller {
public function __construct(){
parent::__construct();
// Your own constructor code
$this->load->helper(array('cookie','form','url'));
$this->load->library('../controllers/accessories');
$this->load->model(array('registration_model','form_model'));
}
这些正确加载。我知道它们正确加载,因为如果我更改任何模型的任何字母,CodeIgniter会抛出一个无法加载模型的错误。
我的Main类中的最后一个函数与表单的操作页面相关联。表单页面是一个外部视图(在“views”文件夹中),它也调用具有相同名称的内部视图,但它位于“views / content”文件夹中,如下所示:
<?php $this->load->view("top"); ?>
<!-- CONTENT BEGIN -->
<?php $this->load->view("content/profile_management"); ?>
<!-- CONTENT END -->
<?php $this->load->view("bottom"); ?>
您可以看到此模板三明治的“内容”中间调用第三级视图,而在$role == 1
的情况下,将调用“forms / profile_manager_form”:
<?php
if ($this->uri->segment(3) === FALSE){
if($this->input->cookie('member')){
$member_id = $this->input->cookie('member');
}
else{
$member_id = 0;
}
}
else{
$member_id = $this->uri->segment(3);
}
$query = $this->db->get_where('members', array('member_id' => $member_id));
foreach ($query->result() as $row){
$role = $row->role;
}
switch($role){
case "1" :
$this->load->view('forms/profile_manager_form');
break;
case "2" :
$this->load->view('forms/portfolio_manager_analyst');
break;
}
?>
提交个人资料更新表单后,操作页面为“profile_form”:
<?php $this->load->view("top"); ?>
<!-- CONTENT BEGIN -->
<?php $this->load->view("content/profile_form"); ?>
<!-- CONTENT END -->
<?php $this->load->view("bottom"); ?>
此页面位于“views”文件夹中,本身调用“views / content”文件夹中的第二级视图,名为“profile_form”:
<?php
foreach($_POST as $k => $v){
echo "$k = $v <br>";
}
$this->form_model->update_profile();
?>
...正如您所看到的,我已将呼叫置于此处update_profile
,并且可以正常运行。但我不认为我想用我的控制器Main类调用一些模型函数来构建这个网站,而从视图页面调用其他模型函数,因为这是他们似乎唯一工作的地方。 / p>
在我的控制器的Main类中,我的最后一个函数是我认为应该放置函数调用的地方:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Main extends CI_Controller {
public function __construct(){
parent::__construct();
// Your own constructor code
$this->load->helper(array('cookie','form','url'));
$this->load->library('../controllers/accessories');
$this->load->model(array('registration_model','form_model'));
}
public function index()
{
$config = array();
$root = "http://".$_SERVER['HTTP_HOST'];
$root .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
$config['base_url'] = "$root";
$data = array();
$data['scripts'] = $this->accessories->getScripts($config);
$this->load->view('home',$data);
}
public function profile_form(){
$config = array();
$root = "http://".$_SERVER['HTTP_HOST'];
$root .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
$config['base_url'] = "$root";
$data = array();
$data['states'] = $this->accessories->states();
$data['scripts'] = $this->accessories->getScripts($config);
$this->form_model->update_profile(); //I want to put my model function call here, but CI gives me the "not an object" error.
$this->load->view('profile_form',$data);
}
}
更新 请参阅下面的答案。
答案 0 :(得分:0)
尝试这种方式加载模型
$this->load->model('registration_model');
$this->load->model('form_model');
答案 1 :(得分:0)
我想我发现__construct中对象的加载顺序很重要。这让我疯了。我研究过“模块助手库是否有加载顺序?”我没有找到任何东西。但是,它确实有所作为。
这是我原来的一个父__constructs:
public function __construct(){
parent::__construct();
// Your own constructor code
$this->load->helper(array('cookie','form','url'));
$this->load->library('../controllers/accessories','form_validation');
$this->load->model(array('login_model','registration_model','form_model'));
}
我只是按字母顺序排列,“h”表示帮助,“l”表示库,“m”表示模型。
我在另一个模型的不同方法(对象 login_model 中的方法 validate())上再次遇到“非对象”错误。这真的开始让我失望了。
我还能做什么,知道我的模型和方法在语法上是正确的,并且知道我正确地调用它们,特别是在网上搜索这个问题并且做得很短?所以,我改变了模型/库/助手的加载顺序,如下所示:
public function __construct(){
parent::__construct();
// Your own constructor code
$this->load->model(array('login_model','registration_model','form_model'));
$this->load->helper(array('cookie','form','url'));
$this->load->library('../controllers/accessories','form_validation');
}
...现在我没有收到错误,我的方法也有效。