• Yii2 показал в форме редактирования чужие данные, это кеш?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Закэшировались данные php yii cache/flush-all

    Другие команды
    cache/flush                      Flushes given cache components.
        cache/flush-all                  Flushes all caches registered in the system.
        cache/flush-schema               Clears DB schema cache for a given connection component.
        cache/index (default)            Lists the caches that can be flushed.
    Ответ написан
    3 комментария
  • Yii2 не работает URL::toRoute?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Проблема в роутах urlManagera Поставьте в rule такой первый роут:
    'site/info' => 'site/info'
    Ответ написан
  • Как в yii1 выполнить конкретную миграцию?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Миграции это версионирование базы данных.

    Логически не может быть такого, что миграция в середине вам нужна, а перед ними нет. Так как перед ними могут быть зависимости для последующих.

    Например, есть 6 миграций. Первые 3 создают таблицы. Следующие 3 добавляют в них новые поля. Если вы примените только последние 3, то у вас выйдет ошибка «такой таблицы нет в БД». Поэтому, взять и применить миграцию из середины нельзя и не имеет никакого смысла. Можно лишь привести БД к определенному состоянию. Подробнее есть в документации.

    Однако, если вам очень нужно это сделать, то есть лайфхак. Удалите все миграции из папки, кроме тех, которые нужно применить и примените их. Затем верните в папку ранее удаленные миграции. Но так использовать не рекомендуется. Это костыль!
    Ответ написан
    Комментировать
  • Почему не работает стандарный метод Update CRUD?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Field 'caption' doesn't have a default value
    По остальному надо смотреть модель.
    Ответ написан
  • Какой самый простой движок или скрипт для маленького интернет-магазина?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Вы такой интересный. Сами пишите простой, но по вашим описаниям полноценный интернет магазин. А с учётом того, что у вас хотела всегда будет преобладать и вы упретесь в невозможность развития, то возьмите сразу что-то на перед. Чтобы вы потом не устраивали танцы с бубном и не думали как вам прикрутить платёжную систему и так далее.

    Из простых Yii2. Есть готовое решение.
    Ответ написан
    9 комментариев
  • Как организовать структуру БД двигателей?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    1. Отдельными таблицами
    2. json
    3. ENUM
    4. Строкой через разделитель.

    Уникальность данный нужно гарантировать при записи. Если данные уже есть для такой категории, то не добавляем.
    Ответ написан
  • Правильно ли я нарисовал план ООП игры шашки?

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

    1. Свойства не выносить отдельно в схеме. Не совсем понятно что вы изменяете в методах. Какие условия при изменении. Какие параметры. И т. д. Свойства нужны больше для проектирования БД.

    Например лучше так:
    Подвесить клетку
    - цвет (string(6))

    2. Шашка это неотъемлемая часть доски. Поэтому модификация шашек будет из сущности доски.

    Для примера можете посмотреть как строится любое API. Везде есть метотоды и описание что они делают. Какие параметры принимают. Какой результат возвращают. Какого типа и так далее. Зайдите VK API сразу поймёте. Вам нужно сделать некое подобие API.

    В остальном нормально)
    Ответ написан
    2 комментария
  • Как укоротить namespace и use?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Так? composer.json
    "autoload": {
        "psr-4": {
          "Myks92\\User\\": "src/"
        }
      },
      "autoload-dev": {
        "psr-4": {
          "Myks92\\User\\Tests\\": "tests/"
        }
      },
    Ответ написан
    5 комментариев
  • YII2 как получить старые значения модели?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Это не подойдёт?
    public function afterSave($insert, $changedAttributes)
    {
            var_dump($changedAttributes['desabilitado']);
            var_dump($this['desabilitado']);
            die;
            [...]
    }

    Напишите для чего нужно использовать.
    Ответ написан
    7 комментариев
  • Почему не работает валидация на уникальность?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Потому что вы используете класс User в своём коде, а не Clients. В User у Вас нет правил для проверки на уникальность. Есть только правила проверки статуса:
    /**
         * {@inheritdoc}
         */
        public function rules()
        {
            return [
                ['status', 'default', 'value' => self::STATUS_ACTIVE],
                ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]],
            ];
        }
    Ответ написан
    Комментировать
  • Сколько строк нормально для класса?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    Где-то читал, что примерно 500-1000 строк для бизнес логики.

    Но:
    1. Количество строк никак не может зависеть от качества кода. У вас может быть 500 строк плохого кода, который не разберёт даже автор. Но если у вас код хотя бы по DDD, то с таким кодом жить проще. А если ещё есть тесты, то вдвойне лучше.

    2. У вас код может быть и на 1500 строк из-за подробной документации кода. Или же много строк получается из-за большого количества передаваемых параметров в методах. И такой метод приходится переносить - каждый параметр 1 строка. Пример.
    3. Не стоит ориентироваться на количество строк. Если код поддерживать и читать не сложно, то не заворачивайтесь. Если сложно - рефакторинг.

    А вообще советую писать код так, чтобы его можно было читать, как английский текст. Подбирать название переменных, методов, классов интерфейсов и т.д.
    Ответ написан
    Комментировать
  • Как развернуть production локально для разработки?

    myks92
    @myks92
    Нашёл решение — пометь вопрос ответом!
    У вас ошибка в том, что отсутствует файл .env
    Как корректно перенести и настроить всю структуру на локальную машину? Или необходимо изначально инсталлировать текущую на production-сервере версию и на неё уже накатывать изменения?

    Настройте окружение так же как на сервере. Для лучшей переносимости можете почитать про Docker или Vargant
    Ответ написан
  • Как сделать такую расширенную пагинацию в yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Очень просто. Измените дефолтные настройки в DI контейнере этого класса.

    1. С использованием DI Контейнера
    <?php
    
    declare(strict_types=1);
    
    namespace frontend\bootstrap;
    
    use Yii;
    use yii\base\BootstrapInterface;
    use yii\di\Container;
    use yii\widgets\LinkPager;
    
    /**
     * @author Maxim Vorozhtsov <myks1992@mail.ru>
     */
    class Bootstrap implements BootstrapInterface
    {
        /**
         * @inheritDoc
         */
        public function bootstrap($app)
        {
            /** @var Container $container */
            $container = Yii::$container;
    
            $container->set(LinkPager::class, [
                'prevPageLabel' => false,
                'nextPageLabel' => false,
                'maxButtonCount' => 3,
            ]);
        }
    }

    Так же DI можно настаивать в config. Я обычно настраиваю там, но кто-то создает такой bootstrap файл. Тут уж выбирайте сами. Я выбираю config. Вот пример:
    'container' => [
            'singletons' => [
                CheckAccessInterface::class => yii\rbac\DbManager::class,
                IdentityInterface::class => function () {
                    return Yii::$app->user->getIdentity();
                },
            ],
        ],

    Но для понимания оформил в bootstrap. Чтобы работало не забудьте поместить этот класс в секцию Bootstrap config фала:
    'bootstrap' => [
            frontend\bootstrap\Bootstrap::class
        ],


    2. C созданием класса, наследованный от базового
    <?php
    
    declare(strict_types=1);
    
    namespace frontend\widgets;
    
    class LinkPager extends \yii\widgets\LinkPager
    {
        public $prevPageLabel = false;
        public $nextPageLabel = false;
        public $maxButtonCount = 3;
    }


    И используйте как обычно. Если нужно заменить в DataProvider используйте DI контейнер. Либо подмените класс на свой:
    Yii::$container->set('yii\widgets\LinkPager',  'frontend\widgets\LinkPager');
    Ответ написан
    9 комментариев
  • Как загрузить расширение для Yii2 на хостинг?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Узнайте установлен ли на хостинге composer. Если установлен, то вам повезло. У вас более удобная работа с проектом. Заливаете все файлы и файл composer.json. Далее php composer update И все. Проект установлен. Но радоваться не стоит. Установленный композер на хостинге это не всегда счастье. Так какое установлен глобально, а у вас нет прав админа, то он может не позволять создавать временные файлы типа .cache и другие. Тут вам придётся изворачиваться и менять пути хранения таких файлов а composer.json разделе config.

    2. Если у вас совсем печальный случай, то можете скачать последний пакет композера (composer.phar). Закинуть его в папку с проектом и устанавливать пакеты через него командой php composer.phar update

    3. Если ни то и не другое не получается, то устанавливайте пакеты на локальной машине и просто обновляйте папку вендор при каждом изменении. Надеюсь, до этого не дойдёт.
    Ответ написан
    Комментировать
  • Как создать ссылку в input взятую от имени из другого input'a?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Google: «Yii2 Slug»
    Ответ написан
    Комментировать
  • Правильно ли я сделал на yii2 (Code review)?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Зачем вы в модели поместили создание директории, создание файла? Это ответственность какого-нибудь сервиса, но не модели (сущности).
    2. Загрузку файлов можно вынести из контроллера в этот же сервис.
    3. Не очень понимаю зачем тут две модели.

    Из этого всего показываю вам сервис загрузки и удаления изображений, правда на Symfony, но его не сложно сделать на Yii. Подключаете в конструкторе контроллера и работаете с ним.

    /**
     * Class FileUploader
     * @author Maxim Vorozhtsov <myks1992@mail.ru>
     */
    class FileUploader
    {
        /**
         * @var string
         */
        private $basUrl;
    
        /**
         * FileUploader constructor.
         * @param string $basUrl
         */
        public function __construct(string $basUrl)
        {
            $this->basUrl = $basUrl;
        }
    
        /**
         * @param UploadedFile $file
         * @return File
         * @throws Exception
         */
        public function upload(UploadedFile $file): File
        {
            $path = $this->generateUrl();
            $name = time() . '.' . $file->getExtension();
            $fileName = $path . '/' . $name;
            FileHelper::createDirectory($path);
            $file->saveAs($fileName);
            return new File($path, $name, $file->size);
        }
    
        /**
         * @return string
         */
        public function generateUrl(): string
        {
            return $this->basUrl;
        }
    
        /**
         * @param string $name
         */
        public function remove(?string $name): void
        {
            if (is_file($fileName = $this->generateUrl() . '/' . $name)) {
                unlink($fileName);
            }
        }
    }


    Store и BaseUrl присваивается в DI контейнере.

    'container' => [
            'singletons' => [
                FileUploader::class => static function () {
                    return new Myks92\Vmc\Event\Service\Uploader\FileUploader(Yii::getAlias('@staticRoot/origin/images/events'));
                },
            ],
        ],


    Контроллер:
    public function actionUploadPoster($id)
        {
            $event = $this->findModel($id);
            $form = new Poster\Upload\Form();
            $handler = Yii::createObject(Poster\Upload\Handler::class);
    
            if (!$this->checker->allowEdit($event->getId())) {
                throw new ForbiddenHttpException('Вам не разрешено производить данное действие!');
            }
    
            if ($form->load(Yii::$app->request->post()) && $form->validate()) {
                $uploader = Yii::createObject(FileUploader::class);
                $uploader->remove($event->getPoster());
                $uploaded = $uploader->upload($form->poster);
    
                $file = new Poster\Upload\File(
                    $uploaded->getPath(),
                    $uploaded->getName(),
                    $uploaded->getSize()
                );
    
                $handler->handle(new Poster\Upload\Command($event->getId()->getValue(), $file));
    
                return $this->redirect(['view', 'id' => $event->getId()->getValue()]);
            }
    
            return $this->render('upload-poster', [
                'model' => $event,
                'posterForm' => $form,
            ]);
        }
    Ответ написан
  • Как настроить рендер при входе через соцсети dektrium/yii2-user?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Возможно ли как-то настроить вход так, чтобы обновился только блок с комментариями? как при ajax...

    А чем вас ajax не устраивает?

    Либо после входа через соц сети перенаправляйте на нужный якорь #comment, который указали в HTML верстке.
    public function actionLogin()
    {   
        //your code for login
        
       return $this->redirect(['profile', 'id' => $id, '#' => 'comment']);
    }
    Ответ написан
    4 комментария
  • Yii2 навигация по сайту Bootstrap?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Вам быстрее вставить просто верстку из Bootstrap и не париться. Если вы так мучаетесь с этим, то что будет если вам надо как-то по всему сделать меню?

    Разницы от использования виджета особо здесь нет.
    Ответ написан
  • Какие способы формирования запросов к БД в Yii2 лучше?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Если вам важна производительность и хороший код, то на все чтения делаем обычные SQL запросы или используем Query Builder от Yii2.

    ActiveRecord работает с объектами, поэтому он сильно «ударяет» по производительности при составлении больших и сложных запросов. Кроме того, в объектах AR не только сами данные, но и: поведения, события, валидация...

    Если брать CRUD (Cread Read Update Delete), то для CUD (модификация данных) использовать ActiveRecord. А там где R (чтение) - используем SQL и QB. В таком случае вы будете работать с данными в виде массива, либо в виде простых DTO, на которые вы сами «маппите» данными из запроса. DTO будет удобно использовать для работы. $dto->name вместо $items['name']. Хотя, если вы используете шаблонизатор twig, — Вам особо без разницы. Но на PHP объекты (DTO) вам ещё и удобно будет использовать в редакторе.

    При таком подходе код будет чище, а производительность выше!
    Ответ написан
    2 комментария
  • Принцип DIP из SOLID и Autowiring из DI-контейнеров?

    myks92
    @myks92 Куратор тега PHP
    Нашёл решение — пометь вопрос ответом!
    Как это не будет? Может быть вы не правильно используете или не знаете как использовать?

    В DI контейнере мы «привязываем» класс, который реализует интерфейс. Таким образом везде, где есть этот интерфейс будет работать созданный и «привязанный» нами класс.

    Вроде бы там достаточно просто и понятно.
    Ответ написан
    9 комментариев