2013-03-16 5 views
4

В моем приложении Symfony у меня есть объект события с адресом. Этот адрес должен быть доступен для многих событий, поэтому я добавил ссылку ManyToOne.Подтвердить поле перед применением DataTransformer

address объекта содержит 3 поля (street, zipcode и city), но я хотел бы иметь только один ввод текст с машинописным для address в моей форме EventType. Поэтому я создал DataTransformer для этого.

По запросу AJAX я получаю адреса и вставляю их. Если введен новый адрес, я хотел бы создать новую запись базы данных. Моя проблема теперь будет подтверждением для нового введенного адреса.

Мой DataTransformer выглядит следующим образом:

class StringToAddressTransformer implements DataTransformerInterface { 

    /** 
    * @var ObjectManager 
    */ 
    private $om; 

    /** 
    * @param ObjectManager $om 
    */ 
    public function __construct(ObjectManager $om){ 
     $this->om = $om; 
    } 

    public function transform($addrobj){ 
     if (!$addrobj) { 
      return null; 
     } 

    return (string)$addrobj; 
    } 

    public function reverseTransform($address){ 

     if (null === $address) { 
      return ""; 
     } 

     preg_match('/^([A-Z][-A-Z ]+)\s+(\d+), (\d{5}) ([A-Z]+)$/i', $address, $res); 

     $street = $res[1] . ' '. $res[2]; 
     $zipcode = $res[3]; 
     $city = $res[4];  

     $addrobj = $this->om->getRepository('FSchubert\SiyabongaBundle\Entity\Address')->findOneBy(array(
      'street' => $street, 'zipcode' => $zipcode, 'city' => $city 
     )); 

     if(is_null($addrobj)){ 
      $addrobj = new Address(); 
      $addrobj->setStreet($street); 
      $addrobj->setZipcode($zipcode); 
      $addrobj->setCity($city); 
     } 

    return $addrobj; 
    } 
} 

Это все работает нормально, но у меня нет абсолютно никакой проверки для введенного адреса.

Я попытался добавить ограничение в класс формы, но так как DataTransformer вызывается на bindRequest(), мне кажется, что ограничение проверки игнорируется.

В принципе, я хочу, чтобы проверка формы была в моем DataTransformer или каким-либо способом для проверки не существующего поля. Если я вручную вызову RegEx-Validator, как бы выглядел мой код? Или есть другой (лучший) способ добиться того, что я ищу?

ответ

0

Хорошо, я нашел ответ. Это далеко не лучший способ. Я просто удалил все поля из Address-Entity, за исключением одной строки addressstring. Теперь я могу сопоставить несколько событий в одном месте и сделать ajax-вызовы propper. Но, к сожалению, я не могу определить город, улицу или почтовый индекс каждого адреса. Это прекрасно работает, но, как я сказал, не решение. Я избежал реальной проблемы ... но это работает.

Смежные вопросы