2012-11-01 13 views
3

Я пытаюсь пропустить имена моих файлов модели в yii, чтобы я мог автоматически заполнить систему ссылок в моей секции admin. В принципе, если я перехожу к генератору Gii и создаю новый раздел CRUD, я хочу, чтобы он взял имя модели и добавил ссылку на эту определенную домашнюю страницу CRUD.Как вы просматриваете модели в структуре yii?

Это то, что я до сих пор на моем администратора домашней странице:

<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> 

так, что я бы просто изменить «компания» и названия «Галерея» в переменную, которая захватывает имена модели и перейдем к этому, вопрос в том, как я буду заниматься этим?

ответ

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. 
+0

Таким образом, я получил правильный путь. Вот как я решил это: в моем контроллере я обернул верхний код в функцию, изменил путь к моделям, которые я искал, также пришлось изменить '.php' только на' php'; то я написал этот скрипт в представлениях ' links(); ?> $ файл):>

  • Edit
  • 'и теперь он отлично работает, спасибо –

    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"; 
        } 
    } 
    

    Следующим шагом является deretmine все модели, которые заявлены в приложении:

    $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 и реализовать этот метод по своему вкусу и добавить дополнительный метод для получения текста ссылки.

    По соображениям производительности вы также можете попытаться кэшировать полученный список административных ссылок, используя caching features provided by Yii.

    +0

    Благодарим за ответ, у меня есть пара вопросов. (Новый для Yii), какой файл я должен добавить в скрипт класса «Расширение базы BaseModel», а также для двух нижних скриптов? Я также поместил BaseModel в папку компонентов, как вы предложили. Также моя папка администратора находится внутри папки модулей. (если это помогает) –

    +0

    Вы помещаете 'class Company extends BaseModel' в файл' models/Company.php' вашего приложения. Каталог 'models' - это то, где ваши классы моделей хранятся по умолчанию. Вы также можете объединить два нижних скрипта вместе и поместить их в некоторый файл 'controller/AdminController.php' как метод' AdminController' class, который вы будете вызывать каждый раз, когда вам нужно подготовить админ-ссылки для представления. – Ezze

    +0

    Кстати, я написал фрагменты кода, полагая, что используемые 'components',' contollers' и 'models' находятся в каталоге' protected' приложения. Если вы используете модуль для организации ваших котроллеров и моделей, то все работает и для модулей - вам нужно только изменить соответствующие пути: http: // www.yiiframework.com/doc/guide/1.1/en/basics.module – Ezze

    Смежные вопросы