从表单中获取 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
。
我是 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
。