Ответы пользователя по тегу Yii
  • Установка Yii2 advanced через composer на Win10?

    slo_nik
    @slo_nik Куратор тега Yii
    Попробуйте так
    composer global require fxp/composer-asset-plugin --no-plugins
    Ответ написан
    5 комментариев
  • Как сделать чтобы элемент массива отображался в html формате?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    В модели:
    const STATUS_BLOCKED = 0;
        const STATUS_ACTIVE = 1;
    
        /**
         * @return mixed
         */
        public function getStatusName()
        {
            return ArrayHelper::getValue(self::getStatusesArray(), $this->status);
        }
    
        /**
         * @return array
         */
        public static function getStatusesArray()
        {
            return [
                self::STATUS_ACTIVE => 'Активен',
                self::STATUS_BLOCKED => 'Завершён'
            ];
        }

    В форме:
    $form->field($model, 'status')->dropDownList(ModelName::getStatusesArray())

    В файле view.php
    'value' => Html::tag('span',
                                         $model->getStatusName(),
                                         ['class' => 'label label-' . ArrayHelper::getValue([0 => 'danger', 1 => 'success'], $model->status)])
                ]
    Ответ написан
  • Форме данные сами сохраняются, не успев нажать на button?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброй ночи.
    Уберите 'enableAjaxValidation' => true
    Перенесите в модель && $model->validate()
    Ответ написан
  • Как в yii2 создать несколько тем?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Когда-то тоже интересовался этой темой. Есть несколько вариантов решения проблемы.
    Например, в SiteController можно сделать так:
    public function init() 
        {
            parent::init();
            // Вариант 1
            // Работает без компонента в конфигурации
            // 'view' => [
            //    'theme' => []
            // ]
            $theme = Yii::$app->request->get('theme');
            if($theme){
                $this->getView()->theme = Yii::createObject([
                    'class' => '\yii\base\Theme',
                    'baseUrl' => '@web/themes/'.$theme,
                    'basePath' => '@app/themes/'.$theme,
                    'pathMap' => ['@app/views' => '@app/themes/'.$theme],
                 ]);
             }
            
            // Вариант 2
            //Работает, если в конфигурации есть компонент без параметров
            // 'view' => [
            //    'theme' => []
            // ]
            Yii::$app->view->theme->basePath = '@app/themes/admin';
            Yii::$app->view->theme->baseUrl = '@web/themes/admin';
            Yii::$app->view->theme->pathMap = ['@app/views' => '@app/themes/admin'];
    
        } 
    
        // Вариант 3
        // устанавливает тему на лету
        // вид ссылки
        // <a href="themeswitch/theme=theme_name">theme_name</a>
        // 
        public function actionThemeswitch($theme)
        {
    
            if($theme == 'default'){
                Yii::$app->response->cookies->remove('theme');
                return $this->redirect(['index']);
            }
    
            $options = ['name'=>'theme','value'=>$theme,'expire'=>time()+86400*365];
            $cookie = new \yii\web\Cookie($options);
            Yii::$app->response->cookies->add($cookie);
    
            return $this->redirect(['index']);
        }
    
        public function beforeAction($action)
        {
            if (parent::beforeAction($action)) {
                if (Yii::$app->request->cookies['theme']) {
                    $theme = Yii::$app->request->cookies->getValue('theme');
    
                    Yii::$app->view->theme = new \yii\base\Theme([
                        'pathMap' => ['@app/views' => '@app/themes/'.$theme],
                        'baseUrl' => '@web',
    
                    ]);
    
                }
                return true;  // or false if needed
            } else {
                return false;
            }
        }

    Ещё вариант Как правильно сделать свою themes для проекта на yii2?
    Мой пример(вариант № 3)

    P.S. Пример по варианту № 3 придуман не лично мной. Нашёл на просторах инета, может даже на toster.ru. Показал как demo.

    P.S.S
    Допустим тема Portfolio(по ссылке.)
    Тема находится по пути themes/portfolio
    Изображения для темы themes/portfolio/assets/ims (там же находятся css, js)
    Виды темы в themes/portfolio/views/site
    В файле index.php темы
    use app\assets\PortfolioAsset;
     $image = PortfolioAsset::register($this);
     $theme = $this->theme;

    Изображения в этом же файле подключаю так:
    echo Html::img($image->baseUrl.'/img/portfolio-1.jpg',
                             ['alt' => '']);

    И конечно же в PortfolioAsset такой параметр
    public $sourcePath = '@app/themes/portfolio/assets';
    Ответ написан
    9 комментариев
  • Неверная кодировка или неверное регулярное выражение?Как исправить?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Кодировка.
    Проверяйте везде совпадение кодировки, приводите всё к utf-8.
    Так же добавьте в регулярное выражение модификатор "u".
    $triger = preg_replace ("/[^a-zA-ZА-Яа-я\s]/u","",$message);
    Ответ написан
    Комментировать
  • Почему не устанавливается Yii2 в Win 10 через Composer и архив?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Продолжаем наше общение.
    Не знаю, что Вы натворили, но не вижу особой проблемы при установке из архива.
    Для этого я специально поставил xampp в virtualbox на windows 7(десятки просто нет у меня, не пользуюсь).
    Значит как я делал:
    1) Установил xampp без каких-либо настроек с путём установки по умолчанию (C:\xampp)
    2) В директории C:\xampp\htdocs создал директорию yii2
    3) Скопировал в директорию yii2 содержимое архива
    4) Перешёл в директорию yii2 и открыл в текстовом блокноте файл init.bat
    5) Отредактировал строку файла
    if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe
    заменил на строку
    if "%PHP_COMMAND%" == "" set PHP_COMMAND="C:\xampp\php\php.exe"

    где в PHP_COMMAND указал свой путь установки php, у Вас, естественно он будет другой, найдёте его в директории xammp.
    6) После редактирования файла init.bat нажал "сохранить" и запустил файл.
    7) В браузере ввёл адрес localhost/yii2/frontend/web и получил рабочий сайт. Версия framework 2.0.12

    P.S.
    Для того, чтобы у Вас открывался сайт по адресу http://frontend Вам надо сделать следующее:
    Открыть файл C:\xampp\apache\conf\extra\httpd-vhosts.conf и добавить виртуальные хосты
    <VirtualHost *:80>
        ServerAdmin webmaster@dummy-host.example.com
        DocumentRoot "C:\xampp\htdocs\yii2\frontend\web"
        ServerName frontend
        ServerAlias www.frontend
        ErrorLog "logs/frontend-error.log"
        CustomLog "logs/frontend-access.log" common
    </VirtualHost>

    В файле hosts прописываете
    127.0.0.1 frontend
    Перезагружаете систему, запускаете xampp и в адресной строке браузера http://frontend.
    Получаете рабочий сайт.
    Всё вышеописанное проверил, вполне рабочий вариант.

    P.S.S.
    Установка через composer тоже не должна глючить, если всё правильно сделать.
    Качаете файл здесь, запускаете и устанавливаете composer не меняя настроек по умолчанию. Единственное, что Вам может нужно будет сделать, так это указать путь к xampp.
    Открываете консоль, вводите команду
    composer global require "fxp/composer-asset-plugin:^1.3.1"

    Затем переходите в директорию xampp htdocs
    cd C:\xampp\htdocs
    и в той же консоли
    composer create-project --prefer-dist yiisoft/yii2-app-advanced имя_директории_в_которую_хотите_установить

    Остальные настройки так же как и при установке из архива(создание виртуального хоста, прописывание в hosts) и в файле init.bat ничего не надо менять.

    P.S.S.S.
    Проверил на десятой версии, всё ставится отлично через composer. Опишите пошагово, как Вы ставили composer, xampp и так далее. Возможно что-то упустили. Путь установки использовать по умолчанию лучше.
    Ответ написан
    1 комментарий
  • Yii2 2 дб миграции?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    В директории db_dev располагаются файлы миграций для базы db_dev
    php yii migrate --migrationPath=@app/migrations/db_dev --db=db_dev

    Или в миграции
    public function init()
        {
            $this->db = 'db_dev';
            parent::init();
        }
    Ответ написан
    Комментировать
  • В Yii2 - Urlmanager rules в контроллере можно написать?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброй ночи.
    можно в контроллере написать rules UrlManager?

    Нет.
    можно в модуле написать?

    Создаёте конфигурационный файл для модуля, там и пишите.
    не хочу в конфиге написать....так как есть много похожие урл

    Сделайте так, чтобы не было дубликатов и пишите в конфигурационном файле.
    Пример rules для модуля в общем конфигурационном файле:
    'rules' => [
                    [
                      // правиля для модуля admin
                      'class' => 'yii\web\GroupUrlRule',
                      'prefix' => 'admin',
                      'routePrefix' => 'admin',
                      'rules' => [
                         '<_a:(login|logout)>' => 'user/users/<_a>',
                         '<_m:[\w\-]+>' => '<_m>/default/index',
                         '<_m:[\w\-]+>/<id:\d+>' => '<_m>/default/view',
                         '<_m:[\w\-]+>/<id:\d+>/<_a:[\w\-]+>' => '<_m>/default/<_a>',
                         '<_m:[\w\-]+>/<_c:[\w\-]+>/<id:\d+>' => '<_m>/<_c>/view',
                         '<_m:[\w\-]+>/<_c:[\w\-]+>/<id:\d+>/<_a:[\w\-]+>' => '<_m>/<_c>/<_a>',
                         '<_m:[\w\-]+>/<_c:[\w\-]+>/<_a:[\w\-]+>' => '<_m>/<_c>/<_a>',
                         '<_m:[\w\-]+>/<_c:[\w\-]+>' => '<_m>/<_c>/index',
                      ],
                    ],
                    // тут rules для остального сайта
                ],
    Ответ написан
  • Установка Yii2 ADVANCED на Windows10?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Нормально скачались файлы только через архив и там есть папка vendor, но файл config/web.php нигде не найти.


    После распаковки архива, переход в директорию проекта и в консоли
    php init
    После этого можно пользоваться проектом.
    и какой именно ключ необходимо ввести


    Любой, какой пожелаете. Файл web.php находится в директории config в basic приложении. Вы же пытаетесь установить advanced. Поэтому переходите в директорию common -> main.php и в секции request пишите
    'cookieValidationKey' => '', // в кавычках вписываете ключ, какой пожелаете.


    p.s. Команду для консоли адаптируйте под windows.
    p.s.s. Установите composer в системе глобально
    p.s.s.s. Статья в помощь и ещё одна.
    Ответ написан
  • Сортировка товара по цене, по названию и.т.д?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Возможно Вам поможет этот виджет и статья.
    Кроме официальной документации вот ещё одна подсказка, возможно натолкнёт Вас на решение.
    Обработать выпадающий список можно примерно так:
    $form->field($model, 'sort')->dropDownList([1 => 'От дорогих', 2 => 'От дешёвых', 3 => 'По популярности', 4 => 'По названию'],
                ['prompt' => 'Сортировать'),
                 'onchange' => '
                                $.post(
                                 "'.Url::toRoute('default/ajax').'",  // путь к действию контроллера
                                 {id : $(this).val()}, // значение выбранного элемента списка
                                 function(data){
                                   $("div#city").html(data) // получение результата и подстановка в указанный div
                                 }
                                )
                              '])

    Действие в контроллере может быть таким:
    public function actionAjax()
    {
        if(Yii::$app->request->isAjax){
          // Тут выполняете запрос к базе и возвращаете результат работы запроса.
       }
    }

    Это Вам нужно в пользовательской части сайта сделать, как я понял.
    Если в админке, то на основе поисковой модели, выпадающий список для сортировки в gridView и фильтрация по параметру надо делать.
    Ответ написан
  • Загрузка картинки?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Откуда взялся такой псевдоним?
    Yii::getAlias('uploads/product')
    Ответ написан
  • Как вытащить id последней записи или узнать с каким id создастся юзер, Yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Создали пользователя и получили id(самый простой вариант):
    if($model->save()){
       return $model->id;
    }
    Ответ написан
    Комментировать
  • Почему не работает загрузка файла?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброй ночи.
    А откуда Вы взяли такой псевдоним?
    Yii::getAlias('@uploads/images/')
    Если уж на то пошло, Вы определили где-то псевдоним @uploads, то путь писать надо приблизительно так
    Yii::getAlias('@uploads') . '/images';
    Или установите псевдоним сначала через setAlias()

    p.s. Сделайте загрузку файла строго по документации, с отдельной моделью.
    Ответ написан
  • Как правильно вывести путь к видео из базы данных?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Для значения атрибута src используйте Url::to()
    Допустим, что файлы находятся в web/uploads/video/name_file.mp4
    Попробуйте сделать так
    <source src="<?= Url::to('@web/uploads/video/' . $video) ?>"></source>
    Ответ написан
  • Создание миниатюр в Yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    1) Сколько пожелаете
    2) Какой пожелаете
    3) Есть, вот это
    4) Да
    Ответ написан
    2 комментария
  • Yii2 как настроить htaccess?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    В корне сайта .htaccess
    <IfModule mod_rewrite.c>
      Options +FollowSymlinks
      RewriteEngine on
    </IfModule>
    
    <IfModule mod_rewrite.c>
       RewriteCond %{REQUEST_URI} ^/.*
       RewriteRule ^(.*)$ web/$1 [L]
    
       RewriteCond %{REQUEST_URI} !^/web/
       RewriteCond %{REQUEST_FILENAME} !-f [OR]
       RewriteCond %{REQUEST_FILENAME} !-d
       RewriteRule ^.*$ web/index.php
    
    </IfModule>

    В директории web
    RewriteEngine on
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    RewriteRule . index.php

    В конфигурации уберите комментарий с секции urlManager и пишите свои правила.
    Для страниц по умолчанию, которые создаются при развёртывании проекта, адреса будут без web.

    Если проект лежит в поддиректории, то в секции request конфигурационного файла пишите
    'baseUrl' => '/yii2basic'
    Ответ написан
    Комментировать
  • Почему не получаетеся с интернационализацией модуля?

    slo_nik
    @slo_nik Куратор тега Yii
    Вечер добрый.
    Вот Вам пример, подставьте своё название модуля
    namespace app\modules\main;
    
    //use Yii;
    use yii\base\BootstrapInterface;
    
    class MainBootstrap implements BootstrapInterface
    {
    	public function bootstrap($app)
    	{
    		$app->i18n->translations['modules/main/*'] = [
                'class' => 'yii\i18n\PhpMessageSource',
                'forceTranslation' => true,
                'basePath' => '@app/modules/main/messages',
                'fileMap' => [
                    'modules/main/module' => 'module.php'
                ]
    		];
    	}
    }

    namespace app\modules\main;
    
    use Yii;
    
    /**
     * main module definition class
     */
    class MainModule extends \yii\base\Module
    {
        /**
         * @inheritdoc
         */
        public $controllerNamespace = 'app\modules\main\controllers';
    
        public static function t($category, $message, $params = [], $language = null)
        {
            return Yii::t('modules/main/' . $category, $message, $params, $language);
        }
    
    }

    В конфигурации подключите модуль, в секции bootstrap
    'app\modules\main\MainBootstrap',
    Ответ написан
  • Как правильно форматировать выводимые записи в yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Попробуйте так:
    echo Yii::$app->formatter->asNtext($model->gdescription);

    И в этом случае использовать encode не обязательно. Обработка encode есть в asNtext()
    Ответ написан
    2 комментария
  • Вывод результатов поиска в ListView?

    slo_nik
    @slo_nik Автор вопроса, куратор тега Yii
    Вопрос решил. Не знаю, насколько верно, но добился нужного мне результата.
    Немного изменил свой цикл foreach(), теперь собираю попарно в массив не атрибуты моделей, а сами модели, при этом сохраняются все связи, которые мне нужны.
    foreach($dataOne as $key => $value){
        if($value->date_start == strtotime($data['FlightsSearch']['date_from'] . ' 00:00')){
            $arr_from[] = $value;
        }
        if($value->date_end == strtotime($data['FlightsSearch']['date_to'] . ' 00:00')){
            $arr_to[] = $value;
        }
    }
    
    foreach($arr_from as $from){
        foreach($arr_to as $to){
            $arr_all[] = [$from, $to];
        }
    }

    Для вывода результата в ListView сделал два представления, одно для результатов поиска "туда" и "обратно" и одно для результатов поиска в одну сторону
    'itemView' => function($model, $key, $index, $widget) use ($search, $data, $arr_all){
                      if($data['FlightsSearch']['direction'] == 2) {
                           return $this->render('_item', ['model' => $model, 'search' => $search]);
                       }
                       if($data['FlightsSearch']['direction'] == 1) {
                            return $this->render('_item_to', ['model' => $arr_all, 'search' => $search]);
                       }
    }

    Теперь, когда пользователь ищет билеты "туда" и "обратно" подключается одни вид, если только "туда" - другой вид.
    В первом случае это выглядит так:
    245f99f9aadb47739342f104333d1817.png

    Во втором так:
    f6a6776c04a840e0890f8760b93243f4.png

    Может правильней было бы преопределить сам метод виджета, но...
    В общем результат меня устраивает.
    Благодарю все, кто пытался помочь в решении задачи.
    Ответ написан
    Комментировать
  • Как получить drop down из связанной таблицы?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Можно сделать при помощи dropDownList()
    Примерно так:
    <?= $form->field($model, 'region_id')->dropDownList(ArrayHelper::map(Regions::getAllName(), 'id', 'name_ru')); ?>
    Ответ написан