За последние 24 часа нас посетили 20690 программистов и 1098 роботов. Сейчас ищут 764 программиста ...

Как правильно работать с валидацией формы.

Тема в разделе "Yii", создана пользователем Artur_hopf, 1 ноя 2019.

  1. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Добрый день. Есть метод формы с валидацией:
    PHP:
    1. public $url;
    2.     public $old_watermark;
    3.     public $my_match;
    4.     public $site_name;
    5.    
    6.     public function rules()
    7.     {
    8.         $this->siteMatch();
    9.        
    10.         return [
    11.             [['url'], 'url', 'defaultScheme' => 'https'],
    12.             ['url', 'match', 'pattern' => $this->my_match, 'message' => 'Некорректная ссылка'],
    13.             ['old_watermark', 'integer'],
    14.         ];
    15.     }
    Метод siteMatch() генерирует строку, относительно url которую ввели в форму. Как то так:
    PHP:
    1. if( $url !== false )
    2.         {
    3.            $url =  $url['url'];
    4.  
    5.             foreach($site as $key => $item)
    6.             {
    7.                 if( stristr($url, $key) !== false)
    8.                 {
    9.                     $implode = implode("|", $item['type']);
    10.                     $suffix = $item['suffix'];
    11.            
    12.                     $my_match = "/{$key}\.ru\/[a-z]+\/({$implode})\/{$suffix}/";
    13.                     $site_name = $key;
    14.                     break;
    15.                 }
    16.             }
    17.         }  
    18.  
    19.         $this->my_match = $my_match;
    Но проблема в том что я не знаю как передать это самое url в этот метод.
    Получается пост запроса еще не было .Подскажите откуда метод rules() берет url для проверки и как ее передать в метод?
     
  2. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    я понял что нужен свой валидатор, как то так:
    PHP:
    1. public $url;
    2. public $old_watermark;
    3. public $site_name;
    4.  
    5.     public function rules()
    6.     {
    7.      
    8.         return [
    9.             [['url'], 'url', 'defaultScheme' => 'https'],
    10.             ['url', 'siteMatch'],
    11.             ['old_watermark', 'integer'],
    12.         ];
    13.     }
    Но он вообще игнорируется:
    PHP:
    1. siteMatch($attribute, $params)
    2. {
    3. $my_match = false;
    4. if($my_match === false)
    5.         {
    6.             $this->addError($attribute, 'Некорректная ссылка');
    7.         }
    8. }
     
  3. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Все, помощь не нужна, избавился от проблемы =)
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    [sarcasm]Никому не говори что было не так. Ведь ты уникален и твой опыт никому не пригодится![/sarcasm]
     
    Roman __construct нравится это.
  5. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @artoodetoo отстань, я избавился от проблемы, а не решил ее :p
    --- Добавлено ---
    Поидее эта задача просто не решаема, ибо регулярка отправляется на клиент когда страница загружена. А не как я хотел, после того как пользователь ввел url. Там велосидеить ajax запрос бы пришлось.