从表单中获取 select 个元素

Get select element from a form

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

他们有一个产品数据库,这些产品有一个类型(5 种蔬菜,6 种水果)。因此,当我列出所有产品时,它会显示有关该产品的所有数据,并为您提供该特定产品的 link 到 "edit" 数据。因此,当我单击 "edit" 时,我想像 html 表单一样打开,其中将包含已填写的字段以及来自该特定产品的数据。

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

<?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 标签之外的所有内容都已填充并且工作正常...只有那个 select 没有得到 select编辑。 :( 我的意思是我可以单击下拉菜单,它会向我显示数据...但我希望它已经 select 像其他所有内容一样被编辑了。

所以我的问题是,我可以在我的 edit.volt 中添加(如果可能的话如何做)像一个 if 语句,它会像 "if the next element is a select element, just select the value that is already in the database" 一样,就像在那个屏幕中一样,如果它的灯笼椒然后 5-Vegetables 应该已经 selected...然后如果你想要你可以改变它并保存它...但我只是希望它已经 selected.

很抱歉post。

如果您希望 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