2013-12-03 3 views
1

Так вот мой контроллер:CodeIgniter - Конструкторы в моделях

class Search extends CI_Controller { 

    public function __construct() { 
     parent::__construct(); 
     $this->load->model('search_model'); 
     $this->search_model->search_result = $_POST; 
    } 

    public function index() 
    { 

     $data['results'] = $this->search_model->get_results(); 
     $this->load->view('search_results', $data); 
    } 

А вот моя модель:

class Search_model extends CI_Model { 

    protected $search_query; 

    function __construct($search_query) 
    { 
     parent::__construct(); 
     $this->load->database(); 
     $this->search_query = $search_query; 
    } 

Но это не похоже на работу. То, что я хочу сделать, это передать опубликованную форму ($ _POST) в мою модель, а затем сделать что-то с ней. Но кажется бесполезным передавать $ _POST каждому методу моей модели. Мой план состоит в том, чтобы извлечь переменные, отправленные с помощью $ _POST, и построить их как свойства, такие как $ website_url, $ text_query и т. Д., Затем вызвать их в методах с $ this-> website_url;

Я относительно новым для CodeIgniter так просто получить, чтобы справиться с основами

+4

Защищено ... это слово кажется очевидным только для меня? – skrilled

ответ

3

для специальных целей, вы можете попробовать этот код

Контроллер:

class Search extends CI_Controller { 

public function __construct() { 
    parent::__construct(); 
    $this->load->model('search_model'); 
    $this->init(); 
} 

private function init() 
{ 
    $this->search_model->init($this->input->post()); 
} 

public function index() 
{ 

    $data['results'] = $this->search_model->get_results(); 
    $this->load->view('search_results', $data); 
} 

модель:

class Search_model extends CI_Model { 

protected $search_query; 

function __construct() 
{ 
    parent::__construct(); 
    $this->load->database(); 
} 

public function init($search_query) 
{ 
    $this->search_query = $search_query; 
} 
1

у вас есть protected $search_query;, которые вы не можете получить доступ к его из контроллера. Вам либо нужно изменить его на public, либо создать для него геттер и сеттер. или просто getter в зависимости от вашего домена/бизнес-логики.

И это должно было быть очевидным, как вы должны получить сообщение об ошибке говорящее

Fatal error: Cannot access protected property in file some/path/to/file!

-1

Не помещайте «поисковый запрос» в вашей модели конструктора.

Контроллер:

class Search extends CI_Controller { 

public function __construct() { 
    parent::__construct(); 
    $this->load->model('search_model'); 
} 

public function index() 
{ 
    if ($this->input->server('REQUEST_METHOD') == 'POST') 
    { 
     // you should probably validate/clean the post data instead 
     // of sending it straight to the model 
     $results = $this->search_model->get_where($_POST); 
    } 
    else 
    { 
     // if it's not a post, you probably need something... 
     // either here, or somewhere in your view to handle empty data 
     $results = array(); 
    } 

    $data['results'] = $results 
    $this->load->view('search_results', $data); 
} 

Ваша модель:

class Search_model extends CI_Model { 

function __construct() 
{ 
    parent::__construct(); 
    $this->load->database(); // <--- you may want to autoload 'database' library 
} 

function get_where($where) 
{ 
    $this->db->where($where); 
    // add select, order, joins, etc here 
    return $this->db->get('mytable'); // whatever your table name is 
} 
+0

Пожалуйста, не поощряйте использование $ _POST. И, "$ this-> load-> database();" может потребоваться в зависимости от того, как пользователь настроил конфигурацию фреймворка. – Charlie

+0

1. У меня есть комментарий для очистки данных POST, 2. $ _POST - это то же, что и '$ this-> input-> post()' в CodeIgniter (глобалы очищаются в библиотеке System/Input) ... но вы правы в 'load-> database()', это необходимо, если вы не загружаете его автоматически (я никогда не работал над проектом, который не использовал БД всюду, но я уверен, что это имеет смысл на небольших объектах). – minboost

Смежные вопросы