2013-09-09 3 views
0

У меня есть пользовательская модель + пользовательский тип, зарегистрируйте модель + тип регистра ... Когда я выполняю его, идентификатор не проверяет модель пользователя (внутренние данные). Код ниже ...Symfony 2.3.4 Реализованная форма не подтверждена

модель

Пользователь:

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Component\Security\Core\User\UserInterface; 
use Serializable; 

/** 
* User 
* 
* @ORM\Table(name="user") 
* @ORM\Entity(repositoryClass="Site\MainBundle\Entity\Repository\UserRepository") 
*/ 
class User implements UserInterface, Serializable 
{ 
    /** 
    * @return array|\Symfony\Component\Security\Core\User\Role[] 
    */ 
    public function getRoles() 
    { 
     return array('ROLE_USER'); 
    } 

    /** 
    * 
    */ 
    public function eraseCredentials() 
    { 

    } 

    /** 
    * @return string 
    */ 
    public function serialize() 
    { 
     return serialize(array($this->id)); 
    } 

    /** 
    * @param string $serialized 
    */ 
    public function unserialize($serialized) 
    { 
     list ($this->id,) = unserialize($serialized); 
    } 

    /** 
    * 
    */ 
    public function __construct() 
    { 
     $this->isActive = false; 
     $this->salt = md5(uniqid(null, true)); 
    } 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    public function getID() 
    { 
     return $this->id; 
    } 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="username", type="string", length=255, nullable=false) 
    * @Assert\NotBlank(message="User name cannot be blank.") 
    */ 
    private $username; 

    public function setUserName($userName) 
    { 
     $this->username = $userName; 

     return $this; 
    } 

    public function getUserName() 
    { 
     return $this->username; 
    } 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="password", type="string", length=255, nullable=false) 
    * @Assert\NotBlank(message="Password cannot be blank.") 
    */ 
    private $password; 

    public function setPassword($password) 
    { 
     $this->password = $password; 

     return $this; 
    } 

    public function getPassword() 
    { 
     return $this->password; 
    } 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="salt", type="string", length=255, nullable=false) 
    */ 
    private $salt; 

    public function setSalt($salt) 
    { 
     $this->salt = $salt; 

     return $this; 
    } 

    public function getSalt() 
    { 
     return $this->salt; 
    } 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="email", type="string", length=255, nullable=false) 
    * @Assert\NotBlank(message="E-Mail cannot be blank.") 
    * @Assert\Email(message="Invalid email address.") 
    */ 
    private $email; 

    public function setEmail($email) 
    { 
     $this->email = $email; 

     return $this; 
    } 

    public function getEmail() 
    { 
     return $this->email; 
    } 

    /** 
    * @var bool 
    * 
    * @ORM\Column(name="isActive", type="boolean", nullable=false) 
    */ 
    private $isActive; 

    public function setIsActive($isActive) 
    { 
     $this->isActive = $isActive; 

     return $this; 
    } 

    public function getIsActive() 
    { 
     return $this->isActive; 
    } 

} 

Тип пользователя:

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class UserType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array    $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('username', 'text', array('label' => 'User name')) 
      ->add(
       'password', 
       'repeated', 
       array(
        'label' => 'Password', 
        'first_name' => 'password', 
        'second_name' => 'confirm', 
        'type' => 'password' 
       ) 
      ) 
      ->add('email', 'text', array('label' => 'E-Mail')); 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(
      array(
       'data_class' => 'Site\MainBundle\Entity\User', 
       'required' => false 
      ) 
     ); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'main_user'; 
    } 
} 

Регистрация модели:

use Symfony\Component\Validator\Constraints as Assert; 
use Site\MainBundle\Entity\User; 

/** 
* Register 
*/ 
class Register 
{ 
    /** 
    * @var Site\MainBundle\Entity\User 
    * 
    * @Assert\Type(type="Site\MainBundle\Entity\User") 
    * @Assert\Valid() 
    */ 
    protected $user; 

    public function setUser(User $user) 
    { 
     $this->user = $user; 

     return $this; 
    } 

    public function getUser() 
    { 
     return $this->user; 
    } 

    /** 
    * @var boolean 
    * 
    * @Assert\NotBlank(message="No terms accepted.") 
    * @Assert\True(message="You have to accept terms to be registered.") 
    */ 
    protected $terms; 

    public function setTerms($terms) 
    { 
     $this->terms = (Boolean)$terms; 

     return $this; 

    } 

