web-dev-qa-db-fra.com

Comment traiter un formulaire avec CodeIgniter

Je suis nouveau sur CodeIgniter. J'ai besoin de traiter un formulaire. J'ai une page form.html en vue

<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>

et contrôleur de forme

class Form extends Controller {

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

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

}

et j'ai un fichier de vue search.php mais quand il est traité il montre la page non trouvée ...

13
Ramesh

DansM. OdelV.iewC. Ontroller, comme CodeIgniter, les vues sont des éléments de l'interface utilisateur. Ils ne doivent pas analyser les résultats.

Si je ne me trompe pas, ce que vous cherchez à faire est de passer des données de www.yoursite.com/index.php/form à www.yoursite.com/index.php/search

En php non structuré, vous pourriez avoir unform.htmlavec une action de forme desearch.php. Un utilisateur accéderait à yoursite.com/form.html, qui appellerait yoursite.com/search.php, ce qui pourrait rediriger vers yoursite.com/results.php.

Dans CodeIgniter (et, si je comprends bien, dans n’importe quel système MVC, quelle que soit la langue), votre Controller , Form appelle une fonction qui charge le form.htmlView en lui-même et puis l'exécute. View génère le code (généralement HTML, mais pas nécessairement) avec lequel l'utilisateur interagit. Lorsque l'utilisateur fait une demande que la vue ne peut pas gérer (demandes pour plus de données ou une autre page), il renvoie cette demande au contrôleur, qui charge plus de données ou une autre vue.

En d'autres termes, la vue détermine le mode d'affichage des données. Le contrôleur mappe les demandes aux vues.

Cela devient légèrement plus compliqué lorsque vous souhaitez afficher des données complexes et/ou changeantes dans une vue. Afin de maintenir la séparation des problèmes que MVC requiert CodeIgniter vous fournit également Models .

Les modèles sont responsables de la partie la plus difficile de toute application Web: la gestion du flux de données. Ils contiennent des méthodes pour lire des données, écrire des données et, plus important encore, des méthodes pour assurer l'intégrité des données. En d'autres termes, les modèles doivent:

  • Assurez-vous que les données sont au bon format.
  • Assurez-vous que les données ne contiennent rien (malveillant ou autre) susceptible de casser l'environnement auquel il est destiné.
  • Posséder des méthodes pourC. Reating,Reading,U. Pdating etD. suppression des données dans les limites des contraintes ci-dessus.

Akelos a un bon graphique présentant les composants de MVC:

Request - Réponse http://svn.akelos.org/trunk/docs/images/akelos_mvc.png

Cela étant dit, le moyen le plus simple (lisez "plus facile", pas "plus extensible") pour accomplir ce que vous voulez faire est:

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);
}
32
Sean Vieira

Le fichier de vue est inutile sans le contrôleur pour le charger et l’afficher. Vous devez créer un contrôleur pour recevoir les données de formulaire, les traiter, puis afficher le résultat du processus.

Vous pouvez utiliser un assistant de formulaire pour définir les balises ouvertes, ainsi que les balises fermantes:

<?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(); ?>

Sans l'aide de formulaire, vous pouvez toujours l'écrire de cette façon:

<form action="<?php echo site_url('form/search'); ?>">

Ajoutez ensuite la méthode search au contrôleur form:

function search()
{
  //get form field
  $search = $this->input->post('search');
  // do stuffs here
  //...
}

N'oubliez pas que CI ne vous aide qu'avec l'organisation du code de base et fournit une bibliothèque et une aide utiles. Mais vous devez toujours écrire l'algorithme du processus sur votre site.

N'oubliez pas de lire le guide de l'utilisateur inclus dans le package codeigniter téléchargé. Vous pouvez apprendre beaucoup de choses à partir de l'exemple ci-dessous. N'hésitez pas à demander des choses que vous ne connaissez pas ici, de nombreux membres de stackoverflow vous aideront.

10
Donny Kurnia

Ceci est la validation du formulaire et le soumettre au contrôleur Ma classe de contrôleur entière

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

    }

Nous pouvons utiliser une forme HTML normale comme celle-ci.

            <?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>
1
cgwCode

Essayez d’utiliser le codeigniter 'site_url' dans votre action pour vous assurer que vous pointez au bon endroit. L'action dans votre exemple aurait été attribuée au contrôleur "recherche" plutôt qu'au contrôleur "formulaire".

<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 n'est utilisé dans votre contrôleur que lorsque rien d'autre n'est passé. Donc, dans le cas de mon exemple ci-dessus, vous voudriez quelque chose comme ceci:

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

function process_search()
{   

     print "<pre>";

     print_r($_POST);

     print "</pre>";
}
0
Shane

remplacez ce <form action="search"> par <?php echo form_open('form/search');?> et le fichier autoload.php add $autoload['helper'] = array('form');

et puis le fichier n'utilise pas le fichier search.php, ajoutez simplement votre code search.php dans votre fichier Controller comme ici

class Form extends Controller {

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

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

function search(){
//your code here
}
}
0
slav

Nettuts propose un excellent tutoriel pour CodeIgniter for Login. Suivez le screencast et il clarifiera vos questions.

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

0
Yada