Come elaborare un module con CodeIgniter

Sono nuovo di CodeIgniter. Ho bisogno di elaborare un module. Ho una pagina form.html in vista

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

e forma il controller

 class Form extends Controller { function Form() { parent::Controller(); } function index() { $this->load->view('form'); } } 

e ho un file di visualizzazione search.php ma quando viene elaborato mostra una pagina non trovata …

In M .odel V .iew C setup di controller come CodeIgniter i Views sono elementi dell'interface utente. Non dovrebbero analizzare i risultati.

Se non mi sbaglio, quello che stai cercando di fare è passare i dati da www.yoursite.com/index.php/form a www.yoursite.com/index.php/search

Nel php non strutturato potresti avere un form.html con un'azione module di search.php . Un utente potrebbe navigare su yoursite.com/form.html , che chiamerebbe yoursite.com/search.php , che potrebbe redirect a yoursite.com/results.php .

In CodeIgniter (e, per quanto ho capito, in qualsiasi sistema MVC, indipendentemente dalla lingua) il tuo Controller , Form chiama una function che carica form.html View in se stesso e poi lo esegue. La vista genera il codice (generalmente HTML, ma non necessariamente) con cui l'utente interagisce. Quando l'utente effettua una richiesta che la vista non può gestire (richieste per più dati o un'altra pagina) passa la richiesta al controller, che carica più dati o un'altra vista.

In altre parole, la vista determina come verranno visualizzati i dati. Il controller mappa le richieste alle viste.

Diventa leggermente più complicato quando si desidera avere dati complessi e / o cambianti visualizzati in una vista. Al fine di mantenere la separazione delle preoccupazioni che MVC richiede CodeIgniter fornisce anche Modelli .

I templates sono responsabili della parte più difficile di qualsiasi applicazione Web – la gestione del stream di dati. Contengono methods per leggere dati, scrivere dati e, soprattutto, methods per garantire l'integrità dei dati. In altre parole i templates dovrebbero:

  • Assicurarsi che i dati siano nel formato corretto.
  • Assicurarsi che i dati non contengano nulla (dannoso o altro) che possa rompere l'ambiente per cui è destinato.
  • Possedere methods per C .reating, Reading, U .pdating e D. Eletare i dati all'interno dei vincoli di cui sopra.

Akelos ha una buona grafica che illustra i componenti di MVC:

Richiesta – Risposta http://svn.akelos.org/trunk/docs/images/akelos_mvc.png

Detto questo, il modo più semplice (leggi "più facile", non "più espandibile") per realizzare ciò che vuoi fare è:

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

Il file di visualizzazione è inutile senza che il controller lo carichi e lo mostri. È necessario creare un controller per ricevere i dati del module, elaborarlo e quindi visualizzare il risultato del process.

È ansible utilizzare un helper di module per impostare i tag di apertura del module, anche i tag di chiusura:

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

Senza usare l'aiuto di forma, puoi comunque scrivere in questo modo:

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

Quindi aggiungi il metodo di search al controller del form :

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

Ricorda che l'IC ti aiuta solo con l'organizzazione del codice di base e fornisce una libreria e un aiuto utili. Ma hai ancora bisogno di scrivere l'algorithm del process nel tuo sito.

Non dimenticare di leggere la guida per l'utente inclusa nel pacchetto codeigniter scaricato. Puoi imparare molte cose dall'esempio qui. Non esitare a chiedere cose che non conosci qui, molti membri di StackOverflow ti aiuteranno.

Questa è la validation del module e l'invio nel controller Tutta la mia class di controller

  class MY_Controller extends CI_Controller { function __construct() { parent::__construct(); $this->load->library(arrays('session','form_validation')); $this->load->helper(arrays('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 = arrays( 'title' => $this->input->post('title'), 'description' => $this->input->post('description'), 'created' => date("Ymd H:i:s") ); $this->article_model->create($article); redirect('article', 'refresh'); } else { $data['article'] = arrays( '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); } } } 

Possiamo usare il normale formato html come questo.

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

Prova a utilizzare il codeigniter "site_url" nella tua azione per assicurarti di puntare al posto giusto. L'azione nel tuo esempio sarebbe andata al controller di 'ricerca' piuttosto che al controller '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 è usato solo nel tuo controller quando non viene passato nient'altro. Quindi, nel caso del mio esempio sopra, vorresti qualcosa di simile a questo:

 function Form() { parent::Controller(); } function process_search() { print "<pre>"; print_r($_POST); print "</pre>"; } 

Nettuts ha un ottimo tutorial per CodeIgniter per il module di Login. Segui lo screencast e chiarirai le tue domande.

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

sostituisci <form action="search"> con <?php echo form_open('form/search');?> e autoload.php file add $autoload['helper'] = arrays('form');

e quindi il file non usa file search.php, semplicemente aggiungi il tuo codice search.php nel tuo file Controller come qui

 class Form extends Controller { function Form() { parent::Controller(); } function index() { $this->load->view('form'); } function search(){ //your code here } }