2009-12-29 10 views
6

सबमिट करने के बाद असफल सत्यापन पर फिर से पॉप्युलेटिंग फ़ॉर्म मेरे पास एक ऐसा फॉर्म है जिसके लिए उपयोगकर्ता को कुछ जानकारी दर्ज करने की आवश्यकता है। यदि वे आवश्यक फ़ील्ड को पूरा करने में असफल होते हैं तो उन्हें फॉर्म के साथ फिर से प्रस्तुत किया जाता है; पृष्ठ के शीर्ष को सूचित करते हुए कि किन फ़ील्ड आवश्यक हैं और मैंने चिपचिपा रूपों (set_value()) को सक्षम किया है, इसलिए उनका इनपुट खो नहीं गया है।कोडिनेटर -

मैं उपयोगकर्ता को संदेश प्रदर्शित करने के लिए फ्लैशडाटा का उपयोग कर रहा हूं (यानी, यदि वे डेटाबेस में पहले से मौजूद हैं जो पहले से मौजूद हैं)।

मेरा फॉर्म मेरे नियंत्रक की अनुक्रमणिका विधि में है। सबमिट करते समय मेरे दृश्य से क्लिक किया जाता है, यह मेरे नियंत्रक में add() विधि को कॉल करता है। ऐड() विधि सत्यापन करता है और परिणामों के आधार पर डेटाबेस को सबमिट करता है या अधिक डेटा प्राप्त करने के लिए उपयोगकर्ता को वापस लाता है।

मेरे पास इस तरह से कई समस्याएं हैं जिनसे मैंने यह किया है। 1. यदि सत्यापन विफल रहता है तो मैं अपने फॉर्म पर वापस जाने और सत्यापन त्रुटियों को प्रदर्शित करने के लिए $-> अनुक्रमणिका() का उपयोग कर रहा हूं। अगर मैं रीडायरेक्ट का उपयोग करने का प्रयास करता हूं, तो मैं अपनी सत्यापन त्रुटियों और मेरे $ _POST [] डेटा को खो देता हूं, इसलिए मेरे चिपचिपा रूप खाली हो जाते हैं। 2. $-> इंडेक्स() का उपयोग करके मेरे यूआरएल के अंत में 'एड' जोड़ता है 3. $-> अनुक्रमणिका() का उपयोग फ्लैशडाटा के साथ समस्याएं उत्पन्न करता है। यादृच्छिक परिणाम।

कोई भी विचार?

<?php 
class Restaurant extends Controller { 

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

    function index() { 

     // Load libraries and models 
     $this->load->model('/restaurant/mRestaurantTypes'); 
     $this->load->model('/restaurant/mRestaurant'); 
     $this->load->model('/utilities/mUtilities'); 

     // Get states 
     $stateSelect = array(); 
     $getStates = $this->mUtilities->getStates(); 

     if($getStates->num_rows() > 0) { 
      foreach($getStates->result() as $row) { 
       $stateSelect[$row->abbr] = $row->name; 
      } 
     } 


     // Get restaurant types 
     $restaurantTypes = array(); 
     $getRestaurantTypes = $this->mRestaurantTypes->getRestaurantTypes(); 

     if($getRestaurantTypes->num_rows() > 0) { 
      foreach($getRestaurantTypes->result() as $row) { 
       $restaurantTypes[$row->restaurant_types_id] = $row->type; 
      } 
     } 

     // Create form elements 
     $data['name'] = array(
      'name'  => 'name', 
      'id'  => 'name', 
      'value'  => set_value('name'), 
      'maxlength' => '200', 
      'size'  => '50' 
     ); 

     $data['address'] = array(
      'name'  => 'address', 
      'id'  => 'address', 
      'value'  => set_value('address'), 
      'maxlength' => '200', 
      'size'  => '50' 
     ); 

     $data['city'] = array(
      'name'  => 'city', 
      'id'  => 'city', 
      'value'  => set_value('city'), 
      'maxlength' => '50', 
      'size'  => '25'   
     ); 

     $data['state'] = $stateSelect; 

     $data['zip'] = array(
      'name'  => 'zip', 
      'id'  => 'zip', 
      'value'  => set_value('zip'), 
      'maxlength' => '10', 
      'size'  => '10'  
     ); 

     $data['phone'] = array(
      'name'  => 'phone', 
      'id'  => 'phone', 
      'value'  => set_value('phone'), 
      'maxlength' => '15', 
      'size'  => '15'  
     ); 

     $data['url'] = array(
      'name'  => 'url', 
      'id'  => 'url', 
      'value'  => set_value('url'), 
      'maxlength' => '255', 
      'size'  => '50'  
     ); 

     $data['type'] = $restaurantTypes; 

     $data['tags'] = array(
      'name'  => 'tags', 
      'id'  => 'tags', 
      'value'  => set_value('tags'), 
      'maxlength' => '255', 
      'size'  => '50'  
     ); 

     $data['active'] = array(
      'name'  => 'active', 
      'id'  => 'active', 
      'value'  => 'Y', 
      'maxlength' => '1', 
      'size'  => '2' 
     ); 

     // Set page variables 
     $data_h['title'] = "Add new restaurant"; 

     // Load views 
     $this->load->view('/template/header', $data_h); 
     $this->load->view('/restaurant/index', $data); 
     $this->load->view('/template/footer');  

    } 


