Codeignoter 1.7.1 и правила валидации из хелпера

Вопросы об установке, настройке и работе самого фреймворка

Codeignoter 1.7.1 и правила валидации из хелпера

Сообщение felix » 02 сен 2010, 23:12

Скажите, можно ли (И КАК) определить функцию для валидации не в самом контроллере, а скажем в хелпере или плагине?
Код: Выделить всё
$this->form_validation->set_rules('tag''lang:tag_tag''min_length[3]|callback_exit'); 
По идее это должно было прервать добавление записи, но этого не произошло.
По-моему есть баг вот здесь. Извините за столь большой размер кода, просто чтобы стало ясно что к чему.
Код: Выделить всё
 // Cycle through each rule and run it
//.....        
foreach ($rules As $rule)
        {
                       
            
// Call the function that corresponds to the rule
            
if ($callback === TRUE)
            {
                
                if ( ! 
method_exists($this->CI$rule))
                {                                                               
                    continue;                          
// Мы завершаем цикл foreach                          
                
}                                                               
                
                
                
// Run the function and grab the result
                
$result $this->CI->$rule($postdata$param);
                
                
// Re-assign the result to the master data array
                
if ($_in_array == TRUE)
                {
                    
$this->_field_data[$row['field']]['postdata'][$cycles] = (is_bool($result)) ? $postdata $result;
                }
                else
                {
                    
$this->_field_data[$row['field']]['postdata'] = (is_bool($result)) ? $postdata $result;
                }
                
                
// If the field isn't required and we just processed a callback we'll move on...
                
if ( ! in_array('required'$rulesTRUE) AND $result !== FALSE)
                {
                    return;
                }
            }
            else
            {
                if ( ! 
method_exists($this$rule))
                {
                    
// If our own wrapper function doesn't exist we see if a native PHP function does.
                    // Users can use any native PHP function call that has one param.
                   
// ------------------------------------------------------------------------------------------- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 // А по-моему мы уже вышти из цикла и этот участок кода не будет выполнен никогда.
// -----------------------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!________________________________
                    
if (function_exists($rule))
                    {
                            
$result $rule($postdata);
                        
                        if (
$_in_array == TRUE)
                        {
                            
$this->_field_data[$row['field']]['postdata'][$cycles] = (is_bool($result)) ? $postdata $result;
                        }
                        else
                        {
                            
$this->_field_data[$row['field']]['postdata'] = (is_bool($result)) ? $postdata $result;
                        }
                    }
                    
                    continue;
                }
             
        } 
felix
 
Сообщения: 132
Зарегистрирован: 20 окт 2009, 19:17

Re: Codeignoter 1.7.1 и правила валидации из хелпера

Сообщение Big_Shark » 03 сен 2010, 02:49

continue это не выйти из цыкла а перейти к следующей позиции
Код: Выделить всё
$stack = array('first''second''third''fourth''fifth');

foreach(
$stack AS $v){
    if(
$v == 'second')continue;
    if(
$v == 'fourth')break;
    echo 
$v.'<br>';
}
/*

first
third

*/ 
Отвечу на ваши вопросы по CodeIgniter и Kohana3
Благодарности принимаются тут: 41001216991355 (ЯД)
Big_Shark
Модератор
 
Сообщения: 1307
Зарегистрирован: 03 фев 2009, 02:12
Откуда: Владивосток

Re: Codeignoter 1.7.1 и правила валидации из хелпера

Сообщение felix » 03 сен 2010, 10:46

Ну, хорошо начало новой итерации, если выразиться научно.
Но суть-то не меняется от этого и вопрос был не об этом.
ПОЧЕМУ callback работает только для фунцкций, определенных в конпроллере?
Код: Выделить всё
$this->form_validation->set_rules('tag', 'lang:tag_tag', 'min_length[3]|callback_exit');  

Означает, что для "проверки" будет вызвана функция exit. Но она не вызывается, так как программа продолжает работать и запись добавляется.
Код: Выделить всё
 // Cycle through each rule and run it
//.....        
foreach ($rules As $rule)
        {
        // Call the function that corresponds to the rule
            if ($callback === TRUE)
            {
             if ( ! method_exists($this->CI, $rule))
            {                                                               
            continue
;                          //Новая итерация foreach                          
            }                                                               
.....            
 if 
( ! method_exists($this, $rule))
                { 
                    
// Будет ли выполен этот код? Выше, если метод не найден мы начинаем новую итерацию цикла. 
                   //По-моему этот участок не будет выполнен никогда. 
                  //Я ошибаюсь? Тогда почему не вызываются "родные" функции для проверки и функции опреденные в хелпере
                    // If our own wrapper function doesn't exist we see if a native PHP function does.
                    // Users can use any native PHP function call that has one param.
                    if (function_exists($rule))
                    {
             ......                
felix
 
Сообщения: 132
Зарегистрирован: 20 окт 2009, 19:17

Re: Codeignoter 1.7.1 и правила валидации из хелпера

Сообщение Big_Shark » 03 сен 2010, 16:40

Как бы вам сказать........... вообщем вы не заметили
Код: Выделить всё
if ($callback === TRUE)
{
//тут идет та самая проверка с continue
}
else
{
//а тут идет $result = $rule($postdata);

так что continue не как не повлияет на вызов функции
кстати меня больше беспокоит то почему не используют call_user_func_array
Отвечу на ваши вопросы по CodeIgniter и Kohana3
Благодарности принимаются тут: 41001216991355 (ЯД)
Big_Shark
Модератор
 
Сообщения: 1307
Зарегистрирован: 03 фев 2009, 02:12
Откуда: Владивосток

Re: Codeignoter 1.7.1 и правила валидации из хелпера

Сообщение felix » 03 сен 2010, 18:07

А как использовать?
Код: Выделить всё
        $this->form_validation->set_rules('tag''lang:tag_tag''min_length[3]|callback_call_user_func_array[checkname]'); 

Так? Но не таботает..
felix
 
Сообщения: 132
Зарегистрирован: 20 окт 2009, 19:17

Re: Codeignoter 1.7.1 и правила валидации из хелпера

Сообщение Big_Shark » 04 сен 2010, 03:51

Код: Выделить всё
function exit($val){exit();} 

и использовать как первый вариант
Код: Выделить всё
$this->form_validation->set_rules('tag''lang:tag_tag''min_length[3]|callback_exit');  
Отвечу на ваши вопросы по CodeIgniter и Kohana3
Благодарности принимаются тут: 41001216991355 (ЯД)
Big_Shark
Модератор
 
Сообщения: 1307
Зарегистрирован: 03 фев 2009, 02:12
Откуда: Владивосток

Re: Codeignoter 1.7.1 и правила валидации из хелпера

Сообщение felix » 04 сен 2010, 14:14

Помогло вот это.
Код: Выделить всё
 if ($callback === TRUE)
            {


                if ( (! 
method_exists($this->CI$rule)))
                {
                    if ( ! 
function_exists($rule))
                    {
                        continue;
                    }
                    else
                    {
                        
$result $rule ($postdata$param);
                    }
                }
                else
                {
                    
// Run the function and grab the result
                    
$result $this->CI->$rule($postdata$param);
                }... 

Вместо
Код: Выделить всё
 // Call the function that corresponds to the rule
            
if ($callback === TRUE)
            {


                if ( (! 
method_exists($this->CI$rule)))
                {
                    continue;
                }


                
// Run the function and grab the result
                
$result $this->CI->$rule($ 
felix
 
Сообщения: 132
Зарегистрирован: 20 окт 2009, 19:17


Вернуться в Общие вопросы по фреймворку

Кто сейчас на конференции

Сейчас этот форум просматривают: Denis и гости: 1

cron