2016-10-04 5 views
1

同じフィールドには、2種類のデータがあります:CPFCNPJです。私は次のように、個別に検証のためのcustom componentを使用しています:同じフィールドに多数のカスタムバリデーターを使用する方法

['cnpj', CnpjValidator::className(), 'skipOnError' => true] 

または

['cpf', CpfValidator::className(), 'skipOnError' => true] 

が、私は同じフィールドcnpj_cpfのための2つのクラスを使用してみましたし、それが成功しませんでした。ルールは、同じモデルに属するnatureza属性に基づいて個別に適用されます。

何かのように:

if($model->natureza == 'F'){ 
// apply CpfValidator::className() 
else { 
// apply CnpjValidator::className() 
} 

@edit

ルール方式

public function rules() 
    { 
     return [ 
      [['nome', 'nome_abrev', 'email', 'cliente_grupo_id'], 'required'], 
      [['email', 'email_nfe'], 'email'], 
      ['cnpj_cpf', CnpjValidator::className(), 'skipOnError' => true, 'when' => function($model){ 
       return $model->natureza == 'J'; 
      }], 
      ['cnpj_cpf', CpfValidator::className(), 'skipOnError' => true, 'when' => function($model){ 
       return $model->natureza == 'F'; 
      }], 
      [['natureza', 'observacoes'], 'string'], 
      [['ativo', 'gera_gnre', 'simples_nacional', 'sintegra', 'emitir_laudo', 'controla_pallet', 'controla_edi', 'regime_especial', 'gera_st', 'termos_industrializacao', 'termo_isencao', 'cod_suframa', 'insc_subs_tributaria', 'ean', 'cliente_grupo_id', 'cliente_ramo_atividade_id', 'localizacao_microrregiao_id', 'venda_canal_id', 'venda_condicao_pagamento_id', 'usuario_representante_id'], 'integer'], 
      [['data_suframa','limite_credito_validade','data_insc_subs_tributaria'], 'default', 'value' => null], 
      [['data_suframa', 'data_insc_subs_tributaria', 'limite_credito_validade'], 'safe'], 
      [['limite_credito', 'desconto_financeiro'], 'number'], 
      [['nome', 'nome_abrev', 'insc_estadual', 'insc_municipal', 'email', 'email_nfe', 'website', 'banco', 'banco_ag', 'banco_cc', 'natureza_operacao'], 'string', 'max' => 255], 
      [['cnpj_cpf'], 'string', 'max' => 18], 
      [['website'], 'url', 'defaultScheme' => 'http'], 
      [['nome_abrev'], 'unique'], 
      [['venda_canal_id'], 'exist', 'skipOnError' => true, 'targetClass' => VendaCanal::className(), 'targetAttribute' => ['venda_canal_id' => 'id']], 
      [['venda_condicao_pagamento_id'], 'exist', 'skipOnError' => true, 'targetClass' => VendaCondicaoPagamento::className(), 'targetAttribute' => ['venda_condicao_pagamento_id' => 'id']], 
      [['cliente_grupo_id'], 'exist', 'skipOnError' => true, 'targetClass' => ClienteGrupo::className(), 'targetAttribute' => ['cliente_grupo_id' => 'id']], 
      [['localizacao_microrregiao_id'], 'exist', 'skipOnError' => true, 'targetClass' => LocalizacaoMicrorregiao::className(), 'targetAttribute' => ['localizacao_microrregiao_id' => 'id']], 
      [['cliente_ramo_atividade_id'], 'exist', 'skipOnError' => true, 'targetClass' => ClienteRamoAtividade::className(), 'targetAttribute' => ['cliente_ramo_atividade_id' => 'id']], 
      [['usuario_representante_id'], 'exist', 'skipOnError' => true, 'targetClass' => UsuarioRepresentante::className(), 'targetAttribute' => ['usuario_representante_id' => 'id']] 
     ]; 
    } 
+0

'[['cnpj_cpf']、 'string'、 'max' => 18]' ??? – soju

+0

私はその行を削除しても問題は解決しません。 –

答えて

1

あなたは試みることができる:

​​3210

Conditional Validationについては、こちらをご覧ください。

+0

私はあなたの解決策を試みますが、正しい値であっても常に無効なメッセージを受け取ります。個別に正常に動作します。条件文が守られていないかのように... –

+0

'when'を' whenClient'に変更して動作させます! –

+0

あなたはいつクライアントオプションを追加しましたか?それは同じではありません... – soju

関連する問題