在我的Symfony项目中,我有一个从表单中恢复帖子数据的视图。
在这个视图中,我有一个像这样的选择标签:
<select id="selectedChoice" name="form[selectedChoice]">
<option value="{{ slug }}" selected>value1</option> <!-- first choice I made before on the first form -->
<option disabled="disabled">-------------------</option>
<option value="{{ slug }}">value2</option>
</select>
实际上,我在当前POST数据之后通过动态查询填充此选择。
但如果我选择其他值,页面必须刷新但必须重新考虑所选择的动态值,也就是说我恢复的初始POST数据必须考虑新的选择。
更好地解释: 初始POST数据来自这样的表单 我有一个选择填充产品类别,日期和位置。我提交表单并将其重定向到我需要恢复这些数据的页面。现在就是这样。
但是另一页的另一个选择与第一个e-g产品类别相同。如果此值发生变化,所有请求也会发生变化,我必须考虑这一点。
示例: 我的拳头形式:
<select name="productCategory">
<option value="" disabled selected>Choose a category</option>
{% for currentCategory in arrayCategory %}
<option value="{{ path('product_by_choice', {'slug': currentCategory.slug}) }}">{{ currentCategory.name }}</option>
{% endfor %}
</select>
<input type="text" id="zipCode" name="location"/>
<input type="text" id="datetimepicker" name="deliveryDate">
<button type="submit"><b>Ask for product</b></button>
所以你可以看到,我发送这个初始POSTdate并将它重定向到另一个我用某个字段打开的地方(例如选择产品与我第一次选择的类别一起映射)
如果我在新页面中更改了我的选择,我该如何恢复相同的数据,但是遵循新的选择。
我的javascript现在看起来像这样:
$('#selectedChoice').change(function() {
window.location.reload(Routing.generate('product_by_choice', {slug: $(this).val()} ));
});
我的控制器看起来像这样:
public function quoteRequestByProductAction(Request $request, $slug, $session = null)
{
// recover the session
$session = $request->getSession();
// recover data from previous form
$location = $request->request->get('location');
$deliveryDate = $request->request->get('deliveryDate');
$productCategory = $em->getRepository('MyBundle:ProductCategory')->findOneBySlug($slug);
$arrayProduct = $em->getRepository('MyBundle:Product')->findByCategory($productCategory);
$newProduct = new Product;
$form = $this->createForm(new ProductType(), $newProduct);
->add('productCategory', 'entity', array(
'required' => true,
'class' => 'MyBundle:ProductCategory',
'property' => 'name',
'choice_value' => 'slug',
'choices_as_values' => true,
'multiple' => false,
'preferred_choices' => array($productCategory),
))
->add('product', 'entity', array(
'required' => true,
'class' => 'MyBundle:Product',
'property' => 'name',
'choice_value' => 'slug',
'choices' => $arrayProduct,
'choices_as_values' => true,
'multiple' => false,
'mapped' => true,
))
}
答案 0 :(得分:2)
重新加载后没有直接的方法可以恢复以前的帖子数据,但是有很多方法可以解决这个问题。
对于您的应用程序,我认为ajax方法将是最友好的用户,因为它不涉及整个页面重新加载。快速谷歌搜索出现了这个例子http://tutorialzine.com/2011/11/chained-ajax-selects-jquery/
如果您不想沿着那条路走,那么我建议您更改您的javascript以提交表单,然后在您的php代码中检查表单的完整性。如果表单仍然不完整,则重绘表单并确保呈现其他选择框(或其他任何需要的内容)。