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

モデルフォルダのコンテンツを取得するには、CFileHelper :: findFiles()を使用できます。

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

次に、結果にフィルターを適用できるため、設計されたモデルリストの目的とは関係がない可能性のあるこれらのモデルを除外します。

$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 に答える