CJuiDroppable 封裝 jQuery UI Droppable,定義可接收拖曳元素的區域,配合 CJuiDraggable 實現完整拖放互動。
<?php $this->beginWidget('zii.widgets.jui.CJuiDroppable', array(
'options' => array(
'accept' => '.draggable-item', // 接受的拖曳元素選擇器
'activeClass' => 'drop-active', // 拖曳元素進入時的類別
'hoverClass' => 'drop-hover', // 懸停時的類別
'drop' => 'js:function(event, ui) {
$(this).html("放置成功! ID: " + ui.draggable.attr("id"));
$(this).addClass("dropped");
}',
'out' => 'js:function(event, ui) {
$(this).html("拖曳至此區域");
$(this).removeClass("drop-hover");
}',
),
'htmlOptions' => array(
'style' => 'width:300px; height:200px; padding:20px; border:2px dashed #ccc; background:#fafafa; text-align:center;',
),
)); ?>
拖曳項目至此區域
<?php $this->endWidget(); ?>
.drop-active { border-color: #2196f3; background: #e3f2fd; }
.drop-hover { border-color: #4caf50; background: #e8f5e9; }
.dropped { border-style: solid; border-color: #4caf50; }
<!-- 商品列表(可拖曳) -->
<?php foreach ($products as $p): ?>
<?php $this->beginWidget('zii.widgets.jui.CJuiDraggable', array(
'options' => array('revert' => 'invalid', 'helper' => 'clone', 'cursor' => 'move'),
'htmlOptions' => array('class' => 'product-item', 'data-id' => $p->id),
)); ?>
<img src="<?php echo $p->image; ?>" width="80"> <?php echo $p->name; ?> $<?php echo $p->price; ?>
<?php $this->endWidget(); ?>
<?php endforeach; ?>
<!-- 購物車(可放置) -->
<?php $this->beginWidget('zii.widgets.jui.CJuiDroppable', array(
'options' => array(
'accept' => '.product-item',
'drop' => 'js:function(event, ui) {
var productId = ui.draggable.data("id");
var productName = ui.draggable.text().trim();
$(this).append("<div class=\"cart-item\">" + productName + "</div>");
$.post("'.Yii::app()->createUrl('cart/add').'", { id: productId });
}',
),
'htmlOptions' => array('id' => 'cart', 'style' => 'width:300px; min-height:200px; border:1px solid #333; padding:10px;'),
)); ?>
<h3>購物車</h3>
<div id="cart-items"></div>
<?php $this->endWidget(); ?>
| 選項 | 用途 | 範例 |
|---|---|---|
accept | 可接受的拖曳元素 | '.item', ':not(.disabled)' |
activeClass | 有拖曳元素進入時加在 droppable 上 | 'highlight' |
hoverClass | 拖曳元素懸停時加在 droppable 上 | 'hover' |
tolerance | 判定「進入」的演算法 | 'fit'/'intersect'/'pointer'/'touch' |
greedy | 巢狀 droppable 是否獨佔事件 | true/false |
scope | 分組篩選(需 draggable 同組) | 'group1' |
startactivate / overdrag(持續)out / over(移出/移入)stopdeactivate / drophelper: 'clone' 讓原元素保留位置,拖曳的是複製品revert: 'invalid' 放置無效區域時動畫回原位