2010-09-30 5 views
0

J'ai un formulaire qui a des sections cachées jusqu'à ce que, la bonne donnée est soumise. Je veux le faire par jQuery et ajax. J'espérais que je serais montrent en mesure l'élément suivant sur le formulaire si le dernier morceau est entré dans la base de données ok, actuellement mon contrôleur ressemble à ceci,codeigniter et l'aide ajax

function add_career() { 
    $data = array(); 
    $this->load->model('admin_model'); 
    $this->load->library('form_validation'); 

     if($this->input->post('career_set') == 'Save') { 

      $this->form_validation->set_rules('career_name', 'Career name', 'required|min_length[3]'); 
      $this->form_validation->set_rules('career_desc', 'Career description', 'required|max_length[3000]'); 
      $this->form_validation->set_rules('useful_info', 'Useful Information', 'max_length[1000]'); 
      $this->form_validation->set_rules('useful_links', 'Useful Links', 'max_length[1000]'); 
      if ($this->form_validation->run() == FALSE) { 
       $this->template->build('admin/add_career'); 
      } else { 
       if($this->input->post('degree_needed')) { 
        $degree_needed = 'Yes'; 
       } else { 
        $degree_needed = 'No'; 
       } 

       $this->load->model('careers'); 
       $insertCareer = $this->careers->save(
       $this->input->post('career_name'), 
       $this->input->post('career_desc'), 
       $degree_needed, 
       $this->input->post('useful_info'), 
       $this->input->post('useful_links') 
       ); 

       $insertCareer['career_id'] = $this->db->insert_id(); 

       //save the data in the session, so we can to it if need be 
       $this->session->set_userdata(array('career' => $insertCareer)); 
       $this->firephp->log($this->session->userdata);  
       } 

     } 
     $careerData = $this->session->userdata('career'); 
     if($this->input->post('salary_set') == 'Save') { 
       $this->form_validation->set_rules('basic_salary', 'Basic salary', 'required|max_length[12]'); 
       $this->form_validation->set_rules('trained_salary', 'Fully trained salary', 'required|max_length[12]'); 
       $this->form_validation->set_rules('progressed_salary', 'Progressing onto salary', 'required|max_length[12]'); 
       $this->form_validation->set_rules('average_salary', 'Average salary', 'required|max_length[12]'); 

       if ($this->form_validation->run() == FALSE) { 
         $this->template->build('admin/add_career'); 
       } else { 
        $this->load->model('salaries'); 
        $insertSalary = $this->salaries->save(
         $this->input->post('basic_salary'), 
         $this->input->post('trained_salary'), 
         $this->input->post('progressed_salary'), 
         $this->input->post('average_salary'), 
         $careerData['career_id'] 
        ); 

       $this->session->set_userdata(array('salary' => $insertSalary)); 
       $this->firephp->log($this->session->userdata);  
       } 
     } 

     if($this->input->post('course_grades_set') == 'Save') { 
      //first off we need to save the grade details 

      $this->load->model('grades'); 
      $this->load->model('course'); 
      $this->firephp->log(count($_POST['grade_desc'])); 

      foreach ($_POST['grade_desc'] as $k => $v) { 
       $this->firephp->log($v, 'Looped Results'); 
       $insertGrade = $this->grades->save($v, $careerData['career_id']); 
       // theorertically we should be able to save the assicated course at the same time using $k 
       $insertCourse = $this->course->save(
        $_POST['course_type'][$k], 
        $_POST['course_names'][$k], 
        $_POST['course_links'][$k], 
        $this->db->insert_id() 
       ); 
       $this->firephp->log($insertGrade, $k); 
       $this->firephp->log($insertCourse, $k); 
      } 
      //$insertGrades = $this->grades->save() 
      //); 
     } 




    $this->template->build('admin/add_career', $data); 
} 

J'ai besoin essentiellement à mon ajax pour vérifier que la dernière les données ont été soumises à la base de données ok et ensuite changer l'affichage aucun sur le formulaire suivant pour afficher le bloc? Est-ce tout possible? Comment puis-je vérifier que les données ont été enregistrées avec succès avant de montrer l'étape suivante du formulaire.

Répondre

0

Réponse courte: oui tout est possible. Comment ?

D'abord la partie JQuery

Vous pouvez utiliser jQuery comme vous le feriez tout autre site (non-cadre). Votre URL dans une fonction $.post() ressemblerait à ceci.

$.post(
    'http://example.com/index.php/controller/function_name", 
    {key1:value1,key2:value2}, 
    function(data){ 
     //function to execute when return data received from 'function_name' in url 
     //this is where you would show the next step of the form 
    }, 
    type of data being returned(html, json) 
    ); 

La partie validation

Je suggère que vous avez quelques options. La première est que vous pouvez soumettre vos données à une fonction de contrôleur qui travaille ensuite avec un modèle ou la base de données. Vous pouvez ensuite récupérer la dernière ligne insérée et voir si elle correspond à vos données soumises dans la même fonction de contrôleur. Vérifiez cette question: Select last insert id

0

Vous ne devriez pas retourner la vue dans add_career() si vous voulez la changer plus tard avec jQuery.

Vous devez retourner le résultat de la sauvegarde() fonction, si elle retourne

$this->db->affected_rows() >= 0; 

vous pouvez vérifier le texte de réponse et faire ce que vous voulez à partir de là ...

REMARQUE: Je préférerais retourner un fichier XML et utiliser cette aproche:

$.ajax({ 
    url: "the/path/to/the/function/", 
    type: 'POST', 
    dataType: 'xml', 
    data: $('#your_form').serialize(), 
    timeout: 15000, 
    error: function(){ 

    }, 
    success: function(xml){ 
     //and away we go.... 
    } 
}); 
0

une solution très simple est disponible d'abord diviser vos sections en di contre. La partie actuellement affichée définit sa valeur sur 1 à l'aide d'un champ de saisie masqué. Affectez des champs masqués à tous les blocs div et définissez leurs valeurs sur 0. Affectez une classe à tous les champs de saisie. Lorsque l'ajax est déclenché et que la réponse est réussie Faites ceci Cette partie masque la div actuelle.

$('.class_name').click(function(){ 
     var value = $(this).val(); 
     if(value == 1){ 
       $(this).val() = 0; 
       $(this).parent().hide(); 
     }else{ 
       $(this).parent().siblings('div').find('input').val() = 1; 
     } 
});