как подключить для каждого модуля отдельный config.php

каким образом можно сделать подключение конфигурационного файла внутри каждого модуля, хотелось примерно так, допустим имеется модуль News который расположен в директории modules/news/ и нужно чтобы конфигурационный файл лежал тут modules/news/config.php или тут modules/news/config/main.php в котором будет находится массив настроек, хранение также как и /protected/config/params.php

в каком месте модуля подключить этот конфигурационный файл?


$config = require(YiiBase::getPathOfAlias('application.modules.news')'/config.php'); 

Наверное стоит сделать это в начале метода init(), воспользовавшись методом configure().

спасибо, только всё же не понятно как этим воспользоваться, может есть где пример ?

сейчас у меня NewsModule.php выглядит таким образом, что нужно сделать?


<?php


class NewsModule extends CWebModule

{

   

	public function init()

	{


		$this->setImport(array(

			// 'news.models.*',

			// 'news.components.*',   


			$this->id . '.models.*',

			$this->id . '.components.*',


		));


	

	}


	public function beforeControllerAction($controller, $action)

	{  

		if(parent::beforeControllerAction($controller, $action))

		{  

  			return true;

		}

		else

			return false;

	}

}

пока не очень ориентируюсь в api, попробую сейчас поискать на форуме может где уже обсуждалось

В начале метода init() вставить следующие строки:




$config = require dirname(__FILE__).DIRECTORY_SEPARATOR.'config.php';

$this->configure($config);



сделал


	public function init()

	{

		$config = require dirname(__FILE__).DIRECTORY_SEPARATOR.'config.php';

		$this->configure($config);


		// import the module-level models and components

		$this->setImport(array(

			$this->id . '.models.*',

			$this->id . '.components.*',


		));


	}

и создал файл

protected/modules/news/config.php

сейчас он подключается, но когда указываю


<?php

return array(

	'title'=>'My module News',

);

?>

выдаётся такая ошибка


Не определено свойство "NewsModule.title".

но прописывать каждое свойство так в классе NewsModule

public $title = ‘’;

не совсем удобно, можно как-то 1 раз определить массив?

так не получается

public $config = array();

да и как я понял получать значения после можно как-то так?


Yii::app()->controller->module->config->title

и ещё раз благодарю за помощь

Ошибка выдается по делу, потому что метод configure() как раз и пытается присвоить значение свойству title, которого нет.

Если у вас так много свойств, то могу предложить перегрузить метод __get() и __set() примерно так:




class NewsModule extends CWebModule

{

    private $_config = array();


    public function __get($name)

    {

        if (array_key_exists($name, $this->_config))

            return $this->_config[$name];

        else

            return parent::__get($name);

    }


    public function __set($name, $value)

    {

        if (array_key_exists($name, $this->_config))

            $this->_config[$name] = $value;

        else

            parent::__set($name, $value);

    }

}



В этом случае можно будет обращаться к значению title так: Yii::app()->controller->module->title.

спасибо большое за помощь, попытался сделать как вы написали, к последнему примеру изменил для функции init() такие строчки


	   	$_config = require dirname(__FILE__).DIRECTORY_SEPARATOR.'config.php';

	   	$this->configure($_config);

но всё же ошибка появлялась та же самая нет определения title и указывала на строку


 parent::__set($name, $value);

Вообщем, решил сделать отдельным компонентом, который подгружает конфиги каждого модуля, название модуля является массивом, а его параметры элементами, вот что получилось:

подключаем компонент в главном конфиге

protected/config/main.php


'components'=>array(


	'par'=>array(

		'class'=>'application.extensions.par.par',

	 ),

),



компонент загружаем в директорию расширений

protected/extensions/par/par.php


class Par extends CApplicationComponent

{


	public function loadParams()

	{

	   $dir = YiiBase::getPathOfAlias('application.modules');

	   $dh  = opendir($dir);

	   $files = array();

	   while (false !== ($filename = readdir($dh))) 

	   {

		  if ($filename != '.' && $filename != '..')

		  {

			 if (is_dir($dir.'/'.$filename))

			 {

				 Yii::app()->setParams(

				     array(

					   $filename => require($dir.'/'.$filename.'/config.php')

					 )

				 );

			 }	

		  }

	   }

	}


}

в главном базовом контролере загружаем конфиги

protected/components/BaseController.php


class BaseController extends CController { 

		public function init() 

		{				

				Yii::app()->par->loadParams();

		}

}

пример конфига

protected/modules/news/config.php


<?php

 return array(

	'title'=>'My module News'

);

пользуемся в любом месте приложения


echo Yii::app()->getParams()->news['title']; 

хотелось бы узнать у специалистов, правильно ли всё сделано, точнее в базовом контроллере правильно было подгружено? Так-то проверил всё работает вроде отлично

Извините, я в своем примере в методе __set небольшую глупость написал :) Проверка на array_key_exists там не нужна:




public function __set($name, $value)

{

    try

    {

        parent::__set($name, $value);

    }

    catch (CException $e)

    {

        $this->_config[$name] = $value;

    }

}




Здесь в массив $_config кидается всё, что не удалось присвоить обычным способом.

Что касается вашего примера, то на вкус и цвет, как говорится… но мне он кажется слишком уж неудобным:

  • Можно добавить название вашего компонента в секцию ‘preload’ основного конфига, а название метода loadParams() заменить на init(), тогда не нужно будет вручную делать вызов в контроллере.

  • Также кажется лишним проходить по всем модулям в папке modules.

спасибо, проверил теперь работает. Благодарю за разъяснения про preload, о нём я знал но не догадывался как им воспользоваться.

Оба варианта хороши, но пока остановился на своём варианте, поскольку я использую шаблонотизатор Smarty, то я могу передать массив в шаблон, один раз прописать строчку


$this->smarty->assign(array("config" => Yii::app()->params)); 



а в самом шаблоне использовать так


{$config.news.title}

насчёт прохода директории модулей, даже не знаю, думаю что модулей примерно 10-20 не слишком окажет нагрузку

хотя всё зависит от ситуации, в каждом из котором требует либо тот либо этот вариант

была мысля хранить конфиги в Бд, но передумал, как то не удобно, может просто дело привычки хранение в файлах…