error de modelos creo?

edited enero 2009 in Principiantes
Hola a todos, estoy trabajando menos de una semana con kumbia y esta espectacular, estoy creando una mejora al seguridad de los usuarios y de repente me sale un error tonto.

Notice: Undefined property: AccionesController::$Acciones in C:\wamp\www\adlog\library\kumbia\controller\standard_form\standard_form.php on line 168

Fatal error: Call to a member function find_first() on a non-object in C:\wamp\www\adlog\apps\default\controllers\application.php on line 56

lo particular que antes colocaba this->Usuario->findfirst($nick);
y en esa linea saltaba los errores de la misma indole
Mi tabla de Usuario es en singular por compartir DB con otro front-end


Aplication.php
<?php
   class ControllerBase {

                /**
                 * La accion por defecto es redirecionar a el controlador login
                 *
*/
        function init(){
            $this->route_to('controller: admin');
        }

        public  $before_filter = 'seguridad';
                /**
                 * Este metodo es llamado antes de ejecutar cualquier accion
                 * en cualquier controlador por Kumbia
                 *
                 * @param string $controlador
                 * @param string $acccion
*/
        public function seguridad(){
            $controlador = $this->controller_name;
            $accion = $this->action_name;
/**
 * El controlador login es el unico que no tiene validacion
 * $usuarios_id viene de la variable de sesión usuarios_id
 * creada en el controlador login/valida
*/
            $usuario_id = Session::get_data('usuario_id');
            if ($usuario_id!=null){
                $tipo = Session::get_data('usuario_tipo');
            }  else {
                return $this->route_to('action: index');
            }
/**
 * 
 * Si es de Tipo a tiene que tener permiso a TODO!
 * 
 */
         //   $tipo='A';
            if($controlador!='admin' && $tipo !='A'){
                $objacciones = $this->Acciones->find_first("nombre='$accion'");
                $tiene_permiso = $this->Permisos->count("controlador='$controlador' and
                                            acciones_id = '$objacciones->id' and
                                            usuario_id = '$usuario_id'");
                // Muestra un mensaje con la accion realizada
                flash::success('Accion: '.$objacciones->nombre);
/**
 * Si no tiene acceso ejecuta la accion no_acceso en el
 * controlador login
*/
                if(!$tiene_permiso){
                    $this->route_to('controller: admin', 'action: no_acceso');
                    return false;
                }else{
/**
* Revisa si el controlador es StandarForm y
* oculta los botones a los que no tiene acceso
*/
                    if(is_subclass_of($this, 'StandardForm')){
/**
*Traemos toda la tabla Acciones
*/
                        $objacciones = $this->Acciones->find();
                        foreach($objacciones as $objaccion){
/**
 * Por cada accion busco el regristo en la tabla permisos
 */
                            $objpermiso = $this->Permisos->find_first("controlador='$controlador' and
                                  usuario_id = '$usuario_id' and
                                  acciones_id = '$objaccion->id'");
                            flash::success($objaccion->nombre.' '.$objpermiso->estado);
/**
 * Si no existe o esta desactivado elimino el boton correspondiente
 */
                            if($objpermiso->estado=='D' or !$objpermiso->estado){
                                switch($objaccion->nombre){
                                    case 'insert':
                                    $this->unable_insert();
                                    break;
                                    case 'query':
                                    $this->unable_query();
                                    break;
                                    case 'browse':
                                    $this->unable_browse();
                                    break;
                                    case 'update':
                                    $this->unable_update();
                                    break;
                                    case 'delete':
                                    $this->unable_delete();
                                    break;
                                    case 'report':
                                    $this->unable_report();
                                    break;
                                }
                            }
                        }
                    }
                }
                echo "error";
            }
        }

    }
 
?>

y cuelgo los archivos de accione, solo por las dudas:
acciones_controler.php
<?php	
	class AccionesController extends StandardForm {
		public $scaffold = true;
		public function __construct(){

		}
	}
?>
acciones.php
<?php
	class Acciones extends ActiveRecord {
	}
?>

Comentarios

  • pero no deberías tocar la class ControllerBase... consulta el manual hay un ejemplo practico de como iniciarse...

    <!-- m --><a class="postlink" href="http://www.assembla.com/wiki/show/kumbia/indice-doc-05">http://www.assembla.com/wiki/show/kumbia/indice-doc-05</a><!-- m -->
  • edited 10:17
    Hola, ok, no sabia que no podía tocarla, entonces cree una clase abstracta de StandardForm e hice que todos mis formularios dependieran de ella.-
    una solución al estilo POO.
  • Bueno creo que debes explicar bien lo que estas haciendo para ayudarte, veo que estas haciendo cambios un poco extranos, ya existe una class StandardForm de hecho el controller que desees que genere formulario debe extends de esta super clase
  • edited 10:17
    Cree una clase llamada seguridad.php
    &lt;?php
    /**
     * PHP Template&#46;
     */
      
        abstract class seguridad extends StandardForm {
        
            public $template = &quot;menu&quot;;
       
            public function before_filter(){
                $controlador = $this-&gt;controller_name;
                $accion = $this-&gt;action_name;
    /**
     * El controlador login es el unico que no tiene validacion
     * $usuarios_id viene de la variable de sesión usuarios_id
     * creada en el controlador login/valida
    */
                $usuario_id = Session&#58;&#58;get_data('usuario_id');
                if ($usuario_id!=null ){
                    $tipo = Session&#58;&#58;get_data('usuario_tipo');
                } 
    
    /*            else {
                    $this-&gt;route_to('controler&#58;admin action&#58;index');
                    return false;
                }*/
    /**
     * 
     * Si es de Tipo a tiene que tener permiso a TODO!
     * 
     */
                $permisos='';
      //ESTA LINEA ES PARA DARLE PERMISOS A TODOS 
     //         $tipo='A';
                if($controlador!='admin' &amp;&amp; $tipo !='A'){
                    $objacciones = $this-&gt;Acciones-&gt;find_first(&quot;nombre='$accion'&quot;);
                    $tiene_permiso = $this-&gt;Permisos-&gt;count(&quot;controlador='$controlador' and
                                                acciones_id = '$objacciones-&gt;id' and
                                                usuario_id = '$usuario_id'&quot;);
                    // Muestra un mensaje con la accion realizada
                    flash&#58;&#58;success('Accion&#58; '&#46;$objacciones-&gt;nombre);
    /**
     * Si no tiene acceso ejecuta la accion no_acceso en el
     * controlador login
    */
                    if(!$tiene_permiso){
                        $this-&gt;route_to('controller&#58; admin', 'action&#58; no_acceso');
                        /**
                         * Guarda un registro de la negacion de permiso
                         * 
                         */
                        $this-&gt;Insertar($usuario_id, &quot;negado el permiso a $controlador / $objacciones-&gt;id&quot;);
                        return false;
                    }else{
                        
    /**
    * Revisa si el controlador es StandarForm y
    * oculta los botones a los que no tiene acceso
    */
                        if(is_subclass_of($this, 'StandardForm')){
    /**
    *Traemos toda la tabla Acciones
    */
                            $objacciones = $this-&gt;Acciones-&gt;find();
                            foreach($objacciones as $objaccion){
    /**
     * Por cada accion busco el regristo en la tabla permisos
     */
                                $objpermiso = $this-&gt;Permisos-&gt;find_first(&quot;controlador='$controlador' and
                                      usuario_id = '$usuario_id' and
                                      acciones_id = '$objaccion-&gt;id'&quot;);
                                
                         //       flash&#58;&#58;success($objaccion-&gt;nombre&#46;' '&#46;$objpermiso-&gt;estado);
    /**
     * Si no existe o esta desactivado elimino el boton correspondiente
     */
                                if($objpermiso-&gt;estado=='D' or !$objpermiso-&gt;estado){
                                    $permisos += $objpermiso-&gt;nombre&#46;'/';
                                    switch($objaccion-&gt;nombre){
                                        case 'insert'&#58;
                                        $this-&gt;unable_insert();
                                        break;
                                        case 'query'&#58;
                                        $this-&gt;unable_query();
                                        break;
                                        case 'browse'&#58;
                                        $this-&gt;unable_browse();
                                        break;
                                        case 'update'&#58;
                                        $this-&gt;unable_update();
                                        break;
                                        case 'delete'&#58;
                                        $this-&gt;unable_delete();
                                        break;
                                        case 'report'&#58;
                                        $this-&gt;unable_report();
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    $this-&gt;Insertar($usuario_id, &quot;Accedio a $controlador / $objacciones-&gt;id &#58; $permisos&quot;);
    
                    echo &quot;error&quot;;
                }else{ 
                    if ($tipo='A'){
                      //  $t = new Testigo();
                        $this-&gt;Insertar($usuario_id, &quot;Accedio a $controlador /   $accion como Administrador&quot;);
                      //  $t-&gt;Insertar($usuario_id, &quot;Accedio a $controlador / $objacciones-&gt;id como Administrador&quot;);
                    }
                }
            }  
            public function Insertar($user, $mensaje){
                $t = new testigo();
                        
                $t-&gt;usuario_id = $user;
                // Flash&#58;&#58;notice(&quot;usuario $t-&gt;usuario_id / $user&quot;);  
                $t-&gt;descripcion = $mensaje;
                $t-&gt;save();
                        
            }        
        }
    ?&gt;
    
    
    Y mis tablas de datos son:
    CREATE TABLE `acciones` (
      `id` int(11) NOT NULL auto_increment,
      `nombre` varchar(45) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;
    
    
    CREATE TABLE `permisos` (
      `id` int(11) NOT NULL auto_increment,
      `controlador` varchar(30) NOT NULL,
      `acciones_id` int(11) NOT NULL,
      `usuario_id` int(11) NOT NULL,
      `estado` char(1) default NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=44 ;
    
    
    
    CREATE TABLE `usuario` (
      `id` int(11) NOT NULL auto_increment,
      `nick` varchar(20) NOT NULL,
      `Nombre` varchar(50) NOT NULL,
      `pass` varchar(40) NOT NULL,
      `nivel` bigint(20) NOT NULL default '0',
      `logia_id` int(11) unsigned NOT NULL COMMENT 'logia que administra',
      `tipo` char(1) NOT NULL default 'U',
      PRIMARY KEY  (`id`),
      UNIQUE KEY `nick` (`nick`),
      KEY `adlogia` (`logia_id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
    
    

    Y hay por ahi una testigo-> insertar que me lleva un log.
    el problema cuando cargo un usuario que no es de 'A' (administrador) me salta el siguiente error
    Notice&#58; Undefined property&#58; MiembroController&#58;&#58;$Acciones in C&#58;\wamp\www\adlog\library\kumbia\controller\standard_form\standard_form&#46;php on line 168
    
    Fatal error&#58; Call to a member function find_first() on a non-object in C&#58;\wamp\www\adlog\apps\default\controllers\seguridad&#46;php on line 36
    
    la linea 36 es $this->Acciones->find_first("nombre='$accion'");
    y pasa ese error con le primer find_first que ponga en el programa de la tabla que sea.-
    Los ActiveRecord son generados automáticamente.-
    los CRUD son generados por el sistema y hago que sean extends de la clase seguridad.-
  • Creo que mas que copiar el codigo (que es importante) seria mas importante aun, que expliques que deseas hacer?
    creo que por este punto es mas importante...
  • edited 10:17
    estoy haciendo un sistema de administración de socios, el cual tiene varias sucursales donde un miembro, pertenece a cada sucursal. A esto cada sucursal tiene administradores, secretarios y tesoreros donde SOLO pueden modificar y/o cierta parte de los datos. Por eso estoy readaptando el sistema de seguridad del ejemplo. el problema radica que la clase seguridad no me deja consultar las tablas y por ello no puedo ver accionar la seguridad, si el usuario es de tipo 'A' es administrador y por lo cual se le debe dar permiso full sin controlar permisos. los administradores no hay problemas son los otros usuarios que falla.
  • edited 10:17
    Por si no lo haz solucionado.

    Me tocó a mi este problema, pues la aplicación funcionaba bien en 0.47 pero en 0.5 no.

    La clase no da accesos a los modelos, algo se cambió y debe ser así.
    $Acciones = new Acciones();
             $Permisos = new Permisos();
            	 
             $objacciones = $Acciones-&gt;find_first(&quot;nombre= '$accion'&quot;);
    
    

    Eso resuelve el problema.
Sign In or Register to comment.