2014-12-24 3 views
1

관리자가 새로운 기간을 만들 수있는 페이지가 있습니다. 이제 관리자가 새로운 기간을 추가하려고 할 때 이미 다른 기간이 없는지 확인하고 싶습니다.다른 기간에 날짜가 이미 있는지 확인하십시오.

이것은 현재 코드이지만, doctrine에서와 같이 <=>=이 작동하지 않습니다. 내 데이터베이스에서

$formMapper->getFormBuilder()->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) { 
    try { 
    $from = str_replace('/', '-', $event->getData()['from']); 
    $to = str_replace('/', '-', $event->getData()['to']); 

    $dateFrom = new \DateTime($from, new \DateTimeZone('Europe/Amsterdam')); 
    $dateFrom = $dateFrom->format('Y-d-m'); 

    $dateTo = new \DateTime($to, new \DateTimeZone('Europe/Amsterdam')); 
    $dateTo = $dateTo->format('Y-d-m'); 

    $query = $this->getModelManager()->createQuery('PeriodeBundle:Periode', 'p'); 

    $query->select() 
     ->where(':from = p.from') 
     ->andWhere(':to = p.to') 
     ->setParameter('from', $dateFrom) 
     ->setParameter('to', $dateTo); 

    $data = $query->execute(); 

    if (count($data) > 0) { 
     $event->getForm()->addError(new FormError('This period overwrites another existing period (' 
     . $data[0]->getFrom()->format('d/m/Y') . ' to ' 
     . $data[0]->getTo()->format('d/m/Y') . ')')); 
    } 
    } catch (\Exception $e) { 
     $event->getForm()->addError(new FormError('Date not valid')); 
    } 


}); 

내가 여러 기간은 다음과 같이 단순화 : period_id, from, to

누군가가 올바른 방향으로 날 포인트? 이미 존재하는 마침표를 만들 때 내 데이터가 NULL이고 먼 미래에 마침표를 추가하면 모든 행의 결과가 표시됩니다. ltegte에 대해 읽었지 만이 코드에서이를 통합하는 방법을 잘 모릅니다.

이 코드는 내 PeriodBundle의 내 관리자에게 있습니다. 다음은 일반적인 형태의 예입니다 .. 내가 소나타 양식 작동 방법을 모르는

$formMapper->getFormBuilder()->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event) { 
try { 
    $from = str_replace('/', '-', $event->getData()['from']); 
    $to = str_replace('/', '-', $event->getData()['to']); 

    $dateFrom = new \DateTime($from, new \DateTimeZone('Europe/Amsterdam')); 
    $dateFrom = $dateFrom->format('Y-d-m'); 

    $dateTo = new \DateTime($to, new \DateTimeZone('Europe/Amsterdam')); 
    $dateTo = $dateTo->format('Y-d-m'); 
    $periods_list=$this->getModelManager()->getRepository(YourClassPath)->findBy(array('from'=>$dateFrom,'to' =>$dateTo)); 
if (sizeof($periods_list) > 0) { 
    $event->getForm()->addError(new FormError('This period overwrites another existing period (' 
    . $data[0]->getFrom()->format('d/m/Y') . ' to ' 
    . $data[0]->getTo()->format('d/m/Y') . ')')); 
} 
} catch (\Exception $e) { 
    $event->getForm()->addError(new FormError('Date not valid')); 
} 


}); 

답변

2

,하지만 난 당신이 대신 청취자의 검증 제약 조건을 사용한다고 생각 :

+0

위대한 답변, 감사합니다! – Matheno

0

는 findBy 메도를 사용하려고

private $em; 

public function __construct(EntityManagerInterface $em) 
{ 
    $this->em = $em; 
} 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver 
     ->setDefaults(array(

      ... 

      'constraints' => array(
       new Callback(
        array('callback' => array($this, 'validateForm')) 
       ) 
      ) 
     )); 
} 

public function validateForm(MyEntity $myEntity, ExecutionContextInterface $context) 
{ 
    $valid = true; 

    $from = str_replace('/', '-', $myEntity->etFrom()); 
    $to = str_replace('/', '-', $myEntity->getTo()); 

    $dateFrom = new \DateTime($from, new \DateTimeZone('Europe/Amsterdam')); 
    $dateFrom = $dateFrom->format('Y-d-m'); 

    $dateTo = new \DateTime($to, new \DateTimeZone('Europe/Amsterdam')); 
    $dateTo = $dateTo->format('Y-d-m'); 

    $queryBuilder = $em->createQueryBuilder(); 

    $query = $queryBuilder 
     ->select(array('p')) 
     ->from('PeriodeBundle:Periode', 'p') 
     ->where($queryBuilder->expr()->gte('p.from', ':from')) 
     ->andWhere($queryBuilder->expr()->lte('p.to', ':to')) 
     ->setParameters(array(
      'from' => $dateFrom, 
      'to' => $dateTo 
     )) 
     ->getQuery(); 

    $data = $query->getArrayResult(); 

    if (count($data) > 0) { 
     $valid = false; 
    } 

    // .... 

    if (!$valid) { 
     $context 
      ->buildViolation('Invalid....') 
      ->atPath('MYFIELD') 
      ->addViolation() 
     ; 
    } 

}