完全重新加载页面,但在选择

时间:2016-02-04 11:57:28

标签: javascript php jquery symfony post

在我的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,
               ))

}

1 个答案:

答案 0 :(得分:2)

重新加载后没有直接的方法可以恢复以前的帖子数据,但是有很多方法可以解决这个问题。

  • 您可以使用会话处理程序来存储您需要挂起的数据,如果帖子数据不符合预期,则只检查您的会话变量。 (这并不适用于您的任务,但如果您想在多个页面浏览量中保留帖子数据,则值得一提)
  • 您可以将重新加载的javascript更改为自己的帖子(提交)并预先选择传递的选项,同时根据需要呈现任何其他选择或选项。
  • 或者您可以使用ajax请求从服务器提取数据,只需更改表单而无需提交或重新加载页面。

对于您的应用程序,我认为ajax方法将是最友好的用户,因为它不涉及整个页面重新加载。快速谷歌搜索出现了这个例子http://tutorialzine.com/2011/11/chained-ajax-selects-jquery/

如果您不想沿着那条路走,那么我建议您更改您的javascript以提交表单,然后在您的php代码中检查表单的完整性。如果表单仍然不完整,则重绘表单并确保呈现其他选择框(或其他任何需要的内容)。