代码之家  ›  专栏  ›  技术社区  ›  Mez

如何找到具有具体继承的推进模型的子类列表

  •  0
  • Mez  · 技术社区  · 14 年前

    我正在为我当地的慈善机构建立一个迷你cms(是的,我知道我可以使用牙线项目,但他们需要定制编码)

    我的架构当前看起来例如:-

    <?xml version="1.0" encoding="UTF-8"?>
    <database name="sja" defaultIdMethod="native">
        <table name="section">
            <column name="id" type="INTEGER" primaryKey="true" required="true" autoIncrement="true" />
            <column name="title" type="VARCHAR" required="true" />
            <column name="slug" type="VARCHAR" required="true" />
        </table>
        <table name="page">
            <column name="id" type="INTEGER" primaryKey="true" required="true" autoIncrement="true" />
            <column name="title" type="VARCHAR" required="true" />
            <column name="section_id" type="INTEGER" required="true" />
            <foreign-key foreignTable="section">
                <reference local="section_id" foreign="id" />
            </foreign-key>
        </table>
        <table name="static_page">
            <behavior name="concrete_inheritance">
                <parameter name="extends" value="page" />
            </behavior>
            <column name="content" type="LONGVARCHAR" required="true" />
        </table>
        <table name="home_page">
            <behavior name="concrete_inheritance">
                <parameter name="extends" value="page" />
            </behavior>
            <column name="standfirst_title" type="VARCHAR" />
            <column name="standfirst_image" type="VARCHAR" />
            <column name="standfirst_content" type="VARCHAR" />
        </table>
    
    </database>
    

    我希望能够得到一个包含“主页”和“静态页面”的列表,而无需在添加新页面类型时手动创建。

    有没有一个简单的方法可以得到这样一个列表,或者我必须写一些关于反射类的神奇的东西,等等?

    1 回复  |  直到 14 年前
        1
  •  0
  •   Mez    14 年前

    在一个正确的方向戳从#推进自由节点-我已经提出了一个基本的概念-还没有测试它

    function getSubClasses()
    {
        $map = $this->getDatabaseMap();
        $children = array();
        foreach ($map->getRelations() AS $relation)
        {
            $behaviours = $relation->getRightTable()->getBehaviours();
    
            if (issset($behaviours['concrete_inheritance']['extends']) AND $behaviours['concrete_inheritance']['extends'] == $this->getDatabaseMap()->getClassName())
            {
                $children[] = $relation->getRightTable()->getClassName();
            }
        }
        return $children;
    }