ThinkAdmin V6 官方文档

🔄 弹窗跳转

ThinkAdmin 提供弹窗选取后跳转到新页面的功能,主要用于需要获取相关数据并进行后续操作的场景。

🚀 主要功能

  • 弹窗选取: 通过弹窗选取相关数据
  • 分页支持: 支持弹窗内容的分页显示
  • 数据传递: 支持选取数据的传递和跳转
  • 逻辑处理: 支持复杂的业务逻辑处理
  • 用户体验: 提供流畅的用户操作体验
  • 灵活配置: 支持多种配置和自定义

📋 使用场景

数据选取

  • 课程选择: 选择需要考核的课程
  • 用户选择: 选择相关用户信息
  • 内容选择: 选择需要处理的内容
  • 配置选择: 选择系统配置项

业务逻辑

  • 先选后操作: 先选取数据,再进行后续操作
  • 数据验证: 对选取的数据进行验证
  • 流程控制: 控制业务流程的执行
  • 状态管理: 管理操作状态和结果

⚙️ 实现方式

1. 弹窗选取数据

  • 使用方式: 使用 data-iframe 属性
  • 分页支持: 支持弹窗内容的分页显示
  • 数据展示: 在弹窗中展示可选数据
  • 交互操作: 支持用户的选择操作
  • 权限控制: 支持基于权限的显示控制

2. 数据传递跳转

  • 弹窗关闭: 选取数据后关闭当前弹窗
  • 页面跳转: 跳转到新的操作页面
  • 数据传递: 将选取的数据传递给新页面
  • 逻辑处理: 在新页面中处理业务逻辑
  • 状态管理: 管理操作状态和结果

3. 前端交互处理

  • 事件绑定: 绑定点击事件处理选择操作
  • 弹窗管理: 使用 top.layer.closeAll() 关闭所有弹窗
  • 页面跳转: 使用 top.$.form.href() 进行页面跳转
  • 数据传递: 通过 URL 参数传递选取的数据
1 打开弹窗选取数据,可分页 需使用 data-iframe
{block name="button"}
<!--{if auth("select")}-->
<button class='layui-btn layui-btn-sm layui-btn-primary' data-iframe='{:url("select")}' data-title="请选择需考核的课程">开始考核</button>
<!--{/if}-->
{/block}
2 弹窗选取内容后,因为逻辑需要先关闭当前弹窗,然后打开新页面
{extend name="../../admin/view/full"}

{block name='content'}
<div class="iframe-pagination">
 <table class="layui-table margin-top-10" lay-skin="line">
 {notempty name='list'}
 <thead>
 <tr>
 <th class="text-left nowrap">信息</th>
 <th></th>
 </tr>
 </thead>
 {/notempty}
 <tbody>
 {foreach $list as $key => $vo}
 <tr>
 <td class="nowrap">{$vo.name|default='--'}</td>
 <td class='text-right'><a class="layui-btn layui-btn-xs layui-btn-normal" data-item="{:url('add')}?course_id={$vo.id}">选择</a></td>
 </tr>
 {/foreach}
 </tbody>
 </table>
 {empty name='list'}<span class="notdata">没有记录哦</span>{else}{$pagehtml|raw|default=''}{/empty}
</div>
{/block}

{block name='script'}
<script>
 $(function () {
 layui.form.render();
 $('[data-item]').on('click', function () {
 top.layer.closeAll();
 top.$.form.href(this.getAttribute('data-item'), this);
 });
 });
</script>
{/block}

🔧 完整实现示例

前端选择页面(select.html)

{extend name="../../admin/view/full"}

{block name='content'}
<div class="iframe-pagination">
 <table class="layui-table margin-top-10" lay-skin="line">
 {notempty name='list'}
 <thead>
 <tr>
 <th class="text-left nowrap">课程名称</th>
 <th class="text-left nowrap">课程类型</th>
 <th class="text-left nowrap">创建时间</th>
 <th class="text-center">操作</th>
 </tr>
 </thead>
 {/notempty}
 <tbody>
 {foreach $list as $key => $vo}
 <tr>
 <td class="nowrap">{$vo.name|default='--'}</td>
 <td class="nowrap">{$vo.type|default='--'}</td>
 <td class="nowrap">{$vo.create_at|default='--'}</td>
 <td class='text-center'>
 <a class="layui-btn layui-btn-xs layui-btn-normal"
 data-item="{:url('add')}?course_id={$vo.id}">
 选择
 </a>
 </td>
 </tr>
 {/foreach}
 </tbody>
 </table>
 {empty name='list'}
 <span class="notdata">没有记录哦</span>
 {else}
 {$pagehtml|raw|default=''}
 {/empty}
</div>
{/block}

{block name='script'}
<script>
 $(function () {
 layui.form.render();

 // 点击选择按钮后,关闭弹窗并跳转到新页面
 $('[data-item]').on('click', function () {
 // 关闭所有弹窗
 top.layer.closeAll();

 // 跳转到新页面(传递 course_id 参数)
 top.$.form.href(this.getAttribute('data-item'), this);
 });
 });
</script>
{/block}

后端控制器(select 方法)

<?php
declare(strict_types=1);

namespace app\admin\controller;

use think\admin\Controller;
use think\admin\helper\QueryHelper;
use think\admin\model\Course;

/**
 * 课程管理
 * @class Course
 * @package app\admin\controller
 */
class Course extends Controller
{
 /**
 * 选择课程(弹窗页面)
 * @auth true
 */
 public function select()
 {
 // 使用 QueryHelper 进行数据查询
 Course::mQuery()->layTable(function () {
 $this->title = '请选择需考核的课程';
 }, function (QueryHelper $query) {
 $query->where(['status' => 1, 'is_deleted' => 0])
 ->like('name')
 ->order('id desc')
 ->page();
 });
 }

 /**
 * 添加考核(跳转后的页面)
 * @auth true
 */
 public function add()
 {
 $courseId = input('course_id');
 if (empty($courseId)) {
 $this->error('请先选择课程');
 }

 // 获取课程信息
 $course = Course::mk()->where('id', $courseId)->find();
 if (empty($course)) {
 $this->error('课程不存在');
 }

 // 传递给模板
 $this->assign('course', $course);

 // 显示添加考核表单
 Course::mForm('form');
 }
}

触发按钮(index.html)

{block name="button"}
<!-- 打开弹窗选择课程 -->
<button class='layui-btn layui-btn-sm layui-btn-primary'
 data-iframe='{:url("select")}'
 data-title="请选择需考核的课程">
 <i class="layui-icon layui-icon-add-1"></i> 开始考核
</button>
{/block}

⚠️ 注意事项

  • 弹窗关闭: 使用 top.layer.closeAll() 确保关闭所有弹窗
  • 页面跳转: 使用 top.$.form.href() 进行页面跳转,保持在同一窗口
  • 数据传递: 通过 URL 参数传递数据,确保数据正确传递
  • 权限控制: 确保选择页面和跳转页面都有相应的权限控制
最近更新:
Contributors: 邹景立, Anyon

AltStyle によって変換されたページ (->オリジナル) /