[symfony]ドラッグ&ドロップの処理を実装してみた
フリッカーのグルーピングのようなドラッグ&ドロップで画像を操作する機能を実装したいと思い、色々と調べてみた。
symfonyのJavascriptヘルパーの中身を調べていたら
drop_receiving_element()
の2つのヘルパーで実装できることが判明。
まずはドラッグするための機能を説明する。
- <div id="product_list" class="product">
- foreach($products as $id => $title):
- echo image_tag('product'.$id, array(
- 'id' => 'product_'.$id,
- 'alt' => $title,
- 'class' => 'products'
- ))
- echo draggable_element('product_'.$id, array('revert' => true))
- endforeach
- </div>
draggable_element(ドラッグさせたい要素のid, [オプション])
で指定した要素をドラッグ出来るようになる。
draggable_elementは次のパラメーターを受け取る。
| パラメーター | 説明 |
|---|---|
| revert | trueに設定した場合、要素が放たれたときに元の位置に戻るようになる。 また任意の関数を呼び出すことも可能。 |
| ghosting | 要素をクローンして、要素が放たれても元の位置に戻らないようになる。 |
| snap | falseに設定した場合、スナッピングされない。 |
次にドロップの機能を説明する。
- forearch ($labels as $label) :
- <div id="label_echo $label->getId() ">
- <span id="count_echo $label->getId() ">0</span>
- <span id="indicator_echo $label->getId() ">loading now....</span>
- drop_receiving_element('label_'.$label->getId(), array(
- 'url' => 'blg/add?label_id='.$label->getId(),
- 'accept' => 'product',
- 'update' => array(
- 'success' => 'count_'.$label->getId(),
- 'failure' => 'error_'.$label->getId()
- ),
- 'method' => 'GET',
- 'hoverclass' => 'label-active',
- 'script' => 'true',
- 'confirm' => '"'.$label->getLabelName().'に追加しますが、よろしいですか?"',
- 'loading' => 'Element.show("indicator_'.$label->getId().'")',
- 'complete' => 'Element.hide("indicator_'.$label->getId().'")',
- ))
- </div>
drop_receiving_element(ドロップさせたい要素のid, [オプション])
で指定した要素をドロップ出来るようになる。
drop_receiving_elementは次のパラメーターを受け取る。
| パラメーター | 説明 |
|---|---|
| url | ドロップされたときに実行するurl |
| accept | ドロップさせる要素を文字列またはcssクラスで指定する。 |
| update | 更新する要素を指定する。配列を指定することで成功時と失敗時の要素を指定できる。 |
| method | POST、GETなどを指定する。 |
| script | trueの場合、指定したアクションでjavascriptを実行できる |
| hoverclass | 要素をドラッグしている最中(ドラッグしているがドロップはしていないとき)のcssクラスを指定する |
| confirm | 確認ダイアログに表示する文字列を指定する |
またdrop_receiving_elementに限ったことではないが、
symfonyのajaxヘルパーには以下のようなコールバックのトリガーが設定されている。
| コールバック | 説明 |
|---|---|
| before | クエストが初期化される前 |
| after | リクエストが初期化された直後で読み込まれる前 |
| loading | ブラウザからのデータでリモートの文章が読み込まれているとき |
| loaded | ブラウザがリモートの文章を読み込み終えたとき |
| interactive | ユーザーが読み込みを終えずにリモートの文章とやりとりしているとき |
| success | XMLHttpRequest が完了し、HTTP ステータスコードが 2XX のとき |
| failure | XMLHttpRequest が完了し、HTTP ステータスコードが 2XX でないとき |
| 404 | url が 404 ステータスを返すとき |
| complete | XMLHttpRequest が完了したとき ( 失敗であろうと成功であろうと ) |

