понедельник, 14 декабря 2009 г.

Symfony: settings

Нередко требуется часть настроек из app.yml сделать редактируемыми в backend, напишем простенький класс.
Схема:
Config:
tableName: sf_config
columns:
id: { type: integer(4), primary: true, autoincrement: true }
name: { type: string(32) }
value: { type: string(32) }
description: { type: string(1024) }


Класс /lib/myConfig.class.php:
class myConfig extends sfConfig
{
public static function get($name, $default = null, $description = null)
{
if (!sfConfig::get($name))
{
$res = Doctrine::getTable('Config')->findOneByName($name);
if (!$res)
{
$c = new Config();
$c->setName($name);
$c->setValue($default);
$c->setDescription($description);
$c->save();
}
}

return (isSet(self::$config[$name]) ? self::$config[$name] : $default);
}

}


Данный класс не находя в настройках требуемого параметра, проверяет его наличие в таблице, и в случаее отсутствия добавляет его.

Фильтр /lib/filters/myConfigFilter.class.php:
class myConfigFilter extends sfFilter
{
public function execute ($filterChain)
{
$configs = Doctrine::getTable('Config')->findAll();
foreach ($configs as $config)
{
sfConfig::set($config->getName(), $config->getValue());
}
$filterChain->execute();
}
}


Фильтр экспортирует из БД настройки в sfConfig.

Добавляем в fontend/config/filters.yml

myConfig:
class: myConfigFilter


Используем:
$postDirName = sfConfig::get('sf_upload_dir').'/'.myConfig::get('posts_dir', 'posts');
'max_size' => myConfig::get('post_max_icon_size', '10', 'size in KBytes')*1024, //(10*1024=10KB in bytes)


Сгенерируем управление из backend
$ symfony doctrine:generate-admin backend Config


Используем backend_dev.php/config