Задать вопрос
  • Как внутри yii2 сделать запрос на centrifugo?

    @rusline18 Автор вопроса
    Нашел решение. Во первых я в docker-compose объединил network все контейнеры, что у них была одна сеть и я мог обращаться к соседней сети

    Дальше я вместо url localhost:8000/api поменял на название контейнера и получился адрес centrifugo:8000/api. И все теперь заработало
    Ответ написан
    Комментировать
  • PHP: Как сделать ссылку вместо community.php?name=...&author=... на community/name/author?

    shambler81
    @shambler81 Куратор тега htaccess
    GET не является частью урла в mod_rewrite в RewriteRule он физически не может попасть
    Ваш вариант RewriteCond %{QUERY_STRING}
    Вот тебе генератор

    https://donatstudios.com/RewriteRule_Generator
    Ответ написан
    Комментировать
  • Как добавить задачу cron на ubuntu при помощи скрипта?

    @Drno
    (crontab -l 2>/dev/null; echo "@reboot first-run-script.sh") | crontab -

    spoiler

    Файл crontab, который открывается командой `crontab -e` для пользователя root, находится в директории:

    /var/spool/cron/crontabs/root

    Ответ написан
    4 комментария
  • Как установить обновление Jetbrains?

    во всех настройках ide по пути appearance & behavior -> system settings -> http proxy можно включить опцию auto-detect proxy settings. и все vpn да прокси будут работать на отлично. если конечно vpn/proxy не в снг...
    Ответ написан
    Комментировать
  • Как правильно составить правило для url?

    slo_nik
    @slo_nik Куратор тега Yii
    'default/<id:\d+>/brand-<brand:\d+>' => 'default/index',
    'default/<id:\d+>' => 'default/index',
    'default' => 'default/index',
    
    echo Html::a('test', ['default/index', 'id' => $id, 'brand' =>  $brand])
    echo Html::a('test', ['default/index', 'id' => $id])
    echo Html::a('test', ['default/index'])
    
    http://site.loc/default/index/3/brand-2
    http://site.loc/default/index/3
    http://site.loc/default/
    Ответ написан
    Комментировать
  • Как настроить yii2 advanced на ubuntu?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    RootDirectory настраиваете на корень сайта, не на backend/web и не на frontend/web
    В корне сайта .htaccess
    RewriteEngine On
    
    RewriteRule ^(frontend|backend)/web/ - [L]
    
    RewriteCond %{REQUEST_URI} ^/(admin)
    RewriteRule ^admin(\/?.*)$ backend/web/$1 [L]
     
    RewriteCond %{REQUEST_URI} ^/
    RewriteRule ^(\/?.*)$ frontend/web/$1 [L]

    В backend/web .htaccess
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.php

    В backend/config/main.php, в секцию request
    'baseUrl' => '/admin'

    Перейдя по адресу http://site.com попадёте на frontend, а по адресу http://site.com/admin - в админку.
    Теперь, если захотите перенести сайт в поддиректорию, например subsite, адрес изменится на http://site.com/subsite.
    Вносите изменения в .htaccess, который в корне сайта.
    RewriteEngine On
    
    RewriteRule ^(frontend|backend)/web/ - [L]
    
    RewriteCond %{REQUEST_URI} ^/(subsite/admin)
    RewriteRule ^admin(/.*)?$ backend/web/$1 [L]
    
    RewriteCond %{REQUEST_URI} ^/(subsite)
    RewriteRule ^(.*)$ frontend/web/$1 [L]

    В backend/config/main.php добавляете переменную $baseUrl
    $baseUrl = str_replace('/backend/web', '', (new yii\web\Request)->getBaseUrl());

    и подставляете в значение baseUrl
    'baseUrl' => $baseUrl . '/admin'
    В этом случае Вы не заморачиваетсь с названием поддиректории в которую перенесёте сайт, названия можете менять как угодно, но не забываете сменить название и в корневом .htaccess
    Ответ написан
    Комментировать
  • Как передать объект из контроллера в head?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    В контроллере создаёте свойство, присваиваете ему нужное значение.
    class DefaultController extends Controller
    {
        public $test;
    
        public function actionIndex()
        {
             $this->test = 'test';
             /* остальной код метода */
        }
    }

    В main.php вызываете приблизительно так
    <?= Yii::$app->controller->view->context->test ?>
    Ответ написан
    6 комментариев
  • Как загрузить изображение на сервер через AJAX?

    slo_nik
    @slo_nik
    Добрый день.
    $(function() {
            $('#form-data').on('submit', function(e){
                e.preventDefault()
                var form = $(this); // Предположу, что этот код выполняется в обработчике события 'submit' формы
                var data = new FormData();  // Для отправки файлов понадобится объект FormData. Подробнее про него можно прочитать в документации - https://developer.mozilla.org/en-US/docs/Web/API/FormData
    
    
    
                // Сбор данных из обычных полей
                form.find(':input[name]').not('[type="file"]').each(function() { 
                    var field = $(this);
                    data.append(field.attr('name'), field.val());
                });
    
    
    
                // Сбор данных о файле (будет немного отличаться для нескольких файлов)
                var filesField = form.find('input[type="file"]');
                var fileName = filesField.attr('name');
                var file = filesField.prop('files')[0];
                data.append(fileName, file) ;
    
    
    
                // Отправка данных
                var url = 'upload.php';
    
                $.ajax({
                    url: url,
                    type: 'POST',
                    data: data,
                    contentType: false,
                    cache: false, 
                    processData:false, 
                    success: function(response) {
                        console.log(response)
                    }           
                });  
            })          
        });

    <form id="form-data" action='#'>
        <input type="file" name="test" multiple>
        <input type="submit" name='submit' value="Send">
    </form>
    Ответ написан
    2 комментария
  • Как отобразить часть контента используя Pjax yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    У Вас есть выпадающий список
    <select name="spjax" id="spjax">
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
    </select>

    Где-то в другом месте страницы есть блок, который надо обновить. При обновлении к заголовку необходимо добавить значение переменной $Ipjax. Оборачиваем этот блок Pjax и добавляем пользовательский js.
    <?php
       Pjax::begin([
           'id' => 'view-mode-pjax'
       ])
    ?>
    <div class="col-lg-4">
        <h2>Heading <?= $Ipjax ?></h2>
    
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et
            dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
            ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
            fugiat nulla pariatur.</p>
    
        <p><a class="btn btn-default" href="http://www.yiiframework.com/doc/">Yii Documentation &raquo;</a></p>
    </div>
    <?php
      Pjax::end();
    $this->registerJs("
    $(function(){
      $('#spjax').on('change', function(){
        var Id = $(this).val()
        console.log(Id)
        $.pjax.reload({
            container: \"#view-mode-pjax\", // контейнер, в котором надо обновить данные.
            url: window.location.href,
            timeout: 0,
            data: {
               'id': Id // данные, которые отправляются на сервер.
            },
        });
      })  
    })    
    ", View::POS_END)
    ?>

    А в контроллере, в действии, которое подключает данный вид передаёте нужную переменную.
    public function actionIndex()
    {
        $Ipjax = Yii::$app->request->get('id') ?: null;
        return $this->render('index', ['Ipjax' => $Ipjax]);
    }

    Отлавливаете изменение выпадающего списка и запускаете pjax. Идёт запрос на сервер, проверяется переменная и возвращается всё тот же вид, но уже с переменной.
    И Pjax, ушлый зверёк, обновит не всю страницу, а только тот блок, который Вы укажите.

    p.s. Пример сделан на yii2-basic, в файле views/index и в DefaultController.
    Ответ написан
  • Как работать с Pjax в yii2?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    Pjax имеет дело только с тем содержимым, которое располагается между begin() и end().
    Поэтому можно просто добавить нужный div после формы.
    Код формы.
    <?php
       yii\widgets\Pjax::begin(['id' => 'new_note', 'enablePushState' => false]) ?>
            <?= Html::beginForm(['/system/system/fastsearch'], 'post', ['data-pjax' => '1','enctype' => 'multipart/form-data', 'class'=>'form-inline' ]) ?>
            <?= Html::input('text', 'search', "", ['class' => "form-control form-control-sm ml-3 w-75"]) ?>
            <?= Html::submitButton('<i class="glyphicon glyphicon-search"></i>&nbsp;Найти', ['class' => 'btn btn-default', 'id'=>'press_search'])?>
            <?= Html::endForm() ?>
            <div id="reload-pjax"><?= $search ?? null ?></div>
        <?php Pjax::end();
    ?>

    Действие в контролере может быть таким.
    public function actionFastsearch()
    {
        if(Yii::$app->request->isAjax){
            $search = Yii::$app->request->post('search');
            return $this->render('index', ['search' => $search]);
        }
    }

    Или, что по моему мнению лучше, оправлять форму и обрабатывать ответ сервера используя обычный js или jquery.

    P.S.
    Хотя можно использовать и такой вариант. Поле формы должно быть заполнено обязательно.
    <?php
    Pjax::widget([
        'id' => 'reload-pjax',
        'enablePushState' => false, 
        'enableReplaceState' => false, 
        'formSelector' => '#options-form',
        'submitEvent' => 'submit',])
    ?>
    <?= Html::beginForm(['/site/fastsearch'],
                        'post',
                        [
                            'class'=>'form-inline',
                            'id' => 'options-form'
                        ]) ?>
    <?= Html::input('text', 'search', "", ['class' => "form-control form-control-sm ml-3 w-75"]) ?>
    <?= Html::submitButton('<i class="glyphicon glyphicon-search"></i>&nbsp;Найти', ['class' => 'btn btn-default', 'id'=>'press_search'])?>
    <?= Html::endForm() ?>
    <div id="reload-pjax"></div>
    Ответ написан
    2 комментария
  • Как ускорить UPDATE MySQL?

    petermzg
    @petermzg
    Самый лучший программист
    Блокировка "for update" работает только внутри транзакции.
    И не работает с autocommit.
    Делайте явный START TRANSACTION
    Ответ написан
    Комментировать
  • Как делать максимально безотказные бэкапы корня сайта и mysql в динамике?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега MySQL
    Делают read-only реплику и бэкапят её обычным способом.
    Ответ написан
    Комментировать
  • Актуален ли Yii2 Фреймворк в 2020?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Тут много нюансов и ответить однозначно сложно. Как уже написал Иван Шумов фреймворк - это инструмент. Каждый инструмент подбирается под конкретную задачу:

    • СMS - система управления сайтом (Wordpress, Joomla и т.д.). Создан для простого и удобного управления сайтом (контентом). Как правило, доступен для работы простому пользователю, без знания языков программирования. Подойдёт для: простых сайтов, блогов, там где не требуется нагрузка и безопасность.
    • RAD framework (Yii2) - фреймворк для быстрой разработки. RAD Фреймворк имеет, монолитную и связанную архитектуру. Он является антипаттенрном и позволяет вам делать всё что угодно, лишь бы вы быстро собрали свой проект. (Используется паттерн Table First - спроектировали базу и по схеме сгенерировали модели данных). При этом Вам никто не говорит, что он не может использоваться для серьёзных проектов. Например, DNS..
    • Компонентные фреймворки (Symfony, Laravel). Это фреймворки, которые разделены на независимые компоненты, которые вы можете подключать к своему проекту при необходимости. В самом фреймворке заложен только необходимый минимум, а всё остальное вынесено в компоненты. Эти компоненты могут использоваться (или не использоваться). Могут использоваться для другого фреймворка (сам Yii2 использует компоненты симфони). Doctirine, которая позволяет вам забыть о базе данных и сосредоточиться на коде. Фреймворк задаёт вам некий стиль, некую структуру и типизацию и требует более хорошего и обдуманного кодинга. Например, при использовании twig вы не сможете сделать запрос в view. Чего нельзя сказать про Yii. Вы там можете построить хорошую бизнес логику, что и встречается...
    • Микрофреймворки (Slim). В таких фреймворках заложен самый минимум, а всё остальное программист должен искать или писать самостоятельно, выстраивать свою архитектуру приложения. Он легкий и простой. Кто-то и Symfony относит к микрофреймворкам. Тут меня многие могут упрекнуть. Подойдет для очень простых, гибких, легких приложений, например, микросервисов. Фреймворк не задает вам никаких правил и архитектуры. Вы должны сами продумать все детали приложения. Где-то используете twig, где то Data Mapper, где-то ActiveRecord. Для работы с таким фреймворком требуется много знаний и опыта. Так как вам всё придется делать самому. Здесь за вас никто не подумал.

    Что же для чего выбрать?
    Решать вам исходя из конкретной задачи. Здесь нет понятия хуже/лучше. Чтобы что-то выбрать нужно на каждом попробовать собрать пару проектов. Тогда и будет понимание когда и что выбирать. Это как автомобиль. Какой лучше BMW или LADA? Оба автомобиля, но каждый для своей аудитории, по своим потребностям, для своих задач.

    Почему другие говорят что Yii2 плохой?
    • 2 версия морально устарела. Это не значит что ВЕСЬ фреймворк плохой, просто им давно никто не занимался. Сейчас идет разработка Yii3, которая многократно лучше 2 версии, но 3 версия доступна только в демо. Поэтому, если хочется писать НОВЫЙ проект на Yii, то я бы не стал выбирать 2 версию. Можете подождать Yii3, но никто не знает когда будет релиз. Можете начать писать используя Yii3-demo, но там может всё поменяться к моменту релиза.
    • Он монолитный. Если вам требуется сделать проект используя много приложений с разными компонентами, то пойдёте по пути Advanced шаблона, где каждое приложение будет папкой: backend, forntend, console. Однако при большой нагрузке вам потребуется разносить приложения. Тогда ваш core будет дублироваться во всех приложениях. Там будет то, что вам даже не требуется. Потому что Yii2 монолит.
    • В Yii2 используется Actvie Record. AR - это не плохо. Его многие любят, многие ценят и хвалят. Но для больших проектов он предоставляет неудобства. Например, при изменении поля в базе данных - приходится менять все свойства и надеяться что везде поменяли, так как в GrigView используется магия, при получение значений из модели 'value' => 'profile.last_name'. Так же нельзя сделать свойства модели (сущности), приватными. Из-за чего состояние модели можно изменить где угодно и вы никак не проконтролируете это.
    • Много абстракции, которую не распознает редактор. Например, вы можете вызвать в контроллере Yii::$app->user->id. Вам приходится делать докблок, что User это common/auth/Identity, а не yii/web/User


    Ну и так далее. С каждым из этих пунктов можно бороться, при правильном подходе. Как уже сказали в плохих руках любой код может пахнуть. Но это основное. Надеюсь, меня не раскритикуют другие за спорные моменты. В таких вопросах всегда есть разногласия) Думаю, что смог донести в сжатом виде отличия.
    Ответ написан
    4 комментария
  • Почему SSH продолжает слушать на 22 порту, хотя я его поменял?

    @pfg21
    ex-турист
    файл конфига изменен, но чтобы работающий в памяти sshd его перечитал необходимо ему намекнуть.
    sudo systemctl reload ssh.service
    потом глянуть статус
    sudo systemctl status ssh.service
    в нем должно быть.
    фев 22 22:43:11 srv16 systemd[1]: Reloading OpenBSD Secure Shell server...
    фев 22 22:43:11 srv16 systemd[1]: Reloaded OpenBSD Secure Shell server.
    фев 22 22:43:11 srv16 sshd[462]: Server listening on 0.0.0.0 port 4453.
    фев 22 22:43:11 srv16 sshd[462]: Server listening on :: port 4453.

    чисто от себя: менять номер порта ssh для скрытия доступа бессмысленно. посоветую использовать хороший длинный ключ
    Ответ написан
    8 комментариев
  • Timetracker для PHPStorm по веткам?

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

    Stalker_RED
    @Stalker_RED
    Возможно, хотя непонятно зачем это делать на PHP.

    Достаточно одной команды архиватору - вот эту папку заархивируй, добавь в название дату, и помести вон в ту папку. Или отправь по почте, например.
    Ну и в планировщик задач это добавить.

    А вообще для бекапа есть специаллизированный софт, который не только позволит бекапить, но и разворачивать из бекапа обратно с минимальными усилиями.

    Еще лучше, если у вас будет запасной сайт, на который можно переключиться за секунды. Но это уже история следующего уровня.
    Ответ написан
    Комментировать
  • Как развернуть nginx для nodejs и react?

    fzfx
    @fzfx
    18,5 дм
    Уберите концевой слеш в proxy_pass.
    Ответ написан
    Комментировать
  • Как следить за статусом контейнеров?

    @vitaly_il1
    DevOps Consulting
    https://www.site24x7.com/ умеет и мониторить URLs, есть и агент, которым можно мониторить процессы и контейнеры.
    Ответ написан
    Комментировать
  • Как следить за статусом контейнеров?

    @mureevms
    Написать скрипт, который чекает в цикле время работы каждого контейнера и если он меньше 5 минут, слать письмо/веб хук/что -то еще, скрипт поместить в крон на выполнение каждые 4 минуты
    Ответ написан
    Комментировать
  • Как следить за статусом контейнеров?

    Если без внешних инструментов с бесплатным триалом и деньжищами за использование,
    можно через Docker API получать живой стрим событий. Отфильтровать в нём только интересующие, например, container=<string> когда имя интересующего контейнера известно и постоянно.

    Но вообще присмотритесь подробнее к опции restart – пусть контейнер перезапускается автоматом после падения. И может, при запуске как-то куда-то отправляет «Доброе утро, админ!»
    Ответ написан
    Комментировать