2010-01-28 6 views
3

Symfony 1.4/Doctrine의 admin 생성기를 사용하고 있습니다.symfony 1.4의 admin 생성기에서 새로운 delete object_action 생성

질문 목록이 있으며 각각에 대해 사용자 정의 object_action을 수행 할 수 있기를 바랍니다.

내가 찾고있는 것은 _delete 개체 동작을 모방하지만 그 전에 계산을 수행하는 것입니다.

는 그래서 새로운 액션 생성 :

public function executeListDeleteAndRecalculate(sfWebrequest $request) 
    { 
    // Do the calculation 

    // Then delete the question 
    } 

을 그리고 난 내 generator.yml에 추가 해요 :

object_actions: 
    delete_and_recalculate: ~ 

새로운 조치가 관리자 발생기에 표시하지만 삭제 부분 아무튼 일하지 마라. 모든 계산이 이루어졌다

  • 되면, 내가 처음 questionActions/delete 조치로 리디렉션하려고 :

    나는 그것이 작동되도록하는 것은 한 무리를 시도했다.
  • executeDelete 코드를 새로운 동작으로 복사하려고 시도했습니다.

하지만 매번 내가 얻을 악명 높은

500 | 내부 서버 오류 | sfValidatorErrorSchema _csrf_token [필수.]

그래서 심포니 실제로 객체를 삭제하기 전에 몇 가지 마술을하고있다 같은데요.

제가 누락 된 부분을 알고 있습니까? 무엇이 가장 효과적인 방법으로 deleteAndRecalculate를 구현할 수 있습니까?

편집 : 나는 $request->checkCSRFProtection(); 모든 것을 제거하면 물론

가 잘 작동합니다. 그러나 나는 꽤 중요한 솔루션이라고 생각합니다.

답변

4

관리자 생성기의 delete 링크가 CSRF 공격을 막기 위해 토큰을 사용하기 때문입니다.

기본적으로 세션의 토큰과 양식의 숨김 필드에 토큰을 설정 한 다음 요청시 토큰을 확인합니다. 이는 관리자 생성기의 delete 링크가 실제로 (자바 스크립트에서 생성 된) 양식이기 때문에 가능합니다 (이것은 REST 동작을 시뮬레이트하기 위해 sf_method 숨김 필드를 추가하기 위해 수행됩니다). CSRF가 작동하고 방지 할 수있는 방법에 대한 자세한 내용은

, 당신은 위키 백과에 더 읽을 수 있습니다

는 당신이 링크의 같은 종류를 사용한다 할 수있다, 당신은 단지이 http://en.wikipedia.org/wiki/Cross-site_request_forgerylink_tomethod 매개 변수를 전달하는 양식을 생성하려면 lib/generator/sfModelGeneratorHelper.class.php 32 행을보고 관리자가 수행 한 작업을 확인하십시오.

executeDeleteAndRecalculate 메서드에서 $request->checkCSRFProtection()을 실행 한 다음 수동으로 개체 삭제를 포함하여 원하는 작업을 계속 진행합니다.

제대로하면 (즉, 모듈 디렉토리의 lib/${YourModule}GeneratorHelper.class.php 파일에 놓여 야) 모듈의 헬퍼 클래스의 linkToDeleteAndRecalculate 방법을 추가하고 다음 코드 (직접 sfModelGeneratorHelper에서 가져온 적용)를 추가합니다, 링크를 생성하려면 :

public function linkToDeleteAndRecalculate($object, $params) 
{ 
    if ($object->isNew()) 
    { 
    return ''; 
    } 

    return '<li class="sf_admin_action_delete">'.link_to(__($params['label'], array(), 'sf_admin'), 'delete_and_recalculate', $object, array('method' => 'delete', 'confirm' => !empty($params['confirm']) ? __($params['confirm'], array(), 'sf_admin') : $params['confirm'])).'</li>'; 
} 

(나는 기본적으로 delete_and_recalculate을 넣었습니다하지만 당신은 모듈의 이름으로 접두사 할 수 있습니다) 당신이 경로를 변경해야 할 점에 유의하십시오 link_to 호출에서.

그런 다음 사용할 수있는 그 하드 방법을이었다 거의 내장 관리자 발전기 방법 (그리고 예를 들어 generator.yml에서 그것을 레이블을 통과) 이제

처럼 delete_and_recalculate.

쉬운 방법에서의 admin.delete_object 이벤트에 가입하는 것입니다 모듈의 사전 실행 예를 들어, 귀하의 답변을

+0

감사합니다 :-)이 당신의 일에. 그러나 linkToDelete가 링크를 만드는 방식을 복사하려고해도 양식을 만드는 onclick 자바 스크립트 이벤트를 생성 할 수 없습니다. 그리고 _delete 객체 액션에 대한 작업이 끝난 곳을 찾을 수 없습니다. "쉬운 방법"에 대해서 : 나는 기본 "삭제"작업을 유지하기를 원하기 때문에 작동하지 않을 것이라고 생각합니다. –

+0

좋아, 링크를 생성하는 방법에 대한 내 대답을 편집, 그 도움이됩니까? –

+0

나는 링크를 클릭하기 전까지 모든 것이 정상적으로 보인다. 백엔드/config/routing.yml에 내가 작성한 경로 (http://pastie.org/798862 참조)에 대한 잘못된 점은 무엇인지 모르겠습니다. 하지만 404 "Action"supprimer_et_recalculer/33 "이 존재하지 않습니다." –

관련 문제