Ответы пользователя по тегу Yii
  • Как получить данные об авторизованном пользователе Yii в Websocket?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Используете токен
    Ответ написан
  • Безопасен ли данный код поиска ?Возможны ли Sql иньекции?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Безопасный)
    Ответ написан
    2 комментария
  • Верна ли такая реализация?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Выносить из контроллера - правильная вещь. Но не правильно что вы туда затащили всю логику. Флешь сообщения. Обработка формы. Можете посмотреть пример как это делается.

    Пример 1
    Пример 2
    Ответ написан
    3 комментария
  • Как добавить фильтр вне GridView?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Почти правильно, но не так. 'MySearch => [is_active =>'0' ]

    А ещё лучше:
    $searchForm->getFormName() => [is_active =>'0' ] Будет подставляться имя даже когда измените название формы.

    <?=Url::to([controller/action/], $searchForm->getFormName() => [is_active =>'0' ])?>
    Ответ написан
    Комментировать
  • Что за неадекватное поведение отношений в yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Внимательно, но невнимательно сделали название свойств или связи.

    У вас в базе и в модели есть свойство совпадающее с названием связи. Поэтому вам надо поменять его на contactor_id или изменить название связи getContactorRelation

    По запросу $model->contractor вы получаете id. Сначала ищется свойство, а потом связь.
    Ответ написан
    2 комментария
  • Как связать между собой Yii2 и ReactJS?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Если вы создали API, то зачем вам совмещаться эти два приложения в одном? Обращайтесь по API к Yii2 из React JS. Аутентификацию осуществляйте по токену. В итоге у вас будет два независимых приложения, которые будут работать по протоколу HTTP. Я бы не стал их совмещать.
    Ответ написан
    Комментировать
  • Не правильно отображается дата при использовании модуля DateControl (kartik-v)?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Вам нужно перед сохранением в базу переконвектировать дату в unix формат сделать это можно так:
    (new DateTimeImmutable('05.07.2020'))->getTimestamp();
    Ответ написан
    Комментировать
  • Как в Yii1.1 лучше реализовать кнопку перенаправляющую пользователя на другой контроллер?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    У вас всё верно. Если изменения произойдут на действующем проекте, то и изменении ссылки будет мало. Так как вы потеряете поисковые переходы. Для этого делают редирект на новый адрес средствами сервера. И есть такое понятие как Роутинг.
    Ответ написан
    Комментировать
  • Как отловить 503 ошибку php, yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    try {
        //Код с ошибкой
    } catch (Exception $e) {
        if ($e->getCode() === 503) {
            ///Ваша обработка
        }
        Yii::$app->errorHandler->logException($e); //Записываем ошибку в лог
    }
    Ответ написан
    1 комментарий
  • Yii2 Invalid argument supplied for foreach() в чём смысл ошибки?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Этот запрос не возвращает массив. Тут либо пусто, либо не массив.
    $masters = Master::find()->select('id' => '1')->where('rost')->one();

    Соотвественно foreach (перебор массива) не требуется в коде. Уберите его!
    Ответ написан
    Комментировать
  • Как создать универсальное расширение для сайтов?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Этот вариант в принципе хорошо применим для более современных фреймворков, но Yii2 достаточно старый. Он не поддерживает PSR стандарты из-за которых он очень плохо совместим с другими. То есть для Yii написать такой модуль и подключить к симфонии невозможно, так же как и наоборот. К тому же на Yii используется Active Record, а на Symfony Doctrine. Поэтому вам можно вынести только какие-то компоненты и подключать их в своих проектах. С отдельным модулем будет сложно. Модуль Yii можно будет использовать только там. Если вы пойдёте таким способом, то вам нужно вынести этот пакет в репозиторий и подключать этот пакет через композер. Внутри проекта останется настроить конфиг, настроить зависимости через DI. Пример.

    2. Второй вариант более гибче. Это уже больше про микросервисы. Приложения будут взаимодействовать через API. В таком случае вам вообще без разницы какой там фреймворк и база. Современные большие системы именно так и устроены. Однако это сложна система, на которую требуется много знаний и времени.

    На вашем месте, проектируя на Yii2 я бы не стал об этом париться. Во-первых, этот иодвль врят ли кому будет нужен. Во-вторых, он не совместим с другими фреймворками. Если вам требуется такой модуль - просто копируйте его в другой проект. Если почувствуете, что часто изменяется и нужна совместимость с другими проектами - выносите в пакет и подключайте через композер.
    Ответ написан
    Комментировать
  • Как создать 2 типа пользователей в YIi2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Клиенты — не всегда пользователи системы.
    Партнёры — не всегда пользователи системы.

    Если мыслить в таком ключе, то Вам нужно разделять эти ответственности. Это будет более правильно. У вас получится система, разделенная на модули. Это позволит вам сделать независимость как на уровне кода, так и на уровне базы. Разделить свой код и базу по ответственностям.

    • Модуль Auth - Система управление аутентификацией: логин, пароль, телефон, социальные сети (для входа по соц сети), роли, разрешения ну и так далее.
    • Модуль Partners - Система управление партнёрами.
    • Модуль CRM - Система управления взаимоотношениями с клиентами.


    В клиентах, партнёрах есть ссылка на user_id (аккаунт). Таким образом у вас система разделена на свои ответсвенности (модули) и каждая система решает одну определённую задачу/проблему. Ваш код становится менее связанным и более независимым.

    User вам нужно чтобы только авторизоваться. А когда он авторизован вы работаете с Client или Partner. В UI интерфейсе вы делаете два личных кабинета или один с переключением (кабинет клиента, кабинет партнёра)

    P.S.: Важный комментарий. Под модулями я понимаю не модули Yii, а область кода который сфокусирован для решения определённой задачи и слабо связан с другими модулями. В Yii3 модулей вообще нет. Модули могут быть разделены папками:
    src/Model/User
    src/Model/СRM
    Ответ написан
    Комментировать
  • Почему не работает метод save()?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    У вас не проходит валидация. Смотрите правила валидации. Выполните в коде var_dump($model->errors) перед формой. И смотрите ошибки. Если у вас нет ошибок одной модели - смотрите другую. Проверить валидация ли это или нет можно легко. $model->save(false)
    Ответ написан
  • Из-за чего возникает ошибка strpos() expects parameter 1 to be string, array given?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1 передаваемый параметр ожидается строка, а там массив.
    Ответ написан
  • Где найти ссылки на хорошие yii2 проекты, где можно изучить хороший код?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Очень сложных проектов на Yii2 с открытым, да ещё и хорошим кодом очень мало)) Прежде всего, потому что Yii создан для быстрой разработки нарушая все правила сложных архитектур. А учитывая его устарелость, то тем более таких проектов мало. На форуме давно обсуждался этот вопрос. Там есть ссылки на проекты и код. Так же на сайте yiipowered.com есть список проектов, у некоторых с исходным кодом.

    Вам лучше изменить тактику и искать проекты с хорошей архитектурой вне зависимости от фреймворка. Так ваша вероятность найти что-то стоящее на много выше. В целом, хорошая архитектура - это всегда дорого. Мало кто будет выкладывать проект большой команды, на которую были потрачены сотни тысяч и миллионы в открытый доступ. Кроме того хорошая архитектура всегда зависит от требований, задач и самого проекта. Что и где применять, как строить - придет только со знанием и опытом. Здесь не получится сделать по примеру.

    Если по теме, то начните изучать или искать DDD, CQRS, SOA, Микросервисы. В принципе это основные архитектурные подходы в разработке. На Yii по DDD есть хороший пример. Однако начинать НОВЫЙ проект на Yii2 используя даже самую сложную архитектуру - путь в никуда. Yii2 создан для других целей. Чтобы понять можно посмотреть ответ на вопрос: Актуален ли Yii2 Фреймворк в 2020?
    Ответ написан
    Комментировать
  • Как отклонить вход пользователю с определённой ролью на Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Не очень понятно почему в методе actionLogin() Вы используете такую сложную конструкцию, которая, в данном случае, не имеет особого смысла. На вашем примере можно попользоваться функцией:
    Yii::$app->getAuthManager()->checkAccess(32, 'admin')

    Данная функция позволит проверять доступ для остальных пользователей. Хорошая практика — использоовать ошибки в виде исключений с ошибкой 403 и сообщением:
    public function actionLogin()
    {
        $model = new LoginForm();
        $model->password = ''; // перенести в метод rules формы, как default
    
        if($model->load(Yii::$app->request->post()) && $model->login()){
            $user = User::findOne(['username' => $this->username]);
            if(Yii::$app->getAuthManager()->checkAccess($user->getId(), 'admin')){
                throw new ForbiddenHttpException('Ошибка доступа');
            }
    
            return $this->goHome();
        }
    
        return $this->render('login', [
            'model' => $model
        ]);
    }

    Если же вам нужно использовать проверку для текущего пользователя - это вполне можно вынести в поведения:
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::class,
                'rules' => [
                    [
                        'actions' => ['create', 'update'],
                        'allow' => true,
                        'matchCallback' => function ($rule, $action) {
                            /** @var User $identity */
                            $identity = Yii::$app->user->getIdentity();
                            return $identity->isAdmin(); // или другая проверка
                        }
                    ],
                ],
            ],
        ];
    }

    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::class,
                'rules' => [
                    [
                        'actions' => ['create', 'update'],
                        'allow' => true,
                        'roles' => ['admin']
                    ],
                ],
            ],
        ];
    }

    Значение опции allow выбранного правила указывает, авторизовывать пользователя или нет. Если ни одно из правил не совпало, то пользователь считается НЕавторизованным, и фильтр ACF останавливает дальнейшее выполнение действия. По умолчанию, когда у пользователя отсутствует доступ к текущему действию, ACF делает следующее:
    • Если пользователь гость, вызывается yii\web\User::loginRequired(), который перенаправляет браузер на страницу входа.
    • Если пользователь авторизован, генерируется исключение yii\web\ForbiddenHttpException.

    Более сложные правила можно выносить в свои фильтры AccessControl

    Ссылки на документацию по теме:
    1. yii\web\User
    2. yii\rbac\ManagerInterface
    3. yii\rbac\CheckAccessInterface
    Ответ написан
    9 комментариев
  • Почему в действие контроллера не передается параметр?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Проблема очевидно не в рендеринге и роутах, а в передаче самого параметра. Вы нигде не показали ссылку и какой параметр там передается. Возможно у вас в параметр $id передается null. Посмотрите внимательно. Проверить этом можно очень просто выполнив простую команду не в шаблоне, а контроллере:
    public function actionIndex($id)
    {
         var_dump($id); die();
    }

    Так же не забывайте про return:
    public function actionIndex($id)
    {
        return $this->render('index', array('id'=>$id));
    }
    Ответ написан
    Комментировать
  • Можно ли использовать VueJs вместо Jquery в проектах Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Используйте NUXT (SSR) для СЕО. А Yii используйте как API.
    Ответ написан
    9 комментариев
  • Возможно ли скрыть колонку при помощи js в gridview yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    'headerOptions' => ['class' => 'hidden-xs'],
    'filterOptions' => ['class' => 'hidden-xs'],
    'contentOptions' => ['class' => 'hidden-xs'],
    //'footerOptions' => ['class' => 'hidden-xs'],

    Далее на класс навешивайте обработчик JS. В данном случае, при использовании bootstrap 4 будет столбец скрыт на маленьких версиях экрана.
    Ответ написан
    Комментировать
  • Как передать параметры в url на redirect в Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Да, можно. Пример
    Ответ написан
    Комментировать