asterisco vicino campi obbligatori

In molti form si vede un asterisco vicino ai campi obbligatori.

Stavo provando a fare la stessa cosa con yii.

Ho provato ad implementare la view così:


    <div class="row">

        <?php echo $form->label($model,'email') . ' *'; ?>

        <?php echo $form->textField($model,'email') ?>

		<?php echo $form->error($model,'email'); ?>

    </div>



però si rovina la grafica. L’asterisco compare vicino al TextField.

Se vado a toccare il model così:


	public function attributeLabels()

	{

		return array(

			'email' => 'Email *',



Risolvo nel form di registrazione, ma poi mi compare l’asterisco ovunque, anche nelle grid.

Potrei creare un nuovo model che estenda dall’originale, dove vado ad implementare solo la funzione attributeLabels()

Ma immagino che ci sia un modo più bello di lavorare, corretto?

Questo vienne fatto automaticamente se usi il validatore "required" - http://www.yiiframework.com/doc/api/1.1/CHtml#activeLabelEx-detail

Anzi no. Andare a modificare attributeLabels è sicuramente sbagliato, perché poi in fase di controllo esce l’errore

[color=#FF0000][font=Arial, Helvetica, sans-serif]Email * non e’ una email valida.[/font][/color]

[color=#FF0000][font=Arial, Helvetica, sans-serif]

[/font][/color]

Allora probabilmente la soluzione più corretta è andare a lavorare sulla grafica della view, andando a toccare le opzioni:

http://www.yiiframework.com/doc/api/1.1/CHtml#label-detail

Si, mi stavo rispondendo da solo.Mi hai preceduto.

pero’ devi usare il labelEx()

Se invece voglio aggiungere la scritta opzionale, sono obbligato ad usare questa sintassi:


<?php echo $form->labelEx($model, Yii::t('plim', 'Email').'<span>'.Yii::t('plim', ' (opzionale)').'</span>'); ?>


<?php echo $form->label($model,'email',array('required'=>true)); ?>



O c’è un modo più stiloso?

non saprei farlo diversamente… pero per me l’opzionale e se non ce l’asterisco…

Devi pensare in modo dissociato le cose. L’asterisco appare perché le lable sono campi obbligatori. Se analizzi bene il codice, scopri che quando un campo è required il campo label ha la classe css “required”, altrimenti no. Partendo da questo assunto, quello di cui hai bisogno, è l’asterisco in caso di campo obbligatorio, e la scritta (opzionale) in tutti gli altri casi.

Per risolvere questo problema, dobbiamo fare un hack di CHtml. In particolare CHtml::label();





	public static function label($label,$for,$htmlOptions=array())

	{

		if($for===false)

			unset($htmlOptions['for']);

		else

			$htmlOptions['for']=$for;

		if(isset($htmlOptions['required']))

		{

			if($htmlOptions['required'])

			{

				if(isset($htmlOptions['class']))

					$htmlOptions['class'].=' '.self::$requiredCss;

				else

					$htmlOptions['class']=self::$requiredCss;

				$label=self::$beforeRequiredLabel.$label.self::$afterRequiredLabel;

			}

			unset($htmlOptions['required']);

		}

		return self::tag('label',$htmlOptions,$label);

	}



In particolare questo pezzetto:




			if($htmlOptions['required'])

			{

				if(isset($htmlOptions['class']))

					$htmlOptions['class'].=' '.self::$requiredCss;

				else

					$htmlOptions['class']=self::$requiredCss;

				$label=self::$beforeRequiredLabel.$label.self::$afterRequiredLabel;

			}

			unset($htmlOptions['required']);



Qui si dice che se è stato impostato l’htmlOption ‘required’ deve essere messa, o aggiunta la classe self::$requiredCss (che poi è una stringa ‘required’). A naso, io proverei a modificare quel codice (CHtml::label();). Mi pare di aver letto da qualche parte che non è possibile sovrascrivere CHtml, quindi temo tu sia costretto a modificare la classe del framework.




			if($htmlOptions['required'])

			{

				if(isset($htmlOptions['class']))

					$htmlOptions['class'].=' '.self::$requiredCss;

				else

					$htmlOptions['class']=self::$requiredCss;

				$label=self::$beforeRequiredLabel.$label.self::$afterRequiredLabel;

			} else {

				if(isset($htmlOptions['class']))

					$htmlOptions['class'].=' '.self::$optionalCss;

				else

					$htmlOptions['class']=self::$optionalCss;

				$label=self::$beforeOptionalLabel.$label.self::$afterOptionalLabel;

			}

			unset($htmlOptions['required']);



Quindi dovresti creare la proprietà $optionalCss. Questa è quella di required




	/**

	 * @var string the CSS class for required labels. Defaults to 'required'.

	 * @see label

	 */

	public static $requiredCss='required';



e questo è quello che potresti fare




	/**

	 * @var string the CSS class for required labels. Defaults to 'required'.

	 * @see label

	 */

	public static $requiredCss='required';

	/**

	 * @var string the CSS class for optional labels. Defaults to 'optional'.

	 * @see label

	 */

	public static $optionalCss='optional';



A questo punto abbiamo il css optional, però non abbiamo il css optional.

Questo è il css dentro al file form.css:




div.form span.required

{

    color: red;

}



Il css non è necessario, ma per coerenza, io lo metterei:





div.form span.required

{

    color: red;

}


div.form span.optional

{

}




Potrebbe venirti in mente di cambiare il css di tutti i campi opzionali. Ma non è finita qui:

Chi ce lo mette quel dannatissimo *? Si vede bene nel ramo dell’else.




			} else {

				if(isset($htmlOptions['class']))

					$htmlOptions['class'].=' '.self::$optionalCss;

				else

					$htmlOptions['class']=self::$optionalCss;

				$label=self::$beforeOptionalLabel.$label.self::$afterOptionalLabel;

			}




Ovvero qui:




				$label=self::$beforeOptionalLabel.$label.self::$afterOptionalLabel;



Questo è il css del required, noi dovremmo creare quello dell’optional




	/**

	 * @var string the HTML code to be appended to the required label.

	 * @see label

	 */

	public static $afterRequiredLabel=' <span class="required">*</span>';



… così:




	/**

	 * @var string the HTML code to be appended to the optional label.

	 * @see label

	 */

	public static $afterOptionalLabel=' <span class="optional">(optional)</span>';

	/**

	 * @var string the HTML code to be appended to the required label.

	 * @see label

	 */

	public static $afterRequiredLabel=' <span class="required">*</span>';



Ecco risolto l’arcano.

Non credo sia la soluzione migliore. Però è efficace. Te la sconsiglio vivamente: ti obbliga a modificare il framework.

Non me la sento proprio di andare a toccare il fw, però ti meriti un bel + per la spiegazione

:rolleyes: