Campi obbligatori in form e controllo link

1)Salve ho un form in cui vorrei che almeno 1 di 2 campi venisse riempito.

Se metto not null il primo non posso lasciarlo vuoto .

Invece a me se viene riempito il campo 2 andrebbe bene purchè uno dei due fosse riempito .

Come lo realizzo ?

  1. ho un campo in un form che deve essere un link corretto nelle rules come lo setto ?
  1. In questo caso dei farti un validatore personalizzato.

  2. http://www.yiiframework.com/doc/api/1.1/CUrlValidator/ - credo che ‘url’ sia la parola da usare.

Guarda questo esempio: http://www.yiiframework.com/wiki/168/create-your-own-validation-rule/

Anche se è in inglese, ti fa capire quanto semplice sia farsi un validatore ‘custom’, cioè personalizzato

Ritiro in auge la discussione perchè non ho capito molto o meglio .

in un model ho i seguenti campi :





@property integer $idEventi

 * @property string $nomeEvento

 * @property string $dataInizio

 * @property string $dataFine

 * @property string $dataPrevista

 * @property string $numPartecipanti

 * @property string $insegnante

 * @property string $svolgimento




vorrei che se fosse scritto nel campo data Prevista non sia inserito ne il campo data inizio ne quello data fine .

Seguendo la guida dovrei realizzare un metodo che chiamo ad esempio controlloDate:

inanzitutto scrivo la logica che vorrei anche se non è corretta:

inserisco nel model tre variabili :




 public $dataInizio;

 public $dataPrevista;

 public $dataFine;



nelle rule ho :




 public function rules()

    {

        return [

            [[ 'nomeEvento', 'svolgimento'], 'required'],

            [['svolgimento'], 'string'],

            [['nomeEvento', 'dataInizio', 'dataFine', 'dataPrevista', 'numPartecipanti', 'insegnante'], 'string', 'max' => 45],

            [['dataInizio', 'dataFine', 'dataPrevista'],'controlloDate']

        ];

    }










public function controlloDate($attribute,$params){

        if (isset($this->dataPrevista)and( isset($this->$dataInizio)or isset($this->dataFine))){

            $this->addError($attribute, 'Se riempi il campo data prevista non puoi riempire i campi data fine e data inizio!');

        }

    }



Ma non funziona …

Ho cambiato la funzione ma ricevo sempre lo stesso errore sia che compilo un solo campo e oltretutto non client side :





<?php


namespace common\models;


use Yii;

use yii\validators;


/**

 * This is the model class for table "Eventi".

 *

 * @property integer $idEventi

 * @property string $nomeEvento

 * @property timestamp $datains

 * @property date $dataInizio

 * @property date $dataFine

 * @property date $dataPrevista

 * @property string $numPartecipanti

 * @property string $insegnante

 * @property string $svolgimento

 */

class Eventi extends \yii\db\ActiveRecord

{

    /**

     * @inheritdoc

     */

  

    public $dataInizio;

    public $dataPrevista;

    public $dataFine;

  

    public static function tableName()

    {

        return 'Eventi';

    }


    /**

     * @inheritdoc

     */

    public function rules()

    {

        return [

            [[ 'nomeEvento', 'svolgimento'], 'required'],

            [['svolgimento'], 'string'],

            [['nomeEvento', 'numPartecipanti', 'insegnante'], 'string', 'max' => 45],

            [['dataInizio','dataFine','dataPrevista'],'string'],

            [['dataInizio', 'dataFine', 'dataPrevista'],'controlloDate','skipOnEmpty' => false, 'skipOnError' => false]

        ];

    }


    /**

     * @inheritdoc

     */

    public function attributeLabels()

    {

        return [

            'idEventi' => 'Id Eventi',

            'nomeEvento' => 'Nome Evento',

            'dataInizio' => 'Data Inizio',

            'dataFine' => 'Data Fine',

            'dataPrevista' => 'Data Prevista',

            'numPartecipanti' => 'Num Partecipanti',

            'insegnante' => 'Insegnante',

            'svolgimento' => 'Svolgimento',

        ];

    }


