[EVO] [customTV] choiceTV - выбор значений из уже заполненных TV или запись нового

Очень часто бывает ситуация когда нужно сделать TV с типом select но при этом что б была возможность туда добавить еще вариант.







Установка:
1 скачиваем gist.github.com/dmi3yy/5026312
2 заливаем в папку /assets/tvs/choicetv/ файл choiceTV.php
3 создаем TV тип ввода custom input и возможные значения вставляем:
@INCLUDE /assets/tvs/choicetv/choicetv.php
4 наслаждаемся результатом.

UPD 01.03.2013 исправил ошибку если нужно было вызывать несколько таких тв в одном документе теперь работает как положено
качать там же
gist.github.com/dmi3yy/5026312

65 комментариев

avatar
А что выведется на фронте через [*tvname*]?
И как будет выглядеть форма, когда войдешь редактировать документ?
И я бы уточнил, что доп.значение сохраняется только для данного документа, в остальных документах этот пункт не появится при его добавлении.
avatar
Не мало нюансов.
avatar
дык это как обычный тв выводится то что положено )
avatar
Скачал и потестировал.
[*tvname*] выводит то, что и выбрано. Когда входишь редактировать, видишь то, что было выбрано. В остальных документах добавленный пункт также доступен для выбора.
avatar
Перечитал код на свежую голову. Я ошибся, действительно будут новые значения доступны в остальных документах. Остается только один неприятный момент — значения, введенные с ошибкой, вычистить из списка не получится. И еще можно в запрос добавить сортировку по алфавиту, иначе на больших списках будет тяжело ориентироваться.
avatar
Очень прикольно. Еще бы все это можно было в шаблон eform добавить)
avatar
А зачем это в шаблоне eForm? это ж для Админки
для Eform можно сделать похоже через небольшой сниппет
avatar
Аякса бы сюда, а то напрягает обязательное сохранение после добавления значения. И возможность выбора нескольких значений.
avatar
Да, и защиту от ввода html тоже надо бы. А то можно вот такой результат заполучить:
Комментарий отредактирован 2013-02-25 07:52:38 пользователем tiptop
avatar
вот это да надо поправить будет а то бага
avatar
Дык так для всех TV да и для любых изменений документа в админке нужно сохранять документ потому думаю ajax тут не нужен
avatar
Да, но при создании документа, когда я дойду до заполнения этого параметра и добавлю новое значение, документ автоматически сохранится. И я еще не тестировал этот момент с ситуацией, когда не все обязательные параметры будут заполнены. Потому, сохранение должно быть не когда я энтер нажал при добавлении параметра, а когда я сам кнопку Сохранить нажму.
avatar
так оно ж само и не сохраняется)
avatar
А, ну да, что-то туплю, пора перекур делать…
avatar
Полезная штука, давно о подобном думал :)
А можно будет замутить подобное с мультивыбором, на чекбоксах к примеру?
avatar
немного более сложный php и js получиться но сделать можно тоже и с мультивыбором
avatar
UPD 01.03.2013 исправил ошибку если нужно было вызывать несколько таких тв в одном документе теперь работает как положено
качать там же
gist.github.com/dmi3yy/5026312
avatar
Всем привет, баг нашел еще один: если в ManagerManager создать новую закладку и на ее попробовать перенести TV c типом custom input, то TV не хочет переноситься.
Что сделал: изменил тип TV на текст — открыл документ для редактирования, TV на нужном табе, как и прописано, зашел и снова изменил тип TV с текст на custom input, открыл для редактирования документ опять и снова TV не на новом табе, а на стандартном Общие. В какую сторону копать?
avatar
версия MM какая?
avatar
0.4
avatar
по умолчанию если не ошибаюсь customTV вообще нельзя никуда перенести

If you want to modify the multiTV with ManagerManager you have to patch the file mm.inc.php and insert case 'custom_tv': in line 136 just before the line $t = 'textarea'; (Note 4)

в понедельник проверю по логике должно помочь и для моего решения
avatar
Открыл файлик mm.inc.php и там оказывается уже есть этот кэйс 'custom_tv'…


