0

はい、唯一の問題は、私がそれを正しく行っているかどうかです。そして多分それの修正。

私は Yii にアプリケーションを持っています。ここには、いくつかの事前定義された設定を入れることができる単純な管理者バックエンドがあります。

MySQL データベース テーブル:

私のMySQL admin_setting テーブル

管理者コントローラーを持っています: 意図したアクションのみを表示しています

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();
    }
}

ユーザー インターフェイス:

シンプルなユーザーインターフェース

複数のレコードがデータを表示する 1 つのページがあるため、このようにしました。これは Yii のデフォルトの動作ではありません。どこを検索しても、他のプログラマーが一度に 1 つのレコードを編集していることしかわかりません。

2 つ目の疑問が生じます。ActiveRecordModel のデフォルト機能を使用して、一度に複数のレコードをデータベースに保存する方法です。

この方法を続けると、すべてのフィールドを手動で保存する actionIndex のリストが増えていることがわかります。

よろしくお願いします。

4

1 に答える 1

2

ここでの最善のアプローチは、 から派生したまったく新しいモデルをコーディングすることですCActiveForm。これを行うには、フォーム モデル__get__setメソッドをオーバーライドして、すべての構成設定のリストを取得し (実際のデータベース エントリが何らかの理由で失われる可能性があるため、ハードコードされた配列からとしましょう)、すべてのように動作する必要があります。それらはモデルのプロパティとして存在します。

これを行うと、大きなメリットを享受する準備が整います。

構成設定がフォーム モデルのプロパティであるかのように作業できます。

  • それぞれを独自の変数として渡す必要はもうありません。ビューに渡し$modelて、次のような設定にアクセスするだけです$model->settingName__getオーバーライドは、これが機能することを確認する必要があります)

  • すべての構成オプションを属性として大量に設定できるようになりました。

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

フォーム全体を一連のフィールドとして一度に簡単にレンダリングできます

これを行うには、新しいを作成し、そのプロパティCFormを動的に設定します (これを行うために必要なすべての情報が含まれている必要があります)。次に、次のような方法でフォームを簡単にレンダリングできますelementsMyAdminFormModel

foreach($form->getElements() as $element) {
    echo $element->render();
}

もちろん、これらすべてにかなりの量のコードが必要になりますが、設定すると、配列に行を追加するだけで (どこMyAdminFormModelからデータを取得するか)、他のすべてが自動的に機能します。

于 2012-06-23T15:32:38.570 に答える