    public function controlloDate($attribute,$params){

        

        if (isset($this->dataPrevista)and !isset($this->dataInizio) and !isset($this->dataFine)){

            return true;

            

        }

       

        else {

            $this->addError($attribute, 'Se riempi il campo data prevista non puoi riempire i campi data fine e data inizio!');

            return false;

        }

    }

}







questa la view :




<?php


use yii\helpers\Html;

use yii\widgets\ActiveForm;

use dosamigos\datepicker\DatePicker;




/* @var $this yii\web\View */

/* @var $model common\models\Eventi */

/* @var $form yii\widgets\ActiveForm */

?>


<div class="eventi-form">


    <?php $form = ActiveForm::begin(); ?>


    <?//S= $form->field($model, 'idEventi')->textInput() ?>


    <?= $form->field($model, 'nomeEvento')->textInput(['maxlength' => 45]) ?>

    <div class="col-lg-4">

        <?= $form->field($model, 'dataInizio')->widget(

            DatePicker::className(), [

            // inline too, not bad

            'inline' => false, 

            //lingua

            'language' => 'it',

            // modify template for custom rendering

            //'template' => '<div class="well well-sm" style="background-color: #fff; width:250px">{input}</div>',

            'clientOptions' => [

                'autoclose' => true,

                'format' => 'yyyy-MM-dd'

            ]

        ]);?>

    </div>

    <div class="col-lg-4">

        <?= $form->field($model, 'dataFine')->widget(

            DatePicker::className(), [

            // inline too, not bad

            'inline' => false, 

             //lingua

            'language' => 'it',

            // modify template for custom rendering

            //'template' => '<div class="well well-sm" style="background-color: #fff; width:250px">{input}</div>',

            'clientOptions' => [

                'autoclose' => true,

                'format' => 'yyyy-MM-dd'

            ]

        ]);?>

    </div>


    <div class="col-lg-4">

        <?= $form->field($model, 'dataPrevista')->widget(

            DatePicker::className(), [

            // inline too, not bad

            'inline' => false, 

             //lingua

            'language' => 'it',

            // modify template for custom rendering

            //'template' => '<div class="well well-sm" style="background-color: #fff; width:250px">{input}</div>',

            'clientOptions' => [

                'autoclose' => true,

                'format' => 'yyyy-mm-dd'

            ]

        ]);?>

    </div>


    <?php 

        $t=time();

        $data=date("Y-m-d-G-i-s",$t);

    ?>

    <?= Html::activeHiddenInput($model,'data_ins',array('value'=>$data)) ?>

    

    <?= $form->field($model, 'numPartecipanti')->textInput(['maxlength' => 45]) ?>


    <?= $form->field($model, 'insegnante')->textInput(['maxlength' => 45]) ?>


    <?= $form->field($model, 'svolgimento')->textarea(['rows' => 6]) ?>


    <div class="form-group">

        <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>

    </div>


    <?php ActiveForm::end(); ?>


</div>






Ho risolto in parte cambiando la funzione di controlloDate:




public function controlloDate($attribute,$params, $enableClientValidation = true){

        

        if ($this->dataPrevista!=''and $this->dataInizio=='' and $this->dataFine==''){

            return true;

            

        }

        elseif($this->dataPrevista==''and $this->dataInizio!='' and $this->dataFine!=''){

            return true;

        }

        elseif ($this->dataPrevista==''and ($this->dataInizio=='' or $this->dataFine=='')) {

             $this->addError($attribute, 'Se riempi il campo data inizio riempi anche il campo data fine!');

            return false;

        }

        elseif ($this->dataPrevista!=''and ($this->dataInizio!='' or $this->dataFine!='')) {

             $this->addError($attribute, 'Se riempi il campo data prevista non puoi riempire i campi data fine e data inizio!');

            return false;

        }

        elseif ($this->dataPrevista==''and $this->dataInizio=='' and $this->dataFine=='') {

             $this->addError($attribute, 'Non puoi lasciare tutti i campi vuoti!');

             return false;

        }

        else{

             $this->addError($attribute, 'Errore Generico!');

             return false;

        }


    }




-Funziona se metto un valore in dataPrevista e dataInizio o in dataFine corretto

-Funziona se non metto un valore in dataPrevista emetto un solo valore in dataInizio o in dataFine .

-Non funziona se lascio tutto vuoto.

-Non funziona client-side…