Codeigniter: использование URI с формами - PullRequest
1 голос
/ 13 мая 2010

Я использую URI для направления функции в библиотеку ... Просмотр файла (он огромен, поэтому я просто выкладываю начальную строку):

<?php print form_open('survey',array('class'=>'horizontal','id'=>'form_survey'))?>

Библиотека:

function survey_form($container)
{
    $id = $this->CI->session->userdata('id');
    // Setup fields
    for($i=1;$i<18;$i++){
      $fields["a_".$i] = 'Question '.$i;
    }
    for($i=1;$i<24;$i++){
      $fields["b_".$i] = 'Question '.$i;
    }
    $fields["firstname"] = "First Name";
    $fields["lastname"] = "Last Name";
    $fields["phone"] = "Phone";
    $fields["company_name"] = "Company Name";
    $fields['company_address'] = "company_address";
    $fields['company_phone'] = "company_phone";
    $fields['company_state'] = "company_state";
    $fields['company_city'] = "company_city";
    $fields['company_zip'] = "company_zip";
    $fields['job_title'] = "job_title";
    $fields['job_type'] = "job_type";
    $fields['job_time'] = "job_time";
    $fields['department'] = "department";
    $fields['supervisor'] = "supervisor";
    $fields['vision'] = "vision";
    $fields['height'] = "height";
    $fields['weight'] = "weight";
    $fields['hand_dominance'] = "hand_dominance";
    $fields['areas_of_fatigue'] = "areas_of_fatigue";
    $fields['job_description'] = "job_description";
    $fields['injury_review'] = "injury_review";
    $fields['job_positive'] = "job_positive";
    $fields['risk_factors'] = "risk_factors";
    $fields['job_improvement_short'] = "job_improvement_short";
    $fields['job_improvement_long'] = "job_improvement_long";
    $fields["c_1"] = "Near Lift";
    $fields["c_2"] = "Middle Lift";
    $fields["c_3"] = "Far Lift";
    $this->CI->validation->set_fields($fields);

    // Set Rules

    for($i=1;$i<18;$i++){
      $rules["a_".$i]= 'hour|integer|max_length[2]';
    }
    for($i=1;$i<24;$i++){
      $rules["b_".$i]= 'hour|integer|max_length[2]';
    }
    // Setup form default values
    $this->CI->validation->set_rules($rules);

        if ( $this->CI->validation->run() === FALSE )
        {
            // Output any errors
            $this->CI->validation->output_errors();
        }
        else
        {
            // Submit form
            $this->_submit();
        }
    //Tool for current user
    if ($method == 'update') {
        // Modify form, first load
        $this->CI->db->from('be_user_profiles');
        $this->CI->db->where('user_id' , $id);
        $user = $this->CI->db->get();
        $this->CI->db->from('be_survey');
        $this->CI->db->where('user_id' , $id);
        $survey =   $this->CI->db->get();
        $user = array_merge($user->row_array(),$survey->row_array());
        $this->CI->validation->set_default_value($user);

        // Display page
        $data['user'] = $user;
    }
    $data['header'] = 'Risk Assessment Survey';
    $data['page'] = $this->CI->config->item('backendpro_template_public') . 'form_survey';
    $this->CI->load->view($container,$data);
}

Отправить функцию:

