• Почему не работает код с namespace?

    slo_nik
    @slo_nik Куратор тега PHP
    Добрый вечер.
    Поставьте слеш перед PDO
    return self::$connection = new \PDO('mysql:host=localhost;dbname=trvlblog', 'root', '');
    Ответ написан
    4 комментария
  • В чём причина зависания PHPStorm?

    slo_nik
    @slo_nik Автор вопроса, куратор тега Yii
    Проблема оказалась в установленном плагине YII2_Support. Он несовместим с версией 2019.3

    От автора плагина есть решение.

    Переустановил плагин, который скачал по ссылке выше. Проблема ушла.
    Ответ написан
    Комментировать
  • Как можно убрать web из url в yii2 xampp?

    slo_nik
    @slo_nik Куратор тега Yii
    В корне приложения, в .htaccess
    <IfModule mod_rewrite.c>
      Options +FollowSymlinks
      RewriteEngine on
    </IfModule>
    
    <IfModule mod_rewrite.c>
       RewriteCond %{REQUEST_URI} ^/.*
       RewriteRule ^(.*)$ web/$1 [L]
    
       RewriteCond %{REQUEST_URI} !^/web/
       RewriteCond %{REQUEST_FILENAME} !-f [OR]
       RewriteCond %{REQUEST_FILENAME} !-d
       RewriteRule ^.*$ web/index.php
    
    </IfModule>
    Ответ написан
    Комментировать
  • Как правильно обрезать слова?

    slo_nik
    @slo_nik Куратор тега PHP
    Доброе утро.
    Чуть по-другому надо делать.
    $text  = 'как политика и бизнес влияют на новости ';
    
    $array = ['как', 'без', 'из', 'c', 'в', 'для', 'a', 'и'];
    
    $words = explode(' ', $text);
    
    // политика бизнес влияют на новости 
    echo implode(' ', array_diff($words, $array));
    Ответ написан
    2 комментария
  • Условие для промежуточной таблицы yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Попробуйте так:
    public function getAdditionalCategories()
        {
            return $this->hasMany(self::className(), ['id' => 'category_id'])
                    ->viaTable(CategoryAssign::tableName(), ['resource_id' => 'id'], function(ActiveQuery $query){
                 return $query->andWhere(['type' => 0]);
             });
        }
    Ответ написан
    Комментировать
  • Как в YII2 выбрать только дубли из базы данных?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Средствами yii, думаю будет морочительно.
    А вот sql Вам должен помочь.
    Что-то подобное этому.
    Yii::$app->db->createCommand('
        SELECT 
            `users`.`name`, COUNT(`users`.`name`),
            `users`.`patronymic`, COUNT(`users`.`patronymic`),
            `users`.`surname`, COUNT(`users`.`surname`),
            `users`.`id`, COUNT(`users`.`id`)
        FROM
            `users`, `users` AS `tmp`
        WHERE `users`.`id` > `tmp`.`id`    
        GROUP BY 
            `users`.`name`, 
            `users`.`patronymic`, `users`.`surname`, `users`.`id`
        HAVING 
               (COUNT(`users`.`name`) > 1) AND 
               (COUNT(`users`.`patronymic`) > 1) AND 
               (COUNT(`users`.`surname`) > 1)
    ')->execute();

    Выбираются дубликаты записей. Запрос делал под свой проект, Вам надо изменить его под свои нужды.
    Ответ написан
    Комментировать
  • Почему не работает кастомное правило activeForm?

    slo_nik
    @slo_nik Куратор тега Yii
    В действии контролера добавьте
    if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
                Yii::$app->response->format = Response::FORMAT_JSON;
                return ActiveForm::validate($model);
            }

    Хотя для ajax валидаци лучше делать отдельное действие, даже отдельный контролер.
    Вот тут показано, что к чему.
    Ответ написан
  • PhpStorm - git, не закоммичивает файлы внутри папки расширения, что за непонятные статус файлов странные файлы?

    slo_nik
    @slo_nik
    Доброе утро.
    Очистите cache git.
    git rm -r --cached ./your_folder
    Ответ написан
    Комментировать
  • Как перевести запрос в формат SQL?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Можно при помощи этого.

    Посмотреть, какой запрос генерирует ActiveRecord можно так
    $query = Orders::find()->joinWith('items');
    
    print_r($query->createCommand()->getRawSql());

    В результате получите что-то похожее
    SELECT `orders`.* FROM `orders` LEFT JOIN `order_items` ON `orders`.`id` = `order_items`.`order_id`
    Ответ написан
    Комментировать
  • Табличный ввод с связанными данными?

    slo_nik
    @slo_nik Куратор тега Yii
    if (Model::loadMultiple($options->pageOption , \Yii::$app->request->post()) && Model::validateMultiple($options->pageOption)) {
        foreach ($options->pageOption  as $page) {
                    $page->save(false);
        }
    }


    p.s. Видео в помощь.
    Ответ написан
  • Как указать ссылку на файл?

    slo_nik
    @slo_nik Куратор тега Yii
    Вечер добрый.
    Не совсем верно указали путь к файлу, да и не нужно так делать.
    Вам нужно сделать ссылку на действие контролера, а уже из действия отдавать файл.
    Приблизительно так
    echo Html::a('Скачать', ['controller/action']);
    В нужном контролере создаёте действие, передаёте в него id файла, если файл данные файла хранятся в бд.
    public function actionDownload($id)
    {
      return Yii::$app->response->sendFile($filePath, "$file->name.$file->type", ['inline' => true]);
    }
    Ответ написан
  • Как сделать перенаправление на вход в админку с помощью htacces в проекте типа advanced?

    slo_nik
    @slo_nik Куратор тега Yii
    В конфигурационном файла backend/main.php или backent/main-local.php сделайте следующее:
    <?php
    use yii\web\Request;
    $baseUrl = str_replace('/backend/web', '/admin', (new Request())->getBaseUrl());
    $config = [
        'components' => [
            'request' => [
                // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
                'cookieValidationKey' => 'your_validation_key',
                'baseUrl' => $baseUrl
            ],
        ],
    ];
    }
    return $config;


    Уберите комментарий с секции urlManager

    В backend/web положите htaccess
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.php

    В корень проекта положите htaccess
    RewriteEngine On
    
    RewriteCond %{REQUEST_URI} ^/(admin)
    RewriteRule ^admin(/.*)?$ backend/web/$1 [L]
    
    # handle the case of frontend
    RewriteCond %{REQUEST_URI} ^/
    RewriteRule ^(.*)$ frontend/web/$1 [L]
    Ответ написан
  • Можно ли получить ошибки валидации формы без виджетов yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    В общем у Вас три пути.
    Первый путь, за основу взял форму, которую Вы привели в вопросе, думаю, что этот Вам подойдёт.
    <?php
    $model = new LoginForm;
    $form = ActiveForm::begin([
       'id' => 'login-form',
       'options' => ['class' => 'login100-form validate-form form-horizontal'],
       'fieldConfig' => [
          'options' => ['class' => 'form-group wrap-input100 validate-input'],
          'template' => "{input}\n<span class=\"focus-input100\"></span>{label}\n{hint}\n{error}",
          'labelOptions' => ['class' => 'symbol-input100'],
          'inputOptions' => ['class' => 'form-control input100']
       ],
    ]);
    ?>
              <span class="login100-form-title">
                Авторизация
              </span>
              <?= $form->field($model, 'username')->textInput(['placeholder' => 'Логин'])->label('<i class="fa fa-envelope" aria-hidden="true"></i>') ?>
              <?= $form->field($model, 'password')->textInput(['placeholder' => 'Пароль'])->label('<i class="fa fa-lock" aria-hidden="true"></i>') ?>
              <div class="container-login100-form-btn">
                <?= Html::submitButton('Войти', ['class' => 'login100-form-btn', 'name' => 'login-button']) ?>
              </div>  
              <?= $form->field($model, 'rememberMe', ['template' => '<div class="text-center p-t-12"><div class="form-group field-loginform-rememberme txt1"><div class="col-lg-offset-1 col-lg-3">{input}</div></div></div>'])->checkbox() ?>
    <?php
    ActiveForm::end();
    ?>

    Второй путь вряд ли подойдёт, так как используется yii\bootstrap\ActiveForm. В этом варианте более гибко настраивается форма.
    Ну и третий путь - использовать виджет от kartik, хотя я не очень к нему склоняюсь.

    p.s В AppAsset у Вас должен быть подключён YiiAsset, Ваши css и js, остальное можно не подключать
    public $depends = [
            'yii\web\YiiAsset',
        ];
    Ответ написан
    Комментировать
  • Почему ошибка прав доступа выводится без стилей?

    slo_nik
    @slo_nik Куратор тега Yii
    У Вас проблема в настройках правил доступа к разным действиям контролера.
    Вы должны или исключить действие "error" из проверки, или явно указать его.
    Как-то так
    return [
            'access' => [
                'class' => \yii\filters\AccessControl::className(),
                'except' => ['error'], // или так
                'rules' => [
                  // или так
                    [
                            'actions' => ['index', 'error'],
                            'allow' => true,
                     ],
                ],
            ],
        ];
    Ответ написан
    Комментировать
  • Как пользоваться try в puppeteer?

    slo_nik
    @slo_nik Куратор тега PHP
    Доброе утро.
    try {
      $page->goto('https: //'.$domain.'/');
    } catch (Exception $e) {
        echo 'Выброшено исключение: ',  $e->getMessage(), "\n";
    }

    Подробней здесь.
    Ответ написан
  • Проблема с checkboxList. Yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    У Вас данные размеров хранятся не очень удобно.
    Пока можно сделать вот так.
    // Ваш статический метод в модели SizeOneHelper
        public static function getSizeList(): array
        {
            return [
                'S (55/56)',
                'M (57/58)',
                'L (59/60)',
                'XL (61/62)',
            ];
        }
    
    // если в $model->size данные хранятся в виде строки, то надо привести к массиву и передать в checkboxList()
    $select = explode(',', $model->size);
    echo $form->field($model, 'size')->checkboxList(SizeOneHelper::getSizeList(),[
       'item' => function($index, $label, $name, $checked, $value) use ($select){
          if(in_array($index, $select)){
             $checked = 'checked';
          }
          return Html::checkbox($name, $checked);
       }
    ])

    Но я бы не хранил это в виде строки. Скорей всего создал бы отдельную связующую таблицу, где хранил бы размеры и id товара.

    p.s. Сделал "на коленке", но если подумать, то можно и это улучшить.

    p.s.s. Для того чтобы выводился label checkbox в функцию передаётся нужный параметр в переменной $label. Используйте его и будет выводится название checkbox-a.
    return Html::checkbox($name, $checked, ['label' => $label]);


    p.s.s.s. В DetailVeiw можно вывести нужные данные таким образом
    // метод в модели SizeOneHelper
        public function getSizeName()
        {
            return ArrayHelper::filter(self::getSizeList(), explode(',',$this->size));
        }
    
    // в DetailView получаем строку по названиям размеров
    echo DetailView::widget([
      'model' => $model,
      'attributes' => [
         [
           'attribute' => 'size',
           'value' => function($model){
              return implode(',',$model->getSizeName());
           }
         ]  
      ]
    ]);


    p.s.s.s.s. Создайте дополнительный метод в модели SizeOneHelper
    public  function getSelectSizeList()
        {
            return explode(',',$this->size);
        }

    Метод getSizeName изменится на такой
    // метод в модели SizeOneHelper
     public function getSizeName()
        {
            return ArrayHelper::filter(self::getSizeList(), $this->getSelectSizeList());
        }


    Тогда вывод размеров может быть таким:
    // в checkboxList
    echo $form->field($model, 'size')->checkboxList(SizeOneHelper::getSizeList(),[
       'item' => function($index, $label, $name, $checked, $value) use ($model){
          if(in_array($index, $model->getSelectSizeList())){
             $checked = 'checked';
          }
          return Html::checkbox($name, $checked, ['label' => $label, 'value' => $value]);
       }
    ])
    Ответ написан
    8 комментариев
  • Yii2 получать данные из двух таблиц сразу?

    slo_nik
    @slo_nik Куратор тега Yii
    Если у Вас есть связь, то используя так Вы получите записи из двух таблиц.
    // relation
    public function getUserInfo()
    {
         return $this->hasOne(User::class, ['id' => 'user_id']);
    }
    //query
    $model = User::find()->with('userInfo')->one();

    Вывести данные из связи можно так
    echo $model->userInfo->age; // example
    Вот тут много полезного по работе со связными данными.
    Ответ написан
  • Как в Yii2 настроить 301 редирект для адресов типа /catalog/trikotazh?page=1?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Оставьте .htaccess и проверку строки запроса в покое)))
    Всё решается гораздо проще.
    $dataProvider = new ActiveDataProvider([
                'query' => $query,
                'pagination' => [
                   'defaultPageSize' => 20,
                   'forcePageParam' => false,
                ]
            ]);

    При таких настройках pagination для первой страницы не будет показывать page=1 и не будет показывать per-page в адресе страницы.
    Так что настраивать перенаправление в .htaccess для этого не нужно, а тем более делать какие-либо проверки в контролере, как советует @Giperoglif

    p.s. Если всё-таки использовать htaccess, то должно сработать следующие директивы
    RewriteCond %{QUERY_STRING} .
    RewriteCond %{QUERY_STRING} (?:^|&)page=1 [NC]
    RewriteRule ^ %{REQUEST_URI}? [R=301,L,NE]
    Ответ написан
  • Как связать DropDownList?

    slo_nik
    @slo_nik Куратор тега PHP
    Добрый день.
    Для начала воспользуйтесь поиском по toster.ru.
    Ответ написан
    Комментировать
  • Авторизация с хэшированым паролем в Yii2?

    slo_nik
    @slo_nik Куратор тега PHP
    Удалите из метода beforeSave() в модели User установку пароля.
    В модели User $this->password у Вас пустой, так как при регистрации Вы работаете с атрибутом модели RegisterForm, а не с атрибутом модели User.
    В методе register установите пароль через setPassword()
    public function register()
    {
       if($this->validate())
       {
          /*****/
          $user->setPassword($this->password)
          $user->generateAuthKey();
          /****/
        }
    }

    В модели User создайте методы
    public function generateAuthKey()
        {
            return $this->auth_key = Yii::$app->security->generateRandomString();
        }
    
    public function validatePassword($password)
        {
            return Yii::$app->security->validatePassword($password, $this->password_hash);
        }

    В LoginForm проверяйте пароль
    public function validatePassword($attribute, $params)
        {
            if (!$this->hasErrors()) {
                $user = $this->getUser();
    
                if (!$user || !$user->validatePassword($this->password)) {
                    $this->addError($attribute, 'Неправильные учетные данные');
                }
            }
        }
    Ответ написан
    Комментировать