...
	switch ($thisTv['type']){ // What fieldtype is this TV type?
		case 'textarea':
		case 'rawtextarea':
		case 'textareamini':
		case 'richtext':
		case 'custom_tv':
			$t = 'textarea';
		break;
...
avatar
ага нашел в чем суть думаю как теперь увязать все вместе
что б и решение мое работало и другие customTV
avatar
Убрать строку
case 'custom_tv':

и обновить еще раз кастом тв
тогда будет работать

но тут есть 1 момент кастом тв может быть любым из полей тоесть и input и textarea и select
в итоге при использовании нескольких кастом-тв с разными типами только 1 из них можно завязать на managermanager
avatar
Спасибо! Сработало, но получается, что если я на текстовое поле вешаю любой виждет, в частности, это виджет яндекс карты, то он тоже как бы уже кастомным становится, несмотря на то, что у него тип Text а не Custom input? Интересуюсь, потому что виджет карт яндекс теперь отказывается переносится на новую вкладку ((( ну это ладно, оставлю пока на закладке Общие.
avatar
виждеты mm это другая тема странно что они не работают адекватно (
надо баг репорт отправить в DivanDesign это они делали
виджеты карт

притом что остальные виджеты не их работают и переносятся замечательно
avatar
www.divandesign.ru/ это им там на сайте через обратную связь написать?
avatar
ага или тут пользователю Ronef
avatar
Супер идея и неплохая реализация, единственное что логически напрашивается после добавления варианта возможность и удаления…
avatar
Думал но так и не пришел к удобному решению
по факту что б удалить нужно просто выбрать другой пункт
и если не будет ни одного документа с таким параметром то он сам пропадет

просто если удалить сделать то оно ж будет удалять из всех документов тоесть получим гдето пустые поля после удаления что не есть гуд
avatar
пытался использовать у себя это решение, но ни в какую не хочет работать, поэтому есть несколько вопросов, чтобы выяснить что делаю не так:

1) Проверялась ли работа с YAMS? Может причина в нем.
2) Как передавать ID категории из которой брать возможные варианты?
3) Есть ли еще какой-то параметр в админке кроме «Enable @Bindings commands» который нужно включить\изменить чтобы заработали @INCLUDE, @EVAL, @SELECT?
4) Какой визуальный компонент нужно использовать? Перепробовал разные варианты, но мало ли.
  • ablik
  • 0
avatar
Этот кастом тв работает не с категориями а со значениями в тв
тоесть проверяются все тв
avatar
Ясно, значит он мне не совсем подходит и становится более актуальным другой вопрос. Можно ли как-то заставить работать @EVAL? Движок кастом 1.0.10-d5.4R.
«Enable @Bindings commands» включен, но все равно не обрабатывается.
И судя по этому топику modx.im/blog/824.html проблема не только у меня.
Может с тех пор нашлось уже решение проблемы?
avatar
да работает без проблем в TV @
иначем и custom TV не работали а тот же MultiTV использую почти везде

@ не работает для типов text textarea
только для выпадающего списка чекбоксов и радиобоксов
avatar
видимо движок криво установился или еще чего, значит буду копать…

Так как все делаю как обычно, TV-параметр имеет тип DropDown List Menu.
В значение по умолчанию вставляю
@EVAL return $modx->runSnippet('itemsList');

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


@SELECT pagetitle FROM modx_site_content WHERE parent = 203

@EVAL $children = $modx->getDocumentChildren(44); foreach($children as $child) {$output .= $child['pagetitle']."==".$child['id']."||"; } return $output;
avatar
не помогло
avatar
дайте скриншет редаткирование этого тв
avatar
восстановил сейчас сайт из вчерашнего бекапа и предложенное выше решение заработало.
Видимо проблема была связана с какой-то из моих правок, буду искать что именно вызвало такую проблему.
Спасибо за помощь.
avatar
Таки есть бага исправим скоро
avatar
Вопрос немного не в тему, но как можно правильно вывести список всех возможных значений дочерних документов без повторений (сформулировал понятно на сколько мог:))

Опишу на примере, чтобы было понятнее. Есть каталог товаров, хочу сделать фильтр по производителям на базе autoFilter, а список производителей формировать с помощью choiceTV. Накидал простенький сниппет который на странице пробегается по дочерним документам, собирает их значение из TV параметра и на их основе строит список из чекбоксов, что-то типа такого:


Но проблема в том, что если у трех товаров в этом списке будет выбран производитель «LG», то появится три чекбокса и т.д. Подскажите пожалуйста, как можно «склеить» одинаковые параметры, чтобы не было таких повторов?
  • ablik
  • 0
