#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 будут переданы функции в качестве аргументов.