function _submit()
{
    $URI = $this->CI->uri->uri_string();
    $new = "new";
    if(strpos($URI, $new) === FALSE){
        $method = "update";
    }
    elseif(strpos($URI, $new) !== FALSE){
        $method = "create";
    }

    //Submit and Update for current User
    $id = $this->CI->session->userdata('id');
    $this->CI->db->select('users.id, users.username, users.email, profiles.firstname, profiles.manager_id');
    $this->CI->db->from('be_users' . " users");
    $this->CI->db->join('be_user_profiles' . " profiles",'users.id=profiles.user_id');
    $this->CI->db->having('id', $id);
    $email_data['user'] = $this->CI->db->get();
    $email_data['user'] = $email_data['user']->row();
    $manager_id = $email_data['user']->manager_id;
    $this->CI->db->select('firstname','email')->from('be_user_profiles')->where('user_id', $manager_id);

    $email_data['manager'] = $this->CI->db->get();
    $email_data['manager'] = $email_data['manager']->row();


    // Fetch what they entered in the form

    for($i=1;$i<18;$i++){
      $survey["a_".$i]= $this->CI->input->post('a_'.$i);
    }
    for($i=1;$i<24;$i++){
      $survey["b_".$i]= $this->CI->input->post('b_'.$i);
    }
    for($i=1;$i<12;$i++){
      $survey["c_".$i]= $this->CI->input->post('c_'.$i);
    }
    $profile['firstname'] = $this->CI->input->post('firstname');
    $profile['lastname'] = $this->CI->input->post('lastname');
    $profile['test_date'] = date ("Y-m-d H:i:s");
    $profile['company_name'] = $this->CI->input->post('company_name');
    $profile['company_address'] = $this->CI->input->post('company_address');
    $profile['company_city'] = $this->CI->input->post('company_city');
    $profile['company_phone'] = $this->CI->input->post('company_phone');
    $profile['company_state'] = $this->CI->input->post('company_state');
    $profile['company_zip'] = $this->CI->input->post('company_zip');
    $profile['job_title'] = $this->CI->input->post('job_title');
    $profile['job_type'] = $this->CI->input->post('job_type');
    $profile['job_time'] = $this->CI->input->post('job_time');
    $profile['department'] = $this->CI->input->post('department');
    $profile['vision'] = $this->CI->input->post('vision');
    $profile['height'] = $this->CI->input->post('height');
    $profile['weight'] = $this->CI->input->post('weight');
    $profile['hand_dominance'] = $this->CI->input->post('hand_dominance');
    $profile['areas_of_fatigue'] = $this->CI->input->post('areas_of_fatigue');
    $profile['job_description'] = $this->CI->input->post('job_description');
    $profile['injury_review'] = $this->CI->input->post('injury_review');
    $profile['job_positive'] = $this->CI->input->post('job_positive');
    $profile['risk_factors'] = $this->CI->input->post('risk_factors');
    $profile['job_improvement_short'] = $this->CI->input->post('job_improvement_short');
    $profile['job_improvement_long'] = $this->CI->input->post('job_improvement_long');      

    if ($method == "update") {
        //Begin db transmission
        $this->CI->db->trans_begin();

        $this->CI->home_model->update('Survey',$survey, array('user_id' => $id));
        $this->CI->db->update('be_user_profiles',$profile, array('user_id' => $id));        
        if ($this->CI->db->trans_status() === FALSE)
        {
            flashMsg('error','There was a problem entering your test! Please contact an administrator.');
            redirect('survey','location');
        }
        else
        {
            //Get credits of user and subtract 1        
            $this->CI->db->set('credits', 'credits -1', FALSE);
            $this->CI->db->update('be_user_profiles',$profile, array('user_id' => $manager_id));

            //Mark the form completed.
            $this->CI->db->set('test_complete', '1');
            $this->CI->db->where('user_id', $id)->update('be_user_profiles');
            // Stuff worked...
            $this->CI->db->trans_commit();



            //Get Manager Information
            $this->CI->db->select('users.id, users.username, users.email, profiles.firstname');
            $this->CI->db->from('be_users' . " users");
            $this->CI->db->join('be_user_profiles' . " profiles",'users.id=profiles.user_id');
            $this->CI->db->having('id', $email_data['user']->manager_id);
            $email_data['manager'] = $this->CI->db->get();
            $email_data['manager'] = $email_data['manager']->row();

            //Email User
            $this->CI->load->library('User_email');
            $data_user = array(
                    'firstname'=>$email_data['user']->firstname,
                    'email'=> $email_data['user']->email,
                    'user_completed'=>$email_data['user']->firstname,
                    'site_name'=>$this->CI->preference->item('site_name'),
                    'site_url'=>base_url()
            );

            //Email Manager     
            $data_manager = array(
                    'firstname'=>$email_data['manager']->firstname,
                    'email'=> $email_data['manager']->email,
                    'user_completed'=>$email_data['user']->firstname,
                    'site_name'=>$this->CI->preference->item('site_name'),
                    'site_url'=>base_url()
            );
            $this->CI->user_email->send($email_data['manager']->email,'Completed the Assessment Tool','public/email_manager_complete',$data_manager);
            $this->CI->user_email->send($email_data['user']->email,'Completed the Assessment Tool','public/email_user_complete',$data_user);

            flashMsg('success','You finished the assessment successfully!');
            redirect('home','location');
        }
    }
    //Create New User
    elseif ($method == "create") {
            // Build
            $profile['user_id'] = $id;
            $profile['manager_id'] = $manager_id;
            $profile['test_complete'] = '1';
            $survey['user_id'] = $id;
            $this->CI->db->trans_begin();

            // Add user_profile details to DB
            $this->CI->db->insert('be_user_profiles',$profile);
            $this->CI->db->insert('be_survey',$survey);

            if ($this->CI->db->trans_status() === FALSE)
            {
                // Registration failed
                $this->CI->db->trans_rollback();

                flashMsg('error',$this->CI->lang->line('userlib_registration_failed'));
                redirect('auth/register','location');
            }
            else
            {
                // User registered
                $this->CI->db->trans_commit();

                flashMsg('success',$this->CI->lang->line('userlib_registration_success'));
                redirect($this->CI->config->item('userlib_action_register'),'location');
            }

    }
}

