0

この問題は、CakePHP 1.3 で書かれたアプリケーションを保守しているときに発生しました。ドキュメントを読むことはできますが、Cake に関する私の経験はかなり限られていることを覚えておいてください。

アプリケーションには Widget モデルと WidgetController があります。ウィジェットを編集するとき、ユーザーが選択できるオプションの 1 つは、3 つのモードのいずれかでデータを大量にウィジェットにインポートすることです。つまり、ウィジェット データをインポートしたものに追加、削除、または置き換えます。

現在の実装は完全に混乱しています (ウィジェットがサポートする 10 ほどのさまざまなミューテーション機能をすべて実行する「編集」アクションがあります。送信されたフォームからパラメーターをスニッフィングすることによって正確に何をすべきかを決定します)。大量のもの」を新しいアクションに:

function batch($id)
{
    // massively apply data to Widget $id; either add, remove or replace
}

このアクションは、「編集」ビューのフォームによってトリガーされます。

// Only relevant elements shown
echo $form->create('Widget', array('enctype'=>'multipart/form-data', 'action' => 'batch')); ?>
echo $form->input('id');
echo $form->input('action', array('type'=>'select',
    'options'=>array(
        'append'=>__('Append', true), 
        'replace'=>__('Replace existing', true), 
        'delete'=>__('Delete specified', true)
    ));
echo $form->end(); ?>

現状では、このフォームはactionパラメーターをWidget配列にバンドルしており、コントローラーからそれを取得できる唯一の方法は$this->data['Widget']['action'].

これは醜く意味的に間違っているので、もっと良い方法があることを願っています。

理想的には URL に提出したいのですが、その部分が固定されていない/widget/batch/X/appendため、それはできません。appendだから私はこれらのいずれかで解決します:

  • どういうわけか、次のようなコントローラーパラメーターとしてアクションを渡します$id
  • 何らかの方法でアクションを名前付きパラメーターとして渡し、許可します$this->params['named']['action']
  • カスタムルートをインストールする必要がなく、JavaScript を必要としない他の方法

Cake 1.3 はこれを行うことができますか?

4

1 に答える 1

0

いいえ

いいえ、post パラメータに基づいてリクエストを別のアクションにルーティングしたり、php だけでフォームのアクションを変更したりすることはできません。これは、どのフレームワークでも同じである可能性があります。

理想は /widget/batch/X/append という URL にサブミットしたいのですが、append 部分が固定されていないため、それはできません。

これを行う唯一の方法は、javascript を使用することです。もちろん、それを行うための適切な jsを作成することは難しくありません。

でも

ユーザーが選択を変更したときにフォーム アクションを操作するために JavaScript を使用したくない場合、または最も単純なソリューションが必要な場合は、setActionを使用して、リクエストをより適切な専用のコントローラー アクションに内部的にリダイレクトできます。

function batch() {
    if (!empty($this->data['Widget']['action'])) {
        $this->setAction($this->data['Widget']['action']);
    }
}

function append() {
    if ($this->data) {
        if ($this->Widget->append($this->data)) {
            $this->Session->setFlash('Widget appended successfully');
        } else {
            $this->Session->setFlash('Error: Unable to append widget');
        }
    }
}

このようにして、既存のコードをより管理しやすく論理的な方法にリファクタリングできる可能性があります。

于 2012-12-28T19:42:18.427 に答える