【问题标题】:ZEND form elements in a table containing also data from the database表中的 ZEND 表单元素还包含来自数据库的数据
【发布时间】:2011-11-21 23:24:20
【问题描述】:

您好 :) 我遇到了装饰器和表格的问题,这些表格将在表格中,并且在此表格中还希望有来自数据库的数据...我不知道如何做到这一点以获得类似的结构下面的东西,让我们说

<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>

当然 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 中生成的另一个表,但我想生成那个表通过表单 od 只需将表单元素插入到在 phtml 视图中生成的表中)。

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

在这里找到了一些东西: Zend_Form: Database records in HTML table with checkboxes

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

【问题讨论】:

    标签: forms zend-framework zend-decorators


    【解决方案1】:

    几个cmets:

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

    2. 1234563在消费者的构造函数中或通过 setter 方法(例如:$form-&gt;setArticleModel($model))。这使得在测试表单时更容易模拟模型,并清楚地说明表单对模型的依赖。
    3. Re:通过装饰器渲染表单中的其他内容:也许,看看AnyMarkup decorator。看起来(抱歉,不能完全理解波兰语)您希望在输出的每一行上都有一个选择框。因此,您可以使用模型获取行,遍历行,在每一行上创建选择框。当您将装饰器分配给选择元素时 - ViewHelperErrors,可能是 HtmlTag 装饰器以将其包装在 &lt;td&gt; 中 - 您还添加 AnyMarkup 装饰器以添加一堆 &lt;td&gt;' s 包含您的行数据,最后将整行包装在 &lt;tr&gt; 中。

    可能是这样的(未完全测试,只是为了给出想法):

    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-&gt;addElementPrefixPath('My_Decorator', 'My/Decorator', self::DECORATOR);

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

    【讨论】:

    • render() 被使用是因为 init() $this->uid 没有正确传递,在stackoverflow上我读到我可以使用render :) 今天试试你的答案:)
    • 如果$uid 需要从外部传入,那么我猜它也可能是构造函数的一部分(public function __construct($uid, $model){})或使用您的setUid($uid) 方法设置。如果有必要,那么构造函数注入可能是最好的。
    • 我不明白如何处理 AnyMarkup... :( 我仍然收到:警告:表单捕获异常:在注册表中找不到名为“AnyMarkup”的插件
    • 实际上,如果我在 phtml 文件中手动从 db 中执行表单和数据,这很糟糕吗?因为我试图从 3 天开始这样做,我已经非常沮丧:(
    • 嘿,我们有时都会屈服于尝试破解某些东西的诱惑。但在你放弃之前有两个想法。 (1) 注册一个元素装饰器前缀,以便能够使用 AnyMarkup 装饰器。我将添加详细信息作为答案的更新。如果做不到这一点,您可以尝试 (2) 为表单使用 [ViewScript 装饰器](bit.ly/tdy2vV)。
    猜你喜欢
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多