Ответы пользователя по тегу Yii
  • Как в yii2 определить запись ближайшую по дате и определить ее место в пагинации?

    А в чем сложность ? создаете датапровайдер, делаете запрос с сортировкой по дате. Указываете какое кол-во строчек в лист вью вам нужно и после скольки создавать пагинацию

    $someQuery = Category::find()->where(['status' => Coupon::STATUS_NEW])->orderby('create_at');
    $yourSomeProvide r= new ActiveDataProvider([
                'query' => $someQuery,
                'pagination' => [
                    'pageSize' => 8, // сколько объектов на стр.
                ],
            ]);


    Далее, если orderBy вам мало, можно сделать Sort
    $sort = new Sort([
                'attributes' => [
                    'created_at' => [
                        'asc' => ['created_at' => SORT_ASC],
                        'desc' => ['created_at' => SORT_DESC],
                        'default' => SORT_DESC,
                        'label' => 'новизне',
                    ],
                ],
            ]);


    Отправка из контроллера на вьюшку, где у вас лист вью. честно не помню, каким образом работает лист вью с массивами или объектами. Но по идее должно работать.
    return $this->render('index', [
                'yourSomeProvider' => $yourSomeProvider,
                'sort' => $sort,
            ]);
    Ответ написан
  • Yii2 Ckeditor и html:encode как сделать безопасно?

    HanDroid
    @HanDroid Автор вопроса
    Вдруг кому-то пригодится. Есть хелпер в Yii2, который чистит от потенциальных угроз
    HTMLPurifier

    Просто оборачиваете свои переменные в
    <?= \yii\helpers\HtmlPurifier::process($model->description); ?>

    Вдруг кому-то пригодится.
    Ответ написан
    5 комментариев
  • Как ограничить доступ к REST?

    Сейвить id автора. в BeforAction проверять запрашиваемую запись и смотреть Id автора
    Вероятнее всего, у вас авторы завязаны на User, вытащить текущий id usera можно так
    Yii::$app->user->identity->id
    Ну и дальше меняете, что там нужно.

    Так делаю я, но мб подскажут, еще лучше вариант.
    Ответ написан
  • Что не так с ArrayHelper::index YII2?

    Все работает. Ток что проверил в контроллере
    public function actionToggle()
        {
            $a = [
                ['id' => '123', 'data' => 'abc', 'device' => 'laptop'],
                ['id' => '345', 'data' => 'def', 'device' => 'tablet'],
                ['id' => '345', 'data' => 'hgi', 'device' => 'smartphone'],
            ];
    
            $b = ArrayHelper::index($a, 'id');
    
            return $this->render('toggle', [
                'b' => $b,
            ]);
        }


    в View toggle
    <?php
    /* @var $this yii\web\View */
    
    $this->title = 'Ars';
    ?>
    
    <h1>Привет</h1>
    
    <?php
    echo "<pre>";
    var_dump($b);
    ?>


    массив такого формата стал
    array(2) {
      [123]=>  array(3) {
        ["id"]=>    string(3) "123"
        ["data"]=>    string(3) "abc"
        ["device"]=>    string(6) "laptop"
      }
      [345]=>
      array(3) {
        ["id"]=>    string(3) "345"
        ["data"]=>    string(3) "hgi"
        ["device"]=>    string(10) "smartphone"
      }
    }
    Ответ написан
    2 комментария
  • Стоит ли писать свои велосипеды новичку?

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

    В конечном итоге будут ситуации, когда нужно решить какую-то сложную задачу, где требуется именно возможности самого Php, а фреймворк своих решений не предоставляет.

    Итог:
    Велосипед на фреймворке
    - даст вариативность решения сложных задач простым путем, однако сложные решения нужно будет думать самому. А начинающему разработчику, самому и сразу найти верное решение без подсказок, трудно(!=невозможно).

    Велосипед на чистом PHP - даст знания самого языка, если вы примените паттерн MVC - вы сможете расширить свой велосипед и разобраться в нем через год. Если вы самостоятельно прикрутите ORM, Doctrine например, вы поймете как это упрощает в разработке время. Если вы добавите паттерны Service Locator, dependency injection - поймете на сколько гибче ваши классы станут.
    Естественно, что после такого стека технологий разработанных вручную. Фреймворк вам не будет казаться такой магией, а сложные фреймворки по типу Zend-a не будут такими сложными.
    Ответ написан
    Комментировать
  • PHP, Yii2 и PostgreSQL. Как сделать поддержку временных зон для юзеров?

    Не знаю как в чистом PHP это сделать, но в Yii 2 достаточно сделать так.
    config/main.php
    'components' => [
        'formatter' => [
           'dateFormat' => 'd.MM.Y',
           'timeFormat' => 'H:mm:ss',
           'datetimeFormat' => 'd.MM.Y H:mm',
       ],
    ],


    Вывод времени и даты
    /* Тут идет установка часового пояса
    * естественно вы можете хранить их в кэше или БД 
    * или вычислять по IP или JS. Тайм зоны можно хранить 
    * в разных форматах. Лучше в UTC, а еще лучше в
    * UNIX timestamp. 1412599260 / 2014-10-06 12:41:00
    */
    
    $myTimeZone = "Europe/Berlin"; 
    
    Yii::$app->timeZone = $myTimeZone;
    Yii::$app->getFormatter()->asDate(time()); // время 
    Yii::$app->getFormatter()->asDatetime(time()); // Дата и время


    Если не изменяет память, то можно так с тайм зоной работать. Естественно можно сделать виджет и постить где вам нужно.

    Список тайм доступных тайм зон в PHP

    UPD: По поводу летнего времени. Можно в форме профиля прикрутить чекбокс "учитывать летнее время", а потом сделать в БД триггер, который в определенную дату менял бы таймштампы +1 и -1 час.
    Ответ написан
    Комментировать
  • Как отключить авторизацию для определенных экшенов (Yii2, rest api)?

    В вашем контроллере, где нужно сделать экшен общедоступным.
    public function behaviors()
        {
            return [
                'access' => [
                    'class' => AccessControl::className(),
                    'only' => ['someActionOne', 'someActionTwo',],
                    'rules' => [
                        [
                            'allow' => true,
                            'actions' => ['someActionOne', 'someActionTwo'],
                            'roles' => ['?'],
                        ],
                    ],
                ],
            ];
        }


    Знак вопроса в rules, указывает на то, что доступ к экшену имеет любой не авторизированный пользователь. Символ @ - указывает на то, что доступно будет только авторизированным. Если у вас в поведение нету ACF, то они будут доступны сами по себе. Все выше сказанное актуально, если у вас не реализована система ролей RBAC, в противном случае, вместо символов придется указывать роль.

    ACF - это фильтр, он работает как с простым приложением так и с REST api. Если я не ошибаюсь )
    Ответ написан
  • Как сохранить данные в Yii c формы?

    Порядок действий такой должен быть в форме делаете функцию. Можете присвоить значения свои ручками, но закидывать админа и тест луче через миграции.
    public function signup()
        {
            if ($this->validate()) {
                $user = new User();
                $user->username = $this->username; 
                $user->email = $this->email;
                $user->setPassword($this->password);
                $user->generateAuthKey();
    
                if ($user->save()) {
                       // тут можно закинуть отправку токена на мыло
                }
                return $user; // это отправка будет на ваш экшн
            }
            return null;
        }


    в контроллере
    public function actionSignup()
        {
            $model = new SignupForm(); // создается форма что выше
            if ($model->load(Yii::$app->request->post())) { // грузит модель из суперглобалки ПОСТ
                if ($user = $model->signup()) { // создается юзер используется функция из формы
                    Yii::$app->getSession()->setFlash('success', 'Регистрация успешна'); // всплывающее сообщение 
                    return $this->goHome(); //возврат на домашку
                }
            }
    
            return $this->render('signup', [
                'model' => $model,
            ]);
        }


    А функция model->save(); Зажмите в вашем IDE контрл и кликните по функции сэйв, посмотрите как он устроен. Это обыкновенная вставка INSERT.

    В Юзерах вы создаете массив данных, а не объект. Как минимум в юзере нужно функцию, которая этот массив передавала бы вам. и в контроллере вы бы использовали что-то вроде
    $model = New User();
    $model->username = $arrayUser['100']['username']
    $model->email = $arrayUser['100']['email']
    $model->setPassword($arrayUser['100']['password']);
    $model->save();
    Ответ написан
  • Почему возникает ошибка при использовании urlManager?

    Это в .htacces
    Options +FollowSymLinks
    IndexIgnore */*
    
    RewriteEngine on
    
    # if a directory or a file exists, use it directly
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    
    # otherwise forward it to index.php
    RewriteRule . index.php


    Это в frontend/config/main.php у вас все норм подключено, просто может правила в формате RegExp Не верно указаны или что у вас в правилах есть?
    'urlManager' => [
                'enablePrettyUrl' => true,
                'showScriptName' => false,
                'rules' => [
                    '/' => 'site/index'
                 /* другие правила */
                ],
            ],
    Ответ написан
  • Почему так сохраняется в базе?

    Я так понимаю, что у вас один класс используется т.е. только Продукт?
    Если да, то массовая работа и обновления проводятся так.

    В контроллере:
    public function actionUpdate()
        {
            // Тут получаете свой cat либо передаете каким либо образом. 
            $products = Product::find()->where('category_id'= $cat->id)->indexBy('id')->all();
    
            if (Model::loadMultiple($products, Yii::$app->request->post()) && Model::validateMultiple($products)) {
                foreach ($products as $product) {
                    $product->save(false);
                }
                return $this->redirect('index');
            }
            return $this->render('update', ['products' => $products]);
        }


    В виде
    $form = ActiveForm::begin();
    
    foreach ($products as $index => $product) {
        echo $form->field($product, "[$index]value")->checkbox(['value' => $prod->title, 'label' => $prod->title]);
    }
    
    ActiveForm::end();


    Если вы используете не одну модель и связанные вещи т.е. к пример как User и Profile, то вам нужна Работа с несколькими моделями

    К тому же, если вы работаете со свзями, можно использовать жадную загрузку. подгружая и связи таким образом
    //получаете продукты и связи за один запрос.
    $products = Product::find()->with('category', 'someTied')->all();
    
    //или с условием
    $products = Product::find()->with([
        'categpry' => function ($query) {
            $query->andWhere(['category_id' => 15]);
        },
    ])->all();


    Если вам нужно сохранить или обновить именно связные Id у разных объектов, есть метод link.
    Ответ написан
  • Как добавить условие при связях?

    Смотрите, вы можете пойти двумя путями. Сделать условие выборки единичным, там где вам это нужно.
    function ($someCountry = 'Ukraine')
    {
    $product = Product::findOne(123);
    //Запрос ниже выполняться может сколько угодно раз в отличии от $price = $product ->Price();
    $price = $product ->getPrice()
        ->where(['country =:someCountry', [':someCountry' => $someCountry])
        ->orderBy('id')
        ->all();
    }


    Либо изначально сделать связь с определенным условием.
    class Product extends ActiveRecord
    {
        public function getBigPrices($someCountry)
        {
            return $this->hasMany(Price::className(), ['product_id' => 'id'])
                ->where('country > :someCountry', [':someCountry' => $someCountry])
                ->orderBy('id');
        }
    }


    Только в первом варианте, думаю есть более простой Where что то вроде
    $query->where(['country' => USA]);
    Ответ написан
    2 комментария
  • Кто может стать наставником(PHP)?

    А что было на втором этапе собеседования, если не секрет?

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

    Благо гайдов на тему Yii, Symfony. Laravel по написанию блогов, и инет магазинов полно. После фреймворков рекомендую найти курс по написанию на чистом Php. Фреймворк конечно упрощает разработку, но это не должна быть панацея. Фреймворк полезен если вы хорошо знаете ЯП, если это не так. Он жутко связывает и вы не знаете как решать простые задачи и возможности самого языка. Поскольку как только попадается не стандартная задача, которую не нагуглить в интернете, человек сразу теряется.
    Ответ написан
    3 комментария
  • Как просто сменить дизайн на yii2?

    не обязательно использовать бутстрап. Просто вам придется под все виджеты и view, которые используются с помощью бутстрапа переписать на чистый css, js если есть.

    Либо поищите готовые адаптивные шаблоны под Bootstrap, но настраивать и подгонять вам все равно рано или поздно нужно будет.

    Ну и как фреймворк интерпретирует шаблоны и виды знать нужно. И если вы думаете, что это работа фронтенда то ошибаетесь. Они рисуют и верстают шаблон, а внедрять и корректировать будете всегда вы. Я был бы рад если фронтендеры знали фреймворки хотя бы пятерку популярных.
    Ответ написан
    Комментировать
  • Почему не рендерится вьюшка в Yii2?

    Попробуйте заменить в контроллере это:
    return $this->render('thanks');

    На показ вот таким образом.
    // показывает файл "@app/views/site/license.php"
    echo \Yii::$app->view->renderFile('@app/views/site/license.php');
    Ответ написан
    6 комментариев
  • Почему не приходят письма c smtp.gmail.com на yandex почту?

    Была проблема, что Gmail не разрешал делать рассылку с неопределенных устройств. Собственно требовалось только галочку поставить на разрешить в самом gmail.

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

    Ответ: Нет, вам могут упасть старые проекты для поддержки. Новое пишут на новом, это очевидно =)

    Насколько быстро вы устроитесь зависит от вас. Но для поступления на работу в качестве джуна. Мало будет знать только фреймворк. Тут важен стек технологий, я не знаю как в вашем городе, но лично в моем. Требуют не то что Yii 1-2.x но и попутно еще и Симфони и Ларавел минимум 2фрейма. А ангуляр с нодой будет плюсом. Умение покрывать тестами и работе в команде JIRA, Redmine, git, svn и линукс конечно же.

    Yii имеет уязвимости, которые закрыли и оптимизировали в Yii2. Добавили удобства разработки. Да и IT- индустрия такая вещь, которая не стоит на месте. Будьте готовы к тому, что учить нужно много и быстро.
    Ответ написан
    3 комментария
  • Как сделать связь в yii2 many-to-many с отрицательным условием?

    1. Заполучите принадлежащее вашей фирме.
    2. Получите все категории.
    3. Вычитайте из из общего скопа, принадлежащие.
    4. Остаток показать где вам нужно.
    5. Все запросы оберните в транзакцию. И заранее проиндексируйте поля по которым вы выбираете. База скажет вам спасибо =)

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

    Был один подводный камень. У человека была большая транзакция, но в определенном месте была отключена валидация save(false). Поскольку валидации не было, юзер мог заходить и делать двойной запрос. Отправляя деньгу при этом оставляя её у себя. К сожалению не могу найти эту тему на тостере. Решилось это более жесткой оберткой данных. Но какой метод использовал не вспомню, увы.
    Ответ написан
  • Как одной командой выполнить все миграции из модулей в Yii2?

    Yii migrate и так находит все миграции, которые не применялись. И применяет их в порядке временного возрастаение по timeStamp.

    Для отдельных модулей можно накатывать так

    yii migrate --migrationPath=@app/modules/forum/migrations --interactive=0


    interactive: логический тип - boolean (по умолчанию true). Указывает, следует ли выполнять миграцию в интерактивном режиме. Если это значение является - true, то пользователю будет выдан запрос, перед выполнением командой определенных действий. Вы можете установить это значение в false если команда используется в фоновом режиме.
    Ответ написан
  • Есть ли подробный пример по Yii2 GridView -с данными из связанных таблиц?

    Все про GridView Тык
    Все про связанные данные Тык Про связи смотрите серидину статьи. Обратите внимание на использование связанной таблицы и вариативность жадных загрузок. Дабы не плодить 100 запросов.
    Ответ написан
    4 комментария