Archive for May, 2008

symfony 的 Admin Generator

Saturday, May 24th, 2008

前段时间对 Admin Generator 的深度使用,已经了解了 Admin Generator 的大部分功能,个人觉得这是一个非常有潜力的功能,这里分析一下 Admin Generator 的具体实现:

Admin Generator 的实现分两部分,第一部分是使用 symfony prople-init-admin apps modulename classname 命令将 \symfony\data\generator\sfPropelAdmin\default\skeleton 中的文件进行简单的预处理之后复制到 \apps\apps\modules\modulename\ 下面。

这一部分主要是用的 \symfony\data\tasks\ 中 sfPakePropelAdminGenerator.php 文件的 run_propel_init_admin() 函数完成的。

第二部分是在用户访问这个 modulename 的时候,缓存的生成,生成的过程会参考用户在 generator.yml 文件中的定义,这也是 Admin Generator 中最复杂的地方。

处理 Admin Generator 的类,被定义在:\symfony\data\config\ 的 config_handlers.yml 文件中

modules/*/config/generator.yml:
  class:    sfGeneratorConfigHandler

这个类位于 \symfony\lib\config\sfGeneratorConfigHandler.class.php,里面的这三行代码是关键

$generatorManager = new sfGeneratorManager();
$generatorManager->initialize();
$data = $generatorManager->generate($config['class'], $generatorParam);

这里的 $config['class'] 值为 sfPropelAdminGenerator, 调用的文件在 \symfony\lib\addon\propel\generator\sfPropelAdminGenerator.class.php 中。

进入 sfPropelAdminGenerator 以后的继承关系如下

sfPropelAdminGenerator
  sfPropelCrudGenerator
    sfAdminGenerator
      sfCrudGenerator
        sfGenerator

generate() 方法在 sfCrudGenerator 中,他调用 generatePhpFiles() 方法,将 \data\generator\sfPropelAdmin\default\template 目录下的文件解析并拷贝到 \cache\apps\dev\modules\auto*** 下面,第二部分完成。

这里举几个例子,对 generator.yml 文件中的配置信息进行具体的说明:

1、使用 display: [title, =content] 的时候,能够将字段的信息外面建一个到 edit 页面的链接。

在 \symfony\data\generator\sfPropelAdmin\default\template\templates\ 的 _list_td_tabular.php 文件中

<?php if ($column->isLink()): ?>
  <td>[?php echo link_to(
<?php echo $this->getColumnListTag($column) ?> ? <?php echo $this->getColumnListTag($column) ?> : __('-'), '<?php echo $this->getModuleName() ?>/edit?<?php echo $this->getPrimaryKeyUrlParams() ?>) ?]</td>
<?php else: ?>
  <td>[?php echo
<?php echo $this->getColumnListTag($column) ?> ?]</td>
<?php endif; ?>

这里的 $column->isLink() 方法在 \symfony\lib\generator\ 的 sfAdminGenerator.class.php 文件中,在这里执行的对“=”符号的判断:

public function isLink()
{
 
return (in_array('=', $this->flags) || $this->isPrimaryKey()) ? true : false;
}

2、使用 type: admin_double_list, params: through_class = sfGuardUserGroup 这样的形式建立一个多对多关系的编辑器:
在 \data\generator\sfPropelAdmin\default\template\templates\ 中的 _edit_form.php 文件中,用的 getColumnEditTag() 方法,getColumnEditTag() 方法位于 \symfony\lib\generator\ 的 sfAdminGenerator.class.php 文件中,在 getColumnEditTag() 方法中进一步调用的 getPHPObjectHelper() 方法,完成对一个“admin_double_list”属性的解析:

function getPHPObjectHelper($helperName, $column, $params, $localParams = array())
{
 
$params = $this->getObjectTagParams($params, $localParams);
 
return sprintf('object_%s($%s, \'%s\', %s)', $helperName, $this->getSingularName(), $this->getColumnGetter($column, false), $params);
}

生成在代码为:(其实是用的object_admin_double_list()函数来实现的这个多对多数据的编辑)

$value = object_admin_double_list($sf_guard_user, 'getGroups', array (
 
'control_name' => 'sf_guard_user[groups]',
 
'through_class' => 'sfGuardUserGroup',
));

symfony 的 eclipse 插件:symfoclipse

Tuesday, May 20th, 2008

symfony 中对 Admin Generator 功能的扩展

Sunday, May 18th, 2008

symfony 的config文件分层管理机制

Saturday, May 17th, 2008

symfony 的插件机制

Saturday, May 17th, 2008