You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii2框架中实现选中内容通过>>按钮跨Div迁移的技术问询

Yii2实现选中复选框内容通过按钮迁移到另一个Div的方案

嘿,我来帮你搞定这个需求!你想要实现的是让候选人选中左侧容器里的编程语言技能,点击>>按钮把选中项迁移到右侧Div对吧?结合你已经在用的Yii2 Sortable组件,我给你整理了一套完整的实现方案,分步骤来:

1. 调整Sortable组件结构(添加复选框)

首先得给每个技能选项加上复选框,这样才能让用户选择要迁移的项,同时保留Sortable的拖拽特性(如果需要的话):

<?php
use yii\jui\Sortable;
?>

<div class="skill-transfer-container">
    <!-- 左侧可选技能容器 -->
    <div class="skill-column">
        <h4>可选技能</h4>
        <?php echo Sortable::widget([
            'id' => 'source-skills',
            'items' => [
                ['content' => '<label><input type="checkbox" value="C++"> C++</label>'],
                ['content' => '<label><input type="checkbox" value="Java"> Java</label>'],
                ['content' => '<label><input type="checkbox" value="MySQL"> MySQL</label>'],
                // 按需添加更多技能选项
            ],
            'options' => ['class' => 'sortable-list'],
        ]);?>
    </div>

    <!-- 中间操作按钮 -->
    <div class="transfer-buttons">
        <button id="btn-move-right">>></button>
        <button id="btn-move-left"><<</button> <!-- 可选:添加移回左侧的按钮 -->
    </div>

    <!-- 右侧已选技能容器 -->
    <div class="skill-column">
        <h4>已选技能</h4>
        <?php echo Sortable::widget([
            'id' => 'target-skills',
            'connected' => true, // 保持和左侧的拖拽关联(可选)
            'items' => [], // 初始为空
            'options' => ['class' => 'sortable-list'],
        ]);?>
    </div>
</div>

2. 基础布局样式

加一点CSS让界面更美观,布局更合理:

.skill-transfer-container {
    display: flex;
    gap: 20px;
    align-items: flex-start;
    padding: 20px;
}

.skill-column {
    width: 220px;
}

.sortable-list {
    list-style: none;
    padding: 0;
    border: 1px solid #e0e0e0;
    border-radius: 4px;
    min-height: 150px;
    background-color: #f8f9fa;
}

.sortable-list li {
    padding: 8px 12px;
    border-bottom: 1px solid #eee;
    cursor: pointer;
}

.sortable-list li:last-child {
    border-bottom: none;
}

.transfer-buttons {
    display: flex;
    flex-direction: column;
    gap: 10px;
    margin-top: 50px;
}

.transfer-buttons button {
    padding: 8px 12px;
    border: 1px solid #6c757d;
    border-radius: 4px;
    background-color: #fff;
    cursor: pointer;
}

.transfer-buttons button:hover {
    background-color: #e9ecef;
}

/* 可选:给右侧已选项加选中样式,方便移回操作 */
.sortable-list li.selected {
    background-color: #dee2e6;
}

3. 核心JavaScript逻辑(按钮迁移功能)

写JS代码实现点击按钮时,把选中的项从左侧移到右侧,以及可选的移回功能:

document.addEventListener('DOMContentLoaded', function() {
    const sourceList = document.getElementById('source-skills');
    const targetList = document.getElementById('target-skills');
    const moveRightBtn = document.getElementById('btn-move-right');
    const moveLeftBtn = document.getElementById('btn-move-left');

    // >> 按钮:把左侧选中项移到右侧
    moveRightBtn.addEventListener('click', function() {
        // 获取左侧所有被选中的复选框
        const checkedBoxes = sourceList.querySelectorAll('input[type="checkbox"]:checked');
        
        checkedBoxes.forEach(checkbox => {
            const listItem = checkbox.closest('li');
            // 克隆节点(避免原节点移除后状态丢失),也可以直接移动原节点
            const clonedItem = listItem.cloneNode(true);
            // 移除克隆节点里的复选框(按需保留或移除)
            clonedItem.querySelector('input[type="checkbox"]').remove();
            // 添加到右侧容器
            targetList.appendChild(clonedItem);
            // 删除原节点
            listItem.remove();
        });
    });

    // << 按钮:把右侧选中项移回左侧
    moveLeftBtn.addEventListener('click', function() {
        // 获取右侧所有被标记为选中的项
        const selectedItems = targetList.querySelectorAll('li.selected');
        
        selectedItems.forEach(item => {
            const skillName = item.textContent.trim();
            // 重新构建带复选框的列表项
            const newListItem = document.createElement('li');
            newListItem.innerHTML = `<label><input type="checkbox" value="${skillName}"> ${skillName}</label>`;
            // 添加到左侧容器
            sourceList.appendChild(newListItem);
            // 删除右侧的项
            item.remove();
        });
    });

    // 可选:点击右侧项时切换选中状态,方便移回操作
    targetList.addEventListener('click', function(e) {
        if (e.target.tagName === 'LI') {
            e.target.classList.toggle('selected');
        }
    });
});

4. 可选:后端保存已选技能

如果需要把用户选择的技能保存到数据库,可以在表单提交前收集右侧的技能数据,放到隐藏输入框中:

// 假设你的表单ID是skill-form
document.getElementById('skill-form').addEventListener('submit', function(e) {
    const targetItems = targetList.querySelectorAll('li');
    // 收集已选技能到数组
    const selectedSkills = Array.from(targetItems).map(item => item.textContent.trim());
    // 设置隐藏输入框的值(需要在表单里添加<input type="hidden" id="selected-skills" name="selected-skills">)
    document.getElementById('selected-skills').value = JSON.stringify(selectedSkills);
});

后端控制器接收数据:

public function actionSaveSkills()
{
    if (Yii::$app->request->isPost) {
        $selectedSkills = json_decode(Yii::$app->request->post('selected-skills'), true);
        // 这里可以把$selectedSkills保存到数据库,比如关联候选人模型
        // 示例:$candidate->skills = implode(',', $selectedSkills); $candidate->save();
    }
}

内容的提问来源于stack exchange,提问作者Ann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:32:55