Контакты
Местоположение
Украина, Харьковская обл., Харьков

Достижения

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

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

Все теги (142)

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

Все ответы (1278)
  • Как работать с 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>
    Ответ написан
  • Как отобразить часть контента используя 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.
    Ответ написан
  • Как загрузить изображение на сервер через 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>
    Ответ написан
  • Отказ в доступе консольному контролеру, как решить?

    slo_nik
    @slo_nik Автор вопроса, куратор тега Yii
    Вопрос решился. Подсказали как правильно сделать.
    Необходим модуль apache2 mpm-itk.

    Этот модуль позволяет запускать виртуальные хосты от имени пользователя. Кроме всего прочего, это позволяет не задумываться о выставлении дополнительных прав на те, или иные папки и файлы на ваших сайтах.

    У меня Ubuntu 16.04., сервер apache2.
    1)Проверяем, собран ли apache2 c поддержкой mpm-itk
    в консоли
    apachectl -t -D DUMP_MODULES
    в результате ищем строку mpm_itk_module (static)
    2)Если нет, то устанавливаем модуль.
    sudo apt-get install libapache2-mpm-itk && sudo service apapche2 restart

    3) Редактируем конфигурацию виртуального хоста, вписываем туда следующую инструкцию
    <IfModule mpm_itk_module>
          AssignUserId your_user_name your_user_groupe
    </IfModule>

    4) Перезагружаем apache2.

    Всё, можно пользоваться.
    Ответ написан
  • Как реализовать два зависимых select-а?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый день.
    Проще простого... Вот Вам даже три связанных списка. Параметры подставите свои.
    <?= $form->field($model, 'country_id')->dropDownList(Countries::getAllName(),
             [
                 'prompt' => 'Выбрать страну...',
                 'onchange' => '
                    $.post(
                     "'.Url::toRoute('ajax/list-regions').'",
                     {id : $(this).val()},
                     function(data){
                      $("select#regions").html(data).attr("disabled", false)
                     }
                    )
                 '
             ]
            ) ?>
    
            <?= $form->field($model, 'region_id')->dropDownList(Regions::getAllName(),
                [
                    'prompt' => 'Выбрать регион...',
                    'id' => 'regions',
                    'disabled' => $model->isNewRecord ? 'disabled' : false,
                    'onchange' => '
                       $.post(
                        "'.Url::toRoute('ajax/list-cities').'",
                        {id : $(this).val()},
                        function(data){
                         $("select#cities").html(data).attr("disabled", false)
                        }
                       )
                    '
                ]
               )
            ?>
    
            <?= $form->field($model, 'city_id')->dropDownList(Cities::getAllName(),
                  [
                      'prompt' => 'Выбрать город...',
                      'id' => 'cities',
                      'disabled' => $model->isNewRecord ? 'disabled' : false
                  ]
                 )
            ?>

    И пару действий в контроллере
    public function actionListRegions()
        {
             if(Yii::$app->request->isAjax)
             {
                 $id = (int)Yii::$app->request->post('id');
    
                 $regions = Regions::find()
                                     ->where('status=:status',[':status' => Regions::STATUS_ACTIVE])
                                     ->andWhere('country_id=:id', [':id' => $id])
                                     ->orderBy('name_ru')
                                     ->all();
                 $this->option  = '<option value="0">Выберите регион...</option>';
                 foreach($regions as $region){
                     $this->option .= '<option value="'.$region->id.'">'.$region->name_ru.'</option>';
                 }
             }
            return $this->option;
        }
    
        /**
         * @inheritdocs
         */
        public function actionListCities()
        {
            if(Yii::$app->request->isAjax)
            {
                $id = (int)Yii::$app->request->post('id');
    
                $regions = Cities::find()
                    ->where('status=:status',[':status' => Cities::STATUS_ACTIVE])
                    ->andWhere('region_id=:id', [':id' => $id])
                    ->orderBy('name_ru')
                    ->all();
                $this->option  = '<option value="0">Выберите город...</option>';
                foreach($regions as $region){
                    $this->option .= '<option value="'.$region->id.'">'.$region->name_ru.'</option>';
                }
            }
            return $this->option;
        }


    p.s. Тянуть сторонний плагин в большинстве случаев неоправдано.
    Ответ написан

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

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