私は以下を提案することができます。
最初に、基本モデルを作成します(たとえば、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が提供するキャッシュ機能を使用して、取得した管理リンクのリストをキャッシュすることもできます。