Symfony2下没有数据库更新


No database updating under Symfony2

我正在Symfony2下进行一个项目,遇到了一个小但令人不安的问题。

我有一个实体,代表由该网站专门负责的协会领导的项目。在这个实体中,我有一个名为"$inscriptionsOvertes"的字段,用于注册学生是否可以为每个项目注册自己。

我想创建一个页面,在那里我可以为每个项目轻松地修改这个变量的状态,但我所做的表单对我的数据库没有影响。

无论我做什么,$inscriptionsOvertes变量总是设置为false。此外,如果我在phpmyadmin下的任何项目中手动将其更改为true,那么在我提交表单的那一刻,它就会返回false。

以下是实体的相关代码:

<?php
namespace CEC'SecteurProjetsBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
/**
 * Projet
 *
 * @ORM'Table()
 * @ORM'Entity(repositoryClass="CEC'SecteurProjetsBundle'Entity'ProjetRepository")
 */
class Projet
{
/**
 * @var integer
 *
 * @ORM'Column(name="id", type="integer")
 * @ORM'Id
 * @ORM'GeneratedValue(strategy="AUTO")
 */
private $id;
/**
 * @var string
 *
 * @ORM'Column(name="nom", type="string", length=255)
 */
private $nom;
/**
* @var string
*
* @ORM'Column(name="slug", type="string", length=100)
*/
private $slug; <br>//Autres propriétés de la classe
/**
* @var boolean
*
* @ORM'Column(name="inscriptions_ouvertes", type="boolean")
*/
private $inscriptionsOuvertes = false;

//Other properties, getters et setters...
/**
 * Set inscriptionsOuvertes
 *
 * @param boolean $etat
 * @return Projet
 */
public function setInscriptionsOuvertes($etat)
{
    $this->inscriptionsOuvertes = $etat;
    return $this;
}
/**
 * Set inscriptionsOuvertes
 *
 * @return Projet
 */
public function switchInscriptionsOuvertes()
{
    $this->inscriptionsOuvertes = !$this->inscriptionsOuvertes;
    return $this;
}
/**
 * Get inscriptionsOuvertes
 *
 * @return boolean
 */
public function getInscriptionsOuvertes()
{
    return $this->inscriptionsOuvertes;
}

}

这是我创建的表单的代码:

{% extends 'CECSecteurProjetsBundle:Projets:base.html.twig' %}

{% block right %}
{{parent()}}
<div class="well" style = "padding-left:20px;padding-right:15px;">
<h1>Ouverture des inscriptions aux projets </h1>
<form class="form form-horizontal" method="post" action="{{ path('ouverture_inscription') }}"><br/>
Voulez-vous ouvrir les inscriptions aux projets ?<br/>
{% for projet in projets%}
<label for="{{projet.slug}}">{{projet.nom}}</label>
<div class="btn-group" data-toggle="buttons" id="{{projet.slug}}">
    <label class="btn btn-success" >
    <input type="radio" name="{{projet.slug}}" id="option1" value="true" autocomplete="off" {% if projet.inscriptionsOuvertes %}checked {% endif %}> Oui
    </label>
    <label class="btn btn-danger">
    <input type="radio"  name="{{projet.slug}}" id="option2" value="false" autocomplete="off" {% if not projet.inscriptionsOuvertes %}checked {% endif %}> Non
    </label>
</div><br/>
{% endfor %}
<div class="footer-controls">
<br/>
    <input type="submit" value="Mettre à jour les inscriptions aux projets" class="btn btn-primary" />
    <a href="{{ path('description_projets') }}" class="btn pull-right">Annuler</a>
</div>
</form>
</div>
{% endblock %}

最后是负责验证表单和更新数据库的方法。

<?php
namespace CEC'SecteurProjetsBundle'Controller;
use Symfony'Bundle'FrameworkBundle'Controller'Controller;
use Sensio'Bundle'FrameworkExtraBundle'Configuration'Template;
use CEC'SecteurProjetsBundle'Form'ProjetType;
use CEC'SecteurProjetsBundle'Form'ReunionType;
use CEC'SecteurProjetsBundle'Form'DossierType;
use CEC'SecteurProjetsBundle'Entity'Reunion;
use CEC'SecteurProjetsBundle'Entity'Dossier;
class ProjetsController extends Controller
{
//Other methods of the controller
/**
* Mise à jour de l'état d'ouverture des inscriptions des projets
*
* @Template();
*/
public function inscriptionsAction()
{
    $em = $this->getDoctrine()->getEntityManager();
    $projets = $this->getDoctrine()->getRepository('CECSecteurProjetsBundle:Projet')->findAll();
    $request = $this->getRequest();
    $data = $request->request->all();
    $message ='';
    if($request->isMethod('POST'))
    {
        foreach($projets as $projet)
        {
            $slug = $projet->getSlug();
            $projet->setInscriptionsOuvertes($data[$slug]);
            $em->flush();
        }
        $this->get('session')->setFlash('success', 'L''ouverture des inscriptions a bien été mise à jour. ');
        return $this->redirect($this->generateUrl('description_projets'));
    }
    return array('projets'=>$projets);
}

}

我浏览了这个网站,发现这个主题与我的主题非常相似,但不同,(在我看来)没有回答我的问题。

你们中有人知道这个表格里发生了什么吗?我必须承认,我暂时看不出这一切背后的逻辑模式。

关于我所做测试的详细信息:

  • 数组$data定义正确(对于每个段塞,每个状态都正确链接)。

  • $inscriptionsOuverts->getInscriptionsOvertes()在将其设置为所需值之前调用它时会返回null。

  • 一旦我通过->setInscriptionsOvertes($data[$slug])更新了它,$inscriptionsOuvertes->getInscripttionsOuvertes()就会返回正确的状态。

  • 手动将数据库中的每个变量更改为true。在下一次提交表单时,所有内容都会返回到错误的

提前感谢您的回答!


多亏了gp_sflover,我找到了解决方案。我的表单给出的值是字符串,而不是布尔值。

将填充数组$data的行替换为:$data[$slug]=($request->request->get($slug)=="true")?真:假;

您有一个接受booleansetInscriptionsOuvertes($etat)方法,而在$projet->setInscriptionsOuvertes($data[$slug]);中,它似乎用$slug设置了string