Convertir Mayúsculas Con Acentos

Hola muy buen día a todos!!

Soy nuevo con YII (y me parece fantástico) lo estoy implementando en la empresa donde trabajo y hasta el momento voy bastante bien en tiempos y en calidad del sistema.

Pero últimamente he notado que al convertir a mayúsculas (antes de guardar en la BD), los caracteres con acentos no los convierte a mayúsculas.

Que me sugieren?

Nota: la conversión a mayúsculas la hago desde el modelo en las reglas de validación con filter.

Saludos!!

Que función estas usando para tal propósito? no creo que sea problemas de yii sino de usar la función adecuada para la codificación utilizada. te recomiendo que busques información de las funciones mb (Multibyte String) de php. Antes verifica si el servidor donde estas trabajando tiene dicha librería instalada.

Saludos.





public function rules()

	{

		

		return array(

			 comentarios','filter','filter'=>'strtoupper'),

			

		);

	}




Así es como convierto a mayúsculas. Estuve leyendo un poco mas y proponen

setlocale(LC_ALL,‘es’);

Lo puse en el index pero sigue sin funcionar.

Antes de aventurarme en idear un método para hacer la conversión manualmente (beforeSave), pienso que el problema esta en una configuración de localidad.

De antemano muchas gracias

Intenta esto,




$cadena="abcdefghijklmnñopqrstuvwxyzáéíóúäëïöü€1234567890.;,:-_'¡!";

echo "<br/>-->$cadena";

echo "<br/>-->".strtoupper($cadena);

echo "<br/>-->".mb_strtoupper($cadena);

echo "<br/>-->".mb_strtoupper($cadena, "UTF-8");



Pon en cadena todos los caracteres que quieras comprobar y mira a ver si funciona.

Yo utilizo utf-8 pero si utilizas otra codificación se la tendrás que pasar a la función de php.

Hola rahif, mi conversión la realizo desde la validación en el modelo

mas o menos asi:




comentarios','filter','filter'=>'strtoupper'),



Con tu solucion que me porpones como quedaria?

Yo lo modifico en el método afterSave(), más exactamente lo hago con un comportamiento.

Creo el comportamiento en mi caso en protected/extensions/behavior/




<?php

class WordBehavior extends CActiveRecordBehavior{

	public $upper;	

	public $lower;	

	public $first;	

	

	public function beforeSave($event){

		if (!empty($upper)){

			foreach ($upper as $campo)

				if (isset ($this->getOwner()->{$campo}))	$this->getOwner()->{$campo} = mb_strtoupper($this->getOwner()->{$campo}, "UTF-8");

		}

		if (!empty($lower)){

			foreach ($lower as $campo)

				if (isset ($this->getOwner()->{$campo}))	$this->getOwner()->{$campo} = mb_strtolower($this->getOwner()->{$campo}, "UTF-8");

		}

		if (!empty($first)){

			foreach ($first as $campo)

				if (isset ($this->getOwner()->{$campo}))	$this->getOwner()->{$campo} = mb_convert_case($this->getOwner()->{$campo}, MB_CASE_TITLE, "UTF-8");

		}

	}

}



y luego en el modelo lo añado:




	public function behaviors(){

		$behaviours=array(

				'wordBehavior' => array(

					'class' =>'ext.behavior.WordBehavior',

					'upper' =>'campo1, campo2, campo3, campo4',

					'lower' =>'campo5, campo6',

					'first' =>'campo7, campo8',

				),

			);

        return CMap::mergeArray(parent::behaviors(),$behaviours);

	}



De esta manera antes de guardar el dato los campos:

  • campo1, campo2, campo3, campo4 se pasan todas las letras a mayúsculas

  • campo5, campo6 todas las letras a minúsculas

  • campo7, campo8 todas las letras a minúsculas menos la primera de cada palabra que esta en mayúsculas.

y se necesitase alguna variación más pues la creo facilmente.

De esta manera se puede utilizar en cualquier sitio y si hay algún error esta centralizado en la clase.

Me parece bastante interesante tu solución, la voy a implementar y te informo los resultados.

de antemano muchas gracias y saludos desde Yucatán!!

Hola, disculpa una pregunta. si quisieras implementar esto para un model creado desde el gii en mi caso TblEstado.php como quedaria? intente algo como.


public function behaviors(){

	        $behaviours=array(

	                        'wordBehavior' => array(

	                                'class' =>'ext.behavior.WordBehavior',

	                                'upper' =>'estado',

	                        ),

	                );

	return CMap::mergeArray(parent::behaviors(),$behaviours);

pero no me funciona, igual en base de datos lo guarda en minusculas. alguna idea? soy nuevo con yii asi que disculpa si la pregunta es tonta. gracias de antemano por cualquier ayuda

Hola wasakaca2, pues si no te da ningún error no se me ocurre nada.

Tendrás que hacer algún echo en beforeSave y parar la ejecución, a lo bruto, 1º para ver si entra y 2º para ver si esta definido el parámetro, en este caso ‘estado’ en el modelo (debe existir en BBDD).

Amigos soy nuevo en yii, como puedo utilziar esta extension la verdad no se como hacerlo