2014-06-12 2 views
0

우리는 엔티티를 관리하기 위해 Symfony 2.3과 Doctrine을 사용하고 있습니다.Symfony2 - 엔티티를 설정하여 속성이 "읽기 전용"이되도록

사용자가 Symfony 양식 빌더를 사용하여 평상시처럼 만들 수있는 "작업"이라는 엔티티가 있고 Doctrine을 사용하여 유지할 수 있다고 가정합니다. "작업"은 예를 들어 특정 날짜에 일부 이메일을 보내는 명령 일 수 있습니다. "작업"에 "상태"라는 속성이 있다고 가정합니다. 올바르게 작성된 "타스크"는 "준비 됨"상태 일 수 있습니다.

cron 작업은 정기적으로 symfony Custom 명령을 호출하여 처리가 필요한 "작업"이 있는지 확인합니다 (즉, "준비 됨"상태). 발견되면 작업을 수행 한 다음 엔티티를 업데이트합니다 상태가 "완료 됨"입니다.

작업이 처리되고 상태가 "완료"로 설정되면 엔티티를 효과적으로 "읽기 전용"으로 만들 수있는 방법이 있습니까? 이것으로, 사용자는 여전히 태스크의 세부 사항을 볼 수 있지만 양식을 사용하여 해당 특성을 변경할 수는 없다는 것을 의미합니다. 사용자가 특정 작업에 대한 "편집"양식을 탐색 할 수 있고 세부 사항을 읽는 동안 cron 작업이 작업을 처리하고 작업의 "상태"속성을 업데이트 할 수 있음을 명심하십시오. 그러면 사용자가 제출할 수 있습니다 폼이 이미 처리되었다는 것을 알지 못하고 폼 핸들러가 엔티티를 유지하려고 시도 할 수 있습니다. 아마도 "상태"를 다시 "준비"로 설정합니다. 그러면 다음 번에 cron이 다시 처리 될 것입니다. 직업이 돌아갑니다.

그러나 상태가 "완료"로 설정되면 작업이 읽기 전용으로 설정된 경우 양식 제출이 효과가 없습니다.

+0

이 엔티티의 양식을 직접 제작했거나 sonata-admin과 같은 것을 사용하고 있습니까? – phpisuber01

+0

우리는 심포니 폼 빌더를 사용하여 직접 폼을 구현합니다. –

+0

각 엔티티 세트 메소드에 대해 status = Completed에 대한 체크를 추가하기 만하면됩니다. 간단하고 당신은 그것을 변경할 수있는 다운 스트림에 대해 걱정할 필요가 없습니다. Task 객체에 readonly라는 새로운 속성을 추가하여 좀 더 융통성있게 사용할 수도 있습니다. – Cerad

답변

2

CRUD에서이 작업을 수행해야합니다. "editAction"을 호출하면 엔터티의 상태를 확인해야합니다. 이 "완료"되면 당신은 편집 양식을 표시하지 않을, 오히려 "showAction"예를 들어

로 사용자를 리디렉션 : 당신이 같은 일을 할 수있는, 또한

/** 
* Displays a form to edit an existing Task entity. 
* 
* @Route("/{id}/edit", name="task_edit") 
* @Method("GET") 
* @Template() 
*/ 
public function editAction($id) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $entity = $em->getRepository('AcmeTaskBundle:Task')->find($id); 

    if($entity->isCompleted()) 
     return $this->forward('AcmeTaskBundle:Task:show', array('id' => $id)); 

    //Else finish edit action 
} 

/** 
* Finds and displays a Task entity. 
* 
* @Route("/{id}", name="task_show") 
* @Method("GET") 
* @Template() 
*/ 
public function showAction($id) { 
    ... 
} 

당신의 양식의 유효성을 확인한 후 조치를 업데이트하십시오. 단지 cron이 실행되기 바로 전에 편집 양식이 열려있는 경우를 대비하여. 작업이 완료되면

/** 
* Edits an existing Task entity. 
* 
* @Route("/{id}", name="task_update") 
* @Method("PUT") 
* @Template("AcmeTaskBundle:Task:edit.html.twig") 
*/ 
public function updateAction(Request $request, $id) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $entity = $em->getRepository('AcmeTaskBundle:Task')->find($id); 

    if (!$entity) { 
     throw $this->createNotFoundException('Unable to find Task entity.'); 
    } 

    if($entity->isCompleted()) 
     //Redirect Again. Note that this happens BEFORE the flush() which is when the entity is persisted to the db 

    $deleteForm = $this->createDeleteForm($id); 
    $editForm = $this->createEditForm($entity); 
    $editForm->handleRequest($request); 

    if ($editForm->isValid()) { 

     $em->flush(); 

     return $this->redirect($this->generateUrl('administration_product_edit', array('id' => $id))); 
    } 

    ... 
} 

또한, 그들은 당신은 아마 모두 함께 showAction 사용자 인터페이스에서 "편집 옵션"을 제거해야합니다. 즉, 나뭇 가지 템플릿에서 "편집 버튼"을 렌더링하기 전에 엔티티가 완료되었는지 확인하십시오.

+0

$ this-> forward 대신 $ this-> redirect()를 사용할 수도 있습니다. – Jacob

+0

PUT 작업의 경우 엔티티가 가져온 직후 엔티티가 완료되었는지 확인하여 양식 구성 요소가 작동하지 않도록하십시오. – Talus

+0

당신은 완전히 옳습니다! 나는 그 비틀기로 그것을 새롭게 할 것이다. – Jacob

관련 문제