Как обработать форму с CodeIgniter - PullRequest
13 голосов
/ 17 февраля 2010

Я новичок в 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, но при обработке он показывает, что страница не найдена ...

Ответы [ 6 ]

32 голосов
/ 18 февраля 2010

In 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 View в себя и затем запускает его. View генерирует код (обычно HTML, но не обязательно), с которым взаимодействует пользователь. Когда пользователь делает запрос, который представление не может обработать (запрашивает дополнительные данные или другую страницу), он передает этот запрос обратно в контроллер, который загружает дополнительные данные или другое представление.

Другими словами, представление определяет способ отображения данных. Контроллер сопоставляет запросы с представлениями.

Это немного усложняется, если вы хотите, чтобы сложные и / или изменяющиеся данные отображались в виде. Чтобы поддерживать разделение интересов , которое требуется для MVC, CodeIgniter также предоставляет вам Модели .

Модели отвечают за самую сложную часть любого веб-приложения - управление потоком данных. Они содержат методы для чтения данных, записи данных и, что наиболее важно, методы для обеспечения целостности данных. Другими словами, модели должны:

  • Убедитесь, что данные в правильном формате.
  • Убедитесь, что данные не содержат ничего (вредоносного или иного), которое могло бы нарушить среду, для которой они предназначены.
  • Имеют методы для C . Обработки, R .eading, U .pdating и D . Удаления данных в пределах вышеуказанного ограничения.

Akelos имеет хорошее графическое изображение компонентов 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);
}
10 голосов
/ 17 февраля 2010

Просмотр файла бесполезен без контроллера, чтобы загрузить и отобразить его. Вы должны создать контроллер для получения данных формы, обработки их, а затем отображения результата процесса.

Вы можете использовать помощник по форме для установки открытых тегов формы, а также тегов закрытия:

<?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 помогут вам.

1 голос
/ 06 августа 2014

Это проверка формы и отправка в контроллере Весь мой класс контроллера

    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>
0 голосов
/ 03 декабря 2012

заменить <form action="search"> на <?php echo form_open('form/search');?> и файл autoload.php добавьте $autoload['helper'] = array('form');

и затем файл не использует файл search.php, просто добавьте свой код search.php в ваш файл контроллера как здесь

class Form extends Controller {

  function Form() {
    parent::Controller();   
  }

  function index() {    
    $this->load->view('form');
  }

function search(){
//your code here
}
}
0 голосов
/ 17 февраля 2010

Nettuts имеет отличный учебник для CodeIgniter для формы входа. Следуйте скринкасту, и он прояснит ваши вопросы.

http://net.tutsplus.com/videos/screencasts/codeigniter-from-scratch-day-6-login/

0 голосов
/ 17 февраля 2010

Попробуйте использовать codeigniter 'site_url' в своем действии, чтобы убедиться, что вы указываете на правильное место. Действие в вашем примере пошло бы на контроллер 'search', а не на контроллер 'form'.

<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 используется только в вашем контроллере, когда больше ничего не передается. Так что в случае моего примера выше вы хотели бы что-то вроде этого:

<code>function Form()
{
    parent::Controller();   
}

function process_search()
{   

     print "<pre>";

     print_r($_POST);

     print "
"; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...