Ampliación en busqueda con campos de usuarios

Issue #26 resolved
seisvalt created an issue

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)

  1. Cristian Salazar 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.

  2. seisvalt 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

  3. Cristian Salazar repo owner

    ok. la primera solución aplica muy bien para entornos de bajo volúmen, pero la segunda es para optimización

  4. Cristian Salazar 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.

  5. Log in to comment