Symfony2 下没有数据库更新
No database updating under Symfony2
我正在 Symfony2 下做一个项目,我遇到了一个小但令人不安的问题。
我有一个实体,代表由该网站专用的协会领导的项目。在这个实体中,我有一个名为“$inscriptionsOuvertes”的字段,用于记录学生是否可以为每个项目注册。
我想创建一个页面,我可以在其中轻松修改每个项目的此变量的状态,但我制作的表格对我的数据库没有影响。
无论我做什么,$inscriptionsOuvertes 变量始终设置为 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);
}
}
我查看了这个网站,发现 this 主题与我的非常相似,但有所不同并且没有回答我的问题(在我看来)。
你们中的任何人都知道这个表单中发生了什么吗?我必须承认,我暂时看不到这一切背后的逻辑模式。
关于我所做的测试的详细信息:
数组 $data 已正确定义(对于每个 slug,每个状态都已正确链接)。
$inscriptionsOuvertes->getInscriptionsOuvertes() returns 在我将它设置为我想要的值之前调用它时我为 null。
$inscriptionsOuvertes->getInscriptionsOuvertes() returns 我通过 ->setInscriptionsOuvertes($data[$slug]).
更新后的正确状态
手动将数据库中的每个变量更改为 true。在下一次提交表单时,一切都回到 false
非常感谢您的回答!
感谢 gp_sflover,我找到了解决方案。我的表单给出的值是字符串而不是布尔值。
将我填充数组 $data 的行替换为:
$data[$slug] = ($request->request->get($slug)=="true") ?真:假;
你有接受 boolean
的 setInscriptionsOuvertes($etat)
方法,而在 $projet->setInscriptionsOuvertes($data[$slug]);
中它似乎设置了 string
和 $slug
。
我正在 Symfony2 下做一个项目,我遇到了一个小但令人不安的问题。
我有一个实体,代表由该网站专用的协会领导的项目。在这个实体中,我有一个名为“$inscriptionsOuvertes”的字段,用于记录学生是否可以为每个项目注册。
我想创建一个页面,我可以在其中轻松修改每个项目的此变量的状态,但我制作的表格对我的数据库没有影响。
无论我做什么,$inscriptionsOuvertes 变量始终设置为 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);
}
}
我查看了这个网站,发现 this 主题与我的非常相似,但有所不同并且没有回答我的问题(在我看来)。
你们中的任何人都知道这个表单中发生了什么吗?我必须承认,我暂时看不到这一切背后的逻辑模式。
关于我所做的测试的详细信息:
数组 $data 已正确定义(对于每个 slug,每个状态都已正确链接)。
$inscriptionsOuvertes->getInscriptionsOuvertes() returns 在我将它设置为我想要的值之前调用它时我为 null。
$inscriptionsOuvertes->getInscriptionsOuvertes() returns 我通过 ->setInscriptionsOuvertes($data[$slug]).
更新后的正确状态手动将数据库中的每个变量更改为 true。在下一次提交表单时,一切都回到 false
非常感谢您的回答!
感谢 gp_sflover,我找到了解决方案。我的表单给出的值是字符串而不是布尔值。
将我填充数组 $data 的行替换为: $data[$slug] = ($request->request->get($slug)=="true") ?真:假;
你有接受 boolean
的 setInscriptionsOuvertes($etat)
方法,而在 $projet->setInscriptionsOuvertes($data[$slug]);
中它似乎设置了 string
和 $slug
。