Я новичок в CodeIgniter. Мне нужно обработать форму. У меня есть страница form.html
<html> <head> <title>Search</title> </head> <body> <form action="search"> <input type="text" name="search" value="" size="50" /> <div> <input type="submit" value="Submit" /> </div> </form> </body> </html>
и контроллер формы
class Form extends Controller { function Form() { parent::Controller(); } function index() { $this->load->view('form'); } }
и у меня есть файл поиска search.php, но когда он обрабатывается, он показывает, что страница не найдена …
В установках M .odel V .iew C .controller, таких как CodeIgniter, представления представляют собой элементы пользовательского интерфейса. Они не должны анализировать результаты.
Если я не ошибаюсь, то, что вы хотите сделать, это передать данные с www.yoursite.com/index.php/form
на www.yoursite.com/index.php/search
В неструктурированном php у вас может быть form.html
с действием вида search.php
. Пользователь перейдет на сайт yoursite.com/form.html
, который будет вызывать yoursite.com/search.php
, который может перенаправляться на yoursite.com/results.php
.
В CodeIgniter (и, насколько я понимаю, в любой системе MVC, независимо от языка) ваш контроллер , Form
вызывает функцию, которая загружает form.html
View в себя, а затем запускает ее. Просмотр генерирует код (как правило, HTML, но не обязательно), с которым пользователь взаимодействует. Когда пользователь делает запрос, который View не может обрабатывать (запросы на большее количество данных или другую страницу), он передает этот запрос обратно контроллеру, который загружает больше данных или другой вид.
Другими словами, представление определяет, как данные будут отображаться. Контроллер сопоставляет запросы к представлениям.
Это немного усложняется, если вы хотите иметь сложные и / или изменяющиеся данные, отображаемые в представлении. Чтобы сохранить разделение опасений, которые MVC требует, CodeIgniter также предоставляет вам модели .
Модели отвечают за самую сложную часть любого веб-приложения – управление потоком данных. Они содержат методы для чтения данных, записи данных и, что наиболее важно, методов обеспечения целостности данных. Другими словами, модели должны:
У Akelos есть хорошая графика, излагающая компоненты MVC:
Запрос – ответ http://img.ruphp.com/php/akelos_mvc.png
При этом простейший (читаемый «самый простой», а не «самый расширяемый») способ выполнить то, что вы хотите сделать:
function Form() { parent::Controller(); } function index() { $this->load->view('form'); } function search() { $term = $this->input->post('search'); /* In order for this to work you will need to change the method on your form. (Since you do not specify a method in your form, it will default to the *get* method -- and CodeIgniter destroys the $_GET variable unless you change its default settings.) The *action* your form needs to have is index.php/form/search/ */ // Operate on your search data here. // One possible way to do this: $this->load->model('search_model'); $results_from_search = $this->search->find_data($term); // Make sure your model properly escapes incoming data. $this->load->view('results', $results_from_search); }
Просмотр файла бесполезен, если контроллер не загружает и не отображает его. Вы должны создать контроллер для получения данных формы, обработать его, а затем отобразить результат процесса.
Вы можете использовать хелпер формы, чтобы задать открытые теги формы, а также теги close:
<?php echo form_open('form/search'); ?> <input type="text" name="search" value="" size="50" /> <div><input type="submit" value="Submit" /></div> <?php echo form_close(); ?>
Без использования помощника формы вы все равно можете написать так:
<form action="<?php echo site_url('form/search'); ?>">
Затем добавьте метод search
в контроллер form
:
function search() { //get form field $search = $this->input->post('search'); // do stuffs here //... }
Помните, что CI помогает вам в базовой организации кода и предоставляет полезную библиотеку и помощник. Но вам все равно нужно написать алгоритм процесса на вашем сайте.
Не забудьте прочитать прилагаемое руководство пользователя в загруженном пакете codeigniter. Вы можете узнать много материалов из приведенного здесь примера. Не стесняйтесь спрашивать то, что вы не знаете здесь, многие члены stackoverflow помогут вам.
Это проверка формы и отправка в контроллер. Весь класс контроллера.
class MY_Controller extends CI_Controller { function __construct() { parent::__construct(); $this->load->library(array('session','form_validation')); $this->load->helper(array('form', 'url', 'date')); //$this->load->config('app', TRUE); //$this->data['app'] = $this->config->item('app'); } } <?php if (!defined('BASEPATH')) exit('No direct script access allowed'); class Article extends MY_Controller { function __construct() { parent::__construct(); $this->load->model('article_model'); } public function index() { $data['allArticles'] = $this->article_model->getAll(); $data['content'] = $this->load->view('article', $data, true); $this->load->view('layout', $data); } public function displayAll() { $data['allArticles'] = $this->article_model->getAll(); $data['content'] = $this->load->view('displayAllArticles', $data, true); $this->load->view('layout', $data); } public function displayArticle($id) { $data['article'] = $this->article_model->read($id); $data['articleId'] = $id; $data['comment'] = $this->load->view('addComment', $data, true); $data['content'] = $this->load->view('displayArticle', $data, true); $this->load->view('layout', $data); } public function add() { $this->form_validation->set_message('required', '%s is required'); $this->form_validation->set_rules('title', 'Title', 'required|xss_clean'); $this->form_validation->set_rules('description', 'Description type', 'required|xss_clean'); $this->form_validation->set_error_delimiters('<p class="alert alert-danger"><a class="close" data-dismiss="alert" href="#">×</a>', '</p>'); if ($this->form_validation->run() == TRUE) { $article = array( 'title' => $this->input->post('title'), 'description' => $this->input->post('description'), 'created' => date("Ymd H:i:s") ); $this->article_model->create($article); redirect('article', 'refresh'); } else { $data['article'] = array( 'title' => $this->input->post('title'), 'description' => $this->input->post('description'), ); $data['message'] = validation_errors(); $data['content'] = $this->load->view('addArticle', $data, true); $this->load->view('layout', $data); } } }
Мы можем использовать обычную html-форму, как это.
<?php echo $message; ?> <form method="post" action="article/add" id="article" > <div class="form-group"> <label for="title">Article Title</label> <input type="text" class="form-control" id="title" name="title" value="<?php echo $article['title']; ?>" > </div> <div class="form-group"> <label for="description">Description</label> <textarea class="form-control" rows="13" name="description" id="description"><?php echo $article['description']; ?></textarea> </div> <button type="submit" class="btn btn-default">Submit</button> </form> </div> </div>
Попробуйте использовать codeigniter 'site_url' в своем действии, чтобы убедиться, что вы указываете нужное место. Действие в вашем примере перешло бы на контроллер поиска, а не на контроллер формы.
<html> <head> <title>Search</title> </head> <body> <form action="<?= site_url('form/process_search') ?>"> <input type="text" name="search" value="" size="50" /> <div><input type="submit" value="Submit" /></div> </form> </body> </html>
index используется только в вашем контроллере, когда ничего не передается. Поэтому в случае моего примера выше вы хотели бы что-то вроде этого:
function Form() { parent::Controller(); } function process_search() { print "<pre>"; print_r($_POST); print "</pre>"; }
В Nettuts есть отличный учебник для формы входа в систему CodeIgniter. Следуйте за скринкастом, и он очистит ваши вопросы.
http://net.tutsplus.com/videos/screencasts/codeigniter-from-scratch-day-6-login/
замените это <form action="search">
на <?php echo form_open('form/search');?>
и файл autoload.php add $autoload['helper'] = array('form');
а затем файл не использует файл search.php, просто добавьте свой код search.php в ваш файл Controller, как здесь
class Form extends Controller { function Form() { parent::Controller(); } function index() { $this->load->view('form'); } function search(){ //your code here } }