Ответы пользователя по тегу Yii
  • Yii2 как в контроллере понять, что в форме нажата кнопка Save?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Кнопка Save тут ни причем.

    2. У модели есть 2 метода $model->save() и $model->validate()
    $model->save() - сохраняет и валидирует
    $model->validate() - только валидирует данные.

    У вас должно быть немного иначе:
    if ($model->validate()) {
            ///здесь ваш код
            $model->save()
            пишем данные, закрываем модалку
        } else {
            выводим результат валидации (рендерим аякс? или встроенная валидация?)
        }
    }


    С загрузкой данных из формы
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
    ///code
       $model->save()
    }


    Валидацию вы выбираете сами. Я думаю, что простые правила валидации валидируются ajax. А сложные уже после нажатия кнопки и запроса на сервер. Например, длину текста валидируем на клиенте. А сложную логику после запроса

    Вопрос: как мне в контроллере проверить, что была нажата кнопка Save в форме?

    Зачем вам проверять нажата ли кнопка? Это вопрос JS. А в контроллере вы смотрите на переданные данные из формы. Если они есть, то вы их обрабатываете. Если их нет, то вы показываете форму.
    Ответ написан
    2 комментария
  • Yii2. Как записать запись в другую таблицу при транзакции?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Я конечно всё понимаю, но где у вас связь. Данные вы заполняете, а сама связь не создается у вас... Она же не появляется ни откуда...

    Создавайте связь напрямую:
    $customer = Customer::findOne(123);
    $order = new Order();
    $order->subtotal = 100;
    // ...
    
    // установка атрибута, которой задаёт связь "customer" в объекте Order
    $order->customer_id = $customer->id;
    $order->save();


    По вашему примеру
    if($model->load(Yii::$app->request->post()) && $address->load(Yii::$app->request->post())){
                  $transaction = Yii::$app->db->beginTransaction();
                  try  {
                      if ($model->save()) {
                          $address->user_id = $model->id
                          Yii::$app->session->setFlash('success', 'Model save');
                          $address->save();
    
                          $transaction->commit();
                          Yii::$app->session->setFlash('success', 'User added');
                          return $this->refresh();
                      } else {
                          $transaction->rollBack();
                          Yii::$app->session->setFlash('error', 'Data error');
                      }
                  } catch (Exception $e) {
                      $transaction->rollBack();
                      Yii::$app->session->setFlash('error', 'Data error2222');
                  }
              }


    Или используйте link():
    $customer = Customer::findOne(123);
    $order = new Order();
    $order->subtotal = 100;
    // ...
    
    $order->link('customer', $customer);

    По вашему примеру
    if($model->load(Yii::$app->request->post()) && $address->load(Yii::$app->request->post())){
                  $transaction = Yii::$app->db->beginTransaction();
                  try  {
                      if ($model->save()) {
                          $address->link('nameRelationModel', $model)
                          Yii::$app->session->setFlash('success', 'Model save');
                          $address->save();
    
                          $transaction->commit();
                          Yii::$app->session->setFlash('success', 'User added');
                          return $this->refresh();
                      } else {
                          $transaction->rollBack();
                          Yii::$app->session->setFlash('error', 'Data error');
                      }
                  } catch (Exception $e) {
                      $transaction->rollBack();
                      Yii::$app->session->setFlash('error', 'Data error2222');
                  }
              }


    Информация в документации
    Ответ написан
    Комментировать
  • Yii2. Как переносить записи на другую страницу при использовании пагинации?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Вы не правильно поняли работу пиганатора. Посмотрите как написано в документации.

    https://www.yiiframework.com/doc/api/2.0/yii-data-...

    Выборка записей меняется с помощью
    $models = $query->offset($pages->offset)
            ->limit($pages->limit)
            ->all();
    Ответ написан
    Комментировать
  • Не работает backend при альтернативном размещении каталогов Yii2 advanced?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Если у вас htaccess настроен правильно, то переходите ко второму пункту. Если не настроен - настройте.
    2. Посмотрите есть ли префикс у BaseUrl.
    3. Проверьте Настройки у URL менеджера

    Вот инструкция: https://кодер.укр/записи/htaccess-для-yii-2-advanced
    Ответ написан
    1 комментарий
  • Как получить название города вместо id?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Читайте документацию klard.

    1. Получение названия можно осуществить через api.

    2. Так же можно хранить информацию о городах в своей таблице city где будет храниться ваш id и klard_id vk_id name

    3. Ещё один вариант это сохранять у записи имя города и id Кларла.

    Лучше всего использовать второй вариант.

    Смысл такой. Вы ищите через поле формы города по Ajax у Кларда. Далее пере сохранением записи смотрите есть ли такой город в вашей базе данных. Если есть, то просто вытаскиваем id если нет, то создаём новый город по данным кларда и получаем уже ваш id города.

    Но хранить ID кладра и получать по api название города крайне не советую. Так вы зависите от системы Кларда. Если у них что-то случиться вам восстановить это будет сложно. В лучшем случае у вас просто не подгрузится название города.
    Ответ написан
    Комментировать
  • Как исправить ошибку "The file or directory to be published does not exist"?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Ошбику можно исправить таким путем прописав в конфиге:
    'aliases' => [
            '@bower' => '@vendor/bower-asset',
            '@npm' => '@vendor/npm-asset',
        ],
    Ответ написан
    Комментировать
  • Как подгрузить меню и футер на разные страницы?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Это шаблон. Layout https://www.yiiframework.com/doc/guide/2.0/ru/stru...

    <?php
    use yii\helpers\Html;
    
    /* @var $this yii\web\View */
    /* @var $content string */
    ?>
    <?php $this->beginPage() ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8"/>
        <?= Html::csrfMetaTags() ?>
        <title><?= Html::encode($this->title) ?></title>
        <?php $this->head() ?>
    </head>
    <body>
    <?php $this->beginBody() ?>
        <header>Моя компания</header>
        <?= $content ?>
        <footer>Моя компания &copy; 2014</footer>
    <?php $this->endBody() ?>
    </body>
    </html>
    <?php $this->endPage() ?>
    Ответ написан
    1 комментарий
  • Как восстановить AdminLte 2 после обнолвения YII2 до верссии 2.0.25?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Ошибка говорит о том, что такой класс не существует.

    1. reinstall yii2-adminlte-asset.

    2. Если не поможет первое. Пройдите к шаблону который указали во второй строке. Скопируйте его к себе в views и зарегистрируйте правильно Asset класс. Должно быть \dmstr\web\AdminLteAsset::register($this);

    Настройте в отображении ваш шаблон, вместо вендора.

    Скорее всего это поможет. Возможно что-то другое. Ошибка заключается в том, что он не может найти класс. Если не получится пишите в комментарии. Разберёмся.
    Ответ написан
  • Как применить только одну миграцию в Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    yii migrate 1

    yii migrate/to 150101_185401                      # используя временную метку определяющую миграцию
    yii migrate/to "2015-01-01 18:54:01"              # используя строку, которая может быть получена путем использования функции strtotime()
    yii migrate/to m150101_185401_create_news_table   # используя полное имя
    yii migrate/to 1392853618                         # используя временную метку UNIX


    В документации все есть
    Ответ написан
    23 комментария
  • Как скрыть пункт меню, в Yii2 используя виджет Menu?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Поле 'visible' должно получать false OR true. В вашем случае это массив. Ответ выше подходит, но у вас отрицание перед переменными. Поэтому мой ответ такой.

    'visible' => !$isGrupeUserOne && !$isGrupeUserTwo
    Ответ написан
    Комментировать
  • Как лучше хранить дату в БД при использовании виджета DateTimePicker?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Виджет от картика тут не причем! Поля в базе могут отличаться сильно от визуализации и использований.
    2. Смотря для каких целей вам нужно использовать дату.

    TIMESTAMP - это 4 байта
    DATETIME - это 8 байтов

    Временные метки также легче в базе данных и быстрее индексируются.

    Тип DATETIME используется, когда вам нужны значения, которые содержат как дату, так и время. MySQL извлекает и отображает значения DATETIME в формате «ГГГГ-ММ-ДД ЧЧ: ММ: СС». Поддерживаемый диапазон: от 1000-01-01 00:00:00 до 9999-12-31 23:59:59.

    Тип TIMESTAMP имеет диапазон от 1970-01-01 00:00:01 UTC до 2038-01-09 03:14:07 UTC. Он имеет различные свойства в зависимости от версии MySQL и режима SQL, в котором работает сервер.

    DATETIME является постоянным, в то время как TIMESTAMP определяется настройкой time_zone.

    Я принимаю это решение на семантической основе.

    Я использую метку времени (TIMESTAMP), когда мне нужно записать (более или менее) фиксированный момент времени. Например, когда запись была вставлена ​​в базу данных или когда произошло какое-либо действие пользователя.

    Я использую поле даты и времени (DATETIME), когда дата и время могут быть установлены и изменены произвольно. Например, когда пользователь может позже сохранить изменения.

    СТАТЬЯ НА ТЕМУ
    Ответ написан
    Комментировать
  • Yii2, есть ли типовое решение для редактирования записей Grid view в модальном окне?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Есть.
    https://github.com/loveorigami/yii2-modal-ajax
    https://github.com/johnitvn/yii2-ajaxcrud

    Второе используйте без фанатизма. Так как не поддерживается. Можете посмотреть как сделано и написать своё. Это не так сложно. Всё зависит от ваших задач.

    Большинство таких задач относится к UI интерфейсу. Поэтому таких решений не так много на Yii2. Это будет не совсем правильно переводить один язык на другой, хотя иногда так делают. Если посмотреть на эти расширения, то именно этим они и занимаются. Для этого и есть JS + Html + CSS и это их отвественность. Можно попробовать поискать готовые решения на JS.
    Ответ написан
    Комментировать
  • Yii2, Grid view, Label - как сделать метку из нескольких полей по внешнему ключу?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Нужно создать новый метод в модели User:

    Как вариант создать в представлении анонимную функцию:

    public function getFullName(string $separator = ' '): string
    {
        return implode($separator, array_filter([
            $this->firstName,
            $this->middleName,
            $this->lastName
        ]));
    }


    'value'=> function($model) {
    return $model->first_name .' '. $model->last_name
    }


    Использовать:
    user.fullName
    //или
    
    $user->getFullName(', ')
    Ответ написан
    1 комментарий
  • Как отобразить 2 массива в хронологическом порядке?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Можно) В Yii2 есть хелпер по работе с массивами:
    https://www.yiiframework.com/doc/guide/2.0/ru/help...
    Ответ написан
    Комментировать
  • Exception 'yii\base\UnknownMethodException' with message 'Calling unknown method: yii\console\Application::getSession()'. Что делать?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    В консоли сессия не нужна и в принципе её там нет. Поэтому и ошибка. Переведите ошибку. Все же понятно:

    Вызов неизвестного метода: yii \ console \ Application :: getSession () '


    Сессия (session) – это некоторый отрезок во времени, в пределах которого веб-приложение может определять все запросы от одного клиента.
    Ответ написан
    5 комментариев
  • Как импортировать файл с таблицей в контентную область сайта на Yii?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Готового нет. Зачем загружать и конвертировать? Если вы это делаете руками, то можно просто копировать и вставить. Таблица распознается этим редактором. По мне дак нет смысла делать эту разработку)
    Ответ написан
    Комментировать
  • Как сортировать кастомное поле с ActiveDataProvider?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Мне кажется вам стоит лучше работать с массивом и SQL запросами по двум причинам:
    1. Вы не загадите сущности дополнительной, не нужной логикой и связями.
    2. Запросы на простых массивах выдают данные на много быстрее чем на объектах AR.

    Если же вы все таки хотите осуществить вашу затею, то идите по подходу денормализации данных. Создайте дополнительное поле-счётчик, которое будете изменять при создании и редактировании. Таким образом вывод и сортировка этого поля не будет нагружать базу, создавать кучу запросов при каждом изменении сортировочных и фильтруемых параметров, так как это будет поле вашей таблице. На которое ещё и можно повесить индекс для ускорения.
    Ответ написан
    Комментировать
  • Как лучше сделать управление GridView из админки?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Права доступа делаются с использованием RBAC, который есть в Yii2. Можете реализовать свою логику. Чтобы можно было изменять данные их лучше хранить в базе. RBAC Yii2 это позволяет.

    Отображением колонок предусмотрено свойство «visible» в GridViev. Ему нужно передавать булево значение (false, true)

    “visible” => true // или ваше условие

    [
        'label' => 'Executive Name',
        'attribute' => 'cs.first_name',
        'visible' => function ($data) {
            if ($data->hc_customersupport->is_supervisor) {
                return '1'; // or return true;
            } else {
                return '0'; // or return false;
            }
        },
    ],


    use Yii;
    
    ...
    
    'visible' => Yii::$app->user->can('supervisor'),
    Ответ написан
    3 комментария
  • Как можно получить атрибуты GridView для своего виджета?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Если ваш виджет наследуется от грида, то да. Можно получить свойство атрибутов.

    Второе решение, если эти два виджета на одной странице. То можно создать переменную $attributes куда добавить общие переменные и добавить её в оба виджета.

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

    Иногда лучше сделать копипаст, чем гадать два дня на кофейной гуще откуда это взялось. Не стоит создавать себе проблем на ровном месте. Особенно если эти два виджета независимы друг от друга. Логику копипаста надо реализовывать не в этих виджетах, а во вне... Например, как написал выше. Или хелпер...

    Стоит просто посмотреть как это реализовано в Yii2. Три виджета GridView, ListView, DetalView. Эти виджеты используют одни и те же атрибуты одной модели. Но там никто так не стал делать как вы хотите.
    Ответ написан
    4 комментария