[Duvida] Colocar Layout Para Cada Modulo

Olá pessoal tudo bem??

Não sei se responderam a esta questão, procurei no forum, na internet e não achei nada, mas vamos a minha dúvida:

  • Vou começar a desenvolver onde existe 3 módulos: administrativo, delivery e financeiro.

e eu quero que cada módulo destes tenha um layout diferente.

O que eu ja fiz:

  • Mudei o caminho da variavel $layout no controler Default de cada modulo e nada;

  • Mudei o caminho da variavel $layout dentro do AdministrativoModule.php e os outros modulos no init() e nada;

  • Mudei o caminho da variavel path para $layoutPath = Yii::getPathOfAlias("administrativo.views.layouts")

no AdministrativoModule.php e outros modulos no init() e nada;

Agora a fonte secou… não sei mais o que fazer.

Se alguem puder me ajudar, eu agradeceria.

Att.

eu usei isto num projecto… ve se ajuda.





class AdminModule extends CWebModule

{

// ...


public function init()

	{

		setlocale( LC_TIME, Yii::app()->params[ __CLASS__ ][ 'locale' ] );

		date_default_timezone_set( Yii::app()->params[ __CLASS__ ][ 'timezone' ] );


		// this method is called when the module is being created

		// you may place code here to customize the module or the application


		// import the module-level models and components

		$this->setImport( array(

			'application.models.*',

			'admin.models.*',

			'admin.messages.*',

			'admin.components.*'

		) );


		$this->setComponents( array(

			'admin' => array(

				'class'          => 'CWebUser',

				'stateKeyPrefix' => md5( Yii::app()->getBaseUrl( true ) . '/admin' ),

				'allowAutoLogin' => false,

				'loginUrl'       => Yii::app()->createUrl( 'admin' )

			)

		) );


		$this->layoutPath = Yii::getPathOfAlias('admin.views.layouts');

		//$this->layoutPath = "/protected/modules/admin/views/layouts";

		$this->layout     = 'main';


		// re-set return url to already set value, or if none default from the config

		$this->admin->setReturnUrl( $this->admin->getReturnUrl( Yii::app()->createUrl( 'admin/' . Yii::app()->params[ __CLASS__ ][ 'returnUrl' ] ) ) );

	}

}



Conseguir resolver!!

Em partes…

Para mudar o layout para cada módulo, fiz o seguinte:

  1. Dentro do Modulo administrativo, na pasta de views criei uma pasta chamada layouts

e criei um arquivo chamado main.php para ser o layout principal deste módulo.

  1. depois fui no arquivo de configuração da aplicação que fica em seuapp/protected/config/main.php, e

lá na parte de configuração dos módulos e especifiquei o caminho dos layout para o módulo administrativo:




'modules'=>array(

		// uncomment the following to enable the Gii tool

		'administrativo' => array('layoutPath' => 'protected/modules/administrativo/views/layouts'),

                'delivery',

                'financeiro',

		'gii'=>array(

			'class'=>'system.gii.GiiModule',

			'password'=>'***',

			// If removed, Gii defaults to localhost only. Edit carefully to taste.

			'ipFilters'=>array('127.0.0.1','::1'),

                        'generatorPaths'=>array('bootstrap.gii'),

		),

		/**/

	),



E depois dentro de cada controler do modulo administrativo, alterei o valor da variavel $layout para o layout

que eu queria:




class ProdutosController extends Controller

{

    public $layout = "main";

    

    [... metodos/actions da classe]

}



E Sussa!! Funfou!!

ENTÃO, QUAL É O PROBLEMA??

  • O novo problema agora é ter que alterar a variavel em cada controller. Isso é bom e ruim. BOM, pois você pode alterar o layout para cada controller e RUIM pois se você for usar um layout para cada modulo, você tem que ficar setando na mão em cada controller o layout do módulo. No meu caso eu vou usar um mesmo layout para todos os controller do mesmo modulo e gostaria de saber se tem algum meio de especificar em um lugar o layout padrão do módulo??

Tentei fazer o que esta no codigo abaixo e nao funcionou. alguma sugestão galera??




'modules'=>array(

		// uncomment the following to enable the Gii tool

		'administrativo' => array(

                                         'layoutPath' => 'protected/modules/administrativo/views/layouts',

                                         'layout' => 'main'

                                         ),

                'delivery',

                'financeiro',

		'gii'=>array(

			'class'=>'system.gii.GiiModule',

			'password'=>'***',

			// If removed, Gii defaults to localhost only. Edit carefully to taste.

			'ipFilters'=>array('127.0.0.1','::1'),

                        'generatorPaths'=>array('bootstrap.gii'),

		),

		/**/

	),



Duardaum,

Se você não setar nenhum layout para os módulos, ele vão buscar o layout inicial que fica na pasta /protected/views/layout.

Agora se cada modulo terá um layout diferente, o jeito que está fazendo é o correto.

Não achei onde faz isso mas, coloquem o tópico como RESOLVIDO

Pode usar o conceito de themes do yii que funciona perfeitamente. So informar o theme no Module.php dentro da pasta do seu modulo.

Como provavelmente os módulos possuem comportamentos diferentes, você poderia criar uma camada de abstração nos controladores pra cada módulo. Exemplo:




class AdminController extends Controller {

    public $layout = "main";

}



E a partir de agora os seus controladores do módulo de Administração passam a estender de AdminController, sem perder as propriedades de Controller:




class ProdutosController extends AdminController {

    // seu objeto já possui $layout = 'main' herdado de AdminController

    // E vc ainda tem a liberdade de mudar, caso tenha algum caso especial.

}



ps.: sou novo no Yii, então talvez tenha alguma solução melhor ou impedimento de usar este formato. Mas achei interessante postar pois vi que talvez poderia te ajudar, pois já usei esse formato em outros frameworks.