avatar
1. почему чекбоксы а не радиокнопки? У одного товара может быть два производителя?
2. список призводителей не бесконечен, почему бы не упростить себе задачу и не прописать их руками в возможных значениях?
avatar
Есть чудо функция DISTINCT как раз убрать дубли)
avatar
1. Потому что это фильтр. У одного товара производитель один, но один производитель может выпускать несколько товаров:) Ведь я могу хотеть найти и «самсунги» и «элджи».
2. Потому что клиент пока не знает сколько будет производителей. А гонять контент-менеджера каждый раз в настройки ТВ-параметра не лучшая идея. Вообще раньше решал эту проблему с помощью категории с дочерними документами-производителями, очень просто и быстро. Но такое решение очень не красивое, с choiceTV явно интересней.
avatar
Ясно, я просто непонял суть вопроса, решил что речь про бекенд.
Комментарий отредактирован 2013-09-25 14:27:52 пользователем tiptop
avatar
Логичней всего в дереве документов создавать всех брендов
что б там можно было и лого вставить и описание и потом использовать эту страничку для вывода всех товаров этого производителя
avatar
раньше так и делал, просто тут ни лого ни чего либо еще не нужно, думал можно обойтись без создания дополнительных документов.

А за подсказку спасибо, я что-то так увлекся использованием ModxAPI что совсем забыл что можно SQL запросом решить:)
avatar
А можно в коде узнать id(другие параметры) родителя?
Просто хочу поменять код так что-бы он зависел от родителя/
avatar
можно
avatar
Извиняюсь, попробую по другому.
Я создал свой TV c типом ввода «Custom inoput», работает.
Теперь хочу код немного модернизировать, так что-бы он зависел от родителя(Тогда мне не надо плодить разные шаблоны для родителей.)
Как в коде узнать id родителя?
avatar
я привязывался к $_GET['id'] или для нового документа сразу получаем $_GET['pid']
еще поидее в масиве данные которые получаем уже есть парент непомню только как правильно обратиться туда надо смотреть
avatar
В javascript нашел
var id = document.mutate.id.value;
var pid = document.mutate.parent.value;
alert(«id=»+id+"---parent="+pid);
avatar
Только странно как-то, код modx отработал и проверил все сам, и даже установил переменные в javascript, вот не понятно почему пользователю не дать возможность использовать эти переменные в своем плагине? Ведь можно использовать $field_id, $field_value! Может можно в custom версии modx evo сделать доступные и другие важные переменные, например id документа и id родителя?
avatar
так они и так доступны если к ним правильно обращаться :)
avatar
Ну я почему-то не нашел в документации про переменные $field_id, $field_value и если бы не код choiceTV.php я о них бы и не узнал. Я не знаю как правильно к ним (id документа и id родителя) обращаться, но и документации я этого не нашел.
avatar
Всего описать невозможно — нужно просто знать, что вывод ТВ в админку (вернее формирование их внешнего вида в зависимости от того, что вы выбрали при создании) осуществляется в файле manager/includes/tmplvars.inc.php, который собственно определяется функцией

function renderFormElement($field_type, $field_id, $default_text, $field_elements, $field_value, $field_style='', $row = array()) {}


Внутри этой же функции как один из частных случае производится и разбор tv с типом custom — опять же как один из вариантов — включением файла через @INCLUDE. Ну и естествено в этом файле также доступны переменные функции, указанные выше.

А узнать это можно только тогда, когда понадобиться. Возможно, если бы вам это было не нужно, вы бы даже узнав что такое есть — просто не обратили на это внимание :)
avatar
Родитель да. Есть parent. А вот цепочки родителей нет.
Вот если б можно сделать опционально цепочку плейсхолдеров от корня, типа [+level1+] [+level2+] [+level3+] с id документов, то отпала бы необходимость в UltimateParent.
avatar
Цепочку родителей можно получить простейшей функцией из API — $modx->getParentIds($id);

На выходе имеем массив всех родителей ресурса $id. И кстати, эта функция описана точно везде :)
avatar
Так и делаю в плагине.
avatar
УПС…
Столкнулся с такой проблемой: с помощью MM скрыть choiceTV невозможно.
Не работает запись:
mm_hideFields('tvauthor');

Есть пути решения?
avatar
я мог упустить или название или ID поидее нужно глянуть чего не хватает что б скрылось или перенеслось
avatar
по моему проблема несколько шире, скрыть любой custom input не удаётся…
avatar
multiTv переноситься без проблем
avatar
А есть что-то подобное для MultiSelect_TV?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.