Ответы пользователя по тегу Yii
  • Реализация полнотекстовый поиска?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Раз.
    Два.
    Ответ написан
    Комментировать
  • Как подружить ajax kartic и большие файлы?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    А какой максимальный размер файла в php.ini при отправке через POST?
    Проверьте значения директив post_max_size и upload_max_filesize. Увеличьте значения если потребуется.
    Ответ написан
    Комментировать
  • Как в dropdownlist yii2 установить значение по умолчанию?

    slo_nik
    @slo_nik Куратор тега Yii
    Вот простой пример.
    $form->field($mod, 'testDrop')->dropDownList([0 => '1', 1 => '2', 2 => '3'], [
         'options' => [
                 1 => ['selected' => true] // Меняя цифру можно установить какой-либо элемент массива по умолчанию
         ]
    ]);

    В Вашем случае, я думаю, можно попробовать так:
    $form->field($model, 'id_shop')->dropDownList(ArrayHelper::map(/*********/), [
         'options' => [
                 2 => ['selected' => true] // Если, конечно, такой id есть в базе
         ]
    ]);
    Ответ написан
    3 комментария
  • Фильтр на одной странице, а данные на другой?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Возможно так.
    return $this->redirect('index', ['model' => $model);
    Ответ написан
  • Как загрузить картинку в actionUpdate в yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Для того, чтобы были видны картинки при редактировании, Вам надо настроить несколько параметров виджета.
    'pluginOptions' => [
           // остальные настройки
           'deleteUrl' => Url::to(['delete-img']), // укажите реальный путь к действию удаления изображений.
            'initialPreviewAsData' => true,
            'overwriteInitial'=>false,
            'initialPreview' => !$model->isNewRecord ? $model->imagesLinks : [],
            'initialPreviewConfig' => !$model->isNewRecord ? $model->imagesLinksData : [],
           // остальные настройки.
    ]

    Методы imagesLinks и imagesLinksData могут выглядеть так
    public function getImagesLinks()
        {
            $path = ArrayHelper::getColumn(UploadsFiles::find()->all(), 'pathImg');
            return $path;
        }
    
        public function getImagesLinksData()
        {
            $files = UploadsFiles::find()->all();
            return ArrayHelper::toArray($files,[
                UploadsFiles::class => [
                    'caption' => 'file',
                    'key' => 'id'
                ]
            ]);
        }
       // getPathImg() возвращает путь к изображению, используется в getImagesLinks()
        public function getPathImg()
        {
            return Url::home(true) . 'uploads/' . $this->file;
        }


    p.s.
    Для того,чтобы работал параметр "deleteUrl" нужно доработать код. Добавить js под формой
    $this->registerJs('
      // #uploadsfiles-imagesfile - id Вашего FileInput
      $("#uploadsfiles-imagesfile").on("fileuploaded", function(event, data, previewId, index) {
      input.fileinput("destroy").fileinput({
        multiple: true,
        showUpload: false,
        showRemove: false,
        initialPreviewAsData: true,
        overwriteInitial: false,
        uploadUrl: "' . Url::to(['upload-img']) . '", // подставить реальный путь к действию
        deleteUrl: "' . Url::to(['delete-img']) . '", // подставить реальный путь к действию
        initialPreview: data.response.initialPreview,
        initialPreviewConfig: data.response.initialPreviewData,
      })
      input.closest("form").find("button").attr("disabled", false)
        console.log(data);
    });
    ', View::POS_END);

    И доработать действие actionUploadImg()
    public function actionUploadImg()
        {
            $model = new UploadsFiles();
    
            if(Yii::$app->request->isAjax){
                $model->imagesFile = UploadedFile::getInstance($model, 'imagesFile');
                if($model->upload()){
                    $model->load(Yii::$app->request->post());
                    $model->saveImg();
                    $answer['initialPreview'] = $model->getImagesLinks();
                    $answer['initialPreviewData'] = $model->getImagesLinksData();
                    return json_encode($answer);
                }
            }
            return false;
        }


    Действие actionDeleteImg() может выглядеть так:
    public function actionDeleteImg()
        {
            if(Yii::$app->request->isAjax){
                $model = UploadsFiles::find()->where('id=:id', [':id' => Yii::$app->request->post('key')])->one();
                FileHelper::unlink('uploads/' . $model->file);
                $model->delete();
                return Json::encode('Delete');
            }
            return false;
        }
    Ответ написан
    2 комментария
  • YII2:Как получать настройки модуля в контроллере?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Если Вы указываете свойство в модели, то обращаться надо так:
    public $filename;
    
    $model = new Image();
    $model->filename;

    Если Вы желаете указать это параметром модуля, то указывайте в классе модуля. Или в конфигурационном файле как параметр
    'main' => [
                'class' => 'app\modules\main\MainModule',
                'layout' => 'main.php',
                'layoutPath' => '@app/modules/main/views/layouts',
                'params' => [
                    'test' => 'test1',
                    'test2' => 'test22'
                ]
            ],

    Тогда обратиться можно так:
    // Если указали в классе модуля public $filename
    $main = Yii::$app->getModule('main');
    echo $main->filename;

    Или так:
    // Если указали параметром в конфигурационном файле.
    $main = Yii::$app->getModule('main');
    echo $main->params['test'];
    Ответ написан
    3 комментария
  • Не могу выполнить команду mv composer.phar /usr/local/bin/composer, ЧТо делать??

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Установите composer глобально в системе.
    В консоли
    sudo su

    php -r "readfile('https://getcomposer.org/installer');" | php -- --filename=composer --install-dir=/bin

    После этого Вы сможете обращаться к composer из директории проекта
    composer your-command
    Ответ написан
    Комментировать
  • Yii как изменять ссылку при переносе контроллера?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Название модуля можно получить так:
    Yii::$app->controller->module->id
    Контролера так же (если не ошибся)
    Yii::$app->controller->id
    Попробуйте подставлять эти значения в ссылки и проверьте, возможно сработает.
    Ответ написан
  • Как вызвать модальное окно из controllera во view?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Передать параметр можно так
    return $this->redirect(['admin', 'modalErrorOplata' => $modalErrorOplata]);


    Но! Модальное окно Вы открываете после клика. При редиректе надо как-то имитировать клик по кнопке. Думаю, что лучше будет посмотреть в сторону ajax отправки данных и получения ответа.
    Ответ написан
    Комментировать
  • Как в Yii2 фильтровать по записям, которы нет в связанной таблице?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Возможно надо изменить строку
    ->andWhere(['not exists', $sub])
    На
    ->andWhere(['not in', 'id', $sub])

    p.s. Что у Вас в $sub попадает? Как я понимаю там должен быть массив id клиентов, которые ничего не покупали?

    p.s. Запрос тоже не мешало бы изменить.

    $sub = Transaction::find()
                ->where(['>', 'amount', 0])
                ->andWhere(['brand_id' => $brand])
                ->andWhere(['between', 'created_at', $start_date, $end_date])
               ->column();
    Ответ написан
  • Как в Yii2 получить название компонента внутри?

    slo_nik
    @slo_nik Куратор тега Yii
    Если я Вас правильно понял, то в конфигурационном файле задайте имя компонента.
    'components' => [
       'testComponent' => [
            'class' => 'app\components\TestComponent',
           'name' => 'testComponent'
       ]
    ]

    В самом классе компонента создайте публичное свойство и обращайтесь к нему так
    class TestComponent extends Component
    {
          public $name;
    
        public function create()
        {
             $config = ArrayHelper::getValue(Yii::$app->components, Yii::$app->testComponent->name, []);
             return Yii::createObject($config);
        }
    
    }

    Можно получить полный путь к классу компонента через Yii::$app->testComponent->className()
    Ответ написан
  • Как на Yii2 в addError вставить гиперссылку?

    slo_nik
    @slo_nik Куратор тега Yii
    Вообще-то можно.
    Сразу не сообразил.
    Вот как-то так надо сделать.
    // В ActiveForm
    $form->field($model, 'password',[
        'errorOptions' => [
            'encode' => false,
        ]
    ])->passwordInput() 
    
    // В модели
    $this->addError('password', UsersModule::t('module', 'ERROR_WRONG_USERNAME_OR_PASSWORD', ['link' => Html::tag('a','test')]));
    Ответ написан
    Комментировать
  • Как работать в Yii2 со слешем в конце URL?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Попробуйте такие настройки.
    'urlManager' => [
          'enablePrettyUrl' => true,
          'showScriptName' => false,
          'suffix' => '/',
          'normalizer' => [
              'class' => 'yii\web\UrlNormalizer',
              'normalizeTrailingSlash' => true,
              'collapseSlashes' => true,
           ],
    // остальные настройки urlManager
    ]

    Или просто добавьте только настройку 'suffix' => '/',
    Ответ написан
    1 комментарий
  • Ошибка при рутировании в Yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    В ошибке же сказано, что "Файл представления не существует: /home/igor/Projects/testmmps/frontend/views/site/error.php"
    Проверяйте в конфигурации настройку error страницы и наличие файла error.php
    Ответ написан
    Комментировать
  • Какая лучшая практика проверки достоверности запроса через ajax?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Про обращение напрямую к глобальному массиву и получение id пользователя уже написали не раз.
    А проверку csrf токена можно сделать так:
    в представлении
    $this->registerJs('
       $("#subscribe").on("click", function(e){
            $.ajax({
                  method: "POST",
                  data: {id: $(this).attr("data-post-id"),_csrf: "' . Yii::$app->request->csrfToken . '"},
                  success: function(data){
                    console.log(data)
                  }
                })
        })
    ', View::POS_END)

    в контроллере
    if(Yii::$app->request->isAjax){
        if(Yii::$app->request->validateCsrfToken()){
           // продолжаем выполнение кода.
        }
        else{
            return 'Error Csrf Token';
        }
    }


    p.s.
    Думаю, что строки подобные этой $user = User::findOne($_POST['userID']); необходимо заменить на
    строку
    $user = User::findOne(['id' => Yii::$app->user->identity->id]);
    Ответ написан
    Комментировать
  • Как правильно настроить nginx под yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Тут найдёте пример настройки Nginx
    Ответ написан
    Комментировать
  • Как записать данный sql код в виде ActiveRecord?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Приблизительно так:
    $query1 = new \yii\db\Query();
    $query1->select('userparam.*')
                 ->from('userparam')
                 ->where(['userparam.id' => 'param.id'])
                 ->andWhere(['userparam.user_id' => 42])->one();
    $query2 = new \yii\db\Query();
    $query2->select('catparam.*')
                 ->from('catparam')
                 ->where(['catparam.parameter_id' => 'param.id'])
                 ->andWhere(['in', 'catparam.category_id', [1,2]])->all();
    $params = Param::find()
                   ->select('id')
                   ->where(['not exist' => $query1])->andWhere(['exists' => $query2])->all();

    Подробней тут и тут.

    p.s. Будут в запросе ошибки, проверить не могу.)))
    Ответ написан
    Комментировать
  • Отображение ошибок валидации свойств модели в форме?

    slo_nik
    @slo_nik Куратор тега Yii
    ну регистрация в два этапа=) В модальном окне заполняешь фио и прочую лабуду, затем нажимаешь далее, открывается вкладка где надо еще заполнить доп информацию, специальность стаж работы например.

    Для этого сценарии не нужны. Разбить регистрацию на два этапа можно при помощи cookies.
    Сценариями можно разделить, например, валидацию регистрации и авторизации на сайте.
    Вот пример из документации
    class User extends ActiveRecord
    {
        const SCENARIO_LOGIN = 'login';
        const SCENARIO_REGISTER = 'register';
    
        public function scenarios()
        {
            return [
                self::SCENARIO_LOGIN => ['username', 'password'],
                self::SCENARIO_REGISTER => ['username', 'email', 'password'],
            ];
        }
    }

    В данном примере SCENARIO_LOGIN используется при авторизации, то есть, будут валидироваться username и password. SCENARIO_REGISTER будет применяться при регистрации, при этом будут проверяться username, password и email. В Вашем случае в этот сценарий можно будет добавить ещё дополнительные атрибуты для проверки, например телефон или адрес или ещё что-то.
    Ваш же сценарий, const SCENARIO_VAR1 = 'var1', вообще не сценарий, это что-то непонятное.
    И ещё, если Вы собираетесь сохранять данные в таблице, то удалите из модели public $var1, иначе в базу будет писаться пустое значение.

    p.s. Документация
    Ответ написан
  • Добавление массивов в ответ сервера. REST на Yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Необходимо настроить связи между моделями.
    Выглядит это примерно так:
    Модель Profile
    В таблице профиля берётся id записи, в данном случае "id" и ищется в таблице вакансий, в которой должен быть "id_company" соответствующий id профиля компании.
    public function getVacancy()
    {
        return $this->hasMany(Vacancy::class, ['id_company' => 'id']); // у одного профиля может быть много вакансий
    }

    Модель Vacancy
    public function getProfile()
    {
        return $this->hasOne(Profile::class, ['id' => 'id_company']); // у одной вакансии может быть только один профиль.
    }

    Тогда Ваш запрос превращается в такой:
    $vacancies = new ArrayDataProvider([
                'allModels' => Vacancy::find()->with('profile')->where(['creator' => $creator]),
                'pagination' => [
                    'pageSize' => 30
                ]
           ]);
    return $vacancies;

    Получить имя профиля можно так
    echo $vacancies->profile->company;
    Подробней здесь.
    Ответ написан
  • Как обойти конфликт js скриптов плагина pqgrid и yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Определитесь с версией jquery, выберите какую-то одну из версий.
    'http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js',
    'http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js',

    И пропишите подключение jquery первой строкой в public $js = []

    И ещё, в файле AppAsset, в блоке public $depends = [] что прописано?
    Ответ написан
    5 комментариев