yii2
Pjax
खोज…
चरण 1 संरचना जोड़ें
दृश्यों में \ site \ form-Submit.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(); ?>
चरण 2 सर्वर साइड कोड
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,
]);
}
pjax का उपयोग कैसे करें
इस लाइन को अपने दृष्टिकोण की शुरुआत में जोड़ें।
<?php
use yii\widgets\Pjax;
?>
आंशिक अद्यतन करने के लिए आवश्यक सामग्री के चारों ओर निम्नलिखित दो पंक्तियाँ जोड़ें।
<?php Pjax::begin(['id'=>'id-pjax']); ?>
Content that needs to be updated
<?php Pjax::end(); ?>
पुनः लोड करें
$.pjax.reload({container: '#id-pjax'});
pjax में टाइमआउट तर्क का उपयोग करें
<?php Pjax::begin(['id'=>'id-pjax', 'timeout' => false]); ?>
आप टाइमआउट तर्क के लिए पूर्णांक मान निर्दिष्ट कर सकते हैं, जो प्रतीक्षा करने के लिए मिलीसेकंड की संख्या होगी (इसका डिफ़ॉल्ट मान 1000 है)। यदि सर्वर में निष्पादन का समय इस टाइमआउट मान से अधिक है, तो एक पूर्ण पृष्ठ लोड चालू हो जाएगा।
डिफ़ॉल्ट रूप से pjax, GET विधि का उपयोग करके फॉर्म जमा करेगा। आप निम्न उदाहरण की तरह फ़ॉर्म जमा करने की विधि को POST में बदल सकते हैं
<?php Pjax::begin(['id'=>'id-pjax', 'timeout' => false, 'clientOptions' => ['method' => 'POST']]); ?>
Pjax उन्नत उपयोग
पेज लोड समय को कम करने वाली जावास्क्रिप्ट लाइब्रेरी Pjax के लिए Yii फ्रेमवर्क 2.0 में बिल्ट-इन सपोर्ट के साथ। यह केवल अजाक्स के माध्यम से बदल गए पृष्ठ के हिस्से को अपडेट करके इसे पूरा करता है, जो आपके पृष्ठों पर कई अन्य संपत्ति होने पर पर्याप्त बचत में बदल सकता है। हमारी कुछ परियोजनाएं इस कार्यक्षमता का उपयोग करती हैं और हम सीखे गए कुछ पाठों को साझा करना चाहते हैं।
समस्या : पृष्ठ 1 एक साधारण स्थैतिक पृष्ठ है जिसमें कुछ तत्व होते हैं। पृष्ठ 2 में ActiveForm के साथ-साथ अन्य विजेट भी शामिल हैं। ActiveForm जावास्क्रिप्ट संसाधनों को इनलाइन जावास्क्रिप्ट को चलाने के लिए क्रम में लोड करने की आवश्यकता होती है, लेकिन चूंकि पेज 1 में उन संपत्तियों को शामिल नहीं किया गया था, सक्रियण रेखा को निष्पादित करने का प्रयास करते समय पृष्ठ 2 एक जावास्क्रिप्ट त्रुटि में चला गया: 'अनकैप्ड टाइपर्रर: अपरिष्कृत नहीं है' समारोह'।
समाधान : एक साझा परिसंपत्ति बंडल में ActiveForm परिसंपत्तियां शामिल करें जो सभी पृष्ठों पर लोड की जाएंगी, यह सुनिश्चित करते हुए कि कोई भी प्रविष्टि पृष्ठ सही स्क्रिप्ट उपलब्ध होने देगा।
class AppAsset extends AssetBundle
{
...
public $depends = [
'yii\widgets\ActiveFormAsset',
'yii\validators\ValidationAsset',
];
...
}
समस्या : ऊपर दिए गए उदाहरण में, पेज 1 में कुछ विजेट्स (नवबार, आदि) शामिल हैं। पृष्ठ 2 में समान विजेट्स और कुछ अधिक (ActiveForm, आदि) शामिल हैं। पेज को पैक्स के माध्यम से लोड करने के दौरान, कुछ कस्टम इनलाइन जावास्क्रिप्ट चल रहा था, लेकिन ActiveForm विजेट द्वारा रखी गई इनलाइन स्क्रिप्ट काम नहीं कर रही थी, क्योंकि सत्यापन कोड काम नहीं कर रहा था। डीबग में, हमने पाया कि ActiveForm init फ़ंक्शन चल रहा था, लेकिन 'यह' चर ActiveForm के अनुरूप नहीं था। यह वास्तव में NavBar div के अनुरूप था। डिव आईडी की जांच करने पर, हमने देखा कि ActiveForm को # w1 की आईडी की उम्मीद थी, लेकिन NavBar को पहले ही पेज 1 पर उस ID को असाइन कर दिया गया था क्योंकि उस पेज पर पहले विजेट का सामना करना पड़ा था।
समाधान : आपके लिए विजेट आईडी को ऑटो-जनरेट करने के लिए Yii पर निर्भर न रहें। इसके बजाय, उन आईडी का नियंत्रण बनाए रखने के लिए विजेट बनाते समय हमेशा एक आईडी में पास करें।
समस्या : अनुरोध शुरू होने के बाद Pjax अनुरोध 1,000 मिसे रद्द हो रहा था।
समाधान : Pjax मध्यांतर सेटिंग बढ़ाएँ। यह 1 सेकंड के लिए चूक करता है, जो उत्पादन साइटों के लिए स्वीकार्य होना चाहिए। हालाँकि, विकास में, xdebug का उपयोग करते समय, हमारे पृष्ठ लोड समय नियमित रूप से इस सीमा से अधिक होते हैं।
समस्या : वेब एप्लिकेशन पोस्ट-रीडायरेक्ट-गेट (PRG) पैटर्न को लागू करता है। Pjax सिर्फ पुनर्निर्देशन के बजाय पूरे पृष्ठ को फिर से लोड करता है।
समाधान : यह Pjax का अभिप्राय व्यवहार है। Pjax का उपयोग करते समय रीडायरेक्ट अपना उद्देश्य पूरा नहीं करता है, इसलिए आप यह निर्धारित कर सकते हैं कि क्या कोई अनुरोध Pjax है, और यदि ऐसा है, तो रीडायरेक्ट के बजाय सामग्री को रेंडर करें। एक उदाहरण की तरह लग सकता है:
$endURL = "main/endpoint";
if (Yii::$app->request->isPjax) {
return $this->run($endURL);
} else {
return $this->redirect([$endURL]);
}
आपका Pjax और Yii के साथ क्या अनुभव रहा है? नीचे टिप्पणी करें यदि आपको कोई मिला है या हमारे पास इससे बेहतर उपाय है!