Ответы пользователя по тегу Yii
  • Вывод и форматирование текста php yii2?

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

    HTML purifier
    <?= Yii::$app->formatter->asHtml($model->content, [
                    'Attr.AllowedRel' => ['nofollow'],
                    'HTML.SafeObject' => true,
                    'Output.FlashCompat' => true,
                    'HTML.SafeIframe' => true,
                    'AutoFormat.AutoParagraph' => true,
                    'URI.SafeIframeRegexp' => '%^(https?:)?//(www\.youtube(?:-nocookie)?\.com/embed/|player\.vimeo\.com/video/)%',
                ]) ?>


    Однако. Такой вариант может повлиять в некоторых случаях на загрузку страниц. Так как весь текст переформатируемая при загрузке страниц. Если важна будет производительность, то в базе данных создайте два поля. Одно оригинальное, другое отформатированное. В отформатированное поле помещайте текст, который прогнали через форматирование оригинального текста. И при считывании вам уже не нужны никакие форматтеры. А страницы будут грузиться быстрее.
    Ответ написан
    Комментировать
  • Как удалить ненужыне данные из проекта yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Любой пакет имеет зависимости. Некоторые пакеты имеют много зависимостей или зависимости больших по объёму библиотек. Поэтому, размеры могут существенно измениться. Но можно для production попробовать сократить эти зависимости, убрав ненужные пакеты или файлы.

    Чтобы не подгружать пакеты для dev используйте команду
    composer —no-dev
    Чтобы убрать лишние файлы используйте команду
    composer —prefer-dist

    Остальное сократить не получится так как все остальное важно для работы пакета.
    Ответ написан
  • Почему нет перехода по ссылкам?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Не правильный htaccess или настройка Apache. Уберите web там или там.
    Ответ написан
  • Сломался user->identity при переносе кода на продакшн сервер?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    php init, выбрал production

    Скорее всего сломали конфиги. Эта команда перетирает файлы конфигов из environments
    Ответ написан
    Комментировать
  • Можно ли указать join в конце каждого запроса через модель?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Не рекомендую так делать. У вас наверняка не везде нужна такая связь. Если хотите оптимизировать запросы, то почитайте мой ответ на эту тему: Какие способы формирования запросов к БД в Yii2 лучше?
    Ответ написан
  • Почему не работает unique в модели Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Попробуйте так
    public function actionTest()
        {
            $email = 'mail@test.ru';
            $emailExists = Test::find()->where(['email' => $email])->exists();
            if (!$emailExists) {
                $model = new Test();
                $model->email = $email;
                $model->save(false);
            }
        }
    Ответ написан
    6 комментариев
  • Как записать данные в промежуточную таблицу Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Так сохранять в Yii нельзя. https://www.yiiframework.com/doc/guide/2.0/ru/db-a...

    Так же есть хорошее расширение "la-haute-societe/yii2-save-relations-behavior"
    Ответ написан
    2 комментария
  • Кеширует ли yii2 запросы к БД по умолчанию?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Запросы кэшируются, если вы явно вызываете метод ->cache() в запросе.
    $user = Profile::find()->where(["id" => $id])->cache(1000)->asArray()->one();
    В других случаях запросы не кэшируются. Иногда, в настройках, устанавливают кэширование схемы:
    ...
            'db' => [
                'class' => 'yii\db\Connection',
                'dsn' => 'mysql:host=localhost;dbname=****',
                'username' => '****', 
                'password' => '****',
                'charset' => 'utf8',
                'enableSchemaCache' => false, //  Если не нужно кэшировать вместо `true` поставить `false`
                'schemaCacheDuration' => 3600,
                'schemaCache' => 'cache',
            ],
    ...
    Ответ написан
    2 комментария
  • 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
    По остальному надо смотреть модель.
    Ответ написан
  • 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]],
            ];
        }
    Ответ написан
    Комментировать
  • Как сделать такую расширенную пагинацию в 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 и не париться. Если вы так мучаетесь с этим, то что будет если вам надо как-то по всему сделать меню?

    Разницы от использования виджета особо здесь нет.
    Ответ написан