Problema Con Permisos A Insertar,modificar,consultas Etc En Yii

Hola, yo necesito dar permisos segun perfil a usuarios. ejemplo operador tiene permisos solo de eliminar etc.

no creo poder usar el cruge para esto por que solo llama a una accion (actionIndex) y en esta hago todo. asi

public function actionIndex()

{


	$model=new AldiaMunicipios;





	// Uncomment the following line if AJAX validation is needed


	$this->performAjaxValidation($model);





            if(isset($_POST['nuevo'])){


                $this->redirect(array('index'));


            }





	if(isset($_POST['AldiaMunicipios']))


	{


                    if (isset($_GET['municipio_id'])){


                        $model= AldiaMunicipios::model()->findByPk($_GET['municipio_id']);


                        $model->municipio_fecha_ultima_modificacion=date("Y/m/d H:i:s");


                        $model->municipio_usr_ultimo_modificador=Yii::app()->user->id;


                    }


                    else{


                        $model->municipio_fecha_creacion=date("Y/m/d H:i:s");


                        $model->municipio_usr_creador=Yii::app()->user->id;


                    }


                    


                    


                    


                    


                    


                    


		$model->attributes=$_POST['AldiaMunicipios'];


                    if ($_POST['AldiaMunicipios']['municipio_usr_creador'])


                    $model->municipio_usr_creador=Yii::app()->user->id;


                    $model->municipio_activo=$_POST['AldiaMunicipios']['municipio_activo'];


                    $model->municipio_nombre=strtoupper($model->municipio_nombre);


                    


                    


                    


		if($model->save()){


                            Yii::app()->user->setFlash('info', '<strong>Transacción exitosa!</strong> Su registro ah sido grabado con exito.');


			//$this->redirect(array('index'));


                    }


	}





	$models=new AldiaMunicipios('search');


	$models->unsetAttributes();  // clear any default values


	if(isset($_GET['AldiaMunicipios']))


		$models->attributes=$_GET['AldiaMunicipios'];





            $dataProvider=new CActiveDataProvider('AldiaMunicipios');


	$this->render('index',array(


		'dataProvider'=>$dataProvider,


		'model'=>$model,


		'models'=>$models,


	));


}

y llama a la siguiente vista:

<?php

if(isset($_GET[‘municipio_id’])){

&#036;consulta=AldiaMunicipios::model()-&gt;findbypk(&#036;_GET['municipio_id']);

}

?>

<div id="tabulaciones_in">

<h4>Remesa</h4>

<ul class="nav nav-tabs">

&lt;li class=&quot;active&quot;&gt;&lt;a href=&quot;#pane1&quot; data-toggle=&quot;tab&quot;&gt;Datos Generales&lt;/a&gt;&lt;/li&gt;


&lt;li&gt;&lt;a href=&quot;#pane2&quot; data-toggle=&quot;tab&quot;&gt;Consultar&lt;/a&gt;&lt;/li&gt;








&lt;li class=&quot;dropdown pull-right&quot;&gt;&lt;a href=&quot;#&quot; data-toggle=&quot;dropdown&quot; class=&quot;dropdown-toggle&quot; rel=&quot;tooltip&quot; title=&quot;Enlaces&quot;&gt;


        &lt;i class=&quot;icon-tags&quot;&gt;&lt;/i&gt;&lt;span class=&quot;caret&quot;&gt;&lt;/span&gt;


    &lt;/a&gt;


    &lt;ul class=&quot;dropdown-menu submenu-show submenu-hide&quot;&gt;


        &lt;li&gt;&lt;a href=&quot;#&quot; tabindex=&quot;-1&quot;&gt;Uno&lt;/a&gt;&lt;/li&gt;


    &lt;li&gt;&lt;a href=&quot;#&quot; tabindex=&quot;-1&quot;&gt;Dos&lt;/a&gt;&lt;/li&gt;


    &lt;li&gt;&lt;a href=&quot;#&quot; tabindex=&quot;-1&quot;&gt;Tres&lt;/a&gt;&lt;/li&gt;


    &lt;/ul&gt;


&lt;/li&gt;


&lt;li class=&quot;pull-right&quot;&gt;&lt;a href=&quot;#pane3&quot; data-toggle=&quot;tab&quot; rel=&quot;tooltip&quot; title=&quot;Documentación del Módulo&quot;&gt;


        &lt;i class=&quot;icon-cloud&quot;&gt;&lt;/i&gt;


    &lt;/a&gt;