Функция контроллера:

function survey()
{
    $id = $this->session->userdata('id');
    $data['member'] = $this->home_model->getUsers(array('user_id'=>$id));

    //Convert the db Object to a row array
    $data['manager'] = $data['member']->row();
    $manager_id = $data['manager']->manager_id;
    $data['manager'] = $this->home_model->getUsers(array('manager_id'=>$id));
    $data['manager'] = $data['manager']->row();
    if ($data['manager']->credits == '0')   {
        flashMsg('warning',"You can't complete the assessment until your manager has purchased credit.");
        redirect('home','location');
    }
    elseif ($data['manager']->test_complete == '3'){
        flashMsg('warning',"You already completed the Assessment.");
        redirect('home','location');                        
    }
    else{
        $data['header'] = "Home";
        $this->survey_form_processing->survey_form($this->_container,$data);
    }
}

Функция отправки аналогична, обновляя db if $ method == "update" и вставляя, если метод == "create".

Проблема в , когда форма отправляется, она не учитывает URL-адрес, который форма отправляет в функцию «survey», которая передает данные в функцию lib, вещи всегда обновляются, никогда не создаются.

Как правильно передать $ method в функцию _submit ()?!

1 Ответ

3 голосов
/ 14 мая 2010

Теперь я лучше понимаю вашу проблему - спасибо за размещение обновлений в вашем коде. Я обновляю и уточняю свой ответ, чтобы объяснить вашу проблему и предложить некоторые решения.

Я уверен, что вы знаете, но не мешало бы предварять это базовым обзором общего шаблона MVC, так как он относится к структуре URI. Таким образом, в примере site.com/home/survey/new первый сегмент home является именем класса контроллера, второй сегмент survey является именем функции контроллера, а третий сегмент new (и любые сегменты после него) идентификатор или переменная, переданная survey(). Подробнее здесь .

Ваш код не работает, потому что вы никогда не передаете переменную в survey() через URI при отправке формы, поэтому «новый» никогда не существует в URL, и поэтому для $method всегда установлено «обновление» , Таким образом,

"Как я могу передать $ method _submit () работает правильно? "

Есть несколько вариантов сделать это. Каждый из них просто требует, чтобы вы определили, существует ли отношение пользователь-> опрос, чтобы установить $method. Затем вы можете передать $method соответствующим функциям. Для моего примера ниже я предполагаю, что у пользователя может быть только один опрос. Если это не так, вам просто нужно будет указать уникальный идентификатор опроса, связанный с уникальным идентификатором пользователя.

Один из возможных сценариев выглядит следующим образом (опять же, предполагается, что пользователь может быть связан только с одним опросом):

  1. Пользователь отправляет опрос
  2. После отправки формы проверьте, существует ли опрос для этого пользователя
  3. Если это так, установите $method="update", в противном случае установите $method="create"
  4. Перейдите к передаче $method другим необходимым функциям

Альтернативное решение может выглядеть следующим образом:

  1. В вашей функции контроллера, которая вызывает файл просмотра вашего опроса, определите, существует ли уже запись для пользователя.
  2. Передать эти данные в представление опроса
  3. В представлении измените действие формы, чтобы оно передавало эти данные (либо "создать", либо "обновить") в функцию survey () при отправке формы.
  4. В survey(), установите $method на основе предоставленных данных
  5. Перейдите к передаче $method другим необходимым функциям

Я буду использовать первый вариант в качестве примера и обрисую логику, которая вам понадобится (простите за несколько псевдокод, но вы поймете идею):

функция обзора ():

function survey() {

    // instead of determining whether "new" is part of the URI (which it never is),
    // check for an existing survey associated with the logged in user's ID
    $id = $this->session->userdata('id');
    $query = $this->db->get_where('Survey', array('user_id' => $id));

    // if the above query returns a result, set $method="update"
    // otherwise set $method="create"
    if ($query->num_rows() > 0) {
        $method="update";
    } else {
        $method="create";
    }

    // whatever other logic you need here

    // pass $method to survey_form()
    $this->survey_form_processing->survey_form($this->_container, $data, $method);
}

функция survey_form ():

function survey_form($container, $data, $method) {

    // your other code here

    if ( $this->CI->validation->run() === FALSE ) {
        // Output any errors
        $this->CI->validation->output_errors();
    } else {
        // Submit form (w/ $method parameter - this comes from survey())
        $this->_submit($method);
    }

}

Функция _submit ():

function _submit($method) {

    // your other code here

    if ($method == "update") {
        // do something
    } elseif ($method == "create") {
        // do something else
    }

}

Как примечание: возможно, есть лучшие способы структурировать то, что вы делаете. Например, в моем псевдокоде выше взаимодействия с базой данных, вероятно, должны происходить в модели. Однако для ясности они включены в контроллер. Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...