Тип поля "Список пользователей" помогите доработать!

InstantCMS 2.X
#1 2 мая 2021 в 21:00
Всем привет, я однажды поднимал тему /forum/thread34133-1.html и думал меня заглючило, но нет) я нашел этот "Тип поля", но я хочу его чуток улучшить, мне нужно чтобы был не список с мультивыбором, а окно куда начинаешь набирать буквы и тебе выводится список ников начинающихся с этих букв, например ввел букву "S" выводятся "Sysadmin", "Syana", "Sir", а когда добавляешь "Sy", оставалить только "Sysadmin" и "Syanya". Сейчас просто список Иллюстрацияа надо так

htmlbook.ru/html/datalist

Файлик который лежит в \system\fields\us.php
  1. <?php
  2.  
  3. class fieldUs extends cmsFormField {
  4. public $title = 'Список пользователей';
  5.  
  6. public $sql = 'text NULL DEFAULT NULL';
  7. public $is_vertical = false;
  8.  
  9.  
  10.  
  11. public function getOptions(){
  12. $users_model = cmsCore::getModel('users');
  13. $getf=$users_model->getGroups();
  14. $getmodel = new cmsmodel;
  15. $getmodels=$getmodel->get('users_fields',FALSE,'name');
  16. $getmodels= array_column($getmodels, 'title', 'name');
  17. $getg = array_column($getf, 'title', 'id'); $getg[0]='Все';
  18. return array(
  19. new fieldListMultiple('grup', array(
  20. 'title' => 'Выберите групы пользователей',
  21. 'items' => $getg
  22. )),
  23. new fieldListMultiple('pol', array(
  24. 'title' => 'Выберите выводимые поля в записи',
  25. 'items' => $getmodels
  26. )),
  27. new fieldCheckbox('grupaf', array(
  28. 'title' => 'Выводить название групп полей',
  29. 'default' => false
  30. ))
  31.  
  32.  
  33. );
  34. }
  35.  
  36.  
  37.  
  38.  
  39. public function parse($value){
  40.  
  41. $htl='';
  42. $pol=$this->getOption('pol');
  43. $grupaf=$this->getOption('grupaf');
  44. $getmodel = new cmsmodel;
  45. $getmodels=$getmodel->get('users_fields',false,'name');
  46. $val=explode(',', $value);
  47. $users_model = cmsCore::getModel('users');
  48. foreach ($val as $key => $uset){
  49. $use = href_to_profile($users_model->getUser($uset));
  50. $userr=$users_model->getUser($uset);
  51. $card_fields['email'] = 1;
  52. $content_model = cmsCore::getModel('content');
  53. $content_model->setTablePrefix('');
  54. $content_model->orderBy('ordering');
  55. $fields = $content_model->getContentFields('users');
  56. $i=0;
  57. foreach ($fields as $name => $field) {
  58. $inft3=''; $inft='';$inft2='';$titlcah='';$ceshep='';$profile_info='';
  59. foreach ($pol as $poln){
  60. if($field['name']==$poln){
  61. $childs[$name] = array(
  62. 'title' => $field['title'],
  63. 'name' =>$field['name'],
  64. 'hint' => $field['handler_title'] != $field['title'] ? $field['handler_title'] : '',
  65. 'default' => 1
  66. );
  67. } }}
  68. $childs1['profile_fields']=$childs;
  69. $profile_fields = array_intersect_key($fields, $childs);
  70. $profile = $userr;
  71. $card_fields = array_keys($childs);
  72. $ceshep=$ceshep.'
  73. <div class="widget_profile_card">'; //1
  74.  
  75. $a='<a href="'.href_to('users', $profile['id']).'"title="'.$profile['nickname'].'" ">';
  76.  
  77.  
  78. if (is_array($card_fields) && is_array($profile_fields)) { if (in_array('avatar', $card_fields) || in_array('nickname', $card_fields)) {
  79. $ceshep=$ceshep.'<div class="profile_info">'.$a.$profile['nickname'].'</a>';//2
  80. if (in_array('avatar', $card_fields)) {
  81. $ceshep=$ceshep.'<div class="avatar"><a href="'.href_to('users', $profile['id']).' ">'.html_avatar_image($profile['avatar'], 'micro', $profile['nickname']).'</a></div>'; }
  82.  
  83.  
  84. if (in_array('nickname', $card_fields)) {
  85.  
  86. $ceshep=$ceshep.'<div class="name"><a href="'. href_to('users', $profile['id']).'">'.'</a></div>';
  87. }
  88.  
  89. $ceshep=$ceshep.'</div>';} //2
  90.  
  91. $user = cmsUser::getInstance();
  92. $ceshep=$ceshep.'<div class="card_information content_item">';//2
  93. $fieldsets = cmsForm::mapFieldsToFieldsets($profile_fields, function($field, $user){
  94. if (in_array($field['name'], array('nickname', 'avatar'))){ return false; }
  95. return true;
  96. }, $profile);
  97. foreach($fieldsets as $fieldset){ if (!$fieldset['fields']) { continue; }
  98. $ceshep=$ceshep.'<div class="fieldset">';//3
  99. if($grupaf){
  100. if ($fieldset['title']){
  101.  
  102. $ceshep=$ceshep.'<div class="fieldset_title">
  103. <h3>'.$fieldset['title'].'
  104. </h3>
  105. </div>'; } }
  106.  
  107. foreach($fieldset['fields'] as $field){
  108. if (empty($profile[$field['name']]) || !$field['is_in_item']) { continue; }
  109. if ($field['groups_read'] && !$user->isInGroups($field['groups_read'])) { continue; }
  110. if (!isset($field['options']['label_in_item'])) {
  111. $label_pos = 'none';
  112. } else {
  113. $label_pos = $field['options']['label_in_item'];
  114. }
  115. $ceshep=$ceshep.' <div class="field ft_'.$field['type'].' f_'.$field['name'].'">';//4
  116.  
  117. if ($label_pos != 'none'){
  118. $ceshep=$ceshep.'<div class="title title_'.$label_pos.'">'.$field['title'].': </div>';
  119. }
  120.  
  121. $ceshep=$ceshep.'<div class="value">'.$a.$field['handler']->setItem($profile)->parse( $profile[$field['name']] ).'</a>
  122.  
  123. </div>
  124.  
  125. </div>';//4
  126.  
  127. }
  128.  
  129. $ceshep=$ceshep.'</div>';//3
  130.  
  131. }
  132. $ceshep=$ceshep.' </div>';//2
  133.  
  134. }
  135.  
  136. $ceshep=$ceshep.'</div>';//1
  137.  
  138. $htl=$htl
#2 3 мая 2021 в 10:49
@CEH9I, Это поле не подойдет под ваши задачи?
#4 3 мая 2021 в 15:30


@CEH9I, Это поле не подойдет под ваши задачи?

AndroS

Нет, пользователя я должен сам в поле указывать как администратор, при создании записи)
#5 3 мая 2021 в 15:33


Пример Виджет на JQuery и AJAX

@noname

То что нужно только как его прикрутить не пойму, тем более что при нажатии на пользователя он должен записываться в поле и сохраняется. На данный момент выглядит так, нажимаешь на чекбокс, потом сохраняешь запись и там сохраняется ник выбранного пользователя с ссылкой на его профиль.
#6 3 мая 2021 в 15:44
Что Вы пишете очень интересно, но мне очень не понятно .

при нажатии на пользователя он должен записываться в поле и сохраняется

@CEH9I
Искусственный интеллект предвижу не ранее чем в cms 3.0.
#7 3 мая 2021 в 18:55
@CEH9I, создайте новый виджет. В системный файл поместите php код из примера, заменив данные на свои. Таблицу и тп. В файл шаблона виджета поместите HTML код из примера. И всё). Ну и is код тоже конечно подключить.
#8 3 мая 2021 в 23:02


@CEH9I, создайте новый виджет. В системный файл поместите php код из примера, заменив данные на свои. Таблицу и тп. В файл шаблона виджета поместите HTML код из примера. И всё). Ну и is код тоже конечно подключить.

Lora

Зачем виджет? Мне это надо использовать в поле, в контенте.
#9 4 мая 2021 в 04:52
Дело не в том, что это будет, виджет или поле. Сделайте тоже самое для поля. И не переделывайте, то что есть, а сделайте новое. Возможно можно будет использовать простое строковое поле, повесив на него событие.
#10 4 мая 2021 в 07:00
@CEH9I, в файле \templates\default\assets\fields\us.php вместо этого
  1. <?php echo html_select_multiple($field->element_name, $field->data['items'], $field->data['selected'], array('id'=>$field->id, 'class' => $field->is_vertical ? 'block_labels' : '')); ?>
прописать это
  1. <?php $this->addTplJSNameFromContext('jquery-chosen');
  2. $this->addTplCSSNameFromContext('jquery-chosen');
  3.  
  4. echo html_select($field->element_name, $field->data['items'], $value, ($field->data['dom_attr'] + array('multiple' => true))); ?>
будет селектор с мультивыбором и строкой поиска по этому селектору.
#11 4 мая 2021 в 09:58


@CEH9I, в файле \templates\default\assets\fields\us.php вместо этого
прописать это
будет селектор с мультивыбором и строкой поиска по этому селектору.

Loadырь
Спасибо за ответ, но вылезает ошибка

Notice: Undefined index: dom_attr in/templates/default/assets/fields/us.tpl.php on line 8

При замене "dom_attr" на "selected" получается такое окно. Иллюстрация
#12 4 мая 2021 в 12:03
Вам надо в файл us.php добавить после
  1. new fieldCheckbox('grupaf', array(
  2. 'title' => 'Выводить название групп полей',
  3. 'default' => false
  4. )),
  5.  
этот код
  1. new fieldList('тут имя поля', array(
  2. 'default' => 'string',
  3. 'generator' => $search ;
  4.  
  5. ))
А в $search поместить ф-цию вывода групп пользователей. Или самих пользователей, что там вам надо. Наподобии этого
Там выводит типы контентов.Можете вместо $search подставить
  1. function() {
  2. return cmsForm::getAvailableFormFields('only_public', 'content');
  3. }
что бы посмотреть как будет.И это ли вам надо.
И вроде у вас в этом файле уже есть метод который возвращает список.
#13 4 мая 2021 в 12:37


Вам надо в файл us.php добавить после

  1. new fieldCheckbox('grupaf', array(
  2. 'title' => 'Выводить название групп полей',
  3. 'default' => false
  4. )),
  5.  
этот код
  1. new fieldList('тут имя поля', array(
  2. 'default' => 'string',
  3. 'generator' => $search ;
  4.  
  5. ))
А в $search поместить ф-цию вывода групп пользователей. Или самих пользователей, что там вам надо. Наподобии этого
Там выводит типы контентов.Можете вместо $search подставить
  1. function() {
  2. return cmsForm::getAvailableFormFields('only_public', 'content');
  3. }
что бы посмотреть как будет.И это ли вам надо.
И вроде у вас в этом файле уже есть метод который возвращает список.

Lora

Ошибка

Parse error: syntax error, unexpected 'new' (T_NEW), expecting ')'

Да и мне надо просто поле где при вводе букв будут подставляться нужные пользователи.

Сам список пользователей уже получен, нужно просто выбор не чек боксами а поиском по буквам. Я так понимаю копать надо только в файле us.tpl.php
#14 4 мая 2021 в 12:52

Ошибка

Нет там никакой ошибки.Я проверял.

Да и мне надо просто поле где при вводе букв будут подставляться нужные пользователи.

для этого нужен соответствующий метод, который будет выполнять соответствующий запрос.

Я так понимаю копать надо только в файле us.tpl.php

Нет. Но можете копать где хотите).
#15 4 мая 2021 в 12:54


Ошибка

Нет там никакой ошибки.Я проверял.

Да и мне надо просто поле где при вводе букв будут подставляться нужные пользователи.

для этого нужен соответствующий метод, который будет выполнять соответствующий запрос.

Я так понимаю копать надо только в файле us.tpl.php

Нет. Но можете копать где хотите).

Lora

Можете показать как у вас выглядит?
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.