Szukaj…


Krok 1 Dodaj strukturę

W views \ site \ form-submission.php

<?php Pjax::begin(['id'=>'id-pjax']); ?>
<?= Html::beginForm(['site/form-submission'], 'post', ['data-pjax' => '', 'class' => 'form-inline']); ?>
    <?= Html::input('text', 'string', Yii::$app->request->post('string'), ['class' => 'form-control']) ?>
    <?= Html::submitButton('Hash String', ['class' => 'btn btn-lg btn-primary', 'name' => 'hash-button']) ?>
<?= Html::endForm() ?>
<h3><?= $stringHash ?></h3>
<?php Pjax::end(); ?>

Krok 2 Kod po stronie serwera

public function actionFormSubmission()
{
    $security = new Security();
    $string = Yii::$app->request->post('string');
    $stringHash = '';
    if (!is_null($string)) {
        $stringHash = $security->generatePasswordHash($string);
    }
    return $this->render('form-submission', [
        'stringHash' => $stringHash,
    ]);
}

jak korzystać z pjax

Dodaj tę linię na początku swojego widoku.

<?php
use yii\widgets\Pjax;
?>

Dodaj następujące dwa wiersze wokół treści, która wymaga częściowej aktualizacji.

<?php Pjax::begin(['id'=>'id-pjax']); ?>
Content that needs to be updated
<?php Pjax::end(); ?>

przeładuj pjax

$.pjax.reload({container: '#id-pjax'});

użyj argumentu limitu czasu w pjax

<?php Pjax::begin(['id'=>'id-pjax', 'timeout' => false]); ?>

możesz podać wartość całkowitą dla argumentu limitu czasu, który byłby liczbą milisekund oczekiwania (jego wartość domyślna to 1000). Jeśli czas wykonania na serwerze jest dłuższy niż ta wartość limitu czasu, zostanie uruchomione pełne ładowanie strony.

Domyślnie pjax prześle formularz metodą GET. Możesz zmienić metodę przesyłania formularza na POST, jak w poniższym przykładzie

<?php Pjax::begin(['id'=>'id-pjax', 'timeout' => false, 'clientOptions' => ['method' => 'POST']]); ?>

Zaawansowane użycie Pjax

Yii Framework 2.0 jest dostarczany z wbudowaną obsługą Pjax , biblioteki JavaScript, która skraca czas ładowania strony. Osiąga to poprzez aktualizację tylko tej części strony, która zmieniła się przez Ajax, co może przełożyć się na znaczne oszczędności, jeśli masz wiele innych zasobów na swoich stronach. Niektóre z naszych projektów wykorzystują tę funkcjonalność i chcieliśmy podzielić się wyciągniętymi doświadczeniami.

Problem : Strona 1 to prosta strona statyczna, która zawiera kilka elementów. Strona 2 zawiera ActiveForm, a także inne widżety. Zasoby JavaScript ActiveForm muszą zostać załadowane, aby można było uruchomić wbudowany skrypt JavaScript, ale ponieważ strona 1 nie zawierała tych zasobów, strona 2 napotkała błąd JavaScript podczas próby uruchomienia wiersza formularza aktywnego: „Nieprawidłowy typ błędu: niezdefiniowany nie jest funkcjonować'.

Rozwiązanie : dołącz zasoby ActiveForm do pakietu zasobów współdzielonych, który będzie ładowany na wszystkich stronach, zapewniając, że każda strona wejściowa pozwoli na udostępnienie poprawnych skryptów.

class AppAsset extends AssetBundle
{
    ...
    public $depends = [
        'yii\widgets\ActiveFormAsset',
        'yii\validators\ValidationAsset',
    ];
    ...
}

Problem : W tym samym przykładzie powyżej strona 1 zawiera kilka widżetów (NavBar itp.). Strona 2 zawiera te same widżety oraz kilka innych (ActiveForm itp.). Podczas ładowania strony przez Pjax działało niestandardowe wbudowane JavaScript, ale skrypt wbudowany umieszczony przez widget ActiveForm nie działał, ponieważ kod sprawdzania poprawności nie działał. Podczas debugowania stwierdziliśmy, że funkcja inicjująca ActiveForm działała, ale zmienna „this” nie odpowiadała ActiveForm. W rzeczywistości odpowiadało to div NavBar. Badając identyfikatory div, zauważyliśmy, że ActiveForm spodziewał się mieć identyfikator # w1, ale NavBarowi przypisano już ten identyfikator na stronie 1, ponieważ był to pierwszy widżet napotkany na tej stronie.

Rozwiązanie : Nie polegaj na Yii, aby automatycznie generować identyfikatory widgetów. Zamiast tego zawsze przesyłaj identyfikator podczas tworzenia widżetu, aby zachować kontrolę nad tymi identyfikatorami.

Problem : żądanie Pjax zostało anulowane dokładnie 1000 ms po zainicjowaniu żądania.

Rozwiązanie : Zwiększ ustawienie limitu czasu Pjax. Domyślnie wynosi 1 sekundę, co powinno być akceptowalne dla zakładów produkcyjnych. Jednak w fazie rozwoju, podczas korzystania z xdebug, czasy ładowania strony regularnie przekraczają ten limit.

Problem : Aplikacja internetowa implementuje wzorzec Post-Redirect-Get (PRG) . Pjax przeładowuje całą stronę zamiast przekierowania.

Rozwiązanie : Jest to zamierzone zachowanie Pjax. Przekierowanie nie spełnia swojego zadania podczas korzystania z Pjax, więc możesz określić, czy żądanie jest Pjax, a jeśli tak, renderuj treść zamiast przekierowywać. Przykład może wyglądać następująco:

$endURL = "main/endpoint";
if (Yii::$app->request->isPjax) {
    return $this->run($endURL);
} else {
    return $this->redirect([$endURL]);
}

Jakie masz doświadczenia z Pjax i Yii? Skomentuj poniżej, jeśli znalazłeś jakieś problemy lub masz lepsze rozwiązania niż nasze!



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow