Ответы пользователя по тегу Yii
  • Как реализовать единоразовый sql-запрос при использовании Behaivors в модели?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    для отключения любого поведения можно вызвать
    $model->detachBehavior('behaviorName');
    Для этого надо указывать behavior c именем

    public function behaviors()
        {
            return [
               'behaviorName'=> [
                    'class' => IndividualServicePriceBehavior::className(),
                    /// ,,,
                ],
            ];
        }


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

    Insolita
    @Insolita
    Отчаянная домохозяйка
    - Формы более переносимы и переиспользуемы
    - Формы могут быть не завязаны на аттрибуты модели и лучше выражать предметную область
    - Формы проще тестировать
    - С использованием форм проще вести разработку в команде
    - Валидация в моделях нарушает принципы SOLID (AR их в принципе нарушает, но хотябы эту часть можно нивелировать)
    - Для элементарного CRUD с минимальной бизнес-логикой можно обойтись, но если на модель завязано много логики и сценарии будут разрастаться - модель быстро превратится в божественный объект
    - Лепить все валидации в одну форму-модель ничуть не лучше, чем лепить их в Ар-модель -> для каждого кейса отдельная модель-форма
    -------------------
    Резюме: Используйте валидацию в моделях со сценариями, пока не поймёте для чего нужны формы. Использование ради использования, без осознания - всё равно бессмысленно и беспощадно
    Ответ написан
    6 комментариев
  • Можно ли минифицировать html в Yii1 стандартными средствами?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    если странички генерируются самим yii - то повешать поведение на это событие
    YII1 www.yiiframework.com/doc/api/1.1/CController#after...
    удаляющее пробелы из view

    саму функцию можно подсмотреть в упомянутом выше виджете
    public function minify(string $content):string
        {
            return  trim(preg_replace('/>\s+</', '><', $content));
        }

    если странички где-то отдельные, то читать штатными средствами. обработать функцией и записать куда надо
    Ответ написан
  • Что значит хорошо знать фреймворк?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    просто тупо изучать классы - нет никакого смысла, нужно садиться и решать какие-то задачи. А помимо самого фреймворка, обычно идёт как минимум 5-10 must-have расширений из коммьюнити, с которыми так же стоит ознакомиться.
    Нужно понять lifecycle фреймворка - пройтись с xdebug по стеку выполнения рендеренига простой страницы.
    Понять принципы роутинга, обработки запросов, конфигурации, авторизации. DI, событий. И сразу применять на практике. Yii2 не простой фреймворк для первого знакомства с фреймворками в принципе, хоть и достаточно с низким порогом вхождения, но у него много специфических плюшек, после которых перестроиться на другие фреймворки может быть тяжелее - в частности виджеты, поведения, и сама специфика конфигурации компонентов с магией
    Ответ написан
    Комментировать
  • Есть в Yii2 (или еще где-то в PHP) возможность автоматически сгенерировать таблицу из класса-модели? Именно так, а не наоборот?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    https://github.com/Insolita/yii2-migrik#annotation... этот плагин вроде похож на то что вам нужно
    Ответ написан
    Комментировать
  • Yii2 как сделать таблицу вида как exel?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    причем тут yii - это чисто html/js - задача такую таблицу делать. Тут лучше сделать фронт на чем-нить типа angular/react/vue, а из yii только данные подтягивать/писать по апи, так как, надо полагать таблица должны быть интерактивной, а не только на вывод. Пытаться это реализовать на базе yii2-виджетов - это как пытаться рубить дрова с помощью лака для ногтей.
    Ответ написан
    Комментировать
  • На чем делать личный кабинет потребителя?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    не знаю на счет готовых, но если есть колебания между yii и symfony то на symfony конструктор форм делать куда перспективнее (с использованием его компонента Form)
    Ответ написан
    Комментировать
  • Почему при попытке записать значение в Redis через yii\redis\Cache название ключа хэшируется?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    Потому что это кеш... ключи могут быть длинными, для оптимизации ключей длинной >32 байта, или если вдруг там нестандартные символы окажутся, кодируются md5
    https://github.com/yiisoft/yii2/blob/master/framew...
    Если важно не кодировать - отнаследуйте класс yii\redis\Cache переопределите функцию buldKey на свою и используйте его. [но для кеширования результатов запросов лучше этого не делать, или сделать отдельный компонент с таким поведением]
    Но, возможно вам больше подойдёт испльзовать redis напрямую, если так важны ключи (по более весомым причинам, чем удобный просмотр в базе)
    Ответ написан
    Комментировать
  • Как в Yii2 внутри шаблона подключить другой шаблон?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    www.yiiframework.com/doc-2.0/guide-structure-views...
    1. Можно отрендерить подшаблон
    $this->render('another_template',['prop'=>$val]);//шаблон в этой же директории
    $this->renderFile('@app/some/path/views/another_template',['prop'=>$val]);//шаблон из другого места

    2. www.yiiframework.com/doc-2.0/guide-structure-views...
    <?php $this->beginContent('@app/views/layouts/base.php'); ?>
     //Some another content - внедрение в вывод контента вызываемого layout 
    <?php $this->endContent(); ?>

    3. Можно использовать блоки в лейаутах для пост-внедрения в структуру
    www.yiiframework.com/doc-2.0/guide-structure-views...
    Ответ написан
    Комментировать
  • Подход к реализации DI в проектах Yii2 - правильно или не очень?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    А чем классический вариант не устраивает?

    Объявите интерфейс который нужен зависимой модели и прямо в конструктор его, можно от ActiveRecordInterface унаследовать
    Пусть ваша модель будет Post с Зависимостью Comments

    interface PostCommentModelInterface // можно extends ActiveRecordInterface
         {
            /**
             * @return ActiveRecord[]|Comment[]
            **/
                public function findForPost();
    
        }
    
         class Model extends yii\base\Model
         {
               protected $commentModel;
               public function __construct(PostCommentModelInterface $commentModel, $config = [])
              {
                    $this->commentModel = $commentModel;
                    parent::__construct($config);
               }
        ]

    А зависимости региструются в начале приложения после запуска конфига, в файле bootstrap.php
    типа Yii::$container->set('\app\modules\posts\PostCommentModelInterface','\app\modules\comments\CommenModel')

    только создавать модель надо будет не new Post(), а Yii::createObject(['class'=>'\app\module\Post']) тогда автоматом зависимость подключит... ну или вручную new Post(new Comment())

    ну или альтернативный, но менее красивый вариант

    ...
         protected $commentModel;
    
          public function __construct(\yii\container\Container $container, $config = [])
          {
             $this->commentModel = $container->get('\app\modules\posts\PostCommentModelInterface'');
              parent::__construct($config);
           }
       ...


    правда смущает ваше $this->hasMany ... при extends yii\base\Model ...
    посмотрите тут про паттерны, особенно в комментах
    https://habrahabr.ru/post/183658/#comment_6392902
    Ответ написан
    4 комментария
  • Как правильно оформить поиск по сайту?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    А что вы собственно ожидаете получить? www.yiiframework.com/doc-2.0/yii-db-queryinterface...

    like: operand 1 should be a column or DB expression, and operand 2 be a string or an array representing the values that the column or DB expression should be like. For example, ['like', 'name', 'tester'] will generate name LIKE '%tester%'. When the value range is given as an array, multiple LIKE predicates will be generated and concatenated using AND. For example, ['like', 'name', ['test', 'sample']] will generate name LIKE '%test%' AND name LIKE '%sample%'. The method will properly quote the column name and escape special characters in the values. Sometimes, you may want to add the percentage characters to the matching value by yourself, you may supply a third operand false to do so. For example, ['like', 'name', '%tester', false] will generate name LIKE '%tester'.
    or like: similar to the like operator except that OR is used to concatenate the LIKE predicates when operand 2 is an array.
    not like: similar to the like operator except that LIKE is replaced with NOT LIKE in the generated condition.
    or not like: similar to the not like operator except that OR is used to concatenate the NOT LIKE predicates.


    если хотите чтоб по каждому слову из запроса искало - то предварительно разбивайте запрос по пробелам
    public function actionSearch($query)
        {
            $subqueries = preg_split("/\s/u", $query, -1, PREG_SPLIT_NO_EMPTY);
            //Лучше потом отфильровать $subqueries убрав короткие слова или пошаманить с регуляркой что разбивало только если за пробелом слово больше n символов (чтоб Елизавета X так и осталась Елизавета X)
           // например так
           // $subqueries = preg_split("/\s(?=\w{2,})/u", $query, -1, PREG_SPLIT_NO_EMPTY)
    
            $search = Serial::find()->where(['or',['like', 'name_serial', $subqueries],['like', 'description_serial', $subqueries]]); 
            $searchDataprovider = new ActiveDataProvider([
                'query' => $search,
                'pagination' => [
                    'pageSize' => 15,
                ],
            ]);
            return $this->render('search', [
                'searchDataprovider' => $searchDataprovider
            ]);
        }
    Ответ написан
  • Как в Yii ActiveRecord получить имя вызываемого класса наследника?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    owner - это в поведениях, а так - как обычно в php php.net/manual/ru/function.get-called-class.php
    php.net/manual/vote-note.php?id=71064&page=languag...
    Ответ написан
    Комментировать
  • Как правильно вносить изменения в компонентах YII2?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    Есть компонент по типу gridview.
    Весь js находится в vendor/component/panel

    полагаю из этого следует что компонент - не есть yii-шный gridView а аналог
    свой js приложения можно хранить либо в корневой папке проекта
    Для подключения создаётся AssetBundle - наследник от соответствующего класса yii где и прописывается путь, затем бандл регистрируется в лейауте или конкретных вьюхах. www.yiiframework.com/doc-2.0/guide-structure-asset... и указанные в настройках бандла файлы будут скопированы/слинкованы в общую папку assets

    Можно сразу хранить в папке доступной из веба web/js/lib например, и тогда можно скрипт подключить во вьюхе методом registerJsFile но как правило ассетбандлы гибче

    Хотя если компонент грида используется как виджет то возможно в нем уже предусмотрена адаптация для событий поддерживаемых компонентом, и если js-кода не очень много, то можно прямо в вьюхе написать типа
    SomeGridWidget::widget([
        'prop1'=>'val1',
        'prop2'=>'val2',
        'clientOptions'=>[
               'onSomeEventCallback'=>new JsExpression('
                              function(callback_arguments){do_custom_behaviors();}
               '),
        ]
    ]);

    если кода очень немного можно прямо строкой и оставить.
    если много - вынести js-функции в отдельный js-файл а из виджета только функции вызывать.
    так же если очень часто используется с модификацией - можно отнаследовать виджет с уже предзабитыми параметрами по дефолту, и при необходимости дополненную доп.аттрибутами, чтобы не таскать по формам большую конфигурацию.
    Но тимлид однозначно прав - править файлы в вендоре не нужно. Либо наследовать (если ООП), либо на собтия предусмотренные вешаться, либо делать полностью форк с правками. Иначе после обновления пакетным менеджером будет ругаться на изменения постоянно ну и папку вендор в гит обычно не включают, при деплое зависимости подкачиваются пакетным менеджером уже на сервер согласно composer.lock
    Ответ написан
    Комментировать
  • В чем ошибка использования TimeStampBehavior в Yii2?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    return [
        'class' => TimestampBehavior::className(),
         'createdAtAttribute' => 'created_at',
         'updatedAtAttribute' => 'updated_at',
          'value' => function () {
                        return date('Y-m-d H:i:s');
          }
      ];
    Ответ написан
    Комментировать
  • Почему не видны методы подключенного класса в Yii2?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    Но почему-то не видит методы find. Не могу понять, почему.

    в каком смысле "не видит" - count($html->find($sel_from)) что возвращает?
    $html = SimpleHTMLDom::file_get_html($url); - вы прямо урл дёргаете? в $html результат есть?
    или не видит методов в том смысле что автокомплит не работает?
    Ответ написан
    Комментировать
  • Как организовать репозитории для разных разработчиков?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    git submodule ?
    Ответ написан
    Комментировать
  • Как правильно работать с layuots (работа с с виджетом dmstr/yii2-adminlte-asset,)?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    передавать данные с моделей в layouts и можно ли создать и как подключить контролер который будет осуществлять передачу данных из базы данных в layouts

    Для этого создаются виджеты
    Ответ написан
  • Yii2 и Codeception: почему не работает Stub для Request компонента?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    а другие функциональные тесты срабатывают? это похоже на ошибку при неверной конфигурации функционального теста
    Ответ написан
    Комментировать
  • Как исправить ошибку тестирования Yii2 (codeception, postgresql)?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    yiiframework.ru/forum/viewtopic.php?t=7768
    там для yii1 решение но смысл тот же... это загрузчики фикстур провоцируют.
    если не используете фикстуры, то просто наследуйтесь от TestCase а не DbTestCase
    или переопределите методы checkIntegrity отнаследовав yii\test\InitDbFixture
    Ответ написан
  • Как вывести посты по времени?

    Insolita
    @Insolita
    Отчаянная домохозяйка
    во-первых если вам нужны данные не для gridview\listview нет необходимости возвращать dataProvider в ArchiveSearch модели достаточно вернуть $query->all();
    а чтобы получить по годам - предварительно сгруппируйте массив результатов по годам
    $result = [];
             $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
             foreach($dataProvider->models as $model){
                  $result[$model->year][] = $model;
             }
             return $this->render('index', [
                        'searchModel' => $searchModel,
                        'result' => $result,
            ]);


    <?php foreach($result as $year=>$models):?>
         <h3><?=$year?></h3>
        <?php foreach($models as $model):?>
              <?=$model->data?>
         <?php endforeach?>
    <?php endforeach?>
    Ответ написан
    Комментировать