zend分页中的意外警告

时间:2012-10-04 10:44:25

标签: php zend-framework

  

可能重复:
  Invalid argument supplied for foreach()

我的控制行动是

public function indexAction(){
 Zend_View_Helper_PaginationControl::setDefaultViewPartial('index.phtml');
  $params = array('host'        =>'localhost',
                  'username'    =>'root',
                        'password'  =>'',
                        'dbname'    =>'test'
                         );
   $db = new Zend_Db_Adapter_Pdo_Mysql($params);
    $select = $db->select()->from('tableviewdemo');
    $paginator = Zend_Paginator::factory($select);

    $paginator->setCurrentPageNumber($this->_getParam('page', 1));
    $paginator->setItemCountPerPage(10);
    $this->view->paginator=$paginator;
}

并且查看文件是

<?  echo "<table border=1>";
foreach ($this->paginator as $item) {
echo '<tr><td>' . $item['id'] . '</td>';
echo '<td>' . $item['name'] . '</td>';
echo '<td>' . $item['city'] . '</td>';
echo '<td>' . $item['state'] . '</td>';
echo '<td>' . $item['date'] . '</td>';
echo '<td>' . $item['zip'] . '</td></tr>';}
echo "</table>";
echo $this->paginationControl($this->paginator,'Sliding','/test/index.phtml'); ?>

显示错误 table和pagelink如下 首先| &LT;上一页|下一个&gt; |最后

并发出警告 警告:在C:\ Users \ Administrator \ hello \ application \ views \ scripts \ test \ index.phtml中为foreach()提供的参数无效 为什么会发生这种情况????

2 个答案:

答案 0 :(得分:0)

如果它实现了接口迭代器,你只将除数组之外的任何变量传递给foreach,我认为Zend_Paginator没有实现它。并且你正在使用paginator进行列表它是完全无法解决的,只需尝试这个

$this->view->records = $db->select()->from('tableviewdemo')->fetchAll()->toArray();

并在您的视图文件中进行迭代

foreach($this->records)
{
}

我也怀疑你的数据库查询是否有效。

答案 1 :(得分:0)

我注意到你将index.phtml设置为默认视图部分,错误引用引号... 我不认为该方法符合您的想法。

至少在一开始我建议你指明一切。指定select(),指定适配器,创建新的分页器。之后你可以采取捷径。

public function indexAction(){
    $params = array('host'      =>'localhost',
                    'username'  =>'root',
                    'password'  =>'',
                    'dbname'    =>'test'
                    );
    $db = new Zend_Db_Adapter_Pdo_Mysql($params);
    $select = $db->select()->from('tableviewdemo');
    //specify paginator adapter
    $adapter = new Zend_Paginator_Adapter_DbTableSelect($select);
    //instantiate the paginator
    $paginator = new Zend_Paginator($adapter);
    //if you really have to use the factory, don't forget the string for the adapter.
    //The paginator should work without the string, but may not work as expected.
    //$paginator = Zend_Paginator::factory($select, 'DbTableSelect');    
    $paginator->setCurrentPageNumber($this->_getParam('page', 1));
    $paginator->setItemCountPerPage(10);
    //assign paginator to the view
    $this->view->paginator=$paginator;
}

关于适配器的说明。

适配器Zend_Paginator_Adapter_DbTableZend_Paginator_Adapter_DbTableSelect之间的最大明显差异是 DbTable 返回aray将使用数组表示法{{1} }和 DbTableSelect 返回一个对象(rowset对象)使用对象表示法`$ item-&gt; name'所以请使用适合您需要的适配器。

回到原点。默认视图partial不会引用您想要显示的页面。它指的是包含paginator控件的视图partial。 Zend没有example的默认分页控件实现。

在您的视图中尝试此操作。

$item['name']

我通常使用的分页器与手册中的示例非常相似,我在我的视图脚本中调用它(所有部分视图的默认位置是<!-- assumes you using DbTableSelect paginator adapter --> <!-- for DbSelect adapter just change to array notation: $item['id'] --> <table border=1> <?php foreach ($this->paginator as $item) : ?> <tr> <td><?php echo $this->escape($item->id) ?></td> <td><?php echo $this->escape($item->name) ?></td> <td><?php echo $this->escape($item->city) ?></td> <td><?php echo $this->escape($item->state) ?></td> <td><?php echo $this->escape($item->date) ?></td> <td><?php echo $this->escape($item->zip) ?></td> </tr> </table> <?php endForeach ?> <?php echo $this->paginationControl($this->paginator,'Sliding','MyPaginatorControl.phtml'); ?> ):

views/scripts

以防有人需要它是我的基本控制部分:

<?php
    echo $this->paginationControl(
        //remember the third parameter is the controls partial
        $this->paginator, 'Sliding', '_paginatorControl.phtml'
    )
 ?>

我希望这会有所帮助。