Задать вопрос
Несколько лет занимаюсь программированием, планирую освоить Java и Rust.

Отмечу, что в IT я с 2011 года, разрабатываю веб-приложения и веб-сервисы потому что мне это нравится.

Несмотря на свой опыт, я не перестаю учится, так как технологии развиваются, и всё знать не возможно.

Делюсь здесь своим опытом, отвечаю на вопросы по IT тематике.
Контакты
Местоположение
Эстония, Эстония, Таллин

Достижения

Все достижения (4)

Наибольший вклад в теги

Все теги (35)

Лучшие ответы пользователя

Все ответы (91)
  • Откуда ошибка Uncaught TypeError: Cannot read property 'addEventListener' of null?

    Isolution666
    @Isolution666
    Full-Stack Developer
    $(document).ready(function() {
                setInterval(window.onload = function(){
                       ...тут ваш код
                });
            });

    js в конце, перед </body>
    Ответ написан
    1 комментарий
  • Как сделать плавную прокрутку страницы до якоря?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Такая конструкция подойдёт всем, у кого есть выпадающие меню с ссылкой
    Чтобы не цеплять выпадающие меню и коллапсы, используйте класс или id
    который будет указывать на разрешение скролла
    $("a.youe_class").click(function() { 
    ...
    });


    Такой подход подойдёт, если без разницы, если в ссылке решётка, или там ссылка, просто будет скроллить к нужному блоку с id
    $("a").click(function() { 
    ...
    });


    <p><a href="#top">К началу страницы</a></p>
    <section id="top">
    ...
    </section>


    $(document).ready(function() {
       var margin = 100; // переменная для контроля докрутки
       $("a").click(function() { // тут пишите условия, для всех ссылок или для конкретных
          $("html, body").animate({
             scrollTop: $($(this).attr("href")).offset().top+margin+ "px" // .top+margin - ставьте минус, если хотите увеличить отступ
          }, {
             duration: 1600, // тут можно контролировать скорость
             easing: "swing"
          });
          return false;
       });
    });
    Ответ написан
    Комментировать
  • Где в Yii2 файлы ошибок 404 и 403(хочется перевести эти страницы)?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Здравствуйте товарищи программисты.
    ---
    Не так страшен код, как его трактуют ))
    Подсказку к этому вопросу как ни странно, я нашёл в папке "views/site/"
    Файл: error.php
    ===
    Разработчики поняли, что программисты столкнуться с таким вопросом, поэтому оставили подсказки:
    <?php
    
    use yii\helpers\Html;
    
    /* @var $this yii\web\View */
    /* @var $name string */
    /* @var $message string */
    /* @var $exception Exception */
    
    $this->title = $name;
    ?>


    Из них мы видим, что переменную <?=$name?>
    нам даёт <?=$this->title;?>
    А свалился этот нейм на наши головы из класса View !
    Проведя рефакторинг, я понял, что за <?=$message;?>
    Отвечает языковой пакет Yii2/
    А именно. /vendor/yiisoft/yii2/messages/ru/
    Если конечно вы в конфиге файла main.php указали русский язык. Там их куча, вы можете в этом убедится, да и сам класс показал, что используется модель подставки сообщений, через конструкцию: <?=Yii::t('yii','значение');?>

    Вы спросите, а нахера такой геморрой нужен??

    Отвечаю, во-первых, это не геморрой, а очень даже классное решение! Убивает сразу двух зайцев наповал! Мультиязычность - раз, Повторяющиеся элементы - два! Благодаря такому решению не надо ковырять весь код, достаточно заменяющие элементы заменить такой конструкцией, и всё, поменял текст или дизайн кнопки "обновить", сделал это в одном месте, в файле yii.php и всё, дизайн и текст поменялся во всём сайте, а отредактировали один файл!!! Это невероятно удобно. Так и с ошибками и с сообщениями, зачем писать на каждой страничке ручками "ваше сообщение успешно отправлено", если можно прописать значение = перевод. Так вот, в голове кода была ещё одна подсказка /* @var $exception Exception */
    и в самом классе ссылка на мануал php7 - php.net/manual/ru/exception.getmessage.php

    Таким образом мы имеем:
    class HttpException extends UserException
    {
        /**
         * @var int HTTP status code, such as 403, 404, 500, etc.
         */
        public $statusCode;
    
    
        /**
         * Constructor.
         * @param int $status HTTP status code, such as 404, 500, etc.
         * @param string $message error message
         * @param int $code error code
         * @param \Exception $previous The previous exception used for the exception chaining.
         */
        public function __construct($status, $message = null, $code = 0, \Exception $previous = null)
        {
            $this->statusCode = $status;
            parent::__construct($message, $code, $previous);
        }
    
        /**
         * @return string the user-friendly name of this exception
         */
        public function getName()
        {
            if (isset(Response::$httpStatuses[$this->statusCode])) {
                return Response::$httpStatuses[$this->statusCode];
            } else {
                return 'Error';
            }
        }
    }

    Ну так, раз мы можем указать код ошибки, public $statusCode;
    То можно тупо и условия поставить, например:
    <?=($exception->statusCode == '404') ? $this->title = "Ошибка 404" : ''; ?>
    <?=($exception->statusCode == '403') ? $this->title = "Доступ запрещён" : ''; ?>
    <?=($exception->statusCode == '500') ? $this->title = "Внутренняя ошибка сервера" : ''; ?>

    А текст ошибки под заголовком редактируется в языковом пакете:
    /vendor/yiisoft/yii2/messages/ru/yii.php
    $message

    <?php
    return [
    ...
    'Page not found.' => 'Страница не найдена.',
    'You are not allowed to perform this action.' => 'Вам не разрешено производить данное действие.',
    'An internal server error occurred.' => 'Возникла внутренняя ошибка сервера.',
    ...
    ];

    Выводится как <?=Yii::t('yii', 'Page not found.');?> и т д...
    Но вам выводить ничего не надо, класс сам определит код ошибки и выведет её текст.
    Как заменить заголовок ошибки я уже написал выше.

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

    Isolution666
    @Isolution666
    Full-Stack Developer
    Меня возможно сейчас возненавидят многие программисты, но мне надоело уже слышать о том что
    GridView - плохой и не гибкий. Ну во первых, он наследует от других виджетов, и если не полениться, то можно найти несколько, так вот, мой пример кода, не идеальный, исключительно, как один из видов решения, чтобы вы понимали, что из него можно выжать.
    Пишем функцию в модель News():
    ...
    <?php 
        public function sklonen($n,$s1,$s2,$s3, $b = false){
            $m = $n % 10; $j = $n % 100;
            if($b) {$n = '<b>'.$n.'</b>';}
            if($m==0 || $m>=5 || ($j>=10 && $j<=20)) {return $n.' '.$s3;}
            if($m>=2 && $m<=4) {return  $n.' '.$s2;}
            return $n.' '.$s1;
        }
    ...


    В контроллере:

    ...
        public function actionNews()
        {
            $searchModel = new NewsSearch();
            $dataProvider = $searchModel->search(Yii::$app->request->queryParams); // ищешь через LIKE
            return $this->render('news', [
                'searchModel' => $searchModel,
                'dataProvider' => $dataProvider,            
            ]);
        }
    ...


    В модели NewsSearch():

    ...
    $dataProvider = new ActiveDataProvider([
        'query' => News::find()->where(['visibility'=>1])->orderBy('date DESC'),
        'pagination' => [
            'pageSize' => 20, // говоришь системе мне нужно вывести 20 записей
        ],
    ]);
    ...


    Теперь во view:

    <?php
        use yii\helpers\Html;
        use yii\widgets\Pjax;
        use yii\grid\GridView;
        use budyaga_cust\users\models\News;
        $this->title = 'Новости';
        $this->params['breadcrumbs'][] = $this->title;
    ?>
    <?php Pjax::begin(); ?> 
    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        //'filterModel' => $searchModel,
        'showHeader' => false, // вырезаем шапку таблицы
        'tableOptions' => [
            'class' => 'table' // можно задать свой, тут 100% ширина блока
        ], 
        'options' => ['tag' => 'div', 'class' => 'col-lg-12'], // оборачиваем в div с Bootstrap CSS
        'emptyTextOptions' => ['tag' => 'p', 'class' => 'text-center text-danger'],
        'emptyText' => 'По вашему запросу ничего не найдено',
        'summary' => '<br/><p class="text-center text-muted">Всего найдено '.News::sklonen( '{totalCount}', 'новость', 'новости', 'новостей').'</p>', // 127
        'layout' => '{summary}{items}',  // настраиваем внешний вид как нам надо
            'columns' => [
                //['class' => 'yii\grid\SerialColumn'], // нумерация строк может вообще не пригодится
                [
                    // 'attribute' => 'img', // если много атрибутов в контенте можно это не писать
                    'format' => 'raw',
                    'label' => '',
                    'content'=>function($data){
                        return '
                                <div class="row">
                                    <div class="col-md-3">
                                        '.Html::a(Html::img('/img/box/'.$data->img,
                                                [
                                                    'class' => 'thumbnail', 
                                                    'alt' => $data->header, 
                                                    'style' => 'width:100%;'
                                                ])
                                        ,'/new/'.$data->link).'                                
                                    </div>
                                    <div class="col-md-9 products">
                                    '.Html::a($data->header, '/new/'.$data->link).'
                                    '.Html::tag('p', $data->text).'
                                    '.Html::a('подробнее', '#',['class' =>'buttons pull-right']).'
                                    </div>
                                </div>
                            ';
                    }
                ],
            ], // может понадобится по дизайну, чтобы пагинация была в другом месте
        ]); ?>
    <?= GridView::widget([
        'dataProvider' => $dataProvider,  
        'showHeader' => false,
        'showOnEmpty' => false,
        'summary' => 'страницы {page} из {pageCount}',
        'layout' => '<div class="page-nav td-pb-padding-side">{pager}<span class="pages">{summary}</span></div>', // формируем внешний вид пагинации
        'pager' => [
            'maxButtonCount' => 5, // максимум 5 кнопок
            'options' => ['id' => 'mypager', 'class' => 'pagination'], // прикручиваем свой id чтобы создать собственный дизайн не касаясь основного.
            'nextPageLabel' => '<i class="ionicons ion-arrow-right-c"></i>', // стрелочка в право
            'prevPageLabel' => '<i class="ionicons ion-arrow-left-c"></i>', // стрелочка влево
        ],  
    ]); ?> 
    <?php Pjax::end(); ?>

    ВСЁ ! Здесь показан рабочий код, настраивайте по вашему вкусу, возможно будет критика, но! Этот код имеет адаптивную вёрстку! То есть вы можете сделать из этого поиск по товарам и услугам, да по любому контенту, и он будет гибким для всех устройств, плюс ajax сделает это невероятно быстро и легко, словно вы нажимаете на табы. Наследованные виджеты я брал из коробки, ничего не выдумывал, материал собрал из документации.

    --
    Это был полный разбор виджета GridView
    Всем спасибо за внимание. Пока! )))
    Ответ написан
    Комментировать
  • Как сделать выборку уникальных значений через ActiveRecord в Yii2?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Я не стал изобретать велосипед. Оказалось, что вывести список записей через цикл на столько просто и легко и элементарно)) Повторяющиеся записи исчезают, остаётся список только уникальных записей!

    Просто в экшене контроллера напиши:

    public function actionPage(){
            $select = City::find()->select(['obl'])->distinct()->all();
            return $this->render('page', ['select' => $select,]);
        }



    Немного поясню City это модель, которая обращается к некой таблице в БД
    obl - название столбца в таблице, записи которого хотите вывести


    Топорный пример вывода списка записей через select:

    <select class="form-control">
                        <?php foreach ($select as $m) { ?>
                            <option value="<?=$m->obl;?>"><?=$m->obl;?></option>
                        <?php } ?>
                    </select>


    Испытано лично, работает! Подсчёт уникальных записей, это:
    ->count();

    --

    $select = City::find()->select(['obl'])->distinct()->count();

    --
    <p>У вас всего <?=$select;?> уникальных записей</p>

    В документации Yii взял, там и черпаю знания, кому помог? )) Был рад стать полезен. Успехов!
    Ответ написан
    5 комментариев

Лучшие вопросы пользователя

Все вопросы (88)