    public function getTerms() 
    { 
     return $this->terms; 
    } 
} 

Регистрация Тип:

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 
use Site\MainBundle\Form\UserType; 

class RegisterType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array    $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('user', new UserType()) 
      ->add('terms', 'checkbox'); 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(
      array(
       'data_class' => 'Site\MainBundle\Entity\Register', 
       'required' => false 
      ) 
     ); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'main_register'; 
    } 
} 

И контроллер с веточкой. Часть прутик:

{% block page_content %} 

    <form method="post" action="{{ path('main_register') }}"> 
     {{ form_errors(formRegister.user.username) }} 
     {{ form_row(formRegister.user.username) }} 

     {{ form_errors(formRegister.user.password.password) }} 
     {{ form_row(formRegister.user.password.password) }} 

     {{ form_errors(formRegister.user.password.confirm) }} 
     {{ form_row(formRegister.user.password.confirm) }} 

     {{ form_errors(formRegister.user.email) }} 
     {{ form_row(formRegister.user.email) }} 

     {{ form_errors(formRegister.terms) }} 
     {{ form_row(formRegister.terms) }} 

     <button type="submit">Register</button> 
    </form> 

{% endblock %} 

Регистрация Контроллер:

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Site\MainBundle\Form\RegisterType; 
use Site\MainBundle\Entity\Register; 

/** 
* RegisterController 
*/ 
class RegisterController extends Controller 
{ 
    public function defaultAction() 
    { 
     $formRegister = $this->createForm(new RegisterType(), new Register()); 

     if ($this->getRequest()->isMethod('post')) { 
      $formRegister->handleRequest($this->getRequest()); 

      if ($formRegister->isValid()) { 
       echo 'form is valid'; 
      } 
     } 


     $twig = 'SiteMainBundle:register:default.html.twig'; 
     $data = array(
      'formRegister' => $formRegister->createView() 
     ); 

     return $this->render($twig, $data); 
    } 
} 

Где может быть проблема? Помогите пожалуйста.

Обновлено

echo "<pre>"; 
echo $formRegister->getErrorsAsString(); 
echo '</pre>'; 

говорит:

user: 
    username: 
     No errors 
    password: 
     password: 
      No errors 
     confirm: 
      No errors 
    email: 
     No errors 
terms: 
    ERROR: No terms accepted. 
    ERROR: You have to accept terms to be registered. 

Как вы можете видеть модель пользователя не проверяется ВООБЩЕ ... = \

+0

КСТАТИ я сделал все, что было сказано в руководстве по Symfony2 точке ком = \ – user1954544

+0

Кроме того, проект был создан композитором как «типовой проект». – user1954544

+0

'Когда я выполняю его, идентификатор не проверяет модель пользователя (внутренние данные).« Что ты имеешь в виду? – cheesemacfly

ответ

0

Найдено, наконец. Ошибка в этой части. Я хотел отключить этот способ проверки браузера ...

'required' => false 

НО. Эти «ребята» (я имею в виду разработчиков), сравнивают две вещи в одной настройке. Поэтому, если мы установим «required» в false, наши поля не будут проверены. И если это правда, это будет подтверждено, НО ТАКЖЕ С браузером валидатора .. = \ Возможно, кто-то знает, как его избежать (проверка браузера) НЕ путем редактирования файла twig (некоторые параметры или другие настройки)?

PS: Чтобы избежать использования браузера, я изменил ветку.

<form method="post" action="{{ path('main_register') }}" novalidate> 
+2

Вы также можете использовать: '{{form_start (form, {'attr': {'novalidate': 'novalidate'}})}}' – keepkimi

0

Если вы хотите сделать это с помощью кода, в вашем контроллере, ваш код должен быть как:

class RegisterController extends Controller 
{ 
    public function defaultAction() 
    { 
     $formRegister = $this->createForm(new RegisterType(), new Register(), array(
      'attr'=> array('novalidate'=>'novalidate'), 
     )); 

С therd ПАРАМЕТР «CreateForm», вы можете модифицировать форму (например: acction, class и т. д.).

Я нормально использовать:

$form = $this->createForm(new RegistroType(), $usuario, array(
    'action' => $this->generateUrl('jgo_registro'), 
    'method' => 'POST', 
    'attr'=> array('novalidate'=>'novalidate'), 
)); 
Смежные вопросы