Валидация части Url

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Татьна
Сообщения: 96
Зарегистрирован: 2018.04.22, 00:17

Валидация части Url

Сообщение Татьна »

Есть в модели поле adress типа Url. Адрес должен всегда содержать вначале, например, https://test.ru/. Далее можно вводить любой адрес.
Вот этот адрес и надо проверять.
Вот описание этого поля:

Код: Выделить всё

['adress', 'url',  'message' => 'Поле Адрес должно содержать допустимый URL'],
Я пробовала и с помощью defaultScheme. Не получилось. Может с помощью UrlValidator ?
Не подскажите как это сделать ?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Валидация части Url

Сообщение Dominus »

Ниже показано как можно проверить что указанный URL в поле address принадлежит текущему домену.

Код: Выделить всё

    /**
     * @inheritdoc
     * @return array
     */
    public function rules()
    {
        return [
            //...
            ['address', 'url', 'validSchemes' => ['https', 'http']],
            ['address', 'validateAddress'],
        ];
    }
    
    /**
     * Наш валидатор
     * @param $attribute
     */
    public function validateAddress($attribute)
    {
        if (!empty($this->address)) {
            $domain = $_SERVER['HTTP_HOST'];
            $address = $this->stripToDomainName($this->address);
            if ($domain != $address) {
                $this->addError($attribute, 'Указанный url не принадлежит текущему домену!');
            }
        }
    }
    
    /**
     * Разбираем URL
     * @param string $uri
     * @return null|string|string[]
     */
    protected function stripToDomainName($uri = '')
    {
        $uri = strtolower(trim($uri));
        $uri = preg_replace('%^(http:\/\/|https:\/\/)*(www.)*%usi', '', $uri);
        $uri = preg_replace('%\/.*$%usi', '', $uri);
        return $uri;
    }
    //...
Что бы валидация заработала на клиенте, в ActiveForm включить ajax валидацию:

Код: Выделить всё

<?php $form = ActiveForm::begin([   
    'validationUrl' => ['ajax-validate'],
    'enableAjaxValidation' => true,
]); ?>
и добавить в контроллер actionAjaxValidate()

Код: Выделить всё

    /**
     * @return array|\yii\web\Response
     */
    public function actionAjaxValidate()
    {
        $model = new ContactForm(); // Ваша модель
        if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
            return \yii\bootstrap\ActiveForm::validate($model);
        }
        return $this->redirect(Yii::$app->request->referrer);
    }
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Татьна
Сообщения: 96
Зарегистрирован: 2018.04.22, 00:17

Re: Валидация части Url

Сообщение Татьна »

Dominus, огромнейшее спасибо. Вы написали целый код. Я не сообразила, что можно было отдельную часть адреса так полно проверять. Я все думала сначала соединить постоянную часть адреса с введенной, а потом уже проверять. Хотела через urlvalidation в методе модели. Но не получилось. Еще раз спасибо.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Валидация части Url

Сообщение Dominus »

Если нужно проверять еще и протокол, то валидатор немного доработать:

Код: Выделить всё

    /**
     * Наш валидатор
     * @param $attribute
     */
    public function validateAddress($attribute)
    {
        if (!empty($this->address)) {
            //$domain = $_SERVER['HTTP_HOST'];
            $domain = ($_SERVER['HTTPS'] ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'];
            $parse = parse_url($this->address);
            $address = $parse['scheme'] . '://' . $this->stripToDomainName($this->address);
            if ($domain != $address) {
                $this->addError($attribute, 'Указанный url не принадлежит текущему домену!');
            }
        }
    }
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Татьна
Сообщения: 96
Зарегистрирован: 2018.04.22, 00:17

Re: Валидация части Url

Сообщение Татьна »

Отлично. Просто супер !
Ответить