2010-02-17 21 views
13

Soy nuevo en CodeIgniter. Necesito procesar un formulario. Tengo una página en vista form.htmlCómo procesar un formulario con CodeIgniter

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

y la forma controlador

class Form extends Controller { 

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

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

} 

y tengo una search.php archivo de vista, pero cuando se procesa demuestra página no encontrada ...

Respuesta

10

Ver el archivo es inútil sin el controlador para cargarlo y mostrarlo. Debe crear un controlador para recibir los datos del formulario, procesarlo y luego mostrar el resultado del proceso.

Puede utilizar un asistente de formulario para establecer las etiquetas de apertura de forma, también los estrechos tags:

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

Sin utilizar el asistente de formulario, todavía se puede escribir de esta manera:

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

Entonces añadir el método search en form controlador:

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

Rem Es importante que CI solo lo ayude con la organización básica del código y brinde una útil biblioteca y ayuda. Pero aún necesita escribir el algoritmo del proceso en su sitio.

No olvide leer la guía del usuario incluida en el paquete codeigniter descargado. Puedes aprender muchas cosas del ejemplo allí. No dude en preguntar cosas que no sabe aquí, muchos miembros de stackoverflow le ayudarán.

0

Pruebe usar codeigniter 'site_url' en su acción para asegurarse de que está apuntando al lugar correcto. La acción en su ejemplo habría ido al controlador de "búsqueda" en lugar de al controlador "formulario". Índice

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

sólo se utiliza en el controlador cuando nada más se pasa .. Así que en el caso de mi ejemplo anterior se querría algo así:

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

function process_search() 
{ 

    print "<pre>"; 

    print_r($_POST); 

    print "</pre>"; 
} 
31

En M .odel V .iew C configuraciones .ontroller como CodeIgniter Las vistas son elementos de la interfaz de usuario. No deberían estar analizando los resultados.

Si no me equivoco, lo que está buscando que hacer es pasar datos desde www.yoursite.com/index.php/form a www.yoursite.com/index.php/search

en PHP no estructurada es posible que tenga un form.html con una acción de forma de search.php. Un usuario navegaría al yoursite.com/form.html, que llamaría al yoursite.com/search.php, que podría redireccionar al yoursite.com/results.php.

En CodeIgniter (y, por lo que yo entiendo, en cualquier sistema de MVC, independientemente del idioma) Controller su Form, llama a una función que carga el form.htmlViewen sí mismo y luego lo ejecuta. El View genera el código (generalmente HTML, pero no necesariamente) con el que el usuario interactúa. Cuando el usuario realiza una solicitud que la Vista no puede procesar (solicitudes de más datos u otra página) devuelve esa solicitud al Controlador, que carga más datos u otra Vista.

En otras palabras, la vista determina cómo se mostrarán los datos. El controlador asigna solicitudes a Vistas.

Se vuelve un poco más complicado cuando quiere que los datos complejos y/o cambiantes se muestren en una vista. Para mantener el separation of concerns que MVC requiere CodeIgniter también le proporciona Models.

Los modelos son responsables de la parte más difícil de cualquier aplicación web: administrar el flujo de datos. Contienen métodos para leer datos, escribir datos y, lo que es más importante, métodos para garantizar la integridad de los datos. En otras palabras, los modelos deben:

  • Asegúrese de que los datos estén en el formato correcto.
  • Asegúrese de que los datos no contengan nada (malicioso o de otro tipo) que pueda dañar el entorno para el que está destinado.
  • Poseer métodos para C .reating, R .eading, U .pdating, y D datos .eleting dentro de las limitaciones anteriores.

Akelos tiene un buen gráfico que pone a cabo los componentes de MVC:

Request - Response http://svn.akelos.org/trunk/docs/images/akelos_mvc.png

Dicho esto, el más simple (léase "más fácil", no "más ampliable") manera de lograr lo que usted querer hacer es:

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

+1 - My Optimistic Upvote. Es claro y acogedor.No soy lo suficientemente habilidoso para evaluar cuán cierto es, pero voy a ver si puedo usarlo para serlo. – Smandoli

+0

'$ term = $ this-> input-> post ('search'); 'here ...' search 'es el nombre del formulario, ¿correcto? –

+2

@b_dubb - 'search' es el nombre del * campo *:' '. –

0

reemplazar esta <form action="search"> con <?php echo form_open('form/search');?> y el archivo autoload.php añadir $autoload['helper'] = array('form');

y luego presentar literatura no toman search.php archivo sólo tiene que añadir su código search.php en el archivo de controlador como aquí

class Form extends Controller { 

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

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

function search(){ 
//your code here 
} 
} 
1

Esta es la validación de formularios y presentar en el controlador de Mi toda clase de controlador

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

    } 

podemos utilizar formulario hTML normal como esto.

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