2013-02-08 2 views
0

내 응용 프로그램에는 자신의 위젯을 사용하여 많은 모듈과 많은 양식이 있습니다.
나는 위젯 세계적으로 '해제', '숨기기'또는 '전용 읽기 메이크업'을 시도하고있다.
양식의 구성 () 기능 중 하나의 위젯을 사용하여 가능하다는 것을 알고 있지만 가능한 한 글로벌 방식으로 더 나은 해결책을 찾고 있습니다. 모든 모듈 양식을 변경하고이를 추적하는 것은 어려울 수 있습니다.
스레드가 약간 길 수도 있지만 문제를 쉽게 이해할 수 있다고 생각합니다. 읽어 주셔서 감사합니다. :)

몇 가지 옵션을 테스트하기 위해 Timestampable 비헤이비어가있는 간단한 뉴스 모듈을 만들었지 만 여전히 아무 것도 작동하지 않았습니다.
symfony 1.4 어떻게 폼 위젯을 전역 적으로 설정 해제, 숨기기 또는 읽기 만할까요?

  • 테이블 : TbNews
  • 열 :
    • id 뉴스 컨텐츠를 저장하기위한 텍스트 필드로
    • scontent 키 차있다.
    • created_at으로 날짜 시간. (Timestampable 동작)
    • updated_at으로 날짜 시간. (Timestampable 동작)


TbNews는 schema.yml 파일 :

TbNews: 
    connection: doctrine_master 
    tableName: tb_news 
    columns: 
    id: 
     type: integer(8) 
     fixed: false 
     unsigned: false 
     primary: true 
     autoincrement: true 
    scontent: 
     type: string(64000) 
     fixed: false 
     unsigned: false 
     primary: false 
     notnull: true 
     autoincrement: false 
    actAs: 
    Timestampable: 
     created: 
     name: created_at 
     type: timestamp 
     format: Y-m-d H:i:s 
     options: 
      notnull: false 
      required: false 
     updated: 
     name: updated_at 
     type: timestamp 
     format: Y-m-d H:i:s 
     options: 
      notnull: false 
      required: false 


TbNews 형태
(예를 들어, 만 쓴 updated_at 그 다시 updated_at 컬럼) : updated_at TbNews에 대한

class TbNewsForm extends PluginTbNewsForm 
{ 
    public function configure() 
    { 
     $this->setWidgets(array(
      'updated_at' => new sfWidgetFormDateTime(), 
    )); 
     $this->setValidators(array(
     'updated_at' => new sfValidatorDateTime(array('required' => false)), 
    )); 
    } 
} 


템플릿 _form.php는 "에코 $ 양식 [ 'updated_at'
수동으로 updated_at 렌더링, 선택의 여지를 테스트 ] "그리고 그것을 렌더링하지 않고.
lib/form/doctrine/BaseFormDoctrine.class.php : 컬럼에서 update_at

<?php echo $form->renderHiddenFields(false) ?> 


종합 시험 sfWidgetFormInputHidden() 함께

  • 는 위젯 템플릿 렌더링되지 않는다.
    설정하지 않은 상태에서 setWidget을 사용하여 설정을 해제하지 않고 테스트 ...가능한 모든 옵션이 있지만 updated_at 필드는 템플릿에 렌더링되지 않습니다. _form.php 템플릿에
    추가에게 필드 updated_at을,하지만이 읽은 상태로 표시되지 : (사용 renderHiddenFields())
abstract class BaseFormDoctrine extends sfFormDoctrine 
{ 
    public function setup() 
    { 
     $value_updated_at = $this->getObject()->updated_at; 
     unset($this->widgetSchema['updated_at']); 
     unset($this->validatorSchema['updated_at']); 
     $this->widgetSchema['updated_at'] = new sfWidgetFormInputHidden(); 
     $this->widgetSchema['updated_at']->setOption('is_hidden', 'true'); 
     $this->widgetSchema['updated_at']->setOption('type', 'hidden'); 
     $this->setDefault('updated_at', $value_updated_at); 
     $this->setWidget('updated_at', new sfWidgetFormInputHidden(array('value'=>$value_updated_at))); 
     //$this->setWidget('updated_at', $this->widgetSchema['updated_at']); 
    } 
} 


  • 와 읽기 전용 만. sfWidgetFormDateTime으로는 작동하지 않습니다.
    $this->widgetSchema['updated_at']->setAttribute('readonly', 'readonly'); 
    


질문과 생각

:

아마 BaseFormDoctrine 모든 형태의 모듈에서 위젯 글로벌 변화에 대한 올바른 방법이 아니거나 내 테스트에서 무엇인가 잘못이 있습니다.

아마도 위의 코드를 양식 위젯 TbNewsForm configure()에서 직접 사용하면 위젯을 한 유형에서 다른 유형으로 쉽게 변경하고 개별적으로 렌더링하거나 숨길 수 있습니다.

  • 그러나 어떻게 글로벌 방식으로 구현할 수 있습니까?
  • symfony Doctrine의 핵심 코드를 변경해야합니까? 당신이 그것을 읽을 시간이 걸릴 수 있다면

당신에게 정말 고마워요, 어떤 의견이나 해결책은 도움이되지 않습니다 BaseFormDoctrine 클래스를 변경 :

+0

, 당신은'updated_at' 및'created_at'가 숨겨하려는 모든 양식? – j0k

+0

예 j0k이지만 created_at 및 updated_at 필드가있는 모든 모듈에 영향을줍니다. – xtrm

+0

또한 전역 적으로 만 테스트 됨 BaseFormDoctrine에서 해당 필드를 설정 해제했지만 업데이트시 created_at에 대한 NULL 값이 저장됩니다. UPDATE tb_news SET scontent = 'content3', created_at = '', updated_at = '2013-02-07 11:59:29'WHERE id = '3'; 체크 리스너 코드는 C : \ php5 \ PEAR \ symfony \ plugins \ sfDoctrinePlugin \ lib \ vendor \ doctrine \ Doctrine \ Template \ Listener \ Timestampable.php에 있지만 쉬운 해결책은 없습니다. – xtrm

답변

0

환영합니다. 양식 위젯은 주어진 양식의 기본 클래스 (귀하의 경우 BaseTbNewsForm)에 설정되어 있기 때문에 BaseFormDoctrine 클래스에서 변경 한 사항을 덮어 씁니다.

각 양식에 대해 동일한 작업을 수행하고 각 클래스의 코드를 다시 작성하지 않으려면 유틸리티 클래스를 만들고 'configure()'양식의 메소드를 호출 할 수 있습니다.

Doctrine/Symfony 내부를 변경하지 않고 전역 적으로 수행 할 수있는 옵션이 없다고 생각합니다. 양식의 기본 클래스가 생성되는 방식을 변경해야합니다.

+0

Michal에게 감사드립니다. 귀하의 의견은 실제로 appretiated이며 어떻게 든 내 생각. 핵심 부분에서 약간의 변경을 시도하고 곧 다시보고하겠습니다. :) – xtrm

0

작동 방식을 찾았습니다. hovewer가 symfony의 소스 코드를 수정해야하기 때문에 최선의 해결책이 아닐 수도 있습니다. 기능 : setupInheritance() 코어 파일에 : 우리가 거기에 코드를 추가하는 경우 sfFormDoctrine.class.php이 위젯과 검증을 설정 한 후 모든 형태에 의해 호출되고, 우리의 변화는 모든 형태에 대해 전역 작동합니다 . 아래의 예를 들어, 모든 위젯 'created_at'와 'updated_at'에서
다음 숨기도록 설정 해제 될 것이다 : 기본적으로

/** 
    * Used in generated forms when models use inheritance. 
    */ 
    protected function setupInheritance() 
    { 
    if (isset($this)) 
    { 
     $oWidgetSchema = $this->getWidgetSchema(); 
     if (isset($oWidgetSchema)) 
     { 
     $screatedcolumn = "created_at"; 
     $supdatedcolumn = "updated_at"; 

     //if ($this->isNew()) //we can add a check for new records 

     //we can also add checks for frontend or backend 
     //$request = sfContext::getInstance()->getRequest(); 
     //$this->url = 'http'.($request->isSecure() ? 's' : '').'://'. $request->getHost(); 
     //$suri_params = $request->getParameterHolder()->getAll(); 

     //set [created_at] as hidden field widget, and set its default value to the Original one before sending it to Timestampable.php Listener. 
     if ($oWidgetSchema->offsetExists($screatedcolumn)) 
     { 
      $value_created_at = $this->getObject()->created_at; 
      unset($this->widgetSchema[$screatedcolumn]); 
      $this->widgetSchema[$screatedcolumn] = new sfWidgetFormInputHidden(); 
      $this->widgetSchema[$screatedcolumn]->setOption('is_hidden', 'true'); 
      $this->widgetSchema[$screatedcolumn]->setOption('type', 'hidden'); 
      //unset($this->validatorSchema[$screatedcolumn]); //unset its validator to make sure values are not checked by default, optional. 
      $this->setDefault($screatedcolumn, $value_created_at); 
     } 
     //set [updated_at] as hidden field widget, and set its default value to time() before sending it to Timestampable.php Listener. 
     if ($oWidgetSchema->offsetExists($supdatedcolumn)) 
     { 
      //$value_updated_at = $this->getObject()->updated_at; 
      unset($this->widgetSchema[$supdatedcolumn]); 
      $this->widgetSchema[$supdatedcolumn] = new sfWidgetFormInputHidden(); 
      $this->widgetSchema[$supdatedcolumn]->setOption('is_hidden', 'true'); 
      $this->widgetSchema[$supdatedcolumn]->setOption('type', 'hidden'); 
      //unset($this->validatorSchema[$supdatedcolumn]); //unset its validator to make sure values are not checked by default, optional. 
      $this->setDefault($supdatedcolumn, time()); 
     } 
     } 
    }