    /** 
    * Add the the new restaurant to the database. 
    */ 
    function add() { 

     // Load libraries and models 
     $this->load->library('form_validation'); 
     $this->load->model('/restaurant/mRestaurant'); 

     // Define validation rules 
     $this->form_validation->set_rules('name',  'Name',  'trim|required|max_length[255]|xss_clean'); 
     $this->form_validation->set_rules('address', 'Address', 'trim|required|max_length[100]|xss_clean'); 
     $this->form_validation->set_rules('city',  'City',  'trim|required|max_length[128]|xss_clean'); 
     //$this->form_validation->set_rules('state',  'State', 'trim|required'); 
     $this->form_validation->set_rules('zip',  'Zip',  'trim|required|max_length[128]|xss_clean'); 
     $this->form_validation->set_rules('phone',  'Phone', 'trim|required|max_length[10]|xss_clean'); 
     $this->form_validation->set_rules('url',  'URL',  'trim|required|max_length[255]|xss_clean'); 
     $this->form_validation->set_rules('tags',  'Tags',  'trim|xss_clean'); 


     // Form validation 
     if ($this->form_validation->run() == FALSE) { 

      // On failure 
      $this->index(); 

     } else { 

      // On success, prepare the data 
      $data = array(
       'name'  => $_POST['name'], 
       'address' => $_POST['address'], 
       'city'  => $_POST['city'], 
       'state'  => $_POST['state'], 
       'zip'  => $_POST['zip'], 
       'phone'  => $_POST['phone'], 
       'url'  => $_POST['url'], 
       'type'  => $_POST['type'], 
       'tags'  => $_POST['tags'], 
       'active' => $_POST['active'], 
      ); 

      // Check if the restaurant already exists 
      $check = $this->mRestaurant->getRestaurant($data['name'], $data['zip']); 

      // If no records were returned add the new restaurant 
      if($check->num_rows() == 0) { 
       $query = $this->mRestaurant->addRestaurant($data); 

       if ($query) { 
        // On success 
        $this->session->set_flashdata('status', '<div class="success">Added New Restaurant!</div>'); 
       } else { 
        // On failure 
        $this->session->set_flashdata('status', '<div class="error">Could not add a new restaurant.</div>');  
       } 

       redirect('restaurant/confirm', 'refresh'); 
      } else { 
       // Notify the user that the restaurant already exists in the database 
       $this->session->set_flashdata('status', '<div class="notice">This restaurant already exists in the database.</div>'); 
       redirect('restaurant/index'); 
      } 

     } 

    } 


    function confirm() { 

     $data['title'] = "Confirm"; 

     $this->load->view('/template/header'); 
     $this->load->view('/restaurant/confirm', $data); 
     $this->load->view('/template/footer'); 
    } 
} 
?> 

उत्तर

2

मैं नियंत्रक कि मैं हमेशा प्रयोग तर्क के साथ मदद करने की कोशिश करेंगे:

function index() 
{ 
    //set some default variables 
    $data['error_message'] = ''; 
    //if this is to edit existing value, load it here 
    // from database and assign to $data 
    //... 
    //set form validation rules 
    $validation = array(); 
    $validation['field_name'] = array(
    'field' => 'field_name', 
    'label' => 'Field label', 
    'rules' => 'trim|required' 
); 
    //more rules here 
    //... 
    $this->load->library('form_validation'); 
    $this->form_validation->set_rules($validation); 
    //run validation 
    if ($this->form_validation->run() == FALSE) 
    { 
    $data['error_message'] .= validation_errors(); 
    } 
    else 
    { 
    //do insert/update 
    // 
    //it's better to do redirection after receiving post request 
    //you can use flashdata for success message 
    if ($success) 
    { 
     $this->session_set_flashdata('success_message', MESSAGE_HERE); 
    } 
    redirect(RESULT_PAGE); 
    } 
    //reaching this block can have 2 meaning, direct page access, or not have valid form validation 
    //assign required variables, such as form dropdown option, etc 
    //... 
    //load view 
    $this->load->view(VIEW_FILE, $data); 
} 