&lt;/li&gt;


&lt;li class=&quot;pull-right&quot;&gt;&lt;a href=&quot;#&quot; data-toggle=&quot;tab&quot; rel=&quot;tooltip&quot; title=&quot;Agregar a mis favoritos&quot;&gt;


        &lt;i class=&quot;icon-star-empty&quot;&gt;&lt;/i&gt;


    &lt;/a&gt;


&lt;/li&gt;

</ul>

<div class="tab-content">

  &lt;?php

//for ($i=0;$i<sizeof($apermisos);$i++){

//

//// echo “nombre:”.$apermisos[$i][‘act_nombre’];

//// echo "<br>";

//// echo “codigo:”.$apermisos[$i][‘act_codigo’];

//// echo "<br>";

//

//

//

//

//}

  ?&gt;


  


    &lt;div id=&quot;pane1&quot; class=&quot;tab-pane active&quot;   


  


        &lt;?php 


        


            if (isset(&#036;consulta))


                echo &#036;this-&gt;renderPartial('_form', array('model'=&gt;&#036;consulta));


            else


                echo &#036;this-&gt;renderPartial('_form', array('model'=&gt;&#036;model)); 


        ?&gt;


   


   &lt;/div&gt;


  





&lt;div id=&quot;pane2&quot; class=&quot;tab-pane&quot;&gt;


    &lt;?php &#036;this-&gt;renderPartial('_search',array('models'=&gt;&#036;models,)); ?&gt;


&lt;/div&gt;  


&lt;div id=&quot;pane3&quot; class=&quot;tab-pane&quot;&gt;


    Aca van los informes generados por cada usuario


&lt;/div&gt;

</div><!-- /.tab-content -->

</div>

que tiene unas pestañas donde llama al formulario, otra llama al buscar etc.

lo que quiero es que segun los permisos deje insertar, ver una consulta, ver otro cunsulta. sin salir de la misma pantalla.

4272

imagen.jpg

Hola,

Que estas usando para manejar los permisos del usuario?

Dependiendo de como lo uses, ya sea una extensión (propia o externa de yii) o código tuyo, puedes usar algún parámetro para hacer un condicional y tomar una determinada acción, ya sea en la vista o el controlador, es decir, puedes hacer un condicional en la vista para saber si se debe imprimir determinado código como por ejemplo opción de eliminar, e igual en el controlador para saber si un usuario puede ejecutar la parte de eliminar, etc.

Aunque lo que estas haciendo es poco ortodoxo, sobre todo mezclar varias acciones en una sola estoy seguro que poco a poco van a ir saliendo mejores códigos en yii :D

saludos.

si yo se que condiciones eso se puede manejar pero la idea es sacarle el mejor provecho a yii. ese codigo ya estaba asi cuando vine ya que lo habia hecho otro ing (todo en una accion) yo quiero dividirlo por acciones para usar el (cruge) pero como hago para que solo una vista tenga cada pestaña con renderPartial diferentes y que use varias acciones a la vez para ir quitando permisos por acciones.

soy nuevo nada mas llevo 1 semana en yii y no doy con la logica de como hacerlo.

Lo bueno yii es que no te limita mucho y hasta podrías hacer todo un sistema en una sola acción, todo es cuestión de gustos y de que funcione dicen algunos.

Nunca he usado el "cruge" pero preguntandole a google me dice lo siguiente:

La cuestión es que RBAC es nativa de yii y eso si que lo he usado en algún momento.

Dado entonces, si podrías usar la extensión cruge para registrar usuarios, asignarles roles y todo relacionado.

Mientras no implementes el siguiente código en los controladores cruge no filtrara los usuarios por controlador o acciones.




<?php

   ..cuerpo de tu controladora...

   public function filters()

   {

      return array(array('CrugeAccessControlFilter'));

   }

   ..cuerpo de tu controladora...

?>



Retomando lo del condicional con RBAC (ó cruge) puedes saber si un usuario tiene un determinado rol con la siguiente sentencia


Yii::app()->user->checkAccess('eliminar')

eso verificar que el usuario tiene el rol ‘eliminar’ asociado y retorna true o false dependiendo del caso.

Esta ese método si quieres salir por el camino fácil, una acción podría tener varias vistas o una vista podría tener varias acciones dependiendo de que tanto te quieres complicar, el caso mas sencillo de manejar es donde una acción tiene una sola vista y viceversa.

Veo que en el ejemplo que pones los formularios se manejan por algún script que cambia de pestaña, podrías manipular el script para que responda con un sumit a acciones diferentes cada ves que le des click a alguna pestaña. también existe la posibilidad de que los botones respondan a diferentes acciones en una vista.

En fin todo depende por donde te quieras ir y también que modulo de usuarios este manejando el sistema si es que tiene uno implementado.

Te dejo un link de donde saque parte de la información de cruge wiki cruge

Saludos.

ok dice "vista podría tener varias acciones" el problema es que yo no se, soy nuevo en yii. en caso de que puedas pasame un codigo para guiarme. la teoria que has dicho esta bien y yo sabia que asi trabajaba cruge etc. pero si necesito algo mas puntual como, poder hacer eso con codigo puedo hacer eso y que funcione.

me imagino que tu tienes exp en yii y sabes mas que yo sobre el tema y sobre el codigo de yii. necesito codigo guia puntual.

okokokok

Veamos, primero no me atreví a escribir ningún código sobre lo que ya tienes porque veo que la aplicación usa el framework css Bootstrap, yii tiene extensiones para manejar bootstrap, pero el que implementa el código que plasmaste lo hace de forma tradicional, cosa que no esta mal ya que yii permite trabajar con cualquier librería así no este diseñada para este framework, la cosa es que esto es otro tema, de como el ing diseño la vista, por eso a lo que vamos, como comunicarte con los controladores en yii.

En yii las vistas se comunican con los controladores principalmente por medio de links o formularios.

Una de las tantas sintaxis para crear un link es la siguiente:




<?php echo CHtml::link('Controlador prueba',array('prueba')); ?>



Esta es otras de las tantas para crear un botón de submit en un formulario:




<?php echo CHtml::submitButton('Enviar'); ?>



Por defecto el boton submit envia los datos del formulario a la acción que llamo a la vista, si quieres cambiar a que accion enviar los datos agregale el siguiente parametro. (una de las tantas formas)




<?php echo CHtml::submitButton('Enviar',array('submit'=>Yii::app()->createUrl('controlador/accion'))); ?>



Después de la teoría te pongo un ejemplo donde dos acciones se comunican con una vista

supongamos que tenemos un controlador con el nombre controladorPrueba y en el hay dos acciones 1) prueba 2) test, y por ultimo tenemos una vista que se llama vistaprueba.

