ZF2共用分页模板显示ajax分页列表

阅读更多

通用的分页模板视图/view/application/page/control.phtml:

 



pageCount): ?>
previous)): ?> < Previous | < Previous | pagesInRange as $page): ?> current): ?> | | next)): ?> Next > Next >

 

 常规的ViewModel包含模板/view/application/pagination-test/test-page.phtml:

 



Example

paginator)): ?>
    paginator as $item):?>
  • value; ?>
paginationControl($this->paginator,'Elastic','application/page/control.phtml', array('route' => 'application')); ?>

 

 Action方法: 

 

public function testPageAction(){
		$select = new \Zend\Db\Sql\Select();
		$select->from('example');
		$adapterOrSqlObject = $this->getServiceLocator()->get('dbAdapter');
		$adapter = new \Zend\Paginator\Adapter\DbSelect($select, $adapterOrSqlObject);
		$paginator = new \Zend\Paginator\Paginator($adapter);
		$paginator->setCurrentPageNumber($this->params()->fromQuery('page'));
		$paginator->setDefaultItemCountPerPage(1);
		$vm = new ViewModel();
		$vm->setVariable('paginator', $paginator);
		
		return $vm;
	}

 

 以上代码分页没有任何问题。但如果我们需要让列表变成ajax加载,点击页数跳转页面无刷新效果,而不想在Js里重新很麻烦的将分页模板的逻辑及样式再写一遍, 那么我们需要共用之前的通用模板。

 

分页模板是通过这句代码传递参数的(如果我们AJAx方式时设置一个模板/ajax.phtml去包含这段代码将会有问题):

 

paginationControl($this->paginator,'Elastic','application/page/control.phtml', array('route' => 'application')); ?>

 

ZF2目前支持设置子模板, 但均是分开设置模板的参数的。如果Ajax方式加载时你想再通过这种方式去调用分页模板control.phtml, 那么会报找不到模板的错误, 因为这个地方分页的参数不能传递到control.phtml,  那么你可能要问为什么前面正常的情况下是能传递,并且没有问题的呢?这因为我们AJAx的action方法里需要解析模板直接返回数据给JS调用,那么加载的方式是不一样了。具体看下面的代码。

那么我们怎么解决呢?可以跳开这种思路, 有时在一个问题上纠结很久时,可以换种方法或许柳暗花明。 

也许你想到了,对,我们直接调用分页模板control.phtml来进行参数赋值。

 

Ajax请求方法代码:

 

public function ajaxAction(){
		$select = new \Zend\Db\Sql\Select();
		$select->from('example');
		$adapterOrSqlObject = $this->getServiceLocator()->get('dbAdapter');
		$adapter = new \Zend\Paginator\Adapter\DbSelect($select, $adapterOrSqlObject);
		$paginator = new \Zend\Paginator\Paginator($adapter);
		$paginator->setCurrentPageNumber($this->params()->fromQuery('page'));
		$paginator->setDefaultItemCountPerPage(1);
		
		$renderer = new \Zend\View\Renderer\PhpRenderer();
		$resolver = new \Zend\View\Resolver\AggregateResolver();
		
		$map = new \Zend\View\Resolver\TemplateMapResolver(array(
				'page'      => __DIR__ . '/../../../view/application/page/control.phtml',
		));
	
		$resolver->attach($map);
		$renderer->setResolver($resolver);
		
		$vm = new ViewModel();
		$pages = get_object_vars($paginator->getPages('Elastic'));

		$vm->setTemplate('page');
		if (is_array($pages)) {
			$vm->setVariables($pages);
		}
		
		$pageHtml = $renderer->render($vm);
		
		$response = $this->getResponse();
		$response->setContent(json_encode(array('data'=>$paginator->getCurrentItems()->toArray(),'pageHtml'=>$pageHtml)));
		return $response;
	}
 

 

Ajax方式加载列表的test-page.phtml模板代码(这里是演示代码,js直接写在模板里了,正式编码放置另外单独JS文件,便于维护及缓存管理):

 

 



Example

 

 

你可能感兴趣的:(zend,framework,2.0,pagination,ajax,template)