• Как в 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
    ...
    ],


    Всё на много проще :)
    Ответ написан
    Комментировать
  • С чего начать разработку SIP клиента из браузера? Какой SIP сервер выбрать и как настраивать?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Возможно я вас не правильно понял, но существуют ведь готовые решения, позволяющие звонить, принимать звонки, записывать разговор а потом прослушивать в .mp3
    И это далеко не всё. Естественно данное удовольствие платное и работает через API.
    Bitrix24 например использует Mango Office.
    Если вам нравится как это работает (не с точки зрения функционала CRM а Mango Office), тогда установите на свой сайт.
    Документация доступная и понятная. Есть и другие кто предоставляет такую возможность. Что подходит вам, решать только Вам. Если хотите своё, то изучите curl - без него и близко туда соваться не советую, его на вашем сервере может и не быть. Я столкнулся с этим когда тестировал Stripe и PayPal - через curl оказывается безопасно обмениваться данными. Плюс, вы можете тестировать и запускать это через консоль, что крайне удобно при тестах, а вникать что там за ошибки на странице вылезли, это потом уже, когда с серверной частью разберётесь. Думаю, вам так же будет по хорошему сделать своё API чтобы делать запросы к серверу. Плюс в будущем это свобода для интеграции в мобильные приложения. Успехов.
    Ответ написан
  • Можно ли задать стили для пагинации в 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',
            ],
    ...

    Всё! Кеш сдуло ветром )))
    Ответ написан
    Комментировать
  • IDE для Python и C/ C++?

    Isolution666
    @Isolution666
    Full-Stack Developer
    IDE NetBeans - https://netbeans.org/features/cpp/index_ru.html
    Для Python - plugins.netbeans.org/plugin/61688/python
    Поддерживает Gulp, Jade, Node.js, Selenium, Redis, и многое другое.
    Поиск по классам осуществляется кликом через зажатую клавишу Ctrl, как по ссылкам - что очень удобно.
    Так же подойдёт тем, кто хочет сэкономить на установке лишних программ, можно править сайты на хостингах и серверах напрямую, как через FileZilla, только без неё, поддерживает ftp соединение, что очень круто. Последним аргументом будет наличие консолей и терминала. Они встроены в эту IDE.
    Не хуже саблайна делит рабочую область на сколько хочешь окон, внешний вид, шрифты, подсветка кода - настраивается индивидуально, как сами захотите. Однако не думайте что это идеальная программа, если комп эпохи целерон, задолбаетесь ждать когда загрузится. Фоновая загрузка и сканирование проектов тоже могут доставить боль ЦП, после полной загрузки - использование ресурсов резко снижается. На современных компах летает и работает быстро.
    От себя добавлю, программа хоть и бесплатная, но сделана продумано! Разве это не счастье, что там работает отладчик?
    Прога без системы отладки, это не прога, а кусок недоразумения.
    Выбор за вами.
    Ответ написан
    Комментировать
  • Как запретить копировать (сохранять) файлы с сайта?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Лучше всего установить бэкдор. Если заказчик свалит с сайтом без оплаты, то вы сможете откатывать всё до нужной версии, то есть, если заказчик посмотрел и исчез без оплаты, сматывайте проект до той версии, где к примеру неправильные ссылки на скрипты и стили. Кто бы не внёс правки, вы снова откатываете сайт через бэкдор и там нихера не работает.
    Хороший урок для тех кто хочет на халяву получить чужой труд. Проблема копипаста из интернета уже стара как мир, опытные программисты прячут репозиторий от исходного проекта как могут, чтобы после скачивания ничего не отображалось, но есть и те, кто может посмотреть "Sourcer" в инспекторе кода, и благополучно всё скачать. Есть ещё один способ, спасёт только от шоколаты, которая ещё не шарит в этом, программист это обойдёт:
    window.onload = function() {
        document.addEventListener("contextmenu", function(e){
            e.preventDefault();
        }, false);
    document.addEventListener("keydown", function(e) {
        if (e.ctrlKey && e.shiftKey && e.keyCode == 73) {
            disabledEvent(e);
        }
        if (e.ctrlKey && e.shiftKey && e.keyCode == 74) {
            disabledEvent(e);
        }
        if (e.keyCode == 83 && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)) {
            disabledEvent(e);
        }
        if (e.ctrlKey && e.keyCode == 85) {
            disabledEvent(e);
        }
        if (event.keyCode == 123) {
            disabledEvent(e);
        }
    }, false);
        function disabledEvent(e){
            if (e.stopPropagation){
                e.stopPropagation();
            } else if (window.event){
                window.event.cancelBubble = true;
            }
            e.preventDefault();
            return false;
        }
    };

    Не хотите чтобы стащили из интернета, не выкладывайте. Делайте сайты на локальном сервере. Показывайте к примеру через "скайп" или "тимвивер" - последнее подойдёт если заказчик хочет "пощупать" сайт, ну вы поняли. А вообще, если к этому подходить без шуток, делайте себе лицензию, открывайте ИП, заключайте договор с заказчиком, и тогда правда будет на вашей стороне. Выбор конечно за вами. Либо оставаться в пролёте, пытаясь заработать копейки на фрилансе, либо иметь юридическую силу, на тот случай если вас нагло поимели по проекту. С последним конечно движухи лишней больше, но зато деньги всегда есть. Успехов вам.
    Ответ написан
    Комментировать
  • Как проверить достоверность введёных данных?

    Isolution666
    @Isolution666 Автор вопроса
    Full-Stack Developer
    Я искал решение для фреймворка Yii2 и для всех криптовалют, к сожалению теги по убирали, поэтому, те кто искал решение для Yii - возможно не увидят моего решения.
    К слову о валидации: https://etherscan.io/apis#contracts
    Это сайт может помочь в проверке "эфирум-кошельков"
    ---
    Обратите внимание:
    1) https://api.etherscan.io/api?module=contract&actio...
    2) https://api.etherscan.io/api?module=contract&actio...
    что у ссылки (2) - ошибка, и "status":"0", у ссылки (1) - видны блоки и "status":"1","message":"OK"
    По сути своей, это API в виде json файла.
    если сделать себе свой ключ (хотя странно что без ключа тоже работает), то можно создать свой класс на php - где создать правила валидации:
    // for Yii2
        public function rules()
        {
            return [
                ...
                ['sender', 'validateSender'],
                ...
            ];
        }

    И само правило:
    // for Yii2
        public function validateSender($attribute, $params)
        {
            $money = self::rightAdress($this->sender);
            if ($money == 0) {
                $this->addError($attribute, 'Неправильный адрес Ethereum-кошелька.');
            }
        }

    Естественно, чтобы это проверить, нужно сделать GET запрос к API:
    public function rightAdress($sender = '') 
        {
            $json = self::viewUrlContent($sender);
            $obj = json_decode($json);
            return ($obj->result == 'Invalid Address format') ? '0' : '1'; // Invalid Address format
        }

    Я сделал две функции, чтобы в дальнейшем можно было сделать более гибкое решение:
    public static function formUrlAddressETH($sender = '')
        {
            // Tokensell::formUrlAddressETH()
            return self::APIurl.'?module=contract&action=getabi&address='.$sender.'&apikey='.self::YourApiKeyToken;
        }
        
        
        public static function viewUrlContent($sender = '')
        {
            return file_get_contents(self::formUrlAddressETH($sender));
        }

    Грубо говоря делаем либо публичные переменные, либо как я, константы:
    const APIurl = 'https://api-rinkeby.etherscan.io/api';
        const YourApiKeyToken = 'тут ваш ключ от которого никакого толка ))) ';

    Так же я делал проверку на баланс, ну я думаю дальше проще понять, и тут будет уже не по теме.
    Мы же рассматривали варианты, чтобы проверить, верно указан кошелёк, или адрес не верный.
    Универсального решения я пока не нашёл, может быть появится, или сам создам. Но по сути больше никак не проверишь, так как их (крипто-кошельков) очень много, хранить на сайте смысла нет, они постоянно обновляются XD
    Поэтому только API, благо оно для криптовалюты есть.
    Учитывая, что на Lavarel и на Simfony - php class особо не отличаются, можно сделать похожее решение.

    Предупреждаю, что валидация срабатывает после отправки формы, после перезагрузки страницы, так что советую добавить ajax

    У меня всё, надеюсь кому помог, или кому-то пригодится.
    Ответ написан
    Комментировать
  • Как сделать случайный цвет у div?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Я думаю, что случайный цвет, это зло, потому как есть люди которым не нравятся определённые цвета, и первое впечатление будет с отвращением и не приязнью. Поэтому советую почитать эту статью https://medium.com/webbdev/%D1%81%D1%80%D0%B5%D0%B... здесь описывается как брать средний цвет картинки, и на его основе делать цвет самого блока. Выглядит весьма интересно и красиво.
    Ответ написан
    1 комментарий
  • Как на Yii2 сделать перевод сайта с помощью кеша (куки)?

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

    Isolution666
    @Isolution666
    Full-Stack Developer
    Например, так:
    $('p').on('click', function () {
        $(this).attr('data-before','bar');
    });


    p:before {
        content: attr(data-before);
        color: red;
        cursor: pointer;
    }


    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    
    <p>This is a paragraph.</p>
    <p>This is another paragraph.</p>
    Ответ написан
    Комментировать
  • Как в yii2 сделать ссылку на главную в navbar?

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

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

    Isolution666
    @Isolution666
    Full-Stack Developer
    Я понял в чём проблема )))
    Вам не поможет здесь никакой change
    Надо обращаться к самой функции bootstrap-slider https://seiyria.com/bootstrap-slider/
    Где ясно дают понять, к какой переменной надо обращаться, чтобы её получить, например

    $('#slider').slider({
        formatter: function(value) {
    
            var x  = value;
            var d  = 0.015;
            var m  = x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); // при форматировании числа с запятой 1,000,000
            var one  = x * Number(d); // умножение с нецелыми числами
    
            $('#text').html(x + ' $');
            $('#return').html(one.toFixed().replace(/\B(?=(\d{3})+(?!\d))/g, ",")); // если надо округлить не целое число 4.554849 и вставить запятые как в m
    
            return z;
            
        }
    });


    Как выводить подобное, я думаю вы поняли, а если нет, то:
    <div id="text"></div>
    <div id="return"></div>


    И всё, ничего больше не нужно. )) Успехов вам. ;-)
    Ответ написан
    Комментировать
  • Как сделать плавную прокрутку страницы до якоря?

    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 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])?>


    Либо как сказал Максим Федоров , берём и объявляем в экшене в контроллере.
    Ответ написан
    Комментировать
  • Кнопка "Показать еще" через Ajax или display: none?

    Isolution666
    @Isolution666
    Full-Stack Developer
    Можно так:
    <script>
    $( 'button' ).click(function() {
      if ( $( "#box" ).is( ":hidden" ) ) {
        $( "#box" ).show( "slow" );
      } else {
        $( "#box" ).slideUp();
      }
    });
    </script>


    <button>показать ещё</button>
    <div id="box">тут картинки</div>


    Если картинки тяжёлые, по мегабайту каждая или более, лучше через:
    else ...
    $( "#box" ).load( "ajax/image.html  #target" );
    ...

    <div id="box">
          <div id="target"></div>
    </div>
    Ответ написан
    Комментировать
  • Откуда ошибка 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
    Я раньше тоже использовал date(); поэтому и расхождение во времени, date(); не подходит для ЗАПИСИ даты и времени. Для записи времени я использую time(); - на php7 работает отлично, старая версия mktime(); - есть риск что на сервере будут вылезать ошибки. Искать информацию этим плагином самое то, но записывать дату и время лучше с помощью time();
    Если вы не в курсе, это дата в unix - формате.
    php.net/manual/ru/function.time.php
    Ответ написан
    Комментировать