Pjax обновление нескольких независимых блоков в Yii2

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
filippov
Сообщения: 7
Зарегистрирован: 2016.11.21, 21:38

Pjax обновление нескольких независимых блоков в Yii2

Сообщение filippov »

Учу Yii2 и решил ознакомиться с работой технологии Pjax на сайте: https://nix-tips.ru/yii2-vnikaem-v-pjax.html. Там есть пример "Несколько независимых блоков". Но реализовано оно в ознакомительном варианте и не совсем правильно, о чём и написано ниже. В данном примере в одном <i>actionMultiple</i> вычисляются и хеш и ключ, а нужно делать в разных экшенах. Так что решил сделать так, как было бы правильно и столкнулся с тем, что что при клике на ссылку перенаправляет на новую страницу с генерацией либо хеша, либо ключа. Нужно же, чтобы всё было на одной странице и без перезагрузок.

Код контроллера:

Код: Выделить всё

 public function actionMultiple()
        {
            $security = new Security();
            $randomString = $security->generateRandomString();
            $randomKey = $security->generateRandomKey();
            return $this->render('multiple', [
                'randomString' => $randomString,
                'randomKey' => $randomKey,
            ]);
        }
    
        public function actionString()
        {
            $security = new Security();
            $randomString= $security->generateRandomString();
            return $this->render('_randomString', [
                'randomString' => $randomString,
            ]);
        }
        public function actionKey()
        {
            $security = new Security();
            $randomKey = $security->generateRandomKey();
            return $this->render('_randomKey', [
                'randomKey' => $randomKey,
            ]);
        } 
view multiple:

Код: Выделить всё

<?php
    use yii\widgets\Pjax;
    use yii\bootstrap\Html;
    
    ?>
    
    <div class="col-sm-12 col-md-6">
        <?php Pjax::begin(); ?>
        <?= Html::a("Новая случайная строка", ['site/string'], ['class' => 'btn btn-lg btn-primary']) ?>
        <h3><?= $randomString ?></h3>
        <?php Pjax::end(); ?>
    </div>
    
    <div class="col-sm-12 col-md-6">
        <?php Pjax::begin(); ?>
        <?= Html::a("Новый случайный ключ", ['site/key'], ['class' => 'btn btn-lg btn-primary']) ?>
        <h3><?= $randomKey ?><h3>
                <?php Pjax::end(); ?>
    </div>
view _randomString:

Код: Выделить всё

 <?php
    use yii\helpers\Html;
    
    ?>
    
    <?= Html::a("Новая случайная строка", ['site/string'], ['class' => 'btn btn-lg btn-primary']) ?>
    <h3><?= $randomString ?></h3>
view _randomKey:

Код: Выделить всё

    <?php
    use yii\helpers\Html;
    
    ?>
    
    <?= Html::a("Новый случайный ключ", ['site/key'], ['class' => 'btn btn-lg btn-primary']) ?>
    <h3><?= $randomKey ?><h3>

Прошу подсказать мне, что я делаю не так.
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Pjax обновление нескольких независимых блоков в Yii2

Сообщение caHek2x »

view _randomString:
view _randomKey:
вам не хочется обернуть тоже в Pjax ?
filippov
Сообщения: 7
Зарегистрирован: 2016.11.21, 21:38

Re: Pjax обновление нескольких независимых блоков в Yii2

Сообщение filippov »

caHek2x писал(а):view _randomString:
view _randomKey:
вам не хочется обернуть тоже в Pjax ?
Тогда показ хеша работает так, как надо, но вот клик по генерации ключа почему-то преводит на новую страницу.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Pjax обновление нескольких независимых блоков в Yii2

Сообщение Loveorigami »

data-pjax=1 для ссылки попробуйте
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Pjax обновление нескольких независимых блоков в Yii2

Сообщение caHek2x »

Loveorigami писал(а):data-pjax=1 для ссылки попробуйте
это еще зачем ... если заглянуть в исходники ссылку оно находит по тегу a ... а форму уже по data-pjax

Код: Выделить всё

$linkSelector = Json::htmlEncode($this->linkSelector !== null ? $this->linkSelector : '#' . $id . ' a');
.....
$formSelector = Json::htmlEncode($this->formSelector !== null ? $this->formSelector : '#' . $id . ' form[data-pjax]'); 
Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: Pjax обновление нескольких независимых блоков в Yii2

Сообщение Neuromance »

Думаю вам надо при создании pjax-блока указать id этого блока.
Еще можете enablePushState указать false, чтобы url не изменялся.
p0int
Сообщения: 1
Зарегистрирован: 2017.06.30, 10:13

Re: Pjax обновление нескольких независимых блоков в Yii2

Сообщение p0int »

Добрый день. Решение найдено?
По тому же примеру уперся в те же грабли
Несколько последовательно идущих виджитов. в каждом кнопка на догрузку информации

Код: Выделить всё

foreach ($model as $group){
    <?
   Pjax::begin(['enablePushState' => false,'timeout'=> 40000]);
?><?
       echo Html::a('', ['/pj/grtocust' , 'group_id' => $group->id ], ['class' => 'btn btn-lg btn-primary glyphicon glyphicon-arrow-down',
           'data-pjax' => 1]);
 ?>
<?/*    <div><?//= $mess ?></div> */ ?>

    <? Pjax::end();
контроллер

Код: Выделить всё

    public function actionGrtocust($group_id)
    {
        $mess='hi man '.$group_id;
        return $this->render('grtocu',['mess'=>$mess , 'group_id' => $group_id]);
    }

    public function actionDnull($group_id)
    {
        $mess='';
        return $this->render('dnull',['mess'=>$mess , 'group_id' => $group_id]);
    }
вьюхи
grtocu

Код: Выделить всё

echo '<div>';
Pjax::begin(['enablePushState' => false]);
echo '<div>';
echo Html::a('', ['/pj/dnull','group_id' => $group_id], ['class' => 'btn btn-lg btn-primary glyphicon glyphicon-arrow-up'])
?>
    <div><?= $mess ?></div>
    </div>
<?php Pjax::end();
echo '<div>';
очистка

Код: Выделить всё

echo '<div>';
Pjax::begin(['enablePushState' => false]);
echo '<div>';
echo Html::a('', ['/pj/grtocust','group_id' => $group_id], ['class' => 'btn btn-lg btn-primary glyphicon glyphicon-arrow-down'])
?>
    <div><?= $mess ?></div>
    </div>
<?php Pjax::end();
echo '<div>';
Первый виджет в списке работает без проблем. Подгружает сообщение, убирает его. Все последующие грузят новую страницу.
Пробовал задавить id в pjax => все в новой странице.
без указания id работает только первый
(id он и сам нормально генерирует)

Код: Выделить всё


<div><h3> (Костенёв В.А.)</h3><br>
    <div id="p0" data-pjax-container="" data-pjax-timeout="400000"><a class="btn btn-lg btn-primary glyphicon glyphicon-arrow-down" href="/pj/grtocust?group_id=17" data-pjax="1"></a>
    </div></div>
<div><h3> (Бабинов С.В.)</h3<br>
    <div id="p1" data-pjax-container="" data-pjax-timeout="400000"><a class="btn btn-lg btn-primary glyphicon glyphicon-arrow-down" href="/pj/grtocust?group_id=19" data-pjax="1"></a>
    </div></div>
Кроме того у меня в блок pjax попадает все что есть во вьюхе.

Что не так? Живут несколько виджитов в одном представлении в таком виде или в статье не правда?
Ответить