我是初学者,谈到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应该已经被选中了......那么如果你想要你可以改变并保存它......但我只是想让它已经被选中了。
我为长篇大论道歉。
答案 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
。