CodeIgniter – Como enviar parámetros a la función Index utilizando únicamente el nombre del controlador
Tiempo total: 10 días con 10:53:23 hrs
Recientemente me encontré con el problema o necesidad de enviar parámetros de paginación a la función index, estas variables eran la página y la cantidad de ítems por pagina. El entorno de desarrollo es únicamente la utilización del nombre del controlador en la URL, por ejemplo estoy trabajando en el modulo usuarios y mi objetivo es no enviar y mostrar los parámetros de la siguiente manera:
http://example.com/usuario/index/50/1
Aquí utilizo la función index para enviar los parámetros ítems/pagina, pero mi objetivo es el siguiente:
http://example.com/usuario/50/1
Se puede observar que se esconde al usuario final alguna señal de la utilización de CodeIgniter, entonces para solucionar este problema se utiliza el siguiente método:
private $pagination = array();
public function _remap($method, $params = array()){
if($method!=”index” && is_numeric($method)){
$this->pagination[0] = $method;
$i=1;
foreach ($params as $param){
$this->pagination[$i] = $param;
$i++;
}
return call_user_func_array(array($this, “index”), $params);
}else{
return call_user_func_array(array($this, $method), $params);
}
}
Este método es el primero en ser llamado antes de la ejecución de la función indicada, en su defecto será la función index o cualquier otra, entonces si el método llamado es index simplemente se hace la llamada a la función y se envían los parámetros, si no – y si el nombre del método es numérico significa que estamos enviando los parámetros de paginación que necesitamos, ahora creamos una variable global de lista de números y asignamos el método (que es un numero) junto a todos los demás parámetros. Pareciera que el arreglo de números es innecesario por que únicamente nos interesaría el primer número (que es el método) pero mi implementación no necesariamente debe de recibir estos parámetros, entonces si entramos al modulo usuario sin enviar las variables de paginación, en el constructor del controlador o bien en la función index establezco los valores por defecto si el arreglo de parámetros esta vacio, y además se utiliza el arreglo de números – porque en otras páginas podemos enviar un tercer parámetro de paginación, por ejemplo año.
Ahora, si el lector busca la optimización de recursos, el método sugerido es el siguiente:
public function _remap($method, $params = array()){ if(is_numeric($method)){ array_unshift($params, $method); return call_user_func_array(array($this, "index"), $params); }else{ return call_user_func_array(array($this, $method), $params); } }
Observamos ahora solo la utilización de la instrucción IF y una línea que almacena el valor entero del método al inicio del array de parámetros, luego únicamente la instrucción que hace la llamada al método index.
El método remap se explica por sí solo, algo más que puede servir de ayuda para ocultar al usuario la utilización de CodeIgniter es no mostrar el nombre del fichero index:
http://example.com/index.php/usuario/index/50/1
Esto, lo arreglamos con el siguiente código en el archivo .htaccess:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . / index.php [L] </IfModule>
No importa si tenemos instalado CodeIgniter en una subcarpeta, por ejemplo:
http://example.com/administrador/index.php/usuario/index/50/1
Para esto, el código seria el siguiente:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase /administrador/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /administrador/index.php [L] </IfModule>
Esto dará como resultado una URL como la siguiente:
http://example.com/administrador/usuario/index/50/1