2017-05-05 3 views
0

Je travaille avec aspnet depuis longtemps, et j'aimerais mettre en œuvre aspnet viewstate avec php (exactement dans codeigniter). Existe-t-il un moyen d'implémenter ASP ViewState avec Codeigniter?Implémenter Viewstate dans codeigniter

+0

Il n'y a pas d'alternative à viewstate dans php. Vous pouvez le coder vous-même ou trouver un framework qui implémente une fonctionnalité similaire. Mais personnellement, viewstate dans asp.net webforms était la chose que je détestais le plus (juste mon sentiment, rien d'autre). – shaggy

+0

Si vous souhaitez repeupler un formulaire après une validation de champ infructueuse, examinez attentivement la documentation de la classe [Form Validation] de CI (https://www.codeigniter.com/user_guide/libraries/form_validation.html). Le principal problème avec cette classe est que la validation ne survivra pas à une redirection dont vous auriez besoin pour implémenter un pattern PRG. Si la mise en œuvre de PRG en utilisant la validation de formulaire de CI est ce que vous voulez, je peux vous montrer comment. – DFriend

+0

Je construis un spa, recharger la page c'est un mal dans le a ** si tu fais quelque chose (remplir un formulaire, éditer quelque chose, etc.), je restaure partiellement la page après le rechargement (utilise la chaîne de requête dans l'url pour charger la dernière action), mais les données que je ne peux pas restaurer (au moins quand je crée, mettre à jour c'est facile). La validation de formulaire ci n'est pas une alternative. –

Répondre

0

Cette réponse permettra d'atteindre certains des objectifs de Viewstate en ce qu'elle conservera les valeurs de contrôle entre les soumissions de formulaire. Si vous vous éloignez de la page, les données seront perdues. Mais c'est pareil pour Viewstate. L'exemple de code fait un usage intensif du Framework CodeIgniter (CI).

Voici une documentation relative aux parties de CI utilisées ici.

La bibliothèque CI_Form_validation souffre de ne pas être en mesure de garder les résultats de la validation à travers une redirection. Cette classe étend CI_Form_validation pour surmonter cette limitation.

fichier: application/bibliothèques/My_Form_validation.php

/** 
* Extends CI_Form_validation to facilitate using the Post/Redirect/Get pattern for form handling. 
* https://en.wikipedia.org/wiki/Post/Redirect/Get 
* http://solidlystated.com/design/best-way-to-process-forms-with-php/ 
* 
* The base class (CI_Form_validation) has the protected property $_field_data 
* which holds all the information provided by form_validation->set_rules() 
* and all the results gathered by form_validation->run(). 
* Form Helper and Form_Validation use the $_field_data to re-populate fields and present error messages. 
* 
* To use this class you must have CodeIgniter Session setup and working. 
* 
* This class stores $_field_data in session flash data for use in the controller method that is the 
* redirect target. 
* 
* Class is handy for defining custom validation methods which will NOT require the "callback_" prefix. 
* 
*/ 
defined('BASEPATH') OR exit('No direct script access allowed'); 

class MY_Form_validation extends CI_Form_validation 
{ 

    public function __construct($rules = array()) 
    { 
     parent :: __construct($rules); 
     $this->CI->load->library('session'); 
    } 

    /** 
    * Enhanced version of form_validation->run(). Sets a $_SESSION item with the contents of $this->_field_data 
    * 
    * @param string $group The name of the validation group to run 
    * @param bool $persistent If TRUE save the state of $_field_data even if validation passes 
    * @return boolean TRUE on success and FALSE on failure 
    */ 
    public function run($group = '', $persistent = FALSE) 
    { 
     if(parent:: run($group)) 
     { 
      if($persistent) 
      { 
       $this->CI->session->set_flashdata('validation_field_data', $this->_field_data); 
      } 
      return TRUE; 
     } 
     $this->CI->session->set_flashdata('validation_field_data', $this->_field_data); 
     return FALSE; 
    } 

    /** 
    * This is used in the redirect target defined in the form processing controller/method 
    * 
    * @return bool TRUE if $_SESSION['validation_field_data'] is set. It indicates that validation failed. 
    * Returns FALSE if there is no indication that validation has failed or even been run. 
    */ 
    public function is_failed_validation() 
    { 
     if(isset($_SESSION['validation_field_data'])) 
     { 
      // Validation failed or is being persisted. 
      $this->_field_data = $_SESSION['validation_field_data']; 
      return TRUE; 
     } 
     return FALSE; 
    } 

    /** 
    * A validation function to cleanup strings 
    * 
    * @param string $str Value of the field 
    * @return string|bool The sanitized string or FALSE if filter_var() fails 
    */ 
    public function sanitize_str($str) 
    { 
     return filter_var($str, FILTER_SANITIZE_STRING); 
    } 

    /** 
    * A do-nothing routine assigned to any field we want included in validation results 
    * @return boolean 
    */ 
    public function alwaysTrue($val) 
    { 
     return TRUE; 
    } 

} 

Espérons que les commentaires expliquent ce qui se passe. Une chose importante à comprendre est que form_validation capture uniquement les données $ _POST pour les contrôles qui ont des règles de validation. C'est la raison de la routine de validation "ne rien faire" alwaysTrue(). Utilisez cette règle sur tout contrôle où vous souhaitez que les valeurs persistent.

Le contrôleur suivant montre un exemple d'utilisation.

fichier: application/controllers/Viewstate.php

class Viewstate extends CI_Controller 
{ 

    public function __construct() 
    { 
     parent::__construct(); 
     $this->load 
      ->library('form_validation', NULL, 'fv') //renames 'form_validation' to 'fv' 
      ->helper(['form', 'url']); 
     $this->fv->set_error_delimiters('<span class="error">', '</span>'); 
    } 

    public function index() 
    { 
     $this->fv->is_failed_validation(); //captures validation data if it's there 

     //Define some data for consumption by CI's Form Helper functions 
     $data['username_field'] = [ 
      'name' => 'username', 
      'id' => 'username', 
      'value' => $this->fv->set_value('username'), 
      'class' => 'your_css', 
     ]; 
     $data['confirm_username_field'] = [ 
      'name' => 'usernameconf', 
      'id' => 'usernameconf', 
      'value' => $this->fv->set_value('usernameconf'), 
      'class' => 'your_css', 
     ]; 
     $data['comment_field'] = [ 
      'name' => 'comment', 
      'id' => 'comment', 
      'value' => $this->fv->set_value('comment'), 
      'class' => 'comment', 
     ]; 
     $data['project_lead_field'] = [ 
      'name' => 'project_lead', 
      'value' => 1, 
      'checked' => $this->fv->set_radio('project_lead', 1, FALSE) 
     ]; 

     $selected_status = ['None' => "None"]; //default dropdown item 
     $status_items = ["None" => "None", "Good" => "Good", 'Bad' => 'Bad', "Ugly" => "Ugly"]; 
     //recover previously posted select item - if any 
     if($item = $this->session->validation_field_data['status']['postdata']) 
     { 
      $selected_status = [$item => $item]; 
     } 
     $data['status_field'] = [ 
      'name' => 'status', 
      'options' => $status_items, 
      'selected' => $selected_status 
     ]; 

     $this->load->view('testcase_view', $data); 
    } 

    /** 
    * This is the "action" that processes the form's posted data 
    */ 
    public function process() 
    { 
     //set rules and error messages at same time 
     $this->fv 
      ->set_rules('username', 'User Name', ['trim', 'required', 'matches[usernameconf]'], 
      ['required' => '<em>{field}</em> required.', 'matches' => "User Names don't match."]) 
      ->set_rules('usernameconf', '', ['trim', 'required'], ['required' => 'Retyping the User Name is required.']) 
      ->set_rules('comment', "", ['trim', 'sanitize_str']) 
      ->set_rules('project_lead', "", 'alwaysTrue') 
      ->set_rules('status', "", 'alwaysTrue') 
     ; 

     //So an uncheck checkbox will be part of the $_POST array 
     if(!isset($_POST['project_lead'])) 
     { 
      $_POST['project_lead'] = 0; 
     } 

     if(FALSE == $this->fv->run('', TRUE)) 
     { 
      redirect('viewstate'); 
     } 
     else 
     { 
      //do something with field values e.g. 
      //$this->model->instert($_POST); 
      redirect('viewstate'); //to prove the page state is persistent 
     } 
    } 
} 

I inclus une validation réelle sur le terrain afin que les lecteurs puissent voir comment cela fonctionne et comment les résultats de validation persistent à travers une redirection.

Voici la vue

Fichier: application/vues/textcase_view.php

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Test Persistent Page</title> 
     <style type="text/css"> 
      p{ 
       margin: 0; 
      } 
      .error { 
       color: #FF0000; 
       font-size: small; 
      } 
      .fld-label{ 
       color: #555; 
       font-size: .9em; 
      } 
      .comment{ 
       color: Blue; 
       font-weight: bold; 
      } 
      div{ 
       margin-bottom: 1em; 
      } 
      div + .fld-label 
      /*div + .error*/ 
      { 
       margin-bottom: 0; 
      } 
     </style> 
    </head> 
    <body> 
     <?= form_open('viewstate/process'); ?> 

     <span class="fld-label">User Name</span> 
     <div><?= form_input($username_field) ?> 
      <p><?= form_error('username'); ?></p> 
     </div> 

     <div class="fld-label">Retype User Name</div> 
     <div><?= form_input($confirm_username_field) ?> 
      <p><?= form_error('usernameconf'); ?></p> 
     </div> 

     <div class="fld-label">Comment</div> 
     <div><?= form_input($comment_field); ?></div> 

     <div class="fld-label">Project Lead?</div> 
     <div><?= form_checkbox($project_lead_field); ?></div> 

     <div class="fld-label">Status</div> 
     <div><?= form_dropdown($status_field); ?></div> 

     <p><input type="submit" value="Submit"></p> 
     <?= form_close(); ?> 
    </body> 
</html> 

La vue utilise beaucoup de fonctions telles que le formulaire Helper form_open, form_close, form_input