parte del código del controlador seria el siguiente:




//accion 1

	public function actionPrueba()	{


		$controlador = "prueba";


		$this->render('vistaprueba',array(

			'controlador'=>$controlador,

		));

	}

//accion 2

	public function actionTest()	{


		$controlador = "test";


		$this->render('vistaprueba',array(

			'controlador'=>$controlador,

		));

	}



Por otro lado tenemos el código de la vista




<h1><?php echo $controlador; ?></h1>


<!-- //link para accion prueba -->

<?php echo CHtml::link('Controlador prueba',array('controladorPrueba /prueba')); ?>


<!-- //link para accion test -->

<?php echo CHtml::link('Controlador test',array('controladorPrueba /test')); ?>




<div class="form">


	<?php $form=$this->beginWidget('CActiveForm', array(

		'id'=>'cruge-authitem-form',

		'enableAjaxValidation'=>false,

	)); ?>




	<?php echo CHtml::textField('textprueba', 'hola mundo'); ?>




	<div class="row buttons">


		<!-- // boton submit para accion prueba -->

		<?php echo CHtml::submitButton('Enviar prueba',array('submit'=>Yii::app()->createUrl("controladorPrueba /prueba"))); ?>


		<!-- // boton submit para accion test -->

		<?php echo CHtml::submitButton('Enviar test',array('submit'=>Yii::app()->createUrl("controladorPrueba /test"))); ?>

	</div>


<?php $this->endWidget(); ?>


</div><!-- form -->



Lo que hace el ejemplo básicamente es lo siguiente, los controladores envía la variable $controlador a la vista, la vista recibe este variable y la imprime como titulo, ademas la vista tiene dos link donde cada uno envía a una acción diferente (prueba o test) y también tiene dos botones submit donde cada uno envía los datos del formulario a acciones diferentes (prueba o test).

Mi consejo es que si le vas a hacer una reingenieria al controlador se la hagas también a la vista, y trabaja de una forma ordenada y fácil, trata en lo posible de que cada acción tenga una vista diferente, por lo menos hasta que le tengas mas confianza YII.

Saludos…