/** * Paginador por sql * * @param string $model nombre del modelo * @param string $sql consulta sql * * page: numero de pagina a mostrar (por defecto la pagina 1) * per_page: cantidad de elementos por pagina (por defecto 10 items por pagina) * * * Retorna un PageObject que tiene los siguientes atributos: * next: numero de pagina siguiente, si no hay pagina siguiente entonces es false * prev: numero de pagina anterior, si no hay pagina anterior entonces es false * current: numero de pagina actual * total: total de paginas que se pueden mostrar * items: array de items de la pagina * count: Total de registros * * Ejemplos: * $page = paginate_by_sql('usuario', 'SELECT * FROM usuario' , 'per_page: 5', "page: $page_num"); * * @return object **/ public static function paginate_by_sql($model, $sql) { $params = Util::getParams(func_get_args()); $page_number = isset($params['page']) ? $params['page'] : 1; $per_page = isset($params['per_page']) ? $params['per_page'] : 10; $start = $per_page * ($page_number - 1); /** * Si es una cadena, instancio el modelo **/ if (is_string($params[0])) { $m = Util::camelcase($params[0]); $model = ActiveRecord::get($m); } /** * Instancia del objeto contenedor de pagina **/ $page = new stdClass(); /** * Cuento las apariciones atraves de una tabla derivada **/ $n = $model->count_by_sql("SELECT COUNT(*) FROM ({$sql}) AS t"); $page->items = $model->find_all_by_sql($model->limit($sql, "offset: {$start}", "limit: {$per_page}")); /** * Se efectuan los calculos para las paginas **/ $page->next = $start + $per_page < $n ? $page_number + 1 : false; $page->prev = $page_number > 1 ? $page_number - 1 : false; $page->current = $page_number; $page->total = $n % $per_page ? (int) ($n / $per_page) + 1 : $n / $per_page; $page->count = $n; $page->per_page = $per_page; return $page; }
/** * Crea una lista SELECT * * @param string $name * @param array, string $data * * selected: opcion seleccionada * include_blank: incluir opcion con valor nulo, se muestra en la opcion el texto aqui indicado * * Para el select basado en activerecord: * option: lista de campos separados por coma para colocar en la opcion (por defecto es el id) * separator: separador de valores para los campos de la opcion * value: indica el campo que servira de valor para la opcion (por defecto es el id) * conditions: condiciones de busqueda * * @return string * * Ejemplos: * select_tag('marca_id', 'Marca', 'conditions: tipo="2"', 'option: nombre') * select_tag('marca_id', 'Marca', 'SELECT * FROM marca WHERE tipo="2"', 'option: nombre') * select_tag('sexo', array('M' => 'Masculino', 'F' => 'Femenino'), 'include_blank: Seleccione uno...') */ function select_tag($name, $data = array()) { $params = is_array($name) ? $name : Util::getParams(func_get_args()); /** * Obtengo id, name y value **/ $params = array_merge(get_id_and_name($params[0]), $params); if (!isset($params['selected'])) { $value = get_value_from_action($params[0]); if ($value) { $params['selected'] = $value; } } if (!isset($params[1])) { return xhtml_start_tag('select', $params); } if (isset($params['selected'])) { $selected = $params['selected']; unset($params['selected']); } if (isset($params['separator'])) { $separator = $params['separator']; unset($params['separator']); } else { $separator = ''; } $options = ''; if (isset($params['include_blank'])) { $options .= "\t" . xhtml_tag('option', array('value' => ''), "content: {$params['include_blank']}"); unset($params['include_blank']); } if (is_array($params[1])) { if (isset($params[1][0]) && is_object($params[1][0])) { if (isset($params['option'])) { $fields = array_map('trim', explode(',', $params['option'])); unset($params['option']); } else { $fields = array('id'); } foreach ($params[1] as $item) { $value = $item->primary_key[0]; $vals = array(); foreach ($fields as $option) { array_push($vals, $item->{$option}); } $k = $item->{$value}; $v = implode($vals, $separator); if (isset($selected) && $selected == $k) { $options .= "\t" . option_tag($k, $v, 'selected: selected'); } else { $options .= "\t" . option_tag($k, $v); } } } else { foreach ($params[1] as $k => $v) { if (isset($selected) && $selected == $k) { $options .= option_tag($k, $v, 'selected: selected'); } else { $options .= option_tag($k, $v); } } } } elseif (is_string($params[1])) { if (isset($params['option'])) { $fields = array_map('trim', explode(',', $params['option'])); unset($params['option']); } else { $fields = array('id'); } /** * combo creado a partir de un modelo **/ $m = ActiveRecord::get($params[1]); if (isset($params['value'])) { $value = $params['value']; unset($params['value']); } else { $m2 = clone $m; $m2->dump_model(); $value = $m2->primary_key[0]; } if (isset($params[2]) && $params[2]) { $items = $m2->find_all_by_sql($params[2]); } else { /** * Arreglo que contiene los argumentos para el find **/ $find_args = array(); /** * Asignando parametros de busqueda **/ if (isset($params['conditions'])) { array_push($find_args, "conditions: {$params['conditions']}"); unset($params['conditions']); } if (isset($params['columns'])) { array_push($find_args, "columns: {$params['columns']}"); unset($params['columns']); } if (isset($params['join'])) { array_push($find_args, "join: {$params['join']}"); unset($params['join']); } if (isset($params['group'])) { array_push($find_args, "group: {$params['group']}"); unset($params['group']); } if (isset($params['having'])) { array_push($find_args, "having: {$params['having']}"); unset($params['having']); } if (isset($params['order'])) { array_push($find_args, "order: {$params['order']}"); unset($params['order']); } if (isset($params['distinct'])) { array_push($find_args, "distinct: {$params['distinct']}"); unset($params['distinct']); } if (isset($params['limit'])) { array_push($find_args, "limit: {$params['limit']}"); unset($params['limit']); } if (isset($params['offset'])) { array_push($find_args, "limit: {$params['offset']}"); unset($params['offset']); } $items = call_user_func_array(array($m2, 'find'), $find_args); } foreach ($items as $item) { $vals = array(); foreach ($fields as $option) { array_push($vals, $item->{$option}); } $k = $item->{$value}; $v = implode($vals, $separator); if (isset($selected) && $selected == $k) { $options .= "\t" . option_tag($k, $v, 'selected: selected'); } else { $options .= "\t" . option_tag($k, $v); } } } return xhtml_tag('select', $params, "content: {$options}"); }
/** * Autentica un usuario usando el adaptador * * @return boolean */ public function authenticate() { $where_condition = array(); foreach ($this->compare_attributes as $field => $value) { $value = addslashes($value); $where_condition[] = "{$field} = '{$value}'"; } $result = Load::model($this->class)->count(join(" AND ", $where_condition)); if ($result) { $model = ActiveRecord::get($this->class)->find_first(join(" AND ", $where_condition)); $identity = array(); foreach ($model->fields as $field) { /** * Trata de no incluir en la identidad el password del usuario */ if (!in_array($field, array('password', 'clave', 'contrasena', 'passwd', 'pass'))) { $identity[$field] = $model->{$field}; } } $this->identity = $identity; } return $result; }