как ajaxify результаты zend_pagination (уже работающие с частичным циклом), используя jquery - PullRequest
6 голосов
/ 24 января 2011

в контроллере у меня есть:

  $paginator = Zend_Paginator::factory($mdlPost->getPosts($this->moduleData->accordion, 'name ASC'));
   if(isset($params['cities'])) {  
          $paginator->setCurrentPageNumber(intval($params['cities']));
            }
$paginator->setItemCountPerPage(4);
$this->view->posts = $paginator;         

в представлении у меня есть что-то вроде этого:

if ($this->posts != null) {?>
  <div id="cities_accord" class="news">
   <?php   echo $this->partialLoop('partials/post-min.phtml', $this->posts); ?>
  </div>   
  <?php   echo $this->paginationControl($this->posts,
                                'Sliding',
                                'public/pagination_cont.phtml'); 
}

частичное / post-min.phtml

<?php 
$color = array(1=>'spring',2=>'summer',3=>'autumn',4=>'winter');
?>

<div id='<?php echo $color[$this->partialCounter] ?>' class="accordion_post">
<?php
$link = Digitalus_Uri::get(false, false, array('openCity' =>      
  $this->id));//$color[$this->partialCounter]));
?>

<h1 class="accordion_post_title"><?php echo $this->title ?></h1>

<p><?php echo $this->teaser ?> <a href="<?php echo $link;?>"><i>read more</i></a></p>
</div>

pagination_cont.phtml взятый из этой ссылки zend (http://framework.zend.com/manual/en/zend.paginator.usage.html) покажет ссылки, которые будут передавать параметры контроллеру для извлечения соответствующей целой страницы, которая сейчас работает нормально

но я хочу изменить это так, чтобы иметь возможность изменить возвращаемые значения (т. Е. Только одно значение с разбивкой на страницы, а не перезагружать всю страницу), как я могу это сделать с помощью jquery и что я должен изменить ..

** РЕДАКТИРОВАТЬ: было бы неплохо сохранить сбой, если это возможно, для браузеров (пользователей), которые отключили JavaScript, чтобы увидеть то же самое путем перезагрузки страницы (т.е. сохранить текущий статус для if (javascript_not_enabled)) **

Ответы [ 2 ]

3 голосов
/ 25 января 2011

Это то, что я делал в прошлом.

Сначала настройте помощник действий AjaxContext , чтобы включить контекст html в действии вашего контроллера.

Добавьте .ajax.phtml представление, которое содержит только раздел разметки, который может быть заменен через AJAX, а также ссылки управления разбиением на страницы. Вы можете, вероятно, просто скопировать это из вашего обычного представления. Замените этот раздел в обычном представлении на что-то вроде

<div id="reloadable-content">
    <?php echo $this->render('controller/action.ajax.phtml') ?>
</div>

Это будет гарантировать, что ваши первоначальные и любые запросы, не относящиеся к AJAX, будут по-прежнему содержать правильное содержимое. Идентификатор <div> предназначен исключительно для ссылки на загружаемый блок в JavaScript.

Также убедитесь, что вы включили ваш файл JS (используя headScript) только в обычный вид.

Теперь в вашем JS-файле незаметно добавьте соответствующую привязку события к ссылкам на страницы. Поскольку вы замените раздел управления разбиением на страницы, чтобы отобразить правильную текущую страницу и другие ссылки, вероятно, лучше всего сделать это с помощью привязки jQuery live. Я также предполагаю, что вы оберните элемент управления нумерацией страниц каким-нибудь идентифицируемым элементом (например, <div class="pagination-control">)

$('.pagination-control').find('a').live('click', function(e) {
    var link = $(this);
    $('#reloadable-content').load(link.attr('href'), { format: 'html' });
    return false;
});

Имейте в виду, что при использовании этого метода вы потеряете возможность навигации по постраничным запросам с помощью обычных кнопок браузера «назад / вперед». Вы также потеряете возможность напрямую создавать закладки для страниц (хотя вы всегда можете предоставить постоянную ссылку на текущую страницу как часть загруженного содержимого AJAX).

Вы можете использовать что-то вроде jQuery плагин истории , если вы действительно заинтересованы, но это потребует больше работы на стороне клиента.

Еще одна оговорка: вышеописанное будет работать только со ссылками на нумерацию страниц. Если вы хотите использовать форму с выбором выпадающего списка, вам нужно добавить другой обработчик событий для отправки.

1 голос
/ 25 января 2011

ПОЛУЧИЛ ЭТО и большое Спасибо @Phil Brown:

в контроллере int () измените тип ответа на json

  class NewsController extends Zend_Controller_Action

  {

      public function init()

      {

          $contextSwitch = $this->_helper->getHelper('contextSwitch');

          $contextSwitch->addActionContext('list', 'JSON')

                        ->initContext();

      }



      // ...

  }


public listAtcion() {

  //  .............

  $paginator = Zend_Paginator::factory($mdlPost->getPosts($this->moduleData->accordion, 'name ASC'));
   if(isset($params['cities'])) {  
         $paginator->setCurrentPageNumber(intval($params['cities']));
         }
  $paginator->setItemCountPerPage(4);

  $post = array();
  foreach($paginator as $post ) {
      $post[] = $post;
  }

  $this->view->post = $paginator; 

  #TODO //add a check here for non-ajax requests (#improvment)
    $this->view->posts = $paginator;     

}

в одном из представлений (наиболее вероятно вpagination_cont.phtml) на контроллере разбиения на страницы добавьте ссылки ajax

 <?= $this->ajaxLink (
                 $this->url('cities'=>$this->page_num),array('id'=>'div_id','complete'=>'js_method(json_data)','method'=>post) ,array('format'=>'JSON'));

и добавьте JavaScript-функцию js_method (json_data) для изменения div с id = 'div_id' с данными json

  function js_method(json_data) { 
    var content = parse.JSON(json_data);
     $('#div_id').html(''); 
    //fill it with the reposnse content  some thing like  $('#div_id').append(content); 
  }
...