【问题标题】:Symfony - how to get data from select html tag in viewSymfony - 如何从视图中的选择 html 标记中获取数据
【发布时间】:2017-11-10 21:27:55
【问题描述】:

我正在学习 Symfony,所以我正在测试使用数据库的各种方法。这个想法是制作包含数据库表中数据的选择下拉列表。 select 中的每个选项都返回表中列的 id 值。下拉列表以这种方式在 View 中定义('find_res' in action 是路由到控制器):

<form action="{{ path('find_res') }}" method="POST" name="formpt">
       <select name="patientId">
        {% for patient in patients %}       
           {{dump(patient)}}
           <option value="{{patient.id}}">{{patient.lastname}}{{patient.firstname}}</option><br />
        {% endfor %}
      </select>   
  <button type="submit" name="submit">Find results</button>
  </form>

因此,对于所选的 patient.id,它应该在表中显示结果,该表在下面的代码中定义为标准 html 表。

在控制器方法中,我从数据库中的表中创建了所有患者的列表,并将其作为参数发送到此视图。这很好用。另外,我不会详细说明如何构建查询,因为问题是我尝试的任何 $request 都不会返回任何内容,只是返回 null。我试过了:

$request->request->get('patientId'); //returns null always
$request->get('patientId'); //also null

我什至尝试在视图中为表单命名,例如“formpt”,然后尝试使用:

$request->request->get('formpt')['patientId'];

还是什么都没有。本次测试代码:

if($request->getMethod() == 'POST'  ) {
        \Doctrine\Common\Util\Debug::dump($request->request->get('patientId'));
        exit;
  }

对于我放入“dump”的任何内容,总是返回 NULL 或 string(0) ""。

我做错了什么? 谢谢!

【问题讨论】:

  • 您的 HTML 无效。您不能在 select 元素中使用 &lt;br&gt;,而且您正在其中转储一些数据 ({{dump(patient)}})。修复 HTML 后重试。
  • 你是不是故意不使用form component
  • @prehfeldt 清理了
  • @Yoshi 是的,我尝试将表单放在视图中,似乎更容易定义您想要的外观。我只需要一个下拉菜单,其中包含一张表中的数据。
  • 也许试试这个 {{ form_start(form) }} {{ form_end() }} 所以你也可以使用 csrf 令牌来保护你的表单。

标签: php mysql symfony drop-down-menu request


【解决方案1】:

以下是使用标准form component 实现您尝试执行的操作的简单方法(请注意,我明确没有创建专用表单类型!)。

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Validator\Constraints\NotBlank;
use AppBundle\Entity\Patient;

class DefaultController extends Controller
{
    /**
     * @Route("/", name="index")
     *
     * @param Request $request
     *
     * @return Response
     */
    public function indexAction(Request $request)
    {
        $form = $this->createFormBuilder()
            ->add('patient', EntityType::class, [
                'required' => false,
                'placeholder' => '--- Select ---',
                'class' => Patient::class,
                'choice_label' => function (Patient $patient) {
                    return sprintf(
                        '%s, %s',
                        $patient->getLastname(),
                        $patient->getFirstname()
                    );
                },
                'constraints' => [
                    new NotBlank()
                ],
            ])
            ->getForm()
            ->handleRequest($request)
        ;

        if ($form->isSubmitted() && $form->isValid()) {
            /** @var $selected Patient */
            $selected = $form->get('patient')->getData();
            dump($selected);
        }

        return $this->render('default/index.html.twig', [
            'form' => $form->createView()
        ]);
    }
}

目前的观点:

{% extends 'base.html.twig' %}

{% block body %}
    {{ form_start(form) }}
        {{ form_widget(form) }}
        <button>Find results</button>
    {{ form_end(form) }}
{% endblock %}

我知道表单组件(尤其是form customization)有它的学习曲线,但最终,如果你想完全使用 symfony,你最终还是会使用它(为什么要重新发明轮子)。所以越早开始越好。

【讨论】:

  • 谢谢,这很有帮助!我想我以后会用这种方式来解决这类问题。
【解决方案2】:

不妨试试这个

对于映射字段

public function yourAction(Request $request){
        $patient = new Patient();
        $form = $this->createForm('AppBundle\Form\PatientType', $patient);
        $form->handleRequest($request);

        if ($form->isSubmitted())
        {
         $patientId = $patient->getId();
        }
}

如果您需要获取非映射字段(不是 Patient 属性的字段)

public function yourAction(Request $request){
            $patient = new Patient();
            $form = $this->createForm('AppBundle\Form\PatientType', $patient);
            $form->handleRequest($request);

            if ($form->isSubmitted())
            {
             $patientCustomField = $form['customField']->getData();
            }
    }

【讨论】:

  • patientId 不能使用表单调用 $patient-&gt;getPatientId()
  • 谢谢,但这是否意味着如果在视图内部定义了表单,它就不能工作?我打算选择那个。
  • @BiljanaM。尝试在树枝中添加动作
  • 在你的 twig 模板中,如果你尝试使用 form_start() twig 函数,你的表单的 name 属性是什么?
猜你喜欢
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2019-05-03
  • 1970-01-01
  • 2019-09-26
  • 2021-01-17
相关资源
最近更新 更多