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 ...
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.html
avec 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.html
View 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:
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);
}
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.
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="#">×</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>
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>";
}
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
}
}
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/