2015-06-16 4 views
2

Когда в действии используется file_get_contents($url), и когда это действие загружается с помощью Pjax, вся страница перезагружается.Yii2 Pjax не работает, перезагружает всю страницу

In controllers/SiteController.php 

public function actionAbout() 
{ 
    $url = 'http://api.dar.fm/topsongs.php?q=Music&page_size=20'; 
    $xml = file_get_contents($url); 

    Yii::$app->view->params['xmldata'] = $xml; 
    return $this->render('about'); 
} 

In layouts/main.php 

<?php Pjax::begin(); ?> 
    <a href="/yiidev/web/index.php?r=site/home">Home</a> 
    <a href="/yiidev/web/index.php?r=site/about">About</a> 
    <a href="/yiidev/web/index.php?r=site/contact">Contact us</a> 
<?php Pjax::end(); ?> 

Для дома и Обратной связи, только область между pjax begin() и end() обновляется, но и для О связи всех перезагрузок страницы.

Если я удаляю звонок file_get_contents() от actionAbout(), перезагрузка страницы не происходит. Я считаю, что проблема связана с получением содержимого из внешнего URL-адреса, используя file_get_contents()

ответ

2

Проблема связана с таймаутом ajax. file_get_contents() потребовалось больше времени для выполнения, так как он читал внешний url и тайм-аут. Проблема была решена путем увеличения тайм-аута, как показано ниже.

Pjax :: begin (['timeout' => 5000]);

См https://github.com/yiisoft/yii2/issues/8819

1

В дополнение к предыдущему ответу я предлагаю свой вариант для решения проблемы с тайм-аут - перекрытая версия класса Pjax (я использую его во всех моих проектах). Это может помочь предотвратить случаи, когда вы забыли добавить тайм-аут в конструкторе Pjax.

/** 
* Custom Pjax with incremented timeout. 
* JS for Pjax updating: 
* <code> 
*  $.pjax.defaults.timeout = false;    // For JS use case yor should manual override default timeout. 
*  $.pjax.reload({container: '#pjaxId'}); 
* 
*  // OR 
*  $.pjax.reload('#pjaxId', {timeout : false}); 
* 
*  // OR for gridview with search filters 
*  $('.grid-view').yiiGridView('applyFilter'); // Thats true only if you have search Filters 
* </code> 
* 
* Note: In more cases ID of widget should be static, because widgetId is autoincremented and browser version of page may be not up-to-date. 
*/ 
class Pjax extends \yii\widgets\Pjax 
{ 
    /** 
    * @var int Timeout {@link \yii\widgets\Pjax::$timeout}. 
    *   For JS use case yor should manual override defaults ( $.pjax.defaults.timeout = false; ). 
    */ 
    public $timeout = 30000; 
} 

Смотреть подробнее здесь: yii2 how to use pjax when hyperlink is not in pjax

+0

Хотя эта ссылка может ответить на этот вопрос, то лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/13475529) –

+0

@CastroRoy Спасибо, ты прав! Я обновил свой андер. – IStranger

 Смежные вопросы

  • Нет связанных вопросов^_^