LinkmenuWidget.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. <?php
  2. /*
  3. * 调用示例: <?php echo \app\common\widget\LinkmenuWidget::widget(['key_id'=>1,'name'=>'parent_id','level'=>3,'model'=>$model,'emptyTxts'=>['省份','城市','区县'],'value'=>1610,'selectClass'=>'form-select original ','blockClass'=>'mb-3 row','unitClass'=>'col-md-2']);?>
  4. */
  5. namespace app\common\widget;
  6. use yii\base\Widget;
  7. use app\assets\CoreAsset;
  8. use app\assets\PluginsAsset;
  9. use yii\helpers\Html;
  10. use Yii;
  11. class LinkmenuWidget extends Widget
  12. {
  13. public $model;
  14. public $level;
  15. public $key_id;
  16. public $name;
  17. public $value;
  18. public $id;
  19. public $blockClass='';
  20. public $unitClass = '';
  21. public $selectClass = '';
  22. public $emptyTxts = [];
  23. public $dataUrl = '';
  24. public $selectedIds=[0,0,0,0];
  25. public $style;
  26. public $blockStyle;
  27. public $unitStyle;
  28. public $space;
  29. public $is_open;
  30. public $select_default;
  31. public $required;
  32. public function init()
  33. {
  34. if(empty($this->name))
  35. {
  36. echo '缺少NAME';
  37. exit;
  38. }
  39. if(empty($this->level))
  40. {
  41. echo '请设置层级';
  42. exit;
  43. }
  44. if(empty($this->key_id))
  45. {
  46. echo '请设置Key Id';
  47. exit;
  48. }
  49. $this->dataUrl = Yii::$app->controller->createRealUrl('ajax/nextlinkmenu');
  50. if($this->value)$this->selectedIds = \app\models\Linkmenu::getParentMenuIdRs($this->value);
  51. }
  52. public function run()
  53. {
  54. $this->registerClientScript();
  55. if(!empty($this->model))
  56. {
  57. $modelName = strtolower(basename(str_replace("\\",DIRECTORY_SEPARATOR,get_class($this->model))));
  58. if(empty($this->id)) $this->id = $modelName.'-'.$this->name;
  59. echo Html::activeTextInput($this->model, $this->name, ['value'=>$this->value,'id'=>$this->id,'style'=>'display:none','class'=>$this->required.' layui-input', 'lay-verify'=>$this->required, 'data-level'=>$this->level,
  60. 'data-verifyid'=>$this->id."_".$this->level]);
  61. }
  62. else
  63. {
  64. if(empty($this->id)) $this->id = str_replace(array('[',']'),array('-',''),$this->name);
  65. else $this->id = str_replace(array('[',']'),array('-',''),$this->id);
  66. echo "<input type='hidden' value='".$this->value."' id='".$this->id."' name='".$this->name."' class='".$this->required." layui-input' lay-verify='".$this->required."' data-level='".$this->level."' data-verifyid='".$this->id."_".$this->level."'>";
  67. }
  68. echo "<div id='".$this->id."_block' class='".$this->blockClass."' style='".$this->blockStyle."' >";
  69. for($i=1;$i<=$this->level;$i++)
  70. {
  71. echo "<div class='".$this->unitClass."' style='".$this->unitStyle."'>";
  72. echo "<select lay-ignore class='".$this->id."_".$i." ".$this->selectClass."' id='".$this->id."_".$i."' name='".$this->id."_".$i."' >";
  73. echo "<option value=''>".$this->emptyTxts[$i-1]."</option>";
  74. echo "</select>";
  75. echo "</div>";
  76. }
  77. echo "</div>";
  78. $js = <<<JS
  79. $('#{$this->id}_block').cascadingDropdown({
  80. selectBoxes: [
  81. {
  82. selector: '.{$this->id}_1',
  83. source: function(request, response) {
  84. var parent_id = {$this->key_id};
  85. var data_url = '{$this->dataUrl}';
  86. $.getJSON(data_url, {parent_id:parent_id}, function(result) {
  87. var data = result.data;
  88. var selectOnlyOption = data.length >= 1;
  89. response($.map(data, function(item, index) {
  90. return {
  91. label: item.name,
  92. value: item.menu_id,
  93. selected: item.menu_id=='{$this->selectedIds[0]}'
  94. };
  95. }));
  96. });
  97. },
  98. onChange: function(event, value, requiredValues, requirementsMet){
  99. var targetId="{$this->id}_{$this->level}";
  100. var realId = "{$this->id}";
  101. var eventTargetId = $(event.target).attr('id');
  102. if(value=='')
  103. {
  104. $('#'+realId).val('');
  105. }
  106. else
  107. {
  108. if(targetId==eventTargetId&&value!='')
  109. {
  110. $('#'+realId).val(value)
  111. }
  112. }
  113. }
  114. },
  115. {
  116. selector: '.{$this->id}_2',
  117. requires: ['.{$this->id}_1'],
  118. source: function(request, response) {
  119. var parent_id;
  120. $.each(request, function(key, val) {
  121. parent_id = val;
  122. });
  123. var data_url = '{$this->dataUrl}';
  124. $.getJSON(data_url, {parent_id:parent_id}, function(result) {
  125. var data = result.data;
  126. var selectOnlyOption = data.length < 1;
  127. response($.map(data, function(item, index) {
  128. return {
  129. label: item.name,
  130. value: item.menu_id,
  131. selected: item.menu_id=='{$this->selectedIds[1]}'
  132. };
  133. }));
  134. });
  135. },
  136. onChange: function(event, value, requiredValues, requirementsMet){
  137. var targetId="{$this->id}_{$this->level}";
  138. var realId = "{$this->id}";
  139. var eventTargetId = $(event.target).attr('id');
  140. if(value=='')
  141. {
  142. $('#'+realId).val('')
  143. }
  144. else
  145. {
  146. if(targetId==eventTargetId&&value!='')
  147. {
  148. $('#'+realId).val(value)
  149. }
  150. }
  151. }
  152. },
  153. {
  154. selector: '.{$this->id}_3',
  155. requires: ['.{$this->id}_1', '.{$this->id}_2'],
  156. requireAll: true,
  157. source: function(request, response) {
  158. var parent_id;
  159. $.each(request, function(key, val) {
  160. parent_id = val;
  161. });
  162. var data_url = '{$this->dataUrl}';
  163. $.getJSON(data_url, {parent_id:parent_id}, function(result) {
  164. var data = result.data;
  165. response($.map(data, function(item, index) {
  166. return {
  167. label: item.name,
  168. value: item.menu_id,
  169. selected: item.menu_id=='{$this->selectedIds[2]}'
  170. };
  171. }));
  172. });
  173. },
  174. onChange: function(event, value, requiredValues, requirementsMet){
  175. var targetId="{$this->id}_{$this->level}";
  176. var realId = "{$this->id}";
  177. var eventTargetId = $(event.target).attr('id');
  178. if(value=='')
  179. {
  180. $('#'+realId).val('');
  181. }
  182. else
  183. {
  184. if(targetId==eventTargetId&&value!='')
  185. {
  186. $('#'+realId).val(value)
  187. }
  188. }
  189. }
  190. },
  191. {
  192. selector: '.{$this->id}_4',
  193. requires: ['.{$this->id}_1', '.{$this->id}_2', '.{$this->id}_3'],
  194. requireAll: true,
  195. source: function(request, response) {
  196. var parent_id;
  197. $.each(request, function(key, val) {
  198. parent_id = val;
  199. });
  200. var data_url = '{$this->dataUrl}';
  201. $.getJSON(data_url, {parent_id:parent_id}, function(result) {
  202. var data = result.data;
  203. response($.map(data, function(item, index) {
  204. return {
  205. label: item.name,
  206. value: item.menu_id,
  207. selected: item.menu_id=='{$this->selectedIds[3]}'
  208. };
  209. }));
  210. });
  211. },
  212. onChange: function(event, value, requiredValues, requirementsMet){
  213. var targetId="{$this->id}_{$this->level}";
  214. var realId = "{$this->id}";
  215. var eventTargetId = $(event.target).attr('id');
  216. if(value=='')
  217. {
  218. $('#'+realId).val('');
  219. }
  220. else
  221. {
  222. if(targetId==eventTargetId&&value!='')
  223. {
  224. $('#'+realId).val(value)
  225. }
  226. }
  227. }
  228. }
  229. ]
  230. });
  231. JS;
  232. if (Yii::$app->request->isAjax) {
  233. echo "<script>";
  234. echo "{$js}";
  235. echo "</script>";
  236. }
  237. else
  238. {
  239. $view = $this->getView();
  240. $view->registerJs($js);
  241. }
  242. }
  243. protected function registerClientScript()
  244. {
  245. $view = $this->getView();
  246. $coreAsset = CoreAsset::register($view);
  247. $coreAssetsUrl = $coreAsset->baseUrl;
  248. $assetPlugin = PluginsAsset::register($view);
  249. $pluginUrl = $assetPlugin->baseUrl;
  250. return array('coreAssetsUrl'=>$coreAssetsUrl,'pluginUrl'=>$pluginUrl);
  251. }
  252. }