देखें फ़ाइल:

... 
<?php if ($error_message): ?> 
    <?php echo $error_message; ?> 
<?php endif; ?> 
<?php echo form_open(current_url, array('id' => 'some_form_id')); ?> 
<!-- form field here --> 
<label for="field_name">Field label</label> 
<input name="field_name" value="<?php echo set_value('field_name', $DEFAULT_FIELD_NAME_IF_NEEDED); ?>" /> 
<!-- more form field here --> 
<?php echo form_close(); ?> 
... 

मुझे आशा है कि यह आप में मदद मिलेगी।

दृश्य फ़ाइल में $DEFAULT_FIELD_NAME_IF_NEEDED के लिए, यदि मैं यह फॉर्म पृष्ठ डेटाबेस से मौजूदा डेटा को संपादित करना है तो डिफ़ॉल्ट मान को पास करने के लिए इसका उपयोग करता हूं। आप नियंत्रक में डेटा लोड कर सकते हैं, फिर इसे फ़ाइल देखने के लिए पास कर सकते हैं और इसे फॉर्म फ़ील्ड में प्रदर्शित कर सकते हैं।

0

आप फॉर्म पोस्ट को इंडेक्स में रखने का प्रयास कर सकते हैं, और इंडेक्स विधि में, फॉर्म सबमिट होने पर सत्यापन करें। फिर या तो इंडेक्स व्यू प्रस्तुत करें (यदि त्रुटियां हैं) या रेस्तरां जोड़ें और पुष्टिकरण दृश्य प्रस्तुत करें।

+0

मैंने सभी कोड को() विधि से इंडेक्स() में स्थानांतरित कर दिया है, तो मैंने यह सत्यापित करने का प्रयास किया कि से सबमिट किया गया है या नहीं: अगर (जारी ($ _ POST ['add']) {~~} यह पहली बार काम करता है जब फॉर्म प्रस्तुत किया जाता है; हालांकि, क्योंकि $ _POST ['add'] सेट है, अगली बार जब उपयोगकर्ता जोड़ता है और सत्यापन नियम अभी भी पूरा नहीं हुए हैं तो यह लूप होगा। मैं अभी भी इंडेक्स में सभी कोड लंपने के बजाय ऐड() विधि का उपयोग करना चाहता हूं। – mazer

+0

मुझे लगता है कि आप इसे लूप करना चाहते हैं जब तक सत्यापन नियम सभी पास न हों, है ना? और आप अपने सभी सत्यापन को स्थानांतरित कर सकते हैं और निजी विधियों या लाइब्रेरी विधियों में कोड जोड़ सकते हैं और फिर वांछित होने पर उन्हें इंडेक्स विधि से कॉल कर सकते हैं। – Coomer

1

मैं एक ऐसी ही समस्या थी और मैं कर रहा समाप्त हो गया:

मेरे प्रपत्र नया उपयोगकर्ता बनाने के लिए है, लेकिन आप विचार प्राप्त करना चाहिए।

if($this->form_validation->run() == FALSE) 
     { 
      $this->data['title'] = "Add User"; 
      $this->load->vars($this->data); 
      $this->load->view('head'); 
      $this->load->view('header'); 
      $this->load->view('admin/sidebar'); 
      $this->load->view('admin/add_user'); 
      $this->load->view('footer'); 
     } 

तो नए फ़ंक्शन को कॉल करने के बजाय प्रभावी रूप से मैं उसी कार्य से नया दृश्य दिखा रहा था। सबसे अच्छा समाधान नहीं है लेकिन यह काम करता है। इसके अलावा, आप जांच करने के लिए कुछ इस तरह उपयोग करना चाहते हैं रेस्टोरेंट पहले से मौजूद हो सकता है:

function _check_username($str) 
{ 
    $this->db->where('username', $str); 
    $query = $this->db->get('sm_users'); 

    if($query->num_rows() == 0) 
    { 
     return TRUE; 
    } 
    else 
    { 
     $this->form_validation->set_message('_check_username', "User '$str' already exists!"); 
     return FALSE; 
    } 
} 

और उपयोग कॉलबैक मान्यता समारोह:

$this->form_validation->set_rules('userName','User Name','trim|required|min_length[3]|callback__check_username'); 
+0

मेरे पास एक ही समस्या थी, '$ this-> load-> लाइब्रेरी (' form_validation ');' इस लाइन को '__constructor' में ले जाया गया और यह काम करता है –

2

------- नियंत्रक ---- ---

 
$data['post'] = $_POST; 
$this->load->view('view/view', $data); 

तो अपने ध्यान में रखते हुए

<input type="text" value="><?=$post['username'];?>" name="username">