Нет обновления базы данных под Symfony2

Я работаю над проектом под Symfony2 и столкнулся с небольшой, но тревожной проблемой.

У меня есть организация, которая представляет проекты, возглавляемые ассоциацией, которой посвящен веб-сайт. В этой сущности у меня есть поле с именем «$ inscriptionOuvertes», которое регистрирует, могут ли студенты регистрироваться для каждого проекта или нет.

Я хочу создать страницу, на которой я могу легко изменять состояние этой переменной для каждого проекта, но созданная мной форма не влияет на мою базу данных.

Переменная $ inscriptionOuvertes всегда имеет значение false независимо от того, что я делаю. Более того, если я вручную изменю его на true для любого проекта в phpmyadmin, в момент отправки моей формы он вернется к 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 определен правильно (для каждого слага каждое состояние корректно связано).

  • $ inscriptionOuvertes-> getInscriptionOuvertes () возвращает мне значение NULL, когда я вызываю его до того, как я установил его на желаемое значение.

  • $ inscriptionOuvertes-> getInscriptionOuvertes () возвращает мне правильное состояние, как только я обновил его через -> setInscriptionOuvertes ($ data [$ slug]).

  • Изменена вручную каждая переменная на true в базе данных. При следующей отправке формы все возвращается к ложному

Большое спасибо заранее за ваши ответы!


Благодаря gp_sflover я нашел решение. Значения, указанные в моей форме, были строками, а не логическими значениями.

Заменил строку, где я заполняю массив $ data на:
$ data [$ slug] = ($ request-> request-> get ($ slug) == «true»)? правда: ложь;

1

Решение

Вы есть setInscriptionsOuvertes($etat) метод, который принимает boolean пока в $projet->setInscriptionsOuvertes($data[$slug]); кажется, установить string с $slug,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]