2014-12-30 2 views
1

다차원 배열 유효성 검사를 지원하는 유효성 검사 클래스를 만들었습니다. 사용하고 싶지만 Phalcon이 유효성 검사 인스턴스를 검색하는 방법을 모르겠습니다.Phalcon : 양식과 함께 사용자 정의 유효성 검사 클래스를 사용하려면 어떻게해야합니까?

어떻게하면됩니까?

이 내 MultiDimensionalValidator 클래스입니다 :

/** 
* Validates inputs with multidimensional names such as "names[fr]name'. 
* 
* @package Intlist\Validator 
*/ 
class MultidimensionalValidator extends Validation 
{ 
    /** 
    * @param \Phalcon\Validation $validation 
    * @param string $attribute 
    * 
    * @return Validation\Message\Group|void 
    */ 
    public function validate($validation = null, $attribute = null) 
    { 
     $this->_data = $validation->_data; 
     $this->_messages = $validation->getMessages(); 

     foreach ($this->_validators as $validator) { 
      $validator->validate($this, $attribute); 
     } 

     return $this->_messages; 
    } 

    /** 
    * Support for multidimensional array. 
    * 
    * @inheritdoc 
    */ 
    public function getValue($attribute) 
    { 
     $parts = $this->extractKeyParts($attribute); 
     $value = $this->_data; 

     while ($name = array_shift($parts)) { 
      if (!array_key_exists($name, $value)) { 
       return null; 
      } 

      $value = $value[$name]; 
     } 

     return $value; 
    } 

    /** 
    * Extract the parts from a flattened multidimensional key. 
    * 
    * @param string $flattened 
    * 
    * @return array 
    */ 
    private function extractKeyParts($flattened) 
    { 
     $pos = strpos($flattened, '['); 

     if (!$pos) { 
      return [ $flattened ]; 
     } 

     $first = substr($flattened, 0, $pos); 
     $remainder = substr($flattened, $pos); 

     preg_match_all('#\[([^\]]+)\]#', $remainder, $matches); 

     return array_merge([ $first], $matches[1]); 
    } 
} 

그리고 이것은 사용법이다 :

foreach ($this->domain->getLanguages() as $language) { 
    $name = new Text("names[$language][name]"); 
    $name->setLabel($t('common.label.category_name') . " ($language)"); 
    $name->addValidator(new MultiDimensionalValidator([ 
     new PresenceOf(['message' => $t('validation.category_name.required')]), 
     new StringLength([ 
      'max' => 255, 
      'messageMaximum' => 'validation.category_name.messageMaximum' 
     ]) 
    ])); 
} 

MultiDimensionalValidator 클래스가 여기에 발리로 사용됩니다,하지만 난 정말로 사용하고 싶습니다 폼의 유효성 검사 인스턴스입니다. 폼과 함께 사용자 지정 유효성 검사기를 사용하려면

+0

이 있습니까? 또는 질문을 명확하게하기 위해 유효성 검사반을 볼 수 있습니까? 폼에 와이어를 연결하려는 시도를 추가 할 수 있다면 이상적이며 질문을 다시 열 수 있습니다. – halfer

+0

지금이 부분이 더 명확합니까? – olvlvl

+0

예, 좋다고 생각합니다. 다시 투표하려면 투표를해야합니다 (투표가 몇 번 더 필요하지만 투표를해야합니다). – halfer

답변

0

, 당신은과 같이 폼 요소를 추가해야합니다 : 문서 당

$form->add($name); 

(http://docs.phalconphp.com/en/latest/reference/forms.html#validation) 그런 다음 isValid을 사용할 수 있습니다 Phalcon 검증 구성 요소 (http://docs.phalconphp.com/en/latest/reference/validation.html가) 형태의 독립적 인, 그러나,

if (!$form->isValid($_POST)) { 
    foreach ($form->getMessages() as $message) { 
     echo $message, '<br>'; 
    } 
} 

참고 : 방법은 데이터의 유효성을 검사합니다. 즉, 양식의 일부일 필요는 없습니다. 대신 모델의 일부가 될 수도 있고, 다음과 같은 예에서와 같이 독립적 인 클래스가 될 수있는 다음 Phalcon 워드 프로세서의 예

$validation = new Phalcon\Validation(); 
foreach ($this->domain->getLanguages() as $language) { 
    $validation->addValidator(new MultiDimensionalValidator(...)); 
} 
$messages = $validation->validate($_POST); 
if (count($messages)) { 
    foreach ($messages as $message) { 
     echo $message, '<br>'; 
    } 
} 
+0

의견을 보내 주셔서 감사합니다 Tim, 죄송 합니다만 예제가 명확하지 않지만 이미 알고 있습니다. 문제는 다차원 이름이있는 입력의 유효성 검사가 Phalcon에서 지원되지 않는다는 것입니다. 필자의 예에서 Phalcon은 "names [fr] [name]"키를 사용하여 값의 유효성을 검사하려고 시도합니다. 실제로는 $ _POST의 배열입니다. $ _POST [ 'names'] [ 'fr'] [ 'name']이 아니라 $ _POST [ 'names [fr] [name]']입니다. 유효성 검사기는이 상황을 처리하며 일부 입력이 아닌 양식 자체에 사용하고 싶습니다. – olvlvl

관련 문제