ZEND表单元素包含数据库中的数据

时间:2011-11-21 23:24:20

标签: forms zend-framework zend-decorators

嗨那里:)我有装饰器和表格的问题,这将在表中,在这个表中希望也有来自数据库的数据...我不知道怎么做这个有一个像这样的结构下面的内容,让我们说

<table>
<tr>
  <td><?php echo array[0]['name']?>
//and here input from zend form
  <td>
  <select name='foo' id='bar'>
    <option value='something'>Foo</option>
    <option value='something2'>Foo2</option>
  </select>
  </td>
</tr>
</table>

Ofcourse tr将更多,并使用foreach或某些循环生成。

我有这样的事情:

<?php

class EditArticles_Form_EditArticles extends Zend_Form
{
protected $uid;

public function render()
{


    /* Form Elements & Other Definitions Here ... */
    $this->setName('editarticles');

    $data = new EditArticles_Model_DbTable_EditArticlesModel();
    $datadata = $data->GetArticlesToEdit($this->getUid());    //here is my data from db


    for ($i=0;$i<count($datadata);$i++)
    {           
        $do = new Zend_Form_Element_Select(''.$i);
        $do->addMultiOption('0', 'Aktywny');
                $do->addMultiOption('1', 'Nieaktywny');

        $this->addElements(array($do));
    }



    $submit = new Zend_Form_Element_Submit('updateart');
    $this->addElement($submit);


    //and here are decorators for array, and i would like to have in this table also data from array containing data from database
    $this->addDecorators(array(

                        'FormElements',
                        array('HtmlTag', array('tag' => 'table', 'id' => 'aaaa', 'style' => 'width:500px;')), 'Form', 

                        ));                 

    $this->setElementDecorators(array(

                        'ViewHelper',
                        array(  array('data' => 'HtmlTag'), array('tag' => 'td', 'style' => 'width:200px;')), 
                                array('Label', array('tag' => 'td')),

                        array(array('row' => 'HtmlTag'), array('tag' => 'tr'))

                        ), 
                        //wykluczenie submita z overrida stulu
                        array('submit'), false);


    return  parent::render();

}


//setting user id for get content from db
public function setUid($uid) {
    $this->uid = $uid;
    return $this;
}

public function getUid() {
    return $this->uid;
}

}
?>

上面的代码输出是这样的:(红色标记,我希望从表单中选择。在此图像中,带有数据的表是另一个用phtml生成的表,但我想生成该表通过form od只将表单元素插入到phtml视图中生成的那个表中。

http://img14.imageshack.us/img14/9973/clipboard01pw.png

这里找到的东西: Zend_Form: Database records in HTML table with checkboxes

但我不知道如何开始...

1 个答案:

答案 0 :(得分:2)

几条评论:

  1. 通常,在表单中添加元素是在init()中完成的,而不是render()

  2. 如果消费者对象(在这种情况下,表单)需要依赖(在这种情况下,文章模型)来完成其工作,那么明确地向消费者提供依赖性通常是有帮助的,或者在消费者的构造函数中或通过setter方法(例如:$form->setArticleModel($model))。这使得在测试表单时更容易模拟模型,并清楚地说明了表单对模型的依赖。

  3. Re:通过装饰器渲染表单中的其他内容:也许,看一下AnyMarkup decorator。它看起来像(对不起,不能完全理解波兰语)你希望在你输出的每一行上都有一个选择框。因此,您使用模型获取行,循环遍历行,在每行上创建选择框。将装饰器分配给选择元素 - ViewHelperErrors,可能是HtmlTag装饰器将其包装在<td>中时 - 您还要添加AnyMarkup装饰器预先添加包含行数据的一堆<td>,最后将整行包裹在<tr>中。

  4. 也许这样的事情(没有经过充分测试,只是为了提出这个想法):

    class EditArticles_Form_EditArticles extends Zend_Form
    {
        protected $model;
    
        public function __construct($model)
        {
            $this->model = $model;
            parent::__construct();
        }
    
        public function init()
        {
            $rows = $this->model->GetArticlesToEdit($this->getUid());
            $numRows = count($rows);
            for ($i = 0; $i < $numRows; $i++) {
                $do = new Zend_Form_Element_Select('myselect' . $i);
                $do->addMultiOption('0', 'Aktywny');
                $do->addMultiOption('1', 'Nieaktywny');
                $do->setDecorators(array(
                    'ViewHelper',
                    array(array('cell' => 'HtmlTag'), array(
                            'tag' => 'td'
                    )),
                    array('AnyMarkup', array(
                            'markup' => $this->_getMarkupForRow($i, $row),
                            'placement' => 'PREPEND',
                    )),
                    array(array('row' => 'HtmlTag'), array(
                            'tag' => 'tr'
                    )),
                ));
                $this->addElement($do);
            }
        }
    
        protected function _getMarkupForRow($i, $row)
        {
            return '<td>' . $i . '</td>' .
                '<td>' . $row['nazwa'] . '</td>' .
                '<td>' . $row['typ'] . '</td>' .
                '<td>' . $row['rozmiar'] . '</td>';
        }
    }
    

    最后一点:请记住注册元素装饰器前缀路径如下(在表单中,可能在init()中):

    $this->addElementPrefixPath('My_Decorator', 'My/Decorator', self::DECORATOR);

    这允许元素将短名称AnyMarkup解析为完整的类名My_Decorator_AnyMarkup