Интерактивный выбор термина в ноде

Главные вкладки

Аватар пользователя Kottov Kottov 14 июля 2014 в 15:29

Есть двух уровневый словарь таксономии.
Размещаю его в профиле и нодах с помощью Hierarchical Select. (нужен выбор именно конечного темина в дереве)
Надо чтобы любой (не автор ноды/профиля) пользователь мог выбрать термин из этого словаря.
Пробовал с Editable Fields, выставил допольнительные разрешения чтоб любой мог менять - не отображается для не авторов (выдает кучу ошибок, сам модуль сырой для 7) и эта кнопка "Сохранить" толком не нужна. Задача не саму ноду править а просто выбрать термин и отправить его по ajax на обработку.
С ajax - все понятно. Делал такое в формах ноды. Но как сделать в ноде и для всех пользователей?

Думаю что надо сделать аналог Hierarchical Select на javascript, загнать в него словарь, ну и вывести.

Или сделать Предствавсление, там использовать Exposed filter и вывести его поле ноды/профиля.

Пока себе смутно представляю что есть проще. Может есть уже какие-то полуготовые решения. Искал пока ничего нашел. Хотя интерактивность страницы думаю широкая тема.

Комментарии

Аватар пользователя Kottov Kottov 14 июля 2014 в 17:17

Но, вот тут это реализованно. http://wimleers.com/demo/hierarchical-select/taxonomy
Это не форма, а нода. Используется именно Hierarchical Select даже видно как ajax работает.

Для чего? Нечто вроде ubercart_marketplace своими руками )).
Например, интерактивно запросить чего (термин таксономии) и сколько (данные в базе) у продавца на складе.
На странице футболок, запросить сколько из них синих XXL на складе.

Hierarchical Select пусть только сделает выбор, не надо ничего сохранять - как в примере http://wimleers.com/demo/hierarchical-select/taxonomy

Ла, решение должно быть гораздо проще. Чето не доганяю.

Аватар пользователя Kottov Kottov 14 июля 2014 в 21:25

не так все просто как в примере с остатками на складе
еще кучу всяких дополнительных действий надо сделать - запросы по вебсокет на другие сервера

мне нужен маленький инструментик типа http://htmlbook.ru/html/optgroup - продвинутая форма селект
но чтоб там было два поля выбора: родительское и дочернее отдельно
и чтоб я туда мог словарь таксономии вогнать - (все это делает Hierarchical Select) остальное я лучше руками чем из пушки по воробьям.

Вопрос простой как использовать выбор Hierarchical Select не только в форме но и просто в ноде.

Неужели нужно хуками его туда вгонять. Если так можено то каким именно?

Аватар пользователя Kottov Kottov 15 июля 2014 в 4:49

Да, спасибо. Именно то что я хотел увидеть. Страно что нет оригинальных модулей под это. Установил. Но он работает только как приемер.
Ему еще надо сделать новый тип поля. Глянул сюда http://internetdevels.ru/blog/module-with-field-api-drupal-7 и понял что для меня это еще рановато )).

Но должна же быть возможность его вызывать прямо из поля с php фильтом?
Попробовал прописать запускающую функцию example_hs_menu(); - но не сработало

Аватар пользователя Kottov Kottov 15 июля 2014 в 12:32

Спасибо, помогли. ))
Если бы я знал что нужно делать, я бы это делал, а не спарашивал тут у знатаков как и чего не надо делать.

Я ущу выход из ситуации отсутствия в Друпале элементарного функционала. И если вам он тоже не известен (или лень его искать) то .... помогите там где реально можете помочь.

Вопрос в понимании как работает Друпал. Почему одно и тоже поле в форме работает одним образом, а в ноде другим (хотя в exposed filter работает как в форме). Что этим управляет?

Многие моменты CMS не очивидны, это не есть естественное знание, это то как каким-то людям показалось удобным собарать все вместе. И тем пользуется приходится долго узнавать как именно пользоваться и просто привыкать к тому как оно сделано.

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 15 июля 2014 в 15:06

"Kottov" wrote:
Если бы я знал что нужно делать, я бы это делал, а не спарашивал тут у знатаков как и чего не надо делать.

Мне кажется вы путаете "Что" и "Как".
Попутно сублимируя своё желание велосипедировать в поиск нестандартных использований стандартных решений.
Уже б давно написали свой модуль с виджетом от HS и делали бы свои запросы к другим серверам.
Зачем в эту схему вносить ещё один костыль в виде php-фильтра, мне непонятно.
Всё равно же модуль писать придётся

Аватар пользователя Kottov Kottov 15 июля 2014 в 16:58

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

Если вас послушать то и views пользоваться не нужно, а самому все писать, чтоб было именно то что нужно.

Если него дельного сказать, так и делайте, - ничего не говорите.
По вашему станицы должны быть статическими, а интерактивность в виде селекта - это нечто нестандартное, узкоспецифическое что нужно с нуля писать.

Спашиваю тех кто с этим сталкивался и у кого есть наработки по этому вопросу.

Как так получилось что для предствалений куча вариантов по интерактивности, а нода ... как доска.
Оно же всеми как-то решается. Неужели все представлениями обвешиваются и это есть нормальное решения вопроса.

Аватар пользователя teatest teatest 15 июля 2014 в 16:58

"Kottov" wrote:
Спашиваю тех кто с этим сталкивался и у кого есть наработки по этому вопросу.

Вы наверное удивитесь, но этот человек один из немногих, кто имеет какие-либо наработки.
Попробуйте уточнить вариант реализации, если не ясно или скорректируйте требования, может и другие подключатся.

Аватар пользователя Kottov Kottov 15 июля 2014 в 17:20

не могу понять что тут можно уточнить

в форме создания ноды выбирали термин таксономии с помощью Hierarchical Select
так нужно это же самое чтоб было возможно для "всех" в уже готовой ноде (при ее просмотре)

ничего большего действия а сам через яваскрипт и ajax прикручу

вот тут это сделано http://myweb.tiscali.co.uk/cornford/example_scripts/dependent_select.html
взял пока это, вбил в html словарь в ручную и все работает
Скажите зачем тогда друпал если в ручную быстрее чем разбираться-разбираться как это в нем правильно-правильно делается, или узнавать-дознаваться у других как это ускорить.

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

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 15 июля 2014 в 19:17

"Kottov" wrote:
Если вас послушать то и views пользоваться не нужно, а самому все писать, чтоб было именно то что нужно.

Если меня послушать, то можно понять, что панацеи нет, но вполне можно использовать виджет от HS, не переписывая его.
Из коробки HS не даёт функционала как вам нужен.
"Kottov" wrote:
Если него дельного сказать, так и делайте, - ничего не говорите.

Это да. Извините, что сразу код для вас не выложил.
"Kottov" wrote:
По вашему станицы должны быть статическими, а интерактивность в виде селекта - это нечто нестандартное, узкоспецифическое что нужно с нуля писать.

Да, ноды должны быть нодами, а остальная логика должна реализовываться модулями.
Узкоспецифичное всегда с нуля писать, но в вашем случае можно подтянуть нужный виджет.
Противоречие в вас

Аватар пользователя Kottov Kottov 15 июля 2014 в 20:18

Подождем того кто помимо советов того что можно и нельзя - даст дельный совет как это можно.
Спасибо и на том, а ведь мог бы и .... ))

То что можно, я и сам это понимаю. Не писал бы сюда о полетах на Марс.

Аватар пользователя Kottov Kottov 21 июля 2014 в 4:10

Создание (программно) простого текстого поля, ссылки, кнопки можно делать через довавление фейкового поля с помощью hook_node_view() и hook_field_extra_fields()


<?php
function hook_node_view($node$view_mode$langcode) {
  
$additional_field 'My extra text here';
  
$node->content['my_additional_field'] ['my_additional_field'] = array(
    
'#markup' => $additional_field
    
'#weight' => 10
    
'#theme' => 'mymodule_my_additional_field',
  );
}
?>

http://www.computerminds.co.uk/drupal-code/add-stuff-node-and-configure-...
http://www.webomelette.com/altering-node-content-it%E2%80%99s-rendered-p...
https://groups.drupal.org/node/35844

Надо лишь забить соответсвующую инф. в #markup b #theme

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

Аватар пользователя Kottov Kottov 31 июля 2014 в 13:10

Получилось.
Пока напишу в общем, так как есть одна ошибка.

Создал поле с помощью function hook_field_extra_fields()
Передал ему форму виджета HS select из http://xandeadx.ru/blog/drupal/446 с помошью hook_user_view()
из виджета а убрал кнопку Submit и ее callback

<?php/**
 * Submit callback
 */
function хххххххххххх_example_form_submit($form, $form_state) {
  //dsm($form_state);
}?>

так как он сбрасывал всю форму - поля переключались на -None-
создал в function hook_field_extra_fields() еще одно поле для кнопки и в hook_user_view() саму кнопку.
К этой кнопке добавил ajax запрос который яваскриптом подхватывает из виджета термин.
Яваскритп файл подключил через hook_user_view_alter(&$build)
Все срабатывает ajax запрос уходит и получается ответ.

Но после нажатия на кнопку яваскрип должен раз сработать и все - а он запускается снова и снова. Даже ответ ajax еще не успел прийти а он выполняется еще раз и запускает новые ajax запросы.

Сам ajax(с его явскрипт-файлом) на 100% рабочий, так как использовал его с формой html собранной вручную.
По сути ничего не изменилось просто данные для ajax теперь берутся с другого виджета.
Единственное что в самом HS select используется ajax - ну так он срабатывает только когда я выбираю термин.

Поискал ответы в инете. Там подобное было из-за ошибки в ядре.

Аватар пользователя Kottov Kottov 31 июля 2014 в 14:20

Понял что проблема связана с HS виджетом.
Если он влючен, то при загрузке странцы файл яваскрипта ajax запроса запускается сразу несколько раз. И далее каждый раз при выборе термина запускаются еще запускается по несколько раз. Когда жму кнопку ajax запроса - то соответственно срабатывают весь десяток "висящих" яваскриптов и делается десяток ajax запрсов.

Я так понимаю что это ajax виджет постоянно перестраивает страницу и каждый раз вызывает hook_user_view_alter(&$build) через который я подгружаю яваскрипт.

Аватар пользователя Kottov Kottov 14 августа 2014 в 5:22

Сменил хук вызывающий js с hook_user_view_alter(&$build) на hook_init() - не помогло.
Оставил старый селект (собраный вручную из html+js) и рядом подклячил HS на ajax.
Старый работает нормально - по выбору и клику по кнопке запускает нужный ajax запрос.
Но стоит тронуть HS и затем вызвать ajax по старому селекту - сразу идут 10 запросов.

Аватар пользователя Kottov Kottov 18 августа 2014 в 22:14

разобрался в чем было дело.
друпаловаский ajax создает серию своих js файлов и если есть свои js файлы работающие с ajax - то получается такая каша.

решил перенести свой ajax запрос внутрь ajax обрабатывающего селект, - в xxxxxx_form_ajax_callback
Все будто бы получается. Но туда нужно также передать и uid просматриваемого профиля. Так как axaj постоянно использует адресную строку то получить из arg() или любой другой метод по адресу - не выходит.

создал в форме дополнительное поле

<?php    $form['prof_uid'] = array(
          
'#type' => 'value',
          
'#value' => arg(1),
         );
?>

затем получил его значение в xxxxxx_form_ajax_callback

<?php$prof_uid = $form_state['values']['prof_uid'];?>

но так как селект сложный то ajax обращается к форме несколько раз и затирает uid из '#value' => arg(1) на 'ajax'.
Значит надо поймать первое значение arg(1)и сохранить его до конца работы ajax.

Пробовал просто через static

<?phpstatic $static_prof_uid; // так тоже пробовал $static_prof_uid = 0;
$prof_uid = $form_state['values']['prof_uid'];
if(is_numeric($prof_uid)){$static_prof_uid = $prof_uid;}?>

- не работает. Первое значение ловится и затирается на последующими на ' '.

попробовал по-Друпаловски

<?php    static $static_prof_uid;
    
$static_prof_uid = &drupal_static(__FUNCTION__);
    
$prof_uid $form_state['values']['prof_uid'];
    if(
is_numeric($prof_uid)){$static_prof_uid[0] = $prof_uid;}?>

тоже не работает.

поробовал в другой функции (hook_user_view) получить uid и передать его в callback - делал как тут http://drupal.stackexchange.com/questions/85968/using-static-variables-i...
тоже не выходит

базовый пример https://api.drupal.org/comment/55503#comment-55503 - получился, значит как-то это возможно
я так понял что многие трудности упираются как раз при передачи переменных, - вот подобная проблема была http://www.drupal.ru/node/88618