Правильное добавление функций внутри функции

#php #function #codeigniter

#php #функция #codeigniter

Вопрос:

Я создаю скрипт профиля, в котором пользователи могут редактировать свои личные данные, интересы и ссылки.

У меня были все поля в одной форме, но теперь я хочу разделить их табуляциями. Итак, у меня будет вкладка «Личная информация», вкладка «Интересы» и вкладка «Ссылки». На каждой странице у меня будет форма, отправляющая данные в соответствующую функцию. Например, если вы редактируете личную информацию, форма направит на mysite.com/edit/personal_info

Функции должны выглядеть следующим образом

 function edit() {

   function personal_info() {
      //data
   }   

   function interests() {
     //data
   }

   function links() {
     //data
   }

}
  

Я не уверен, как правильно отправлять данные из функции edit () во все ее вспомогательные функции.

Я добавляю приведенные ниже общие данные ко всем своим функциям, но я хочу добавить их один раз, и они должны быть у всех функций. Я также пытаюсь избегать глобальных переменных.

 $this->db->where('user_id', $this->tank_auth->get_user_id());
$query = $this->db->get('user_profiles');
$data['row'] = $query->row();
  

Затем в каждой подфункции у меня есть правила проверки (codeigniter) Ниже приведены правила для функции personal_info

 $this->form_validation->set_rules('first_name', 'First Name', 'trim|required|xss_clean|min_length[2]|max_length[20]|alpha');
$this->form_validation->set_rules('last_name', 'Last Name', 'trim|required|xss_clean|min_length[2]|max_length[20]|alpha');
$this->form_validation->set_rules('gender', 'Gender', 'trim|required|xss_clean|alpha');
  

и инструкция для добавления данных в базу данных или возврата ошибки, если правила проверки не выполняются

 if ($this->form_validation->run() == FALSE) //if validation rules fail
        {           
            $this->load->view('edit_profile', $data);
        }
        else //success
        {
        $data = array (                 
                'first_name'    => $this->input->post('first_name'),
                'last_name'     => $this->input->post('last_name'),
                'gender'    => $this->input->post('gender')

            );
            $this->load->model('Profile_model');
            $this->Profile_model->profile_update($data);            
        }
  

Как я могу правильно создать эти подфункции, не повторяя код в каждой из них?

Ответ №1:

Вау, ты меня вроде как запутал. Почему вы используете функции внутри функций? Если вы используете CodeIgniter, эти функции должны находиться в классе:

 class Edit extends CI_Controller {
  function personal_info() {
    /* Do personal info stuff. */
  }

  function interests() {
    /* Do interests stuff. */
  }

  function links() {
    /* Do links stuff. */
  }

  function _common() {
    // The underscore makes the function not available to browse, but you can
    // put common code here that is called within the other functions by
    // invoking $this->_common();
  }
}
  

Комментарии:

1. Это, конечно, было бы в файле с именем controllers/edit.php . Для получения дополнительной информации я рекомендую вам ознакомиться с документацией по контроллерам на этом сайте: codeigniter.com/user_guide/general/controllers.html

2. Спасибо за пример! Я забыл о классах в CI. Я использовал $this->_common(); в соответствии с инструкциями, и это работает! 🙂

3. Рад, что это работает, и удачи с вашим сайтом! Я довольно часто использую CodeIgniter, и я думаю, вы найдете его удобным фреймворком для использования.

Ответ №2:

судя по тому, как сделан ваш код, похоже, что вы используете codeigniter.

Когда вы запрашиваете mysite.com/edit/personal_info он запросит контроллер с именем edit и функцию с именем personal_info, поэтому вам не нужна функция внутри функции, вам просто нужны функции внутри класса edit controller. Дополнительные сегменты URL будут переданы функции в качестве аргументов.