从表单中获取select元素

时间:2016-07-17 15:55:19

标签: php html phalcon volt

我是初学者,谈到Phalcon框架和他的Volt引擎,但我真的很想学习它。我正在关注他们的文档,我目前正在他们的INVO项目。

他们有一个产品数据库,这些产品就像一种类型(5种蔬菜,6种水果)。因此,当我列出所有产品时,它会显示有关该产品的所有数据,并为您提供“编辑”该特定产品的数据的链接。因此,当我点击“编辑”时,我想打开一个html表单,其中包含已填充的字段,其中包含来自该特定产品的数据。

这是他们用来为产品创建表单的表单类:

<?php

use Phalcon\Forms\Form;
use Phalcon\Forms\Element\Text;
use Phalcon\Forms\Element\Hidden;
use Phalcon\Forms\Element\Select;
use Phalcon\Validation\Validator\Email;
use Phalcon\Validation\Validator\PresenceOf;
use Phalcon\Validation\Validator\Numericality;

class ProductsForm extends Form
{
    /**
     * Initialize the products form
     *
     * @param null $entity
     * @param array $options
     */
    public function initialize($entity = null, $options = array())
    {
        if (isset($options['edit'])) {
            $element = new Text("id");
            $this->add($element->setLabel("Id"));
        } else {
            $this->add(new Hidden("id"));
        }

        $name = new Text("name");
        $name->setLabel("Name");
        $name->setFilters(array('striptags', 'string'));
        $name->addValidators(
            array(
                new PresenceOf(
                    array(
                        'message' => 'Name is required'
                    )
                )
            )
        );
        $this->add($name);

        $type = new Select(
            'profilesId',
            ProductTypes::find(),
            array(
                'using' => array('id', 'name'),
                'useEmpty' => true,
                'emptyText' => '...',
                'emptyValue' => ''
            )
        );
        $this->add($type);

        $price = new Text("price");
        $price->setLabel("Price");
        $price->setFilters(array('float'));
        $price->addValidators(
            array(
                new PresenceOf(
                    array(
                        'message' => 'Price is required'
                    )
                ),
                new Numericality(
                    array(
                        'message' => 'Price is required'
                    )
                )
            )
        );
        $this->add($price);
    }
}

这是来自控制器的动作:

/**
 * Shows the view to "edit" an existing product
 */
public function editAction($id)
{
    if (!$this->request->isPost()) {
        $product = Products::findFirstById($id);
        if (!$product) {
            $this->flash->error("Product was not found");
            return $this->forward("products/index");
        }

        $this->view->form = new ProductsForm($product, array('edit' => true));
    }
}

这是我的edit.volt视图文件:

{{ form("products/whatever") }}

<h2>Search products</h2>

<fieldset>

    {% for element in form %}
        <div class="control-group">
            {{ element.label(['class': 'control-label']) }}
            <div class="controls">{{ element }}</div>
        </div>
    {% endfor %}

    <div class="control-group">
        {{ submit_button("Edit", "class": "btn btn-primary") }}
    </div>

</fieldset>

现在,当我点击特定产品时,我得到了这个: Edit screen

正如你所看到的......除了select标签之外的所有东西都已经填满了,并且工作正常...它只是那个没有被选中的选择。 :( 我的意思是我可以点击下拉菜单,它确实向我显示数据......但我希望它已被选中,就像其他一切一样。

所以我的问题是,我可以添加(如果可能的话,如何做),就像我的edit.volt中的if语句一样,如果下一个元素是一个select元素,只需选择值即可已经在数据库中“,就像在那个屏幕上,如果它的甜椒那么5-Vegetables应该已经被选中了......那么如果你想要你可以改变并保存它......但我只是想让它已经被选中了。

我为长篇大论道歉。

1 个答案:

答案 0 :(得分:0)

如果您希望Phalcon自动为表单分配数据库值,则需要确保表单元素与Products列(〜数据库列)具有相同的名称。
否则,Phalcon无法知道如何将Products值映射到正确的表单元素。

控制器:

$product = Products::findFirstById($id);
// ...
$this->view->form = new ProductsForm($product, array('edit' => true));

形式:

$type = new Select(
    'product_type_id', // was previously "profilesId"
    ProductTypes::find(),
    array(
        'using' => array('id', 'name'),
        'useEmpty' => true,
        'emptyText' => '...',
        'emptyValue' => ''
    )
);

正如您在评论中提到的,您的Products模型没有profilesId列,而是product_type_id列。因此,您应该将Select元素从profilesId重命名为product_type_id

相关问题