/hdcmsedu/system/model/Rule.php

https://github.com/houdunwang/video · PHP · 155 lines · 85 code · 15 blank · 55 comment · 9 complexity · 25e3cd4b84412b0c9bbc6f6eb39c1094 MD5 · raw file

  1. <?php
  2. /** .-------------------------------------------------------------------
  3. * | Software: [HDCMS framework]
  4. * | Site: www.hdcms.com
  5. * |-------------------------------------------------------------------
  6. * | Author: 向军 <2300071698@qq.com>
  7. * | WeChat: aihoudun
  8. * | Copyright (c) 2012-2019, www.houdunwang.com. All Rights Reserved.
  9. * '-------------------------------------------------------------------*/
  10. namespace system\model;
  11. use houdunwang\db\Db;
  12. /**
  13. * 微信回复规则
  14. * Class Rule
  15. *
  16. * @package system\model
  17. */
  18. class Rule extends Common
  19. {
  20. protected $table = 'rule';
  21. protected $denyInsertFields = ['rid'];
  22. protected $allowFill = ['*'];
  23. protected $validate
  24. = [
  25. ['rank', 'num:0,255', '排序数字在0~255之间', self::MUST_VALIDATE, self::MODEL_BOTH],
  26. ['name', 'required', '规则名称不能为空', self::MUST_VALIDATE, self::MODEL_BOTH],
  27. // ['name', 'unique', '规则名称已经存在', self::MUST_VALIDATE, self::MODEL_BOTH],
  28. ['module', 'required', '模块字段不能为空', self::MUST_VALIDATE, self::MODEL_BOTH],
  29. ['rid', 'validateRid', '回复规则不属于本网站', self::EXIST_VALIDATE, self::MODEL_BOTH],
  30. ];
  31. protected function validateRid($field, $val)
  32. {
  33. $rule = Db::table('rule')->where('rid', $val)->first();
  34. if ( ! empty($rule) && $rule['siteid'] != SITEID) {
  35. return false;
  36. }
  37. return true;
  38. }
  39. protected $auto
  40. = [
  41. ['siteid', 'siteid', 'function', self::EMPTY_AUTO, self::MODEL_BOTH],
  42. ['status', 1, 'string', self::NOT_EXIST_AUTO, self::MODEL_INSERT],
  43. ['rank', 0, 'string', self::NOT_EXIST_AUTO, self::MODEL_INSERT],
  44. ];
  45. /**
  46. * 根据关键词内容获取规则
  47. *
  48. * @param string $content 关键词内容
  49. *
  50. * @return array
  51. */
  52. public static function getByKeyword($content)
  53. {
  54. $content = trim($content);
  55. $sql = "SELECT * FROM ".tablename('rule')." AS r INNER JOIN "
  56. .tablename('rule_keyword')." as k ON r.rid = k.rid "
  57. ." WHERE k.status=1 AND k.siteid=".SITEID
  58. ." ORDER BY k.rank DESC,type DESC";
  59. $rules = Db::query($sql);
  60. foreach ($rules as $rule) {
  61. $rule['content'] = strtolower($rule['content']);
  62. switch ($rule['type']) {
  63. case 1:
  64. //完全匹配
  65. if ($content == $rule['content']) {
  66. return $rule;
  67. }
  68. break;
  69. case 2:
  70. //部分匹配
  71. if (strpos($content, $rule['content']) !== false) {
  72. return $rule;
  73. }
  74. break;
  75. case 3:
  76. //正则匹配
  77. if (preg_match('/'.$rule['content'].'/i', $content)) {
  78. return $rule;
  79. }
  80. break;
  81. }
  82. }
  83. }
  84. /**
  85. * 根据规则编号获取规则
  86. * 饮食关键词信息
  87. *
  88. * @param int $rid 规则编号
  89. *
  90. * @return array
  91. */
  92. public function getRuleByRid($rid)
  93. {
  94. if ($data = self::where('rid', $rid)->first()) {
  95. $data['keyword'] = (new RuleKeyword())->getKeywordByRid($rid);
  96. }
  97. return $data;
  98. }
  99. /**
  100. * 按规则标识删除微信规则与回复关键字
  101. *
  102. * @param $name 规则标识
  103. *
  104. * @return bool
  105. */
  106. public function delRuleByName($name)
  107. {
  108. $rid = $this->where('name', $name)->pluck('rid');
  109. return WeChat::removeRule($rid);
  110. }
  111. /**
  112. * 根据规则标识获取规则编号
  113. *
  114. * @param $name 规则标识
  115. *
  116. * @return int
  117. */
  118. public function getRidByName($name)
  119. {
  120. return self::where('siteid', siteid())->where('name', $name)->pluck('rid') ?: 0;
  121. }
  122. /**
  123. * 获取模块回复规则根据状态
  124. *
  125. * @param string $module 模块标识
  126. * @param int $status 1 启用 0 禁用
  127. *
  128. * @return array
  129. */
  130. public function moduleRuleByStatus($module = '', $status = 1)
  131. {
  132. $module = $module ?: v('module.name');
  133. return self::where('siteid', siteid())->where('module', $module)->orderBy('rid', 'DESC')
  134. ->where('status', $status)->get() ?: [];
  135. }
  136. public function keywords()
  137. {
  138. return $this->hasMany(RuleKeyword::class, 'rid', 'rid');
  139. }
  140. }