Ответы пользователя по тегу Yii
  • Как решить ошибку Use of undefined constant php - assumed 'php'?

    Isolution666
    @Isolution666 Автор вопроса
    Full-Stack Developer
    На будущее всем тем, кто кодит в браузере в редакторе кода.
    Если вы пользуетесь редакторами кода на хостинге, или используете ISP Manager
    После первого сохранения, будет казаться что у вас сохранился код, в следующий раз, после открытия, вы можете выяснить, что редактор кода решил всё слепить в одну строку.
    Более того у ISP Manager есть баг потери замыкающих скобок, фигурных скобок и прочего в этом духе. Повторюсь, ошибка синтаксиса выявляется после закрытия страницы с кодом, и при повторном открытии подсветка синтаксиса может съехать.
    Поэтому, если не хотите подобных проблем, старайтесь не программировать в браузере, в редакторе кода. Как я понял, это баг одной и той же библиотеки, которую применяют везде где есть редакторы кода и подсветка синтаксиса. Используйте специальные программы или IDE чтобы исключить деформацию кода после перезалития.
    Ответ написан
    Комментировать
  • [Yii2] Как добавить id полям формы, при использовании ActiveForm?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Например так:

    <?php $form = ActiveForm::begin(['id' => 'form-add-video']); ?>
                <?= $form->field($model_video_form, 'name')->textInput(['id' => 'your_id', 'placeholder' => 'your place holder'])->label('Название (для отображения в списке)') ?>
                ...


    В квадратные скобочки вписываем массив данных в textInput() - и всё :)
    Ответ написан
  • Как задать value для CKEditor Yii2?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Например так:
    <?= $form->field($post, 'text')->widget(CKEditor::className(),[
        'editorOptions' => [
            'preset' => 'full',
            'inline' => false, 
        ],
    ])->textarea(['value' => 'Ваш текст value']); ?>

    Но лучше через контроллер передать значение
    $post->text = 'Ваш текст value';
    Ответ написан
    Комментировать
  • Как сделать стоп-слова на Yii2?

    Isolution666
    @Isolution666 Автор вопроса
    Full-Stack Developer
    Самое разумное решение, какое вообще мне пришло, хоть и прошло уже много времени с того момента, как я задал этот вопрос - так это вот эта страница - fspamlist.com/index.php?c=api

    По API мы проверяем аж 3 параметра - email , login , IP-adress

    Что даёт этот инструмент ))) Если хотя бы один из параметров вернёт FALSE - можем отказать пользователю хоть в чём (регистрация, авторизация, комментарий, отправка сообщений)
    Валидаторы на Yii2 связанные с API я уже писал, так что проверку можно повесить хоть на какое поле ввода, или вообще на все, смысл в том чтобы в принципе проверить, кто пытается ворваться в поля ввода, и если данный пользователь в чёрном списке СПАМА - то мы ему отправляем бан.
    Ответ написан
    Комментировать
  • Как решить проблему View not Found – yii\base\ViewNotFoundException?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Напишите функцию.
    ...
    use yii\base\ViewNotFoundException;
    ...
    $path = Yii::getAlias('@web').'/order/index';
    ...
    try {
        // 1) тут пишите то что хотите проверить
        $this->render($path, ['dataProvider' => $dataProvider]);
    } catch (ViewNotFoundException $e) {
        // 2) тут выводите "удобную" ошибку, чтобы не закрывать ошибкой 500 или той которая вылезает
        $this->render('myerror');
    }
    ...


    Можно обратится и к Yii::getAlias('@frontend') - а вдруг проект лежит не в папке frontend ???
    Так что никаких return ...; Либо вы получите представление, либо myerror
    ViewNotFoundException это отслеживает.
    Да, если файл будет, ошибки не вылезут, а если файла не будет, вы столкнётесь с ViewNotFoundException

    Так почему бы сразу не отловить ошибку и просто вывести её в виде текста на странице?
    Гораздо лучше чем ошибка на всю страницу.

    Ну ведь Easy? Правда? :)))
    Ответ написан
    Комментировать
  • Как в yii2 проверить существует ли представление?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Напишите функцию.
    ...
    use yii\base\ViewNotFoundException;
    ...
    $get = Yii::$app->request->get();
    $path = Yii::getAlias('@web').'/views/mydir/'.$get['url'];
    ...
    try {
        // 1) тут пишите то что хотите проверить
        $this->render($path, ['model' => $model,]);
    } catch (ViewNotFoundException $e) {
        // 2) тут выводите "удобную" ошибку, чтобы не закрывать ошибкой 500 или той которая вылезает
        $this->render('default', [ 'model' => $model,]);
    }
    ...


    Можно обратится и к Yii::getAlias('@frontend') - а вдруг проект лежит не в папке frontend ???
    Так что никаких return $view; Либо вы получите представление, либо default
    ViewNotFoundException это отслеживает, я давно в Yii отказался от file_exists потому что он не эффективен и не работает, да, если файл будет, ошибки не вылезут, а если файла не будет, вы столкнётесь с ViewNotFoundException

    Так почему бы сразу не отловить ошибку и просто вывести её в виде текста на странице?
    Гораздо лучше чем ошибка на всю страницу.

    Ну ведь Easy? Правда? :)))
    Ответ написан
    Комментировать
  • Yii2 как правильно обработать исключение?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Напишите функцию.
    ...
    use yii\base\ViewNotFoundException;
    ...
    try {
        // 1) тут пишите то что хотите проверить
    } catch (ViewNotFoundException $e) {
        // 2) тут выводите "удобную" ошибку, чтобы не закрывать ошибкой 500 или той которая вылезает
    }

    В данном случае проверяется путь на существование файла, если его нет, то вернёт комментарий "2)"
    то есть, если вам досаждает ошибка ErrorHandler пишите и юзаете её в catch и так далее, смотря что мешает работать странице. Это решение подойдёт тем у кого закрывается ошибкой вся страница, а не её фрагмент. Так устроен Yii, чтобы чуть что,вы наверняка увидели что у вас что-то не так работает.
    Успехов вам.
    Ответ написан
    Комментировать
  • ЧПУ Yii2, передача GET параметров, как организовать?

    Isolution666
    @Isolution666
    Full-Stack Developer
    ПРИМЕР:
    перехожу по /site/index/c/1/b/2

    'urlManager' => [
                'enablePrettyUrl' => true,
                'showScriptName' => false,
                'rules' => [
                    '' => 'site/index', // сделает главную страницу сайтконтроллера чистой без слэшей и экшенов
                   'site/index/<c:\d+>/<b:\d+>' => 'site/index', // если верхнее правило оставить можно вот так обработать http://example.ru/1/2 - d+ - digital - обрабатывает только цифры
    ...
    ],


    РЕЗУЛЬТАТ:
    мы в экшене index контроллера site, получаю массив GET [c=>1,b=>2]


    Тут я вижу только два параметра. если хотите как `/site/index/c/1/b/2`

    'urlManager' => [
                'enablePrettyUrl' => true,
                'showScriptName' => false,
                'rules' => [
                    '' => 'site/index', 
                   'site/index/<param:\w+>/<c:\d+>/<params:\w+>/<b:\d+>' => 'site/index', 
                   'site/index/<param:\w+>/<c:\d+>/<params:\w+>/<b:\d+>.html' => 'site/index',  // с преффиксом .html
    // analog -> http://example.ru/site/index?param=c&c=1&params=b&b=2
    // analog -> http://example.ru/site/index/c/1/b/2
    // preffix -> http://example.ru/site/index/c/1/b/2.html
    ...
    ],


    Всё на много проще :)
    Ответ написан
    Комментировать
  • Можно ли задать стили для пагинации в yii2??

    Isolution666
    @Isolution666
    Full-Stack Developer
    Смотрите мой ответ здесь я разбирал на примере GridView.
    Виджет LinkPager подойдёт если вы не хотите пользоваться виджетами а выводите через свой цикл.
    Ответ написан
    Комментировать
  • Как сохранить в бд, по выборке и привязать в json объект?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Чтобы не говорили, что это придумал я, просто изучите файл:
    https://github.com/samdark/yii2-cookbook/blob/mast...
    Думаю, теперь вы сможете в разных форматах сохранять информацию ))
    Можно конечно как Максим Тимофеев предложил, но уже ведь всё готово, достаточно одной строчки, и данные уже в другом формате.
    Ответ написан
    Комментировать
  • Как в yii2 отключить кэширование?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Может быть, речь о следующем файле:
    \common\config\main-local.php
    И тут поменять флажочек:
    ...
            'db' => [
                'class' => 'yii\db\Connection',
                'dsn' => 'mysql:host=localhost;dbname=****',
                'username' => '****', 
                'password' => '****',
                'charset' => 'utf8',
                'enableSchemaCache' => false, //  Вместо `true` поставить `false` и обновить через Ctrl+F5 или Cmd + R (Mac OS)
                'schemaCacheDuration' => 3600,
                'schemaCache' => 'cache',
            ],
    ...

    Всё! Кеш сдуло ветром )))
    Ответ написан
    Комментировать
  • Как на Yii2 сделать перевод сайта с помощью кеша (куки)?

    Isolution666
    @Isolution666 Автор вопроса
    Full-Stack Developer
    Решение найдено!
    Надо создать модель, а в ней функцию наследующую от класса преложения, переопределить переменную, отвечающую за вывод языка, и готово!
    Естественно надо объявить ещё две переменные, одна будет значением по умолчанию, если язык не выбран, а вторая за хранение куки!
    К сожалению, я пока не разобрался как переводить отдельно бекенд и фронтенд, но думаю в скором времени и это сделаю, так как в документации по мультиязычности уже был пример с урлами, значит осталось дописать условия, откуда выводится представление, такой и язык.
    Если мы можем определить контроллер Yii::app()->controller->id - значит сможем определить откуда берётся вьюшка, потому как у бекенда и фронтенда контроллеры разные.
    Если не понятно, дам инструкции индивидуально, писать на мою электронную почту.
    Ответ написан
    Комментировать
  • Как в yii2 сделать ссылку на главную в navbar?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Чтобы наверняка попасть куда надо, есть несколько способов:
    Действенные:
    узнать данные по конкретной странице:
    <?= __FILE__; // абсолютный путь ?>
    <?=$this->context->module->id; // какой модуль используется ?>
    <?=Yii::$app->controller->action->id; // имя экшена ?>

    и вывести соответствующую ссылку в меню, либо воспользоваться роутерами:
    <?=Html::a('Главная', Url::toRoute('/web/page/index'));?>
    Ответ написан
    Комментировать
  • Как в Yii2 checkbox сделать checked?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Если флажок НЕ нужен по умолчанию:
    ...
    <?php
    $page->text = 'я принимаю пользовательское соглашение';
    ?>
    ...
    <?=$form->field($model, 'serv1')->checkbox(['uncheck' => $page->text, 'value' => $page->text, 'label' => '$page->text]); ?>


    если флажёк НУЖЕН:
    --
    <?=$form->field($model, 'serv1')->checkbox(['checked'=>false])?>


    Либо как сказал Максим Федоров , берём и объявляем в экшене в контроллере.
    Ответ написан
    Комментировать
  • Как выяснить причину расхождения по времени?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Я раньше тоже использовал date(); поэтому и расхождение во времени, date(); не подходит для ЗАПИСИ даты и времени. Для записи времени я использую time(); - на php7 работает отлично, старая версия mktime(); - есть риск что на сервере будут вылезать ошибки. Искать информацию этим плагином самое то, но записывать дату и время лучше с помощью time();
    Если вы не в курсе, это дата в unix - формате.
    php.net/manual/ru/function.time.php
    Ответ написан
    Комментировать
  • Как правильно перенести сайт (yii) c хостинга на локальный сервер (openserver)?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Здравствуйте.
    Я вижу здесь две причины затыка:
    1) При создании папки, произошла ошибка аргумента.
    2) Во время записи выяснилось, что есть ограничения в режиме доступа к файлам

    Судя по всему у вас Yii1 - разрешите запись
    <?php chmod("/framework/utils", 0755);  // либо 0777 ?>


    При использовании filezilla частенько с этим сталкиваюсь, зато через консоль, через git, или через cmd , на крайняк composer - таких проблем с правами доступа почему-то нет.
    Возможно это защита на запись, чтобы не было несанкционированного вмешательства в коробку или в песочницу.
    Ответ написан
    Комментировать
  • Как правильно делать форму с разными моделями?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Ответ написан
    Комментировать
  • Как в yii2 выводить записи используя постраничную навигацию?

    Isolution666
    @Isolution666
    Full-Stack Developer
    В ListView тоже можно по своему выводить паганацию, виджет можно "разобрать" на части, если надо чтобы паганация, число страниц и количество записей было в разных местах, никогда не бойтесь экспериментировать. Тренируйтесь, пробуйте
    Ответ написан
    Комментировать
  • Куда добавить Class в Yii 2, чтобы он отрабатывал всегда при рендере любой страницы?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Создайте свой класс где вам вздумается, и выводите через узы там, где он вам нужен, класс может хранить переменные и функции, которые вы можете постоянно использовать. Если верно прописаны namespace и use, всё будет работать.
    ---
    Например переменные создаются так:
    <?php
    
    namespace app\backend\models; // у вас будет свой путь, создайте класс на IDE, чтобы правильно вывести
    
    use Yii; // если используете узы, пишите после namespace
    use yii\helpers\Html; // могут понадобится любые классы
    
    class Yourclass {
        
        const CLOCK = '<i class="fa fa-clock-o"></i>'; // только так передаются "переменные"
        // в функции self::CLOCK 
        // во вьюшке, на любой странице Yourclass::CLOCK;
        // 
        public function getTimeName($params = '') 
        { 
            // данная функция позволяет выводить оформленную дату с тегами
            // в определённом формате, на всём сайте, если вы измените эту функцию
            // везде где вы выведите этот формат поменяется одновременно, что удобно
            // Yourclass::getTimeName(вставляете ваше значение);
            $rezult = Html::tag('small', self::CLOCK . Yourclass::formTime($params), ['class' => 'text-muted']);
            return $rezult; 
        }
    }


    То есть, во вьюшке это будет так:
    <?php
    use yii\helpers\Html;
    use app\backend\models\Yourclass; // я на абум написал, у вас будет свой путь
    ?>
    <?=Yourclass::CLOCK;?> - глиф иконка часов FontAwesome
    <?=Yourclass::getTimeName($model->time);?> - дата и\или время в виде html кода в заданном формате


    То есть, класс можно хранить во фронтэнде или в бэкеэнде, где пожелаете, просто соблюдайте узы и пространство имён. Выводит можно и статичные и публичные функции. Проверено лично, плюс можно редактировать файл по средством fopen() в php - как будет удобно. Успехов вам.
    Ответ написан
    Комментировать
  • Обновление записи по ajax в БД по клику id div блока, как реализовать?

    Isolution666
    @Isolution666 Автор вопроса
    Full-Stack Developer
    Для тех, кто искал! Этот метод называется .submit()
    <script type="text/javascript">
       $(document).ready(function () {
    	   $("#yellow").click(function() {
    		         $("#act form").submit();
    	   });
       });
    </script>


    Смысл заключается в том, что вы оборачиваете form в id (чтобы скрипт не реагировал на другие формы) и указываете на что должен реагировать скрипт при заполнении формы, можно использовать .change() или .bind() - если через input, и .click() - если хотите передать через span или div.
    Хочу заметить, что с этим заданием хорошо справляется Vue.js

    <div id="act">
            <form action="" method="post" data-ajax="post">
                 <input type="text" id="yellow" name="param">
                 <input type="submit" value="send">
            </form>
       </div>


    Подкрепите это всё ajax , скройте кнопку submit, и форма будет отправлять сразу, как только вы кликнули чекбокс, или выбрали селект, или указали цифру, для других решений лучше это не делать.
    Ответ написан
    Комментировать