Выбор стандартных иконок из темы в своём виджете

InstantCMS 2.X
#1 4 января 2025 в 12:31

Всех с наступившим НГ!. 

Подскажите пожалуйста как сделать выбор стандартной иконки в своём виджете?

Делаю так, но путь не получаю. 

  1. new fieldString('icon_top_btn', array(
  2. 'title' => 'Иконка',
  3. 'prefix' => '<a href="#" class="icms-icon-select" data-href="'.href_to('admin', 'settings', ['theme', cmsConfig::get('template'), 'icon_list']).'"><span>'.(defined('LANG_CP_ICON_SELECT') ? LANG_CP_ICON_SELECT : '').'</span></a>',
  4.  
  5. )),

Выводит выбор иконки, но путь у неё /admin/widgets#

Изображение

#2 4 января 2025 в 13:50

Посмотрите как реализовано в этом шаблоне instantcms.ru/addons/lte.html уже не помню, но долго заморачивался.

В виджете Статистика 

#3 4 января 2025 в 17:08

Посмотрите как реализовано в этом шаблоне instantcms.ru/addons/lte.html уже не помню, но долго заморачивался.

В виджете Статистика 

My-InstantCMS.Ru

У Вас не много не то. Вы сделали отдельным вывод шаблона и как я понял только к одному элементу.

А я хочу сделать, например: Поле телефон и к нему иконка, другое поле почта и к нему иконка.

#4 4 января 2025 в 21:25

Посмотрите как реализовано в этом шаблоне instantcms.ru/addons/lte.html уже не помню, но долго заморачивался.

В виджете Статистика 

My-InstantCMS.Ru

У Вас не много не то. Вы сделали отдельным вывод шаблона и как я понял только к одному элементу.

А я хочу сделать, например: Поле телефон и к нему иконка, другое поле почта и к нему иконка.

litemir

Проще через CSS 

#5 4 января 2025 в 21:28

Делаю так, но путь не получаю.

litemir

Так и не получите — вы пытаетесь в одном модальном окне Bootstrap вызвать второе окно с иконками. Bootstrap увы так не умеет. А вот если выбор иконки делать просто вставкой в строковое поле, то сработает: {solid:map}

#6 18 декабря 2025 в 18:17

Кому интересно, нашёл решение как получить системные иконки в своём виджете. 

Может кому то пригодится.

В форме после public function init() { 

Добавляем 

  1. $tpl = cmsTemplate::getInstance();
  2. $url = '/admin/settings/theme/' . cmsConfig::get('http_template') . '/icon_list';
  3.  
  4. $tpl->addBottom(<<<HTML
  5. <script>
  6. (function(\$){
  7.  
  8. var SPINNER =
  9. '<div style="display:flex; align-items:center; justify-content:center; height:220px;">' +
  10. '<div class="spinner-border" role="status" aria-hidden="true"></div>' +
  11. '</div>';
  12.  
  13. function ov(){
  14. var \$ov = \$("#icmsIconOverlay");
  15. if (\$ov.length) return \$ov;
  16.  
  17. \$ov = \$(
  18. '<div id="icmsIconOverlay" style="display:none; position:fixed; inset:0; z-index:99999;">' +
  19. '<div class="b" style="position:absolute; inset:0; background:rgba(0,0,0,.45)"></div>' +
  20. '<div class="w" style="position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); width:min(1100px,94vw); height:min(720px,92vh); background:#fff; border-radius:12px; overflow:hidden; box-shadow:0 20px 60px rgba(0,0,0,.35)">' +
  21. '<div style="display:flex; justify-content:space-between; padding:10px 12px; border-bottom:1px solid #eee;">' +
  22. '<div style="font-weight:600">Выбор иконки</div>' +
  23. '<button type="button" class="x btn btn-sm btn-light">&times;</button>' +
  24. '</div>' +
  25. '<div class="c" style="height:calc(100% - 49px); overflow:auto; padding:12px;"></div>' +
  26. '</div>' +
  27. '</div>'
  28. );
  29.  
  30. \$("body").append(\$ov);
  31. \$ov.on("click", ".b,.x", function(){ \$ov.hide().find(".c").empty(); });
  32.  
  33. return \$ov;
  34. }
  35.  
  36. function iconName(el){
  37. var \$el = \$(el);
  38. var d = \$el.data();
  39. if (d.icon) return String(d.icon);
  40. if (d.name) return String(d.name);
  41. if (d.value) return String(d.value);
  42.  
  43. var oc = \$el.attr("onclick") || "";
  44. var m = oc.match(/["']([a-z]+:[a-z0-9\\-]+)["']/i);
  45. return m ? m[1] : "";
  46. }
  47.  
  48. \$(document).on("click", "a.icms-icon-select", function(e){
  49. e.preventDefault();
  50.  
  51. window.__icms_icon_target = \$(this)
  52. .closest(".field, .form-group, .icms-field, td, .row, .icms-form-field, form")
  53. .find("input[type=text], input[type=search]").first();
  54.  
  55. var url = \$(this).data("href") || \$(this).attr("href");
  56. var \$ov = ov();
  57.  
  58. \$ov.show().find(".c").html(SPINNER);
  59.  
  60. \$.get(url, function(html){
  61. \$ov.find(".c").html(html).find("[onclick]").removeAttr("onclick");
  62. });
  63. });
  64.  
  65. \$(document).on("click", "#icmsIconOverlay .c a, #icmsIconOverlay .c button, #icmsIconOverlay .c [role=button], #icmsIconOverlay .c i, #icmsIconOverlay .c svg", function(e){
  66. var icon = iconName(this);
  67. if (!icon) return;
  68.  
  69. e.preventDefault();
  70. e.stopPropagation();
  71.  
  72. window.__icms_icon_target.val(icon).trigger("change");
  73. \$("#icmsIconOverlay").hide().find(".c").empty();
  74. });
  75.  
  76. })(window.jQuery);
  77. </script>
  78. HTML);

И само поле 

  1. new fieldString('icon', [
  2. 'title' => LANG_CP_MENU_ITEM_ICON,
  3. 'suffix' => '<a href="' . $url . '" class="icms-icon-select" data-href="' . $url . '"><span>' . LANG_CP_ICON_SELECT . '</span></a>',
  4. ]),

Если кто знает решение иное, прошу сказать как.

Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.

Похожие темы

Похожее в блогах

🍪Мы используем файлы cookie для работы сайта. Читать подробнее.