3

我正在尝试遍历 yii 中我的模型文件的名称,以便我可以在我的管理部分中自动填充链接系统。基本上,如果我去 Gii 生成器并创建一个新的 CRUD 部分,我希望它采用模型名称并添加指向该特定 CRUD 主页的链接。

到目前为止,这是我在管理主页上的内容:

<li><a href="<?php echo Yii::app()->request->baseUrl; ?>/index.php/admin/company">Edit Company Information</a></li>
<li><a href="<?php echo Yii::app()->request->baseUrl; ?>/index.php/admin/gallery">Edit Gallery</a></li>

所以我只是将“公司”和“画廊”名称更改为一个变量,该变量获取模型的名称并循环通过它,问题是我将如何去做呢?

4

2 回答 2

3

You might use CFileHelper::findFiles() in order to get the contents of your models folder,

$filenames =CFileHelper::findFiles(Yii::getPathOfAlias("application.models"), array ( 
    'fileTypes'=> array('.php'),
  )
);

Next up you can apply a filter to the results, so you exclude these models which possibly have nothing to do with the purpose of your designed model list.

$modelNames = array();
foreach ($filenames as $filename)
{
  //remove off the path
  $file = end( explode( '/', $filename ) );
  // remove the extension, strlen('.php') = 4
  $file = substr( $file, 0, strlen($file) - 4);
  $modelNames[]=$file
}
//$modelNames holds all the names of the model files without paths or extensions.
于 2012-11-01T18:30:08.390 回答
2

我可以提出以下建议。

首先,您创建一个基本模型(例如,在components目录中),您的其他模型将来自:

class BaseModel extends CActiveRecord
{
    public static function getAdminRoute()
    {
        return null;
    }
}

静态getAdminRoute方法将为模型的管理页面提供 Yii 路由。你BaseModel像这样扩展:

class Company extends BaseModel
{
    public static function model($className = __CLASS__)
    {
        return parent::model($className);
    }

    public function tableName()
    {
        return "{{company}}";
    }

    public static function getAdminRoute()
    {
        return "admin/company";
    }
}

下一步是确定应用程序中声明的所有模型:

$models = array();
$modelsDir = Yii::getPathOfAlias("application.models");
$dh = opendir($modelsDir);
if ($dh !== false)
{
    $matches = array();
    while (($modelFileName = readdir($dh)) !== false)
    {
        if (preg_match("/^([A-Za-z0-9]+)\.php$/", $modelFileName, $matches))
            array_push($models, $matches[1]);
    }
    closedir($dh);
}

在检索到模型类列表(根据 Yii 命名约定文件的名称等于其类的名称)之后,您可以对其进行迭代并获取那些具有覆盖getAdminRoute方法的模型的管理链接:

$adminLinks = array();
foreach($models as $model)
{
    if (method_exists($model, "getAdminPage"))
    {
        $modelAdminRoute = $model::getAdminPage();
        if ($modelAdminRoute !== null)
            array_push($adminLinks, Yii::app()->createUrl($modelAdminRoute));
    }
}

当然,您可以根据自己的喜好省略admin部分并实现此方法,并添加一个额外的方法来获取链接的文本。getAdminRoute

出于性能原因,您还可以尝试使用Yii 提供的缓存功能缓存获得的管理链接列表。

于 2012-11-01T18:22:57.863 回答