• Как создать новую папку при загрузке файла в Yii2?

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    в yii2 есть FileHelper:
    www.yiiframework.com/doc-2.0/yii-helpers-filehelpe...
    у него в свою очередь есть метод createDirectory()
    FileHelper::createDirectory($fullPath);
    Ответ написан
    1 комментарий
  • Как увеличить время сессии в yii?

    @yiiworld
    Для Yii2 нужно добавить в конфигурацию(/config/web.php для базового приложения) значение timeout с указанным количеством секунд.
    Например на 10 лет:
    $config = [
    ...
    	'components' => [
            ...
    		'session'=>[
    	    		'timeout'=>10*365*24*60*60,
    		],
    	...
    	],
    ...
    ];
    Ответ написан
    Комментировать
  • Как настроить автоматическое переключение языка на сайте?

    syschel
    @syschel
    freelance/python/django/backend
    $_SERVER['HTTP_ACCEPT_LANGUAGE']
    habrahabr.ru/post/159129
    Ответ написан
    Комментировать
  • PHP 7 как установить imagick?

    rusticus
    @rusticus
    Разработчик
    apt-get install php7.0-imagick
    После перезапустите apache
    Ответ написан
    Комментировать
  • Как включить параметры async defer при загрузке скрипта?

    qonand
    @qonand
    Software Engineer
    $this->registerJsFile('https://maps.googleapis.com/maps/api/js?key='.Yii::$app->params['google']['map_api_key'].'&callback=initMap',  [
        'position' => $this::POS_END,
        'async' => 'async',
        'defer' => 'defer'
    ]);
    Ответ написан
    Комментировать
  • Как убрать единицы измерения в каталоге торговых предложениий?

    Logic87
    @Logic87
    Программист/администратор сайтов на 1С-Битрикс.
    Поставьте в настройках комплексного компонента Каталог опцию Схема отображения: расширенный.
    Ответ написан
    4 комментария
  • Как добавить data-attribute каждому элементу выпадающего списка DropDownList (Yii2)?

    В доке все есть. Примерно так.
    <?php 
        $attrs = ArrayHelper::map(ObjectType::find()->all(), 'object_type', 
            function($t){
                return ['data-attribute' => $t['type_attr']];
            });
    ?>
    <?= $form->field($model, 'type')->dropDownList(ArrayHelper::map(ObjectType::find()->all(), 'object_type', 'object_type'),
        [  
           'prompt' => 'Выберите тип объекта..',
           'options' => $attrs;
        ]
    ); ?>
    Ответ написан
    1 комментарий
  • Как в gridview в label вставить иконку и значение?

    qonand
    @qonand
    Software Engineer
    во первых если Вы используете стандартный \yii\grid\DataColumn то свойство label не может принимать анонимную функцию. Во вторых что бы отображать корректно html-контент необходимо установить параметр encodeLabel в false
    Например, так:
    [
        'attribute' => 'user_id',
        'label' => '<i class="fa fa-user-circle" aria-hidden="true"></i>',
        'encodeLabel' => false
    ]
    Ответ написан
    4 комментария
  • Почему пищит Mikrotik?

    @pr0l
    может у вас алерты на бипер завязаны? зайдите в терминал сделайте экспорт (export) конфига и ищите поиском бипер (beep)
    отключить бипер
    /system routerboard settings set silent-boot=yes
    Ответ написан
    Комментировать
  • Как в yii подключить отдельные стили на определенную страницу?

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Так же как и всегда. Либо добавить стили в head
    //это во view
    $this->registerCss('
    body {background-color:#fff;}
    ');

    либо как файл.
    //это во view
    $this->registerCssFile('path/to/myfile');

    Если зависимостей много и их еще где-то в таком же наборе надо подключить, то можно создать AssetBundle, подробнее тут www.yiiframework.com/doc-2.0/guide-structure-asset...
    Как правило в самом view не подключают css и js, так как при правильной верстке все должно быть виджетами, а у виджетов есть свой метод подключения зависимостей. И если есть необходимость во view прописать какой-то css, то скорее всего это ошибка глобальная в структуре.
    Ответ написан
    1 комментарий
  • Как вывести данные в GridView с динамическим набором колонок?

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    $models = $this->dataProvider->getModels(); //массив с моделями

    все тут: www.yiiframework.com/doc-2.0/yii-data-activedatapr...
    Ответ написан
    Комментировать
  • Как вывести данные в GridView с динамическим набором колонок?

    @masterfreelance
    программист со стажем
    Вот так "строит" колонки GridView, если его свойство $columns пустое.
    protected function guessColumns()
        {
            $models = $this->dataProvider->getModels();
            $model = reset($models);
            if (is_array($model) || is_object($model)) {
                foreach ($model as $name => $value) {
                    if ($value === null || is_scalar($value) || is_callable([$value, '__toString'])) {
                        $this->columns[] = (string) $name;
                    }
                }
            }
        }
    Ответ написан
    4 комментария
  • Как добавить модули в систему на YII2 через админку?

    kimono
    @kimono
    Web developer
    Сначала разработать и подготовить все доступные модули. В файле main.php/main-local.php (или в другом месте предполагаемого подключения модулей) вписать это:
    $modules = require('/path/to/modules/file.php');
    // и далее
    return [
      'modules' => array_merge($modules, [
        'user'  => [
          'class' => common\modules\user\Module::className(),
        ],
      ]),
    ];

    Создать табличку в базе, где будут хранится все модули. Через CRUD создать функционал по изменению статусов модулей. Рядом с GridView создать кнопочку, по нажатию на которую из всех активных модулей будет генерироваться файл '/path/to/modules/file.php' примерно следующего содержания:
    return [
                'questions'  => [
                    'class' => common\modules\poll\questions\Module::className(),
                ],
                'answers'    => [
                    'class' => common\modules\poll\answers\Module::className(),
                ],
                'news'       => [
                    'class' => common\modules\news\Module::className(),
                ],
                'tags'       => [
                    'class' => common\modules\tags\Module::className(),
                ],
                'categories' => [
                    'class' => common\modules\categories\Module::className(),
                ],
                'images'     => [
                    'class' => common\modules\images\Module::className(),
                ],
                'uploader'   => [
                    'class' => common\modules\uploader\Module::className(),
                ],
                'content'    => [
                    'class' => common\modules\content\Module::className(),
                ],
                'employees'  => [
                    'class' => common\modules\employees\Module::className(),
                ],
                'comments'   => [
                    'class' => common\modules\comments\Module::className(),
                ],
    ];

    В принципе как бы и всё. Только от ошибок тут не застрахуешься, потому как один модуль нередко работает с другим в паре. Например, отдельно стоящие модули - статьи, блоги, новости, погода - таким макаром подключить можно, но какие-нибудь Comments, которые подключаются к другим модулям, наверное без правки кода не получится.
    Ответ написан
    1 комментарий
  • Что лучше: yii\db\Query или Active Record?

    maxkh
    @maxkh
    Web developer
    В батле Query VS ActiveRecord - нет победителя - это инструменты для решения разных задач.

    Но я хочу отвлечься от вашего вопроса и поинтересоваться настроены ли в вашей БД внешние ключи ? Если нет, то советую начать изучение именно с этого момента, понимание внешних ключей в MySQL.

    После чего, нужно очень вдумчиво и хорошо прочесть официальную документацию на тему ActiveRecord (www.yiiframework.com/doc-2.0/guide-db-active-recor...

    После этого, у вас должна сложиться более целостная картинка о том, как это использовать вместе и что за что отвечает.

    Теперь вернемся к использованию Query и AR, ну тут все просто, приведу просто пример кода

    /**
     * Class VehicleQuery
     * @package frontend\modules\v1\models\vehicle
     */
    class VehicleQuery extends ActiveQuery
    {
        public $type;
    
        /**
         * @param \yii\db\QueryBuilder $builder
         * @return \yii\db\Query
         */
        public function prepare($builder)
        {
            if ($this->type !== null) {
                $this->andWhere([Vehicle::tableName() . '.vehicle_type' => $this->type]);
            }
            return parent::prepare($builder);
        }
    
        /**
         * Returns popular and active vehicles based on vehicle type
         * @return $this
         */
        public function popular()
        {
            $this->andWhere([
                Vehicle::tableName() . '.promoted' => 1,
                Vehicle::tableName() . '.deleted' => 0,
                Vehicle::tableName() . '.status' => '1',
                Vehicle::tableName() . '.in_use' => 1
            ]);
            return $this;
        }
    
        /**
         * @return $this
         */
        public function active()
        {
            $this->andWhere([
                Vehicle::tableName() . '.status' => '1',
                Vehicle::tableName() . '.deleted' => 0
            ]);
            return $this;
        }
    
        /**
         * @return $this
         */
        public function inUse()
        {
            $this->andWhere([Vehicle::tableName() . '.in_use' => 1]);
            return $this;
        }
    
    
        /**
         * Returns most rated vehicles
         * @return $this
         */
        public function rated()
        {
            $this->addOrderBy([
                Vehicle::tableName() . '.rating' => SORT_DESC,
                Vehicle::tableName() . '.created_at' => SORT_DESC
            ]);
            return $this;
        }
    
        /**
         * Returns most recently vehicles
         * @return $this
         */
        public function recently()
        {
            $this->addOrderBy([
                Vehicle::tableName() . '.created_at' => SORT_DESC,
                Vehicle::tableName() . '.rating' => SORT_DESC
            ]);
            return $this;
        }
    }


    Мы имеем модель Vehicle и для работы с этой моделью нам необходимо строить запросы, именно этим и занимается класс VehicleQuery - он берет на себя эту ответственность. Очень важно что бы Query класс был ответственный только за построение запросов, методы не должны возвращать find или save, они должны возвращать только экземпляр Query.

    Приведу код модели Vehicle
    class Vehicle extends ActiveRecord
    {
        public static function find()
        {
            return new VehicleQuery(get_called_class());
        }
    
        /**
         * @return \yii\db\ActiveQuery
         */
        public function getCarBrand()
        {
            return $this->hasOne(CarBrand::className(), ['id' => 'car_brand_id']);
        }
    
        /**
         * @return \yii\db\ActiveQuery
         */
        public function getCarGeneration()
        {
            return $this->hasOne(CarGeneration::className(), ['id' => 'car_generation_id']);
        }
    
        /**
         * @return \yii\db\ActiveQuery
         */
        public function getLanguage()
        {
            return $this->hasOne(Language::className(), ['id' => 'language_id']);
        }
    
        /**
         * @return \yii\db\ActiveQuery
         */
        public function getUser()
        {
            return $this->hasOne(User::className(), ['id' => 'user_id']);
        }
    
        /**
         * @return \yii\db\ActiveQuery
         */
        public function getPosts()
        {
            return $this->hasMany(Post::className(), ['car_id' => 'id']);
        }
    }


    Модель описывает entity, rules, relations, attributes - собственно это главная ответственность модели, никакую дополнительную логику в моделе не рекомендуется имплементировать.

    Из выше описанного ваш запрос может выглядеть следующим образом

    Vehicle::find()->with(['user', 'posts'])->active()->recently();


    Этот запрос выберет активные транспортные средства за последнее время со связями getUser(владелец) и getPosts(блоги).
    Ответ написан
    1 комментарий
  • Что лучше: yii\db\Query или Active Record?

    mitaichik
    @mitaichik
    В первую очередь нужно настроить связи таблиц в БД (прописать ключи) - это делается с помощью MySQL менеджера (или какая бд у вас там).

    Далее сгенерировать классы объектов (в терминологии Yii - модели) с помощью Gii (чтоб не писать код вручную). Если вы правильно сделали пункт 1, то он вам сам сгенерирует все необходимые связи (после чего имеет смысл удалить ненужные и переименовать, например связь pageValue в value - но это по желанию).

    После этого просто пользуйтесь ActiveRecord'ом, например:

    $page = Page::findOne(1);
    echo $page->value->text;
    echo $page->category->title;
    
    foreach($page->params as $param){
       echo $param->name .' : '. $param->value;
    }


    Yii сам выполнит необходимые запросы и подгрузит необходимые данные.

    Приведенный коллегами метод with позволяет сократить кол-во запросов (подгружает связи сразу). joinWith позволяет джойнить тадлицу в запросе чтоб делать по ней условия, и много чего другого есть в ActiveRecord - все это описано в документации.

    В целом - ActiveRecord - потрясающе удобный механизм, его однозначно стоит изучить.
    Ответ написан
    Комментировать
  • Что лучше: yii\db\Query или Active Record?

    kimono
    @kimono
    Web developer
    Если настроить связи с page_category, page_value и page_params то можно получить такой запрос:
    $data = Page::find()
        ->where(['page.page_id' => 1])
        ->with('page_category')
        ->with('page_value')
        ->with('page_params')
        ->all();
    Ответ написан
    2 комментария
  • Как заставить DOMDocument закрыть тэг, как хочу я?

    @salexseen
    Попробуй заменить $doc->save(path) на $doc->save(path, LIBXML_NOEMPTYTAG), тогда библиотека не должна удалять закрывающий тег.
    Ответ написан
    Комментировать
  • Yii2 Advanced на хостинге -как запустить отладчик и gii?

    slashinin
    @slashinin
    Задачи для PHP https://justcoding.ru
    Попробуйте вставить в конфиг:
    'modules' => [
        'bootstrap' => ['gii','debug'],
        'gii' => [
            'class' => \yii\gii\Module::className(),
            'allowedIPs' => ['Ваш IP']
        ],
        'debug' => \yii\debug\Module::className(),
        // ..........
    ],
    Ответ написан
    Комментировать
  • Как вы создаёте адаптивный дизайн и всегда ли это нужно?

    SuperMax899
    @SuperMax899
    лучшее "спасибо" - кнопка "решение вопроса"
    На абстрактный ответ мог бы ответить абстрактно, но отвечу с вариантами.
    В зависимости от задачи, я опишу не для сервисов или больших сайтов\ресурсов.
    Советую так же прочесть вот эту статью: frontender.info/building-a-better-responsive-website

    Обычно использую bootstrap, который дополняю своими стилями, к примеру, сразу удаляю\перекрываю .row с его -15px margin'ом по сторонам, добавляю класс padding-0 для убирания в некоторых блоках padding'a у col- (который стандартно по 15px).

    Стандартно учитываю разрешения - HD, ноутбучное 1366 и свое чуть меньше 1366 (у меня пуск справа:) ), 1024-960 - старые мониторы и нетбуки, смотрю в диапазоне 768px-960 для некоторых планшетов и телефонов, и меньше 768 для телефонов. Тут дизайн один, через media onlyscreen убираем с загрузки ненужные части.
    Если все сверстано правильно и добавлены везде классы, то сайт будет полностью адаптивным.
    Для тестов меньше 768px проверяю через iphone 5 и старенький android-телефон. (Через Toggle Device mode в Google Chrome получаешь очень сильно разительные результаты в сравнении с устройством - браузеры то другие, хотя большие косяки всплывают сразу.)
    Тут кстати еще (мобильная) кросс-браузерность очень тонкий вопрос. Стиль у каждого браузера свой, особенно у всяких элементов типа input, так что тоже требует проверки и состояний тоже (placeholder, цвет текста в поле).

    Нужно ли это? Безусловно - на любом сайте, в любой отрасли половина трафика с мобильных устройств, это уже стандарт качества, на мой взгляд:)
    Ответ написан
    2 комментария