【问题标题】:How do you loop through the models in the yii framework?你如何循环遍历 yii 框架中的模型?
【发布时间】:2012-10-22 08:19:19
【问题描述】:

我正在尝试在 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>

所以我只需将“公司”和“画廊”名称更改为获取模型名称并循环遍历的变量,问题是我将如何执行此操作?

【问题讨论】:

    标签: php frameworks yii


    【解决方案1】:

    我可以提出以下建议。

    首先,您创建一个基本模型(例如,在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));
        }
    }
    

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

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

    【讨论】:

    • 感谢您的回复,我只是有几个问题。 (Yii 新手)我将“class Company extends BaseModel”脚本放入什么文件,底部的两个脚本也是如此?我还按照您的建议将 BaseModel 放在了组件文件夹中。我的管理文件夹也放在模块文件夹中。 (如果有帮助的话)
    • 您将class Company extends BaseModel 放入应用程序的models/Company.php 文件中。 models 目录是默认存储模型类的位置。您还可以将两个底部脚本合并在一起,并将它们作为 AdminController 类的方法放在某个 controllers/AdminController.php 文件中,每次需要为视图准备管理链接时都会调用该方法。
    • 顺便说一下,我编写了sn-ps代码,假设使用componentscontollersmodels位于应用程序的protected目录中。如果您使用模块来组织您的控制器和模型,那么所有模块也适用 - 您只需修改相应的路径:yiiframework.com/doc/guide/1.1/en/basics.module
    【解决方案2】:

    您可以使用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.
    

    【讨论】:

    • 这种方式让我走上了正确的道路。这就是我解决它的方法:在我的控制器中,我将顶部代码包装在一个函数中,将路径更改为我正在寻找的模型,还必须将 .php 更改为 php;然后我在视图&lt;?php $filenames = $this-&gt;links(); ?&gt; &lt;?php foreach($filenames as $key =&gt; $file): ?&gt; &lt;?php $info = pathinfo($file);?&gt; &lt;li&gt;&lt;a href="&lt;?php echo Yii::app()-&gt;request-&gt;baseUrl; ?&gt;/index.php/admin/&lt;?php echo $info['filename'];?&gt;"&gt;Edit &lt;?php echo $info['filename'];?&gt;&lt;/a&gt;&lt;/li&gt; &lt;?php endforeach; ?&gt; 中编写了这个脚本,现在它可以完美运行了,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 2016-04-25
    • 2012-03-07
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多