Ответы пользователя по тегу Yii
  • Как убрать автоматический вход при регистрации в Yii2?

    igorbelikov
    @igorbelikov
    Fullstack Developer
    Там кажется нужно мосмотреть на модельку формочки с регистрацией, там после того, как пользователь создан - оно его авторизирует, вот эту строчку и нужно убрать :-)
    Ответ написан
    2 комментария
  • Yii2, почему не работает search model?

    igorbelikov
    @igorbelikov
    Fullstack Developer
    Как бы работать должно.

    Можете пожалуйста привести еще код модели и код модели поиска.

    Скорей всего у вас в моделе поиска неправильно описаны условия поиска, либы вы пытаетесь использовать несуществующие поля.
    Ответ написан
    43 комментария
  • Как в Yii2 работать с последовательно связанными таблицами используя ActiveRecord?

    igorbelikov
    @igorbelikov
    Fullstack Developer
    Используйте Gii генератор и он все сделает за вас.

    Модель Department.
    class Department extends \yii\db\ActiveRecord {
      /**
       * @return \yii\db\ActiveQuery
       */
      public function getBuildings() {
        return $this->hasMany(Building::className(), ['department_id' => 'id']);
      }
      // ...
    }

    Может получать:
    var_dump($department->buildings);

    Модель Building.
    class Building extends \yii\db\ActiveRecord {
      /**
       * @return \yii\db\ActiveQuery
       */
      public function getDepartment() {
        return $this->hasOne(Department::className(), ['id' => 'department_id']);
      }
      /**
       * @return \yii\db\ActiveQuery
       */
      public function getRooms() {
        return $this->hasMany(Room::className(), ['building_id' => 'id']);
      }
      // ...
    }

    Может получать:
    var_dump($building->department);
    var_dump($building->rooms);


    Модель Room.
    class Room extends \yii\db\ActiveRecord {
      /**
       * @return \yii\db\ActiveQuery
       */
      public function getBuilding() {
        return $this->hasOne(Building::className(), ['id' => 'building_id']);
      }
      // ...
    }

    Может получать:
    var_dump($room->building);
    Ответ написан
  • Как правильно подружить forignKey и создание записи в yii2?

    igorbelikov
    @igorbelikov
    Fullstack Developer
    Если я правильно понял вашу структуру таблиц, то вы кажется допустили ошибку в проектировании бд.
    У вас должно быть по идее примерно так:
    cars - car_id, name
    options - option_id, name
    cars_has_options - id, car_id, option_id, value

    При такой структоре значение по умолчанию указывать не нужно будет.
    И далее вы устанавливаете релейшены и будете получать список опций примерно так: $car->options
    Ответ написан
    Комментировать
  • Зачем yii2-authclient использует js редирект на returnUrl пользователя?

    igorbelikov
    @igorbelikov
    Fullstack Developer
    Посмотрел исходники и вот что нашел.
    function popupWindowRedirect(url, enforceRedirect)
    {
        if (window.opener && !window.opener.closed) {
            if (enforceRedirect === undefined || enforceRedirect) {
                window.opener.location = url;
            }
            window.opener.focus();
            window.close();
        } else {
            window.location = url;
        }
    }
    popupWindowRedirect(<?= Json::htmlEncode($url) ?>, <?= Json::htmlEncode($enforceRedirect) ?>);

    Как я понял, то там происходит проверка открыто ли у пользователя попап окно (где он авторизируется) и если нет, то его просто перенаправляют на успешную страницу после авторизации.
    То есть причина в попап окне.
    Ответ написан
  • Yii2: Как в GridView добавить одну колонку при определенном условии?

    igorbelikov
    @igorbelikov
    Fullstack Developer
    К примеру можно положить все колонки в переменную и в зависимости от условия - добавлять или убирать.
    $columns = [
      // coulumns
    ];
    if($condition) {
      $columns[] = $someColumn;
    }
    GridView::widget([
      'columns' => $columns,
      // ...
    ]);
    Ответ написан
    Комментировать
  • В чем отличие Yii2 basic от advanced?

    igorbelikov
    @igorbelikov
    Fullstack Developer
    Basic - пример реализации одиночного приложения (простое).
    Advanced - пример реализации приложений, которое включает в себя разделение на другие приложения (сложное).
    В advanced показана реализация самых часто используемых частей, таких как:
    • frontend - паблик часть приложения
    • backend - закрытая часть приложения, где осуществляется администрирование
    • api - апи для работы с приложением, реализация rest

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

    И стоит не забывать, что это просто шаблоны и их можно расширять, как будет удобно самому разработчику.
    Ответ написан
    2 комментария
  • Создание блочного сайта и передача переменной в layout?

    igorbelikov
    @igorbelikov
    Fullstack Developer
    Вот пару способов:
    • оформить как виджет
    • объявить переменную в контроллере и выводите ее в представьении
    // В контроллере
    public $topicday = "defaultvalue";;
    public function actionTest() {
      $this->topicday = "somevalue";
      // ...
    }
    // Вывод в представлении (layout)
    <?= $this->topicday ?>


    PS
    Если необходимо использовать второй способ, то вам нужно в вью сделать так:
    <?php $this->renderPartial('_topicday', array('topicday' => $this->topicday)); ?>

    Только учтите, что этому свойству нужно задавать какое-то значения по умолчанию или делать проверку в самом _topicday и если оно NULL, то ничего не выводить ибо ваш layout могут использовать другие контроллеры и в них значение свойства public $topicday может быть не определенно.
    А вообще, то этот случай полностью подходит под категорию - виджет, там нет ничего сложно в их реализации, а после того, как вы его сделаете - вы поймете на сколько это красивое решение и как оно удобно. Гайд можно посмотреть тут www.bsourcecode.com/yiiframework2/how-to-create-cu...
    В коде он будет выводится примерно так:
    <?= TopicDay::widget() ?>
    И главное - вся логика, представления и его контрол - будут в одном месте и никак не будут от чего-то зависеть.
    Ответ написан
    Комментировать
  • Как настроить ответ при неправильном запросе в REST API?

    igorbelikov
    @igorbelikov
    Fullstack Developer
    Кастомизация обработки ошибки описываются тут www.yiiframework.com/doc-2.0/guide-rest-error-hand....
    Вот пример кода (указывается в конфиге api приложения):
    'response' => [
                'class' => 'yii\web\Response',
                'format' => 'json',
                'on beforeSend' => function ($event) {
                    $response = $event->sender;
                    if ($response->data !== null) {
                        $data = $response->data;
                        // Error handle
                        $error = '';
                        if( ! $response->isSuccessful) {
                            if(isset($data['message'])) {
                                $error = $data['message'];
                            } elseif(isset(current($data)['message'])) {
                                $error = current($data)['message'];
                            }
                        }
                        $response->data = [
                            'status' => $response->isSuccessful,
                            'code' => $response->statusCode,
                            'error' => $error,
                        ];
                        if($response->isSuccessful) {
                            $response->data['data'] = $data;
                        }
                        // $response->statusCode = 200;
                    }
                },
            ],
    Ответ написан
    3 комментария
  • Как настроить ЧПУ в yii2 basic?

    igorbelikov
    @igorbelikov
    Fullstack Developer
    config/web.php
    $baseUrl = str_replace('/web', '', (new \yii\web\Request)->getBaseUrl());
    ...
    'request' => [
        'baseUrl' => $baseUrl,
    ],
    'urlManager' => [
        'baseUrl' => $baseUrl,
        'enablePrettyUrl' => true,
        'showScriptName' => false,
    ],

    .htaccess
    Options -Indexes
    
    <IfModule mod_rewrite.c> 
    	RewriteEngine on
    	RewriteCond %{REQUEST_URI} !^public
    	RewriteRule ^(.*)$ web/$1 [L] 
    </IfModule>
    
    # Deny accessing below extensions
    <Files ~ "(.json|.lock|.git)">
    	Order allow,deny
    	Deny from all
    </Files>
    
    # Deny accessing dot files
    RewriteRule (^\.|/\.) - [F]
    Ответ написан
    4 комментария
  • Yii2 Relations: Запутался. Простой релейшен на саму себя. Поможете?

    igorbelikov
    @igorbelikov
    Fullstack Developer
    Если правильно понял, то кажется должно быть примерно так.

    Пользователи
    // Таблица
    // user
    // id | name
    
    // Модель
    class User {
      public function getTeam() {
          return $this->hasOne(UserTeam::className(), ['id' => 'user_id']);
      }
    }


    Команды
    // Таблица
    // team
    // id | name
    
    // Модель
    class Team
    {
      public function getUsers() {
          return $this->hasMany(UserTeam::className(), ['id' => 'user_id']);
      }
    }


    Кросстаблица
    // Таблица
    // user_team
    // id | team_id | user_id
    
    // Модель
    class UserTeam {
      public function getUser() {
          return $this->hasOne(User::className(), ['id' => 'user_id']);
      }
      public function getTeam() {
          return $this->hasOne(Team::className(), ['id' => 'team_id']);
      }
    }
    Ответ написан
    Комментировать