ConfigClassifyRepository.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\common\repositories\system\config;
  12. use app\common\dao\system\config\SystemConfigClassifyDao;
  13. use app\common\repositories\BaseRepository;
  14. use FormBuilder\Exception\FormBuilderException;
  15. use FormBuilder\Factory\Elm;
  16. use FormBuilder\Form;
  17. use think\db\exception\DataNotFoundException;
  18. use think\db\exception\DbException;
  19. use think\db\exception\ModelNotFoundException;
  20. use think\facade\Route;
  21. /**
  22. * 配置分类
  23. */
  24. class ConfigClassifyRepository extends BaseRepository
  25. {
  26. /**
  27. * ConfigClassifyRepository constructor.
  28. * @param SystemConfigClassifyDao $dao
  29. */
  30. public function __construct(SystemConfigClassifyDao $dao)
  31. {
  32. $this->dao = $dao;
  33. }
  34. /**
  35. * 获取选项数据,格式化为级联选择器的数据格式。
  36. *
  37. * 本方法旨在从数据访问对象(DAO)获取预定义的选项数据,并对这些数据进行格式化,以适应级联选择器的数据显示格式。
  38. * 这种格式化包括但不限于将数据的某个字段作为标签显示,使得前端界面能够以更加直观的方式展示这些数据。
  39. *
  40. * @return array 返回格式化后的级联选择器数据。
  41. */
  42. public function options(): array
  43. {
  44. // 从DAO获取原始选项数据
  45. $options = $this->dao->getOptions();
  46. // 格式化原始选项数据,以'classify_name'字段作为标签显示
  47. return formatCascaderData($options, 'classify_name');
  48. }
  49. /**
  50. * 根据条件获取列表数据及总数
  51. *
  52. * 本函数用于根据提供的条件查询数据库,并返回查询结果的列表以及总数。
  53. * 这样做的目的是为了在前端页面上展示数据列表,并且提供分页功能。
  54. *
  55. * @param string|array $where 查询条件,可以是字符串或数组形式的SQL WHERE子句。
  56. * @return array 返回包含列表数据和总数的数组,数组键名为'list'和'count'。
  57. */
  58. public function lst($where)
  59. {
  60. // 使用DAO对象的search方法根据$where条件进行查询
  61. $query = $this->dao->search($where);
  62. // 从查询结果中获取数据列表
  63. $list = $query->select();
  64. // 从查询结果中获取数据总数
  65. $count = $query->count();
  66. // 将列表数据和总数一起返回
  67. return compact('list', 'count');
  68. }
  69. /**
  70. * 切换实体的状态。
  71. *
  72. * 本函数用于通过指定的ID和新的状态来更新数据库中相应实体的状态字段。
  73. * 它封装了与数据访问对象(DAO)的交互,使得业务逻辑层可以更方便地进行状态更新操作,
  74. * 而无需直接处理数据库层面的细节。
  75. *
  76. * @param int $id 实体的唯一标识符。用于在数据库中定位到特定的实体。
  77. * @param int $status 新的状态值。该值会被用于更新实体的状态字段。
  78. * @return mixed 返回DAO更新操作的结果。具体类型取决于DAO的实现。
  79. */
  80. public function switchStatus(int $id, int $status)
  81. {
  82. // 使用compact函数将$status变量打包成一个名为'status'的键值对数组,
  83. // 然后调用dao的update方法,通过$id更新数据库中的对应记录的状态。
  84. return $this->dao->update($id, compact('status'));
  85. }
  86. /**
  87. * 创建或编辑配置分类表单
  88. *
  89. * 该方法用于生成一个包含各种输入字段的表单,用于创建或编辑配置分类。
  90. * 表单字段包括上级分类选择、分类名称、分类键、分类说明、图标选择、排序和显示状态。
  91. *
  92. * @param int|null $id 分类的ID,如果为null,则表示创建新分类;否则,表示编辑已有的分类。
  93. * @param array $formData 表单的初始数据,用于填充表单字段。
  94. * @return Form 返回生成的表单对象。
  95. */
  96. public function form(?int $id = null, array $formData = []): Form
  97. {
  98. // 根据$id的值决定生成表单的URL,用于创建或更新分类。
  99. $formUrl = is_null($id) ? Route::buildUrl('configClassifyCreate')->build() : Route::buildUrl('configClassifyUpdate', ['id' => $id])->build();
  100. $form = Elm::createForm($formUrl);
  101. // 设置表单的验证规则和字段。
  102. $form->setRule([
  103. // 上级分类选择字段,使用下拉列表呈现,允许选择顶级分类。
  104. Elm::select('pid', '上级分类:', 0)->options(function () {
  105. $data = $this->dao->getTopOptions();
  106. $options = [['value' => 0, 'label' => '顶级分类']];
  107. foreach ($data as $value => $label) {
  108. $options[] = compact('value', 'label');
  109. }
  110. return $options;
  111. })->placeholder('请选择上级分类'),
  112. // 分类名称输入字段,必填。
  113. Elm::input('classify_name', '配置分类名称:')->placeholder('请输入配置分类名称')->required(),
  114. // 分类键输入字段,必填。
  115. Elm::input('classify_key', '配置分类key:')->placeholder('请输入配置分类key')->required(),
  116. // 分类说明输入字段,可选。
  117. Elm::input('info', '配置分类说明:')->placeholder('请输入配置分类说明'),
  118. // 图标选择字段,使用iframe嵌入图标选择界面。
  119. Elm::frameInput('icon', '配置分类图标:', '/' . config('admin.admin_prefix') . '/setting/icons?field=icon')->icon('el-icon-circle-plus-outline')->height('338px')->width('700px')->modal(['modal' => false]),
  120. // 排序数字输入字段,可选,默认值为0。
  121. Elm::number('sort', '排序:', 0)->precision(0)->max(99999),
  122. // 显示状态开关字段,默认开启。
  123. Elm::switches('status', '是否显示:', 1)->activeValue(1)->inactiveValue(0)->inactiveText('关')->activeText('开'),
  124. ]);
  125. // 设置表单标题,并根据$id的值决定是创建还是编辑分类。
  126. // 填充表单数据。
  127. return $form->setTitle(is_null($id) ? '添加配置分类' : '编辑配置分类')->formData($formData);
  128. }
  129. /**
  130. * 创建表单实例。
  131. *
  132. * 本方法旨在提供一个统一的入口,用于创建表单对象。通过调用此方法,可以避免直接与表单对象的构造函数交互,
  133. * 增加了代码的灵活性和可维护性。此方法的设计符合开闭原则,即对扩展开放,对修改关闭,
  134. * 当需要更换表单实现或者添加新的表单类型时,只需修改此方法即可,而不需要修改调用此方法的代码。
  135. *
  136. * @return FormInterface 返回一个表单对象。返回的对象将根据实际业务需求实现FormInterface接口,
  137. * 从而确保表单对象的统一性和可操作性。
  138. */
  139. public function createForm()
  140. {
  141. // 通过调用form方法来创建并返回表单实例
  142. return $this->form();
  143. }
  144. /**
  145. * 更新表单数据。
  146. * 该方法用于根据给定的ID获取数据库中的记录,并使用这些数据来构建一个表单,以便用户可以查看或编辑这些数据。
  147. *
  148. * @param int $id 表单记录的唯一标识符。
  149. * @return array 返回一个包含表单字段和值的数组。
  150. */
  151. public function updateForm($id)
  152. {
  153. // 通过ID从数据库获取记录,并转换为数组格式,用于填充表单
  154. return $this->form($id, $this->dao->get($id)->toArray());
  155. }
  156. }