- edited description
Ampliación en busqueda con campos de usuarios
No encontré en la documentación si existe forma de buscar a todos los usuarios que tengan un campo personalizado con cierto valor. Ejemplo:
- Se crea un campo personalizado llamado grupo con los valores {1:azul,2:verde,3:rojo} y se necesita ubicar a todos los usuarios pertenecientes al grupo verde.
$grupos = Yii::app()->user->um->getGroupFieldValue("grupo",2);
foreach ($grupos as $usuario){
echo "<br>id ".$usuario->iduser." - ".$usuario->value;
}
Para suplir esta necesidad y seguir trabajando con cruge de forma nativa, modifique los siguientes archivos:
ICrugeField.php (agregada función)
public function getGroupFieldValue($idfield, $value){
if(is_numeric($idfield)){
// busca por idfield
//
$field = $this->loadFieldById($idfield);
if($field == null)
return "";
}
else
{
// busca por nombre
if(is_string($idfield)){
$field = $this->loadFieldByName($idfield);
echo "<br>Encontrado field ".$field->getPrimaryKey(). " - ";
if($field == null)
return "";
}
else{
// asume que es una instancia que implementa a ICrugeField
$field = $idfield;
echo "<br>else ";
}
}
if($field != null){
echo "<br>Field";
$fv = CrugeFactory::get()->getICrugeIdFieldValue($field,$value);
if($fv != null)
return $fv;
}
return "";
}
============================================================== CrugeFactory.php (agregada funcion) =================================================
public function getICrugeIdFieldValue (ICrugeField $field, $fieldvalue){
$model = CrugeFieldValue::loadAllBy($field->getPrimaryKey(), $fieldvalue);
return $model;
}
============================================================== CrugeFieldValue.php (agregada funcion) ==============================================================
public static function loadAllBy($id, $valuefield){
return self::model()->findAllByAttributes(array('idfield'=>$id, 'value'=>"$valuefield"));
}
:D
Comments (10)
-
reporter -
reporter - edited description
-
repo owner hola se pudo haber hecho sin hacer eso, solo usando el API, ya muestro como.
la solucion propuesta (arriba) resuelve un problema puntual del sistema cliente que usa a Cruge, pero con el problema agregado de que esa instancia de Cruge no se va a poder sincronizar con el repo principal de cruge dado el cambio realizado. La funcion creada: getGroupFieldValue solo es un clon de getFieldValue, este tipo de soluciones no se aplica en el core de cruge, se debio aplicar en una funcion de usuario si el caso fuese asi.
se pudo resolver por dos maneras:
manera1: (no es optima para miles de usuarios, pero si para casos pequeños)
[php] public function listarUsuariosPorGrupo($nombreGrupo){ $listaUsuarios = array(); foreach(Yii::app()->user->um->listUsers as $user){ $campoGrupo = Yii::app()->user->um->getFieldValue($user,'grupo'); if($campoGrupo == $nombreGrupo) $listaUsuarios[] = $user; } return $listaUsuarios; }
manera2: optima para miles de usuarios, habria que seleccionar de la tabla crugefieldvalue cuales usuarios tienen el campo con ese valor, y de ahi se obtienen la lista de IDUSER, para luego armar una lista de modelos.
-
reporter - edited description
-
reporter Si, dentro de la documentación encontré un ejemplo parecido, pero no es conveniente realizar una consulta completa a la base de datos y luego realizar un filtro desde el servidor php. la segunda solución no la tuve encuenta debido a que quería conservar la sintaxis simple de cruge mostrada en la documentación.
Muchas gracias por la respuesta
-
repo owner ok. la primera solución aplica muy bien para entornos de bajo volúmen, pero la segunda es para optimización
-
repo owner hola, pronto sacaré una ampliación del API que incorporará una funcion llamada:
Yii::app()->user->um->loadUserByCustomField('cedula', $cedula);
en donde "cedula" es el nombre de un campo personalizado, la busqueda se hace de forma optima filtrando desde dentro en la organizacion de clases mucho mas optimo para volumenes grandes.
-
reporter Muchas gracias por tenerlo encuenta
-
repo owner a partir del commit indicado abajo se han hecho muchos cambios en el API. los detalles los encuentras en la wiki especificamente aqui: http://yiiframeworkenespanol.org/wiki/index.php?title=Cruge#Nuevas_funciones_del_api
https://bitbucket.org/christiansalazarh/cruge/commits/cbca2c9820527e005994a9d4f6c9dbea8251115a
-
repo owner - changed status to resolved
- Log in to comment