Как обрабатывать форму с помощью CodeIgniter
Я новичок в 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, но когда он обрабатывается, он показывает, что страница не найдена...
Ответы
Ответ 1
В настройках M.odel V.iew C.ontroller, таких как 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
в себя, а затем запускает его. Представление генерирует код (обычно HTML, но не обязательно), с которым взаимодействует пользователь. Когда пользователь делает запрос, который представление не может обработать (запрашивает дополнительные данные или другую страницу), он передает этот запрос обратно в контроллер, который загружает дополнительные данные или другое представление.
Другими словами, представление определяет, как будут отображаться данные. Контроллер сопоставляет запросы с представлениями.
Это немного усложняется, если вы хотите, чтобы в представлении отображались сложные и/или изменяющиеся данные. Чтобы поддерживать разделение интересов, которое требует MVC, CodeIgniter также предоставляет вам Модели.
Модели отвечают за самую сложную часть любого веб-приложения - управление потоком данных. Они содержат методы для чтения данных, записи данных и, что наиболее важно, методы для обеспечения целостности данных. Другими словами, модели должны:
- Убедитесь, что данные в правильном формате.
- Убедитесь, что данные не содержат ничего (вредоносного или иного), которое могло бы нарушить среду, для которой они предназначены.
- Обладают методами для C.reating, R.eading, U.pdating и D.eleting данных в рамках вышеуказанных ограничений.
Акелос имеет хорошее графическое изображение компонентов MVC:
(источник: akelos.org)
При этом самый простой (читайте "самый простой", а не "самый расширяемый") способ выполнить то, что вы хотите сделать, это:
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);
}
Ответ 2
Просмотр файла бесполезен, если контроллер не загружает и не отображает его. Вы должны создать контроллер для получения данных формы, обработать его, а затем отобразить результат процесса.
Вы можете использовать хелпер формы, чтобы установить открытые формы формы, а также теги закрытия:
<?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 помогут вам.
Ответ 3
Это проверка формы и отправка в контроллер
Весь класс контроллеров
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("Y-m-d 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>
Ответ 4
Попробуйте использовать 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>";
}
Ответ 5
Nettuts имеет отличный учебник для CodeIgniter для формы входа. Следуйте за скринкастом, и он очистит ваши вопросы.
http://net.tutsplus.com/videos/screencasts/codeigniter-from-scratch-day-6-login/
Ответ 6
замените это <form action="search">
на <?php echo form_open('form/search');?>
и файл autoload.php добавить $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
}
}