Yii保存管理员设置 - 这是正确的做法

时间:2012-06-23 15:01:18

标签: architecture model controller yii

是的,唯一的问题是我是否正确。也许可以解决它。

我在Yii有一个应用程序,我有一个简单的Admin后端,我可以在其中放置一些预定义的设置。

MySQL数据库表:

My MySQL admin_setting table

我有一个管理员控制器: 我只展示了预期的行动

class AdminController extends Controller
{

    public function actionIndex()
    {
        // Update a setting
        if (isset($_POST['submit']))
        {
            AdminSetting::updateSetting('topCategory', $_POST['topCategory']);
            AdminSetting::updateSetting('marketRegion', $_POST['marketRegion']);
        }

        // Get all settings
        $topCategory = AdminSetting::model()->find('name = :name', array(':name' => 'topCategory'));
        $marketRegion = AdminSetting::model()->find('name = :name', array(':name' => 'marketRegion'));

        if (isset($marketRegion->value))
            $marketRegion = $marketRegion->value;
        if (isset($topCategory->value))
            $topCategory = $topCategory->value;

        $this->render('index', array('topCategory' => $topCategory, 'marketRegion' => $marketRegion));
    }
}

模型AdminSetting.php: 我只显示添加的功能:updateSetting

class AdminSetting extends CActiveRecord
{

    public static function updateSetting($name, $value)
    {
        Yii::app()->db->createCommand("UPDATE admin_setting SET value = '$value' WHERE name = '$name'")->execute();
    }
}

用户界面:

Simple User interface

我这样做了,因为我有一个页面,有多个记录显示数据。这不是它在Yii中的默认工作方式。无论我在哪里搜索,我都只看到其他程序员一次编辑一条记录。

出现第二个问题: 如何使用ActiveRecordModel的默认功能一次将多个记录保存到数据库。

我看到如果我继续这样,我的actionIndex中有一个不断增长的列表,可以手动保存每个字段。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

这里最好的方法是编写一个源自CActiveForm的全新模型。要使用此功能,您必须覆盖表单模型的__get__set方法以获取所有配置设置的列表(假设从硬编码数组中获取,因为实际的数据库条目可能会结束)因任何原因而丢失)并且表现得像所有这些都作为模型上的属性存在。

完成此操作后,您现在已准备好获得巨大收益:

您可以像配置设置是表单模型

的属性一样工作
  • 不再需要将每个传递作为自己的变量;只需将$model传递给视图即可访问$model->settingName等设置(您的__get覆盖需要确保此功能正常运行)

  • 您现在可以将所有配置选项大量设置为属性:

    $model = new MyAdminFormModel;
    $model->attributes = $_POST['MyAdminFormModel'];
    

您可以轻松地将整个表单一次性渲染为一系列字段

通过创建新的CForm并动态填充其elements属性(MyAdminFormModel应该拥有执行此操作的所有必要信息)来执行此操作。然后,您可以使用

之类的内容轻松渲染表单
foreach($form->getElements() as $element) {
    echo $element->render();
}

当然所有这些都需要一些非常重要的代码,但是当你设置它时,你只需要向一个数组添加一行(MyAdminFormModel从中获取数据)然后一切其他将自动运作。