Problema con render_partial

edited noviembre 2007 in Desarrolladores
Como está implementado render_partial en este momento, no funciona cuando se quiere mostrar un partial de un controlador distinto del activo, debido al codigo siguiente:
function render_partial(){
$params = get_params(func_get_args());
if(isset($params)) {
$controller_name = uncamelize($params);
}elseif(preg_match("/^(.+)\/(.+)$/", $params[0], $data)) {
...
Fijense que si se pasa un parametro con nombre 'controller' para especificar que el partial es de otro controller, no se le asigna ningun valor a la variable $partial_view, y se lanza la excepcion que no se encontro la vista, esto se podría solucionar así:
...
if(isset($params)) {
$controller_name = uncamelize($params);
$partial_view = uncamelize($params);
//$partial_view = uncamelize($params);
}elseif(preg_match(
...

Comentarios

  • Lo probaste y te funciona?
    ya esto fue solucionado en la version 0.5...

    Gracias...
  • edited 6:28
    Lo probé y me funciona bien.
    El fragmento de codigo que puse arriba, es de la versión 5 que la bajé del svn ayer, si te fijas en el código verás lo que digo arriba
  • Perfecto realmente no hemos querido incorporarle nada nuevo a la versión 0.4x ya que seria muy recursivo cada vez que se agregue algo a la versión posterior retroceder a la versión anterior, todo lo nuevo viene para la versión 0.5...

    Éxito..
  • edited 6:28
    Al parecer no me he explicado bien, estoy probando la version 05, y no me funciona bien cuando trato de mostrar una vista parcial de otro controlador, revisé el código del render_partial, y me di cuenta que cuando se pasa un parámetro con nombre 'controller', no se le asigna un valor a la variable $partial_view, por lo que en este caso no muestra esa vista parcial, le añadí una línea de código, y funciona bien, al menos con las pruebas que hice.
  • Ah ok perfecto ahora si entiendo pensé que hablabas de la versión 0.4X que bueno que se halla encontrado un Bug y que este gracias a ti se pueda solucionar voy a revisar el problema y luego realizo los cambios que tu propones, Gracias...

    Éxitos...
  • Que raro, lo acabo de probar y funciona.

    Si te fijas bien:
    function render_partial(){
    	$params = get_params(func_get_args());
    
    	if(isset($params['controller'])) {
    		$controller_name = uncamelize($params['controller']);
    	}elseif(preg_match("/^(.+)\/(.+)$/", $params[0], $data)) {
    		$controller_name = $data[1];
    		$partial_view = $data[2];
    	} else {
    		$controller_name = Router::get_controller();
    	}
    
            /** fijate aqui  **/
    	if(!isset($partial_view)) $partial_view = $params[0];
    
    	$views_dir = Kumbia::$active_views_dir;
    	$partial_file = join_path($views_dir, $controller_name, "_$partial_view.phtml");
    	
    	if(file_exists($partial_file)){
    		if(is_array(Kumbia::$models)){
    			foreach(Kumbia::$models as $model_name => $model){
    				$$model_name = $model;
    			}
    		}
    		
    		if(is_subclass_of(Dispatcher::get_controller(), "ApplicationController")){
    			foreach(Dispatcher::get_controller() as $var => $value) {
    				$$var = $value;
    			}
    		}
    
    		if(isset($params[1])) $$partial_view = $params[1];
    		include $partial_file;
    	} else {
    		throw new kumbiaException('Kumbia no puede encontrar la vista parcial: "'.$partial_view.'"', 0);
    	}
    }
    

    Fijate, la linea:
    if(!isset($partial_view)) $partial_view = $params[0];

    Cubre el caso del que hablas.

    De cualquier forma aun estan en fase de desarrollo, hay que agregar el soporte para los archivos .tpl

    Saludos.
  • edited 6:28
    El caso que tu dices, no es del que yo hablo,
    yo hablo del caso que se pase el parametro con nombre 'partial_view', y 'controller', si traceas el código, en ese caso, a $partial_view no se le asigna nada hasta llegar a la linea que tu mencionas, en ese linea, se le asigna el primer parámetro que perfectamente puede ser el nombre del controlador, y a la hora de incluir el fichero no lo encontraría
  • Te refieres a efectuar lo siguiente
    render_partial('controller: mi_controlador', 'partial_view: mi_partial');
    

    En ese caso tienes toda la razon, no esta contemplado.

    Ya lo resolvi.

    Ahora se puede hacer de las siguientes maneras:
    render_partial('mi_partial', $data);
    render_partial('partial_view: mi_partial', $data);
    render_partial('mi_controller/mi_partial', $data);
    render_partial('controller: mi_controller', 'mi_partial', $data);
    render_partial('controller: mi_controller', 'partial_view: mi_partial', $data);
    

    Esta para todos los gustos.

    Ya subi el cambio al svn.

    Pruebenlo a ver que tal funciona.

    Saludos.
Sign In or Register to comment.