Как обрабатывать форму с помощью 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:

Request - Response
(источник: 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="#">&times;</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>";
}

Ответ 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
}
}