Codeigniter возвращает ошибку проверки из помощника

#php #validation #forms #codeigniter

#php #проверка #формы #инициатор кодирования #codeigniter

Вопрос:

Я создаю помощник для проверки URL, который я установил как правило при проверке моей формы.

 $this->form_validation->set_rules('link_url', 'Link URL', 'trim|required|xss_clean|max_length[255]|validate_url');
  

Если validate_url возвращает FALSE , как я могу вернуть пользовательскую ошибку проверки из помощника?

Помощник

 if ( ! function_exists('validate_url'))
{
    function validate_url($str)
    {
       $pattern = "/^(http|https)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*) ):?(d )?/?/i";
        if (!preg_match($pattern, $str))
        {
            $this->form_validation->set_message('validate_url', 'URL is not valid');
            return FALSE;
        }
        else 
        {
            return TRUE;
        }
    }
}
  

Когда я отправляю форму, я получаю

 Fatal error: Using $this when not in object context
  

Ответ №1:

Как упоминал @alex, вы пытаетесь вызвать объект внутри функции, любым способом вы можете избежать этой ошибки, используя get_instance(), который возвращает суперобъект. Я не уверен, что вы можете использовать эту вспомогательную функцию в качестве обратного вызова внутри библиотеки form_validation.

вот код:

 if ( ! function_exists('validate_url'))
{
    function validate_url($str)
    {
        $ci = get_instance();

       $pattern = "/^(http|https)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*) ):?(d )?/?/i";
        if (!preg_match($pattern, $str))
        {
            $ci->form_validation->set_message('validate_url', 'URL is not valid');
            return FALSE;
        }
        else 
        {
            return TRUE;
        }
    }
}
  

Ответ №2:

Вы создаете глобальную функцию, а не метод объекта.

В этом контексте $this не указывает ни на один созданный объект. Чтобы задать сообщения для объекта, вам нужно будет перейти $this к объекту проверки.

Вы могли бы заменить тело этой функции на return (bool) parse_url($str) .