• Как задать assets для yii2 только для определенной страницы?

    zetamen
    @zetamen
    В поисках нового
    В функции init проверять url, если главная - добавлять

    public function init()
    {
        if (\yii::$app->request->url == \yii::$app->homeUrl) {
            $this->js[] = 'script.js';
        }
    }
    Ответ написан
    7 комментариев
  • Когда использовать protected, private, public и static методы?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Есть такая штука в ООП как инкапсуляция. С этого стоит начать и в принципе можно было бы закончить, если бы не static и не protected.

    public
    Публичные методы класса. Логично да? Какие методы у нас должны быть публичными - те которые составляют интерфейс класса. То есть для, например, класса кеширования у нас должен быть такой интерфейс:
    interface Cache {
        public function get($name);
        public function set($name, $value);
        public function has($name);
        public function remove($name);
        public function removeAll();
    }


    Давайте введем понятие "клиентский код". Это тот код который будет использовать ваш код, ваши объекты. Что он должен знать о реализации ваших классов? Да ничего он знать не должен. Он должен знать только как им пользоваться. Это как раз таки интерфейс и регламентирует. Мол "этот объект позволяет вам брать/сохранять/удалять данные в/из кэша. Клиентский код не знает где кэш находится, есть ли он вообще... да и ему и не нужно.

    private
    Внутренние методы классов. Те которые не входят в интерфейс но нужны, скажем, для уменьшения дублирования реализации.

    class FileCache implements Cache{
        public function has($name) {
              return is_file($this->getCacheFilePath($name));
        }
    
        public function get($name) {
             if (!$this->has($name)) {
                  return null;
             }
     
             return unserialize(file_get_contents($this->getCacheFilePath($name)));
        }
    
        private function getCacheFilePath($name) {
             return $this->cacheDir . '/' . $name;
        }
    }


    protected
    Иногда у вас появляется необходимость вынести общую реализацию внутренних методов в базовый какой-то абстрактный класс. Например у вас есть несколько реализаций кеша для одного и того же хранилища или что-либо такое. Тогда вы заводите абстрактный класс, выносите туда всю общую реализацию в protected методах ну и т.д. Придумывать пример лень... Придумайте сами. Суть в том что protected методы желательно использовать только в абстрактных классах (но не как абстрактные методы, хотя всякое может быть) или если вы планируете дать возможность расширять ваш класс (но если честно, это крайне редко бывает).

    static
    Статические методы, это всяческие методы хелперы. Например в языках типа Java есть такое понятие как именованные конструкторы. Мол когда для конструирования объектов нужно много данных переделать или что-то еще, для удобства заводят статический метод какой а в нем уже реализуют какую-то логику. Желательно вообще что бы статический метод не содержал много логики, но... всякое бывает. Вообще тут стоит еще поподробнее почитать о том как себя ведут статические методы и свойства, в чем их особенность и т.д. Попробуйте тот же сингелтон сделать к примеру.

    class Template($content) {
        public static fromFile($path) {
             return new static(file_get_contents($path));
        }
    }


    Вот... Возможно человеки вроде FanatPHP разгромят мой ответ, или дополнят его...

    Так же если вам хочется научиться правильно составлять интерфейсы классов, следует почитать про low coupling и high cohesion. Эти два принципа должны заставить вас соблюдать баланс и держать в интерфейсе класса только то, что там должно быть. Так же к вопросу о наследовании можно подключить принцип подстановки Барбары Лисков. Даже на той же википедии почитайте. А там если станет интересно в принципе можно поискать интересные материалы по GRASP и SOLID.
    Ответ написан
    4 комментария
  • Как выделить активную ссылку Pjax?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Используйте виджеты Nav или Menu. У обоих виджетов, для свойства items есть параметр active. Вот при помощи этого параметра и укажите, когда ссылка должна быть активирована, а когда нет.
    Например:
    'active' => $context->module->id == 'user',
    Есть у этих виджетов и другие свойства для определения активных элементов, подробней смотрите по ссылкам.
    Ответ написан
    7 комментариев
  • Как в yii2 реализовать алфавитный указатель?

    usdglander
    @usdglander
    Yipee-ki-yay
    $list = Model::find()->where(['like', 'name', 'А%', false])->all();
    Ответ написан
    2 комментария
  • Как в Yii2 работать со связанными таблицами при помощи ActiveRecord?

    @urfinjazz Автор вопроса
    Отвечу на свой вопрос, вдруг кому-то пригодится.

    Итак, задача:
    Есть таблица pages и связанная таблица content, в таблице content может быть несколько записей с одним page_id.
    Нужно реализовать список всех pages, при клике на "edit page" мы должны попасть на страницу с контентом этой page.

    Реализация:
    Заходим в gii, создаём модель для pages, если поставить галочку Generate Relations, в моделе создастся функция
    getContents()
        {
            return $this->hasMany(Content::className(), ['page_id' => 'id']);
        }

    Создаём модель для Content.
    Создаём CRUD для Pages.

    В контроллере Pages меняем строчку
    $model = Pages::findOne($id)
    на
    $model = Pages::find()->with('contents')->where(['id'=>$id])->one()

    Всё. Можем работать с данными из таблицы content.

    Первый вопрос - можно ли пихать такое в контроллер - остаётся открытым.
    Вернее, я уверен, что не стоит.
    Ответ написан
    7 комментариев
  • Yii2 виджеты NAV и MENU не принимают массив?

    Может все-таки так нужно:
    'items' => Category::CategoryMenu(),
    Ответ написан
    2 комментария
  • Как создать поля формы (select, checkboxList...) на мультиязычном Yii2?

    @iSensetivity
    бухгалтер, програміст-самоук
    В контроллере собрать масив с переведенньіми значениями и потом скормить в dropDownList
    Ответ написан
    1 комментарий
  • Yii2 как создать форму с удалением/добавлением полей через админку?

    qonand
    @qonand
    Software Engineer
    Структура базы:
    1. Таблица questionary насколько я понимаю хранит вопросы а данные анкеты, поэтому ее лучше переименовать, например в questions. По структуре таблицы - все норм
    2. Таблица questionary_item - опять таки что у Вас в ней храниться? Варианты ответа на вопрос. По этому ее опять таки лучше переименовать например в answers_variants. По структуре этой таблицы так же все нормально, но не надо в ней хранить null для полей ввода... У Вас эта таблица должна хранить ТОЛЬКО варианты ответов, если вопрос не подразумевает возможности выбора из вариантов - тогда не надо хранить никаких NULL

    Логика и валидации: Есть такая штука как динамическая модель, она позволяет формировать ее структуру в процессе выполнения приложения. Разберитесь с ней и вопрос как организовать логику и валидацию отпадет

    Верстка: ну тут все просто нужно использовать стандартный ActiveForm и формировать его поле с помощью цикла по атрибутам динамической модели
    Ответ написан
    Комментировать