Ответы пользователя по тегу Yii
  • Как в yii2 реализовать форму с аттрибутами из БД?

    doniys_a
    @doniys_a
    Backend-разработчик (Php, node.js, python, ruby)
    Хм...
    В реляционной структуре запись имени столбца вида $item->name недопустима.

    Рилейшины можете обрабатывать, в крайнем случае использовать репитер (jquery.repeater) например

    Или вот этот виджет, https://github.com/unclead/yii2-multiple-input

    Я правда от него остался не в восторге и пилил свой, но почти свалил из мира Yii разработчиков и так и не дописал до фин точки свое решение. В любом случае, работа с Relation данными и уж тем более рипетарами не очень поддерживается коробкой Yii.

    И вот просто интетесно, где у вас аттрибут называется $item->name ? Я так понимаю, $item - некий объект с данными, и вам нужно его отредактировать.

    Множественные рилейшины обрабатывать Yii из коробки тоже не умеет. Я для этого писал трейт
    https://github.com/sonrac/yii2-deep-relation-savin...

    Опишите как то детальнее свою проблему. Из описания выше сложно понять, что вам нужно.
    Ответ написан
  • Yii2: как вывести на фронтенде меню категорий с NestedSets?

    doniys_a
    @doniys_a
    Backend-разработчик (Php, node.js, python, ruby)
    https://github.com/voskobovich/yii2-tree-manager/b...

    Виджетом не подходит ?
    Ответ написан
    Комментировать
  • Аутентификация проблема с validatePassword()?

    doniys_a
    @doniys_a
    Backend-разработчик (Php, node.js, python, ruby)
    var_dump($this->password . "------------" . Yii::$app->getSecurity()->validatePassword($this->password, $user->password) . "**********" . $user->password);

    Никакой 0 возвращаться не может. Ф-я validatePassword возвращает либо true либо false. Она ничего не сохраняет, ничего не обновляет - всего лишь проверяет пришедший пароль и установленный
    Из-за того, что вы конкатенируете строку, ничего не выводится.
    Выведите так

    var_dump($this->password,Yii::$app->getSecurity()->validatePassword($this->password, $user->password), $user->password);
    Ответ написан
    Комментировать
  • Как отправить емейл в yii2?

    doniys_a
    @doniys_a
    Backend-разработчик (Php, node.js, python, ruby)
    по умолчанию все письма улетают в файлы.
    опция useFileTransport = true
    изменить на false, чтобы отправка осуществлялась через smtp
    'mail' => [
            'class' => 'yii\swiftmailer\Mailer',
            'viewPath' => '@backend/mail',
            'useFileTransport' => false,//set this property to false to send mails to real email addresses
            //comment the following array to send mail using php's mail function
            'transport' => [
                'class' => 'Swift_SmtpTransport',
                'host' => 'smtp.gmail.com',
                'username' => 'username@gmail.com',
                'password' => 'password',
                'port' => '587',
                'encryption' => 'tls',
                            ],
        ],
        ],
    Ответ написан
    Комментировать
  • Yii2 как расширить модель при включении модуля?

    doniys_a
    @doniys_a
    Backend-разработчик (Php, node.js, python, ruby)
    Стратегией можно.
    По добавлению - все понятно. Когда модуль подключен, доступ к его контоллерам есть, когда нету - нету и доступа.

    По поводу пользователей и связей.

    Самый простой вариант
    if (isset(Yii::app()->modules['moduleName'])) {...}
    Но достаточно много мест будет таких, второй способ можно создать базовый класс стратегии, который будет на входе создавать один объект со всей необходимой логикой, либо файбрику объектов - так будет проще логику раскидать, во всех действиях использовать именно стратегию/фабрику, внутри которой уже будет подсовываться нужный класс по функционалу, если модуль доступен, один, если нет - другой.

    В общем организовать нужно логику так, чтобы код не дублировался и оба случая не знали друг о друге.
    Так же вполне подойдут (даже лучше, чем выше преложенный) DI-контейнера для решения данной задачи и дробление глобальной задачи на много мелких и реализация мелких, потом уже компоновка в инстурмент.
    Ответ написан
    Комментировать
  • Где храниться пароль админки сайта на yii?

    doniys_a
    @doniys_a
    Backend-разработчик (Php, node.js, python, ruby)
    в yii1 нет поля password_hash, я могу ошибаться, но, кажись, там просто поле password и в качестве хеша - md5.
    Из коробки yii не поддерживает авторизацию через DB
    https://github.com/yiisoft/yii/blob/master/framewo...
    Обычно наследование CWebUser и переписывание метода для проверки пользователя из DB позволяло это.
    Вы можете просто написать миграцию для изменения пароля пользователя, запустить ее и спокойно входить, либо просто сгенерить новый хеш md5 (только вначале проверьте, что при проверке пароля используется именно md5), засунуть его в поле password или как оно называется в таблице user и авторизироваться.
    Ответ написан
    2 комментария
  • Фронтенд для YII2?

    doniys_a
    @doniys_a
    Backend-разработчик (Php, node.js, python, ruby)
    Да в принципе, хрен с ним с front-end фреймворком.
    Если уж следовать разделению на фронт и бек приложения, так и логика на front своя, на беке - своя, а взаимодействие через REST-API. А что выбрать - то, что вам ближе, то, что вы лучше понимаете, то, на чем вы сможете построить приложение, а не набор костылей, Vue, Angular, Marionette, React/Redux и другие инструменты - все подойдет.
    Важно просто изначально заложить архитектуру frontend-приложения. Если изначально плохо продумаете структуру и взаимодействие компонент, наплачетесь!)
    А собственно говоря, front-фреймворки нисколько не затачиваются под конкретный бекенд-фреймворк, неважно yii2, laravel, symphony, django, ror и прочее. Все равно общаются они посредством запросов в конечном итоге, либо в самом простом варианте: синхронная работа, когда большая часть рендеринга отдается серверу.
    Я конечно видел реализации, когда на этапе запроса возвращается html и вставляется в нужное место, и даже такой бред, увы, приходилось писать, ввиду отсутствия времени и требований работы без перезагрузки отдельных форм и их валидаций, но на кой тебе в таком случае frontend-фреймворк?)))
    Ответ написан
    2 комментария
  • Есть ли в Yii2 инструменты для работы с .cfg файлами?

    doniys_a
    @doniys_a
    Backend-разработчик (Php, node.js, python, ruby)
    смотря в каком формате и что в .cfg файлах...
    Смотрели, пробовали???
    А вообще для того чтобы понять что вам нужно, скиньте пример конфига, который необходимо распарсить. Если обыкновенный файл по типу "ключ=значение" или "ключ значение", то распарсить совсем не проблема.
    Cfg - это просто конфигурационный файл, а вот что там за конфигурация, в каком она формате, в каком виде это нужно смотреть на конкретном примере. Общей стандартизации для них нет.
    Ответ написан
    Комментировать
  • Как переопределить базовый метод в yii2?

    doniys_a
    @doniys_a
    Backend-разработчик (Php, node.js, python, ruby)
    https://github.com/lajax/yii2-translate-manager
    В нем из коробки есть акшн scan, который собирает и добавляет в базу новые текста из Yii::t
    Ответ написан
    Комментировать
  • Как организовать RBAC в Yii2 для контроля помимо доступов еще и доступ по языку к контенту?

    doniys_a
    @doniys_a Автор вопроса
    Backend-разработчик (Php, node.js, python, ruby)
    Да, это так, но есть одно "но", пытаюсь автоматизировать проверку правил, из замечательного проекта https://github.com/trntv/yii2-starter-kit взят GlobalAccessBehavior, который задает глобально права доступы на экшины.
    Вот как это выглядит
    Есть консольная команда, которая пробегается по всем модулям админки, собирает контроллеры и все экшины, так же пробегается по контроллерам внутри админки и делает то же самое.
    правила составляются следующим образом
    backend___
    Далее это все привязывается к роли.
    Все работает отлично, но когда возникает ситуация, когда конкретному пользователю (а их может быть и десяток) нужно отключить определенный контроллер или даже экшн, то в случае с использованием permission, его не понимает AccessControl, так как доступ задать можно для роли.
    В случае использования permission, подобную проверку проводить нужно в методе контроллера beforeAction
    public function beforeAction() {
            $permission = 'backend_' . Yii::$app->controller->module->id . '_' . Yii::$app->controller->id . '_' . Yii::$app->controller->action->id;
    
            if (!Yii::$app->user->can($permission)) {
                throw new yii\web\ForbiddenHttpException;
            }
        }

    В таком случае, это необходимо реализовывать в базовом контроллере.
    Еще есть вариант все же заставить понимать AccessRule permission а не только роли, немного его переопределив
    <?php
    
    namespace common\behaviors;
    use yii\base\Action;
    use yii\filters\AccessRule;
    use yii\helpers\Inflector;
    
    
    /**
     * @class   AccessRuleCustom
     *
     * @package common\behaviors
     * @author  Sergey Doniy <doniysa@gmail.com>
     */
    class AccessRuleCustom extends AccessRule
    {
        public $checkPermissions = true;
        public $prefix = 'backend_';
    
        public function allows($action, $user, $request)
        {
            return parent::allows($action, $user, $request) || $this->hasPermission($action);
        }
    
        protected function hasPermission(Action $action) {
            if (!$this->checkPermissions)
                return false;
    
            $permission = $this->prefix . $action->controller->module->id . '_' . $action->controller->id . '_' . Inflector::id2camel($action->id);
    
            return \Yii::$app->user->can($permission);
    
        }
    
    }

    Во втором варианте все работает, во всяком случае permission проходят, и все ок. Остановился в конечном счете на этом варианте - у пользователя всего одна роль, к которой привязываются дефолтные пермишины, а отдельные привязываются непосредственно к пользователю.
    Для того, чтобы не хардкодить с языками и ролями по ним, отдельно создал две таблицы
    auth_assignment_language_item
    которая хранит перечень языков - т.е. по сути permission для языка
    и таблицу
    auth_assignment_language
    Которая в свою очередь хранит привязку отдельного пользователя к языку
    и таблицу auth_assignment_language_child
    Для привязки роли к языку
    Расширен функционал RBAC для управления еще и языками (так как rbac храню в БД, то расширен DbManager)
    В отдельные таблицы вынес для того, чтобы логика данных была прозрачна, что позволило достаточно быстро накидать gui-интерфейс для управления правами на конкретный язык.
    Это я описал свою реализацию поднятой темы.
    Но все равно не уверен, что нет более лучших подходов для реализации.
    Интересно будет почитать, кто как решал подобные задачи и какими методами - сразу уточню - система пишется не под один проект, это внутренняя CMS компании и hot-фиксы и пинание системы под конкретный случай усложнит разработку следующих проектов, поэтому приходится по максимуму (насколько позволяет время) делать ее гибкой и расширяемой для большинства задач, которые перед разработчиками ставятся.
    Ответ написан
    Комментировать