0

これは簡単に聞こえるかもしれませんが、私にとっては混乱を招きます。既存のデータベース エントリを編集するためのフォームに取り組んでいます。一部のフィールドは、結合されたテーブルのレコードに基づいて作成および入力されます。

これは少し大雑把に聞こえるので、図解してみます。Content という名前のコンテンツを持つテーブルと、ファイル名と場所を保持する Files という名前のテーブルがあります。提供されたコンテンツIDに基づいてファイル名を取得すると、フォームがフィールドを作成し、これらにファイル名が入力されます。

public function setFiles($files) {
    $i = 0;
    foreach ($files as $file) {
        $i++;
        $fieldname = "encloseditemname{$i}";
        $this->addElement('text', $fieldname, array('required'       => true,
                                                        'label'          => 'Enclosed item name (test)',
                                                        'value'          => $file['file_url'],
        ));
    }
}

これは問題なく動作しますが、ファイルの 1 つを削除できるボタンを追加したいと思います。だから私がすべきだと思ったのはfileDeleteAction()、コントローラーで を作成し、ボタンをそのアクションにリダイレクトし、データベースのエントリを削除してから、フォームでビューをレンダリングすることです。

アクションに別のビューをレンダリングさせると、それは標準ビューであり、問​​題ではありません。データベースのエントリを削除するコードを書くことも問題ではありません。addElements メソッドをファクトリとして使用して削除アクションにリダイレクトするボタンを作成する...大きな問題。これが私が得た距離です。

$this->addElement('button', "deleteencloseditem{$i}", array( ??? ));

フォームを送信してコントローラーの editAction を呼び出すために使用されるフォームの下部にある送信ボタンを妨げずに、このボタンを削除アクションにリダイレクトするにはどうすればよいですか。

どのボタンが押されたかを検出するために JavaScript を少し使用することを検討しましたが、まだ JavaScript を使用できず、ボタン名と ID が setFiles 関数に依存しているため、どのボタンが押されたかを見つける方法を見つけるのに苦労しています。したがって、フォームにプッシュするファイル名の量deleteencloseditem1deleteencloseditem5000応じて、範囲を変えることができます。

どうすればこれを行うことができますか? ヒントやアドバイスは大歓迎です:)

4

3 に答える 3

1

HTMLは、送信時にフォームがルーティングされる属性を<form>1つだけ持つことができます。actionただし、クライアント側とサーバー側の両方で、これを克服するための回避策があります。

サーバ側

  1. すべてのボタンをフォームに送信するだけですaction$this->setAction(...)フォームのコードで設定)
  2. このアクションでは、post(またはget)変数をチェックして、クリックされたボタンを判別します。
  3. クリックされたボタンに基づいて正しいアクションにリダイレクトします

クライアント側

ボタンのclickイベントを使用して、クリックされたボタンを判別します。ボタンは、ID削除するファイルについて何かを教えてくれると思います。すべての削除ボタンにaclass="delete"を指定すると、jQueryを使用して次のように実行できます。

$('input.delete').click(function(){
    // remove 'deleteencloseditem' from the button's ID
    // to only keep the file number
    var myFileID = $(this).attr('id').replace('deleteencloseditem', '');
    window.location.href = 'myLocation?fileID=' + myFileID;
});
于 2012-06-01T07:49:46.300 に答える
0

ルーティングを使用するだけです。フォームのルーティングとはaction、を対応するルートに転送することを意味します。フォームのアクションのパスにより、ZFのルーティングは関連するコントローラーとアクションを使用します。

于 2012-05-31T15:03:59.037 に答える
0

これを修正する最も簡単な方法は、削除アクションのリンクを使用し、ボタンとしてスタイルを設定することです。

別の方法として、1 つのフォームで 2 つのボタンを使用することもできます。異なるラベルを付けて、POST でラベル名をテストするだけです。

if ($this->getRequest()->getPost('submit') == 'Label')
于 2012-06-01T11:31:44.297 に答える