Я создаю тип содержимого панелей CTools (то есть то, что вы вставляете в панели при добавлении контента, а не тип узла), и я пытаюсь использовать #ajax
атрибут элемента формы, чтобы установить некоторые значения по умолчанию. Смотрите код ниже.
my_module_content_type_edit_form($form, &$form_state)
Кстати, это все внутри вызова типа контента .
$form['link_type'] = array(
'#type' => 'radios',
'#title' => t('Link Type'),
'#ajax' => array(
'callback' => 'my_module_set_target'
),
'#default_value' => empty($conf['link_type']) ? '_blank' : $conf['link_type'],
'#options' => array('none'=>t('No Link'), 'internal'=>t('Internal Link'), 'external'=>t('External Link'), 'document'=>t('Document Link')),
);
Мой обратный звонок следующий.
function my_module_set_target($form, $form_state) {
watchdog("Test", "Testing callback", array(), WATCHDOG_ALERT);
$form['link_target']['#default_value'] = '_parent';
return $form['link_target']['#default_value'];
}
Независимо от того, будет ли возвращение, которое я предлагаю, действительно работать, watchdog()
даже не работает.
Я знаю, что CTools делает странные вещи с AJAX, но это не может быть так странно. У вас есть идеи о том, как я буду делать то, что хочу?
Спасибо!
Альтернативный вариант: как установить значение по умолчанию на основе значения предыдущего параметра формы?
Я понял, как это сделать, но это немного глупо - вы создаете новые поля формы для каждого форка зависимости. Затем вы можете объединить значения вместе hook_content_type_edit_form_submit()
, используя то, что соответствует значению, выбранному для компонента, который изначально разветвлялся.
Я оставляю вопрос открытым, потому что я (и, честно говоря, каждый программист, с которым я работаю) действительно хочу хороший способ использовать AJAX в этих формах редактирования типов контента Panel.
Обновление: Похоже, что вы не можете делать вещи с #attached, либо.
$form['link'][$i] = array(
'#type' => 'fieldset',
'#title' => t('Link #@num', array('@num' => $i)),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#attached' => array(
'js' => array(
'alert("Yay.");', 'inline'
),
)
);
источник
ctools_add_js();
илиdrupal_add_js();
в концеhook_content_type_edit_form();
. Если вы просто делаете простые вещи, связанные с пользовательским интерфейсом, кажется, что это может быть лучшим вызовом (по крайней мере, пока кто-то правильно не ответит на этот вопрос).Ответы:
Краткий ответ: вы должны использовать #ajax ['path'].
Длинный ответ:
Наличие обратного вызова ajax не помогает, поскольку ctools создает свои формы по-разному. Обратный вызов, выполняемый system / ajax, не может найти полное определение формы, поэтому не может найти элемент, для которого обрабатывается запрос ajax. Использование #ajax [путь] просто вызывает пункт меню.
Вы можете проверить сами, выгрузив форму при использовании #ajax [callback]
Я изменил simplecontext_content_type_edit_form, добавив виджет автозаполнения пользователя и ваше поле, которые оба работают :)
Так как вы сейчас используете путь #ajax, вам нужно добавить пункт меню, как я хотел
Нечетная пометка о #attached [js]: встроенный js должен иметь значение key =>, например:
Я использовал Firebug для проверки результирующего значения, а не результата. Поэтому я надеюсь, что это поможет решить вашу проблему.
источник
У меня была похожая проблема, когда я хотел включить тип элемента Media в плагин типа контента CTools, который также использует ajax для выбора изображения.
Он использует собственный параметр пути 'ajax' вместо параметра 'обратный вызов', но при выборе изображения форма была перестроена без использования медиа-элемента полностью.
Я проследил это до того, что drupal_rebuild_form не смог найти ни функцию-оболочку формы CTools, ни функцию формы реальных настроек. Поэтому я исправил это, добавив следующие строки кода в форму настроек ctools:
Может быть, я упускаю что-то очевидное, почему включаемые файлы не загружаются, но включение их вручную решило проблему для меня.
источник
со своей стороны я должен был написать функцию обертки формы в файле .module и вручную включить панель (где определено исходное содержимое формы), например:
Теперь, во время вызова ajax, Drupal может получить мою форму, чтобы я мог использовать стандартный API формы AJAX.
источник