如何使用CodeIgniter处理表单

时间:2010-02-17 08:43:59

标签: php 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但是当它被处理时它显示找不到页面......

6 个答案:

答案 0 :(得分:32)

M .odel V .iew C .Introller设置,如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系统中,无论语言如何),您的ControllerForm都会调用一个加载form.html {{3}的函数} 自身,然后运行它。 View生成用户与之交互的代码(通常是HTML,但不一定)。当用户发出View无法处理的请求(请求更多数据或其他页面)时,它会将该请求传递回Controller,后者会加载更多数据或其他View。

换句话说,视图决定了数据的显示方式。 Controller将请求映射到Views。

如果要在视图中显示复杂和/或更改的数据,则会稍微复杂一些。为了维护MVC要求的 View ,CodeIgniter还为您提供了separation of concerns

模型负责任何Web应用程序中最困难的部分 - 管理数据流。它们包含读取数据,写入数据的方法,最重要的是确保数据完整性的方法。换句话说,模型应该:

  • 确保数据格式正确。
  • 确保数据不包含任何可能破坏其目标环境的内容(恶意或其他)。
  • 拥有 C .reating, R .eading, U .pdating和 D .eleting的方法上述限制内的数据。

Models有一个很好的图形,列出了MVC的组件:

Akelos

话虽这么说,最简单的(阅读“最简单”,而不是“最可扩展”)的方式来完成你想要做的事情是:

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);
}

答案 1 :(得分:10)

如果没有控制器加载和显示它,查看文件就没用了。您必须创建一个控制器来接收表单数据,处理它,然后显示处理结果。

您可以使用表单助手设置表单开放标记,也可以使用关闭标记:

<?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的许多成员都会帮助你。

答案 2 :(得分:1)

这是表单验证并在控制器中提交 我的整个控制器类

    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>

答案 3 :(得分:0)

尝试在动作中使用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>";
}

答案 4 :(得分:0)

Nettuts有一个很棒的CodeIgniter for Login表格教程。按照截屏视频进行操作,它将清除您的问题。

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

答案 5 :(得分:0)

将此<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
}
}