Copyable.php 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. namespace App\Admin\Extensions\Form;
  3. use Dcat\Admin\Admin;
  4. use Dcat\Admin\Form\Field;
  5. use Dcat\Admin\Support\Helper;
  6. /**
  7. * Form页面复制功能
  8. *
  9. * 为Form页面的字段添加复制按钮功能
  10. */
  11. class Copyable extends Field
  12. {
  13. /**
  14. * 添加复制功能的JavaScript脚本
  15. */
  16. protected function addScript()
  17. {
  18. $script = <<<'JS'
  19. $('.form-field-copyable').off('click').on('click', function (e) {
  20. e.preventDefault();
  21. var content = $(this).data('content');
  22. // 创建临时输入框
  23. var $temp = $('<input>');
  24. $("body").append($temp);
  25. $temp.val(content).select();
  26. // 执行复制
  27. try {
  28. var successful = document.execCommand('copy');
  29. if (successful) {
  30. // 显示成功提示
  31. Dcat.success('复制成功');
  32. } else {
  33. Dcat.error('复制失败');
  34. }
  35. } catch (err) {
  36. // 使用现代API作为备选方案
  37. if (navigator.clipboard) {
  38. navigator.clipboard.writeText(content).then(function() {
  39. Dcat.success('复制成功');
  40. }).catch(function() {
  41. Dcat.error('复制失败');
  42. });
  43. } else {
  44. Dcat.error('浏览器不支持复制功能');
  45. }
  46. }
  47. $temp.remove();
  48. });
  49. JS;
  50. Admin::script($script);
  51. }
  52. /**
  53. * 渲染复制按钮
  54. *
  55. * @return string
  56. */
  57. public function render()
  58. {
  59. $this->addScript();
  60. $value = Helper::htmlEntityEncode($this->value());
  61. if ($this->value() === '' || $this->value() === null) {
  62. return '<div class="form-group"></div>';
  63. }
  64. $label = $this->label;
  65. $id = $this->id();
  66. $html = <<<HTML
  67. <div class="form-group">
  68. <label for="{$id}" class="col-sm-2 control-label">{$label}</label>
  69. <div class="col-sm-8">
  70. <div class="form-field-copyable-wrapper">
  71. <p class="form-control-static">{$value}</p>
  72. <a href="javascript:void(0);"
  73. class="form-field-copyable btn btn-sm btn-outline-secondary"
  74. data-content="{$value}"
  75. title="点击复制">
  76. <i class="fa fa-copy"></i> 复制
  77. </a>
  78. </div>
  79. </div>
  80. </div>
  81. HTML;
  82. return $html;
  83. }
  84. }