Estoy creando un tipo de contenido de paneles CTools (es decir, lo que inserta en los paneles al agregar contenido, no un tipo de nodo) y estoy tratando de usar el #ajax
atributo de un elemento de formulario para establecer algunos valores predeterminados. Ver el código a continuación.
Todo esto está dentro de la my_module_content_type_edit_form($form, &$form_state)
llamada del tipo de contenido , por cierto.
$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')),
);
Mi devolución de llamada es la siguiente.
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'];
}
Independientemente de si el retorno que sugiero realmente funcionaría, watchdog()
ni siquiera funciona.
Sé que CTools hace algunas cosas raras con AJAX, pero no puede ser tan raro. ¿Tienes alguna idea de cómo haría lo que quiero hacer?
¡Gracias!
Alternativamente: ¿Cómo configuro un valor predeterminado basado en el valor de una opción de formulario anterior?
Descubrí cómo hacer esto, pero es un poco complicado: crea nuevos campos de formulario para cada bifurcación de dependencia. Luego puede fusionar los valores juntos hook_content_type_edit_form_submit()
, usando el que corresponda al valor elegido para el componente que inicialmente bifurcó todo.
Dejo la pregunta abierta porque yo (y, francamente, cada programador con el que estoy trabajando) realmente quiero una buena forma de usar AJAX dentro de estos formularios de edición de tipo de contenido del Panel.
Actualización: Parece que tampoco puedes hacer cosas con #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'
),
)
);
fuente
ctools_add_js();
odrupal_add_js();
al final dehook_content_type_edit_form();
. Si solo está haciendo cosas simples relacionadas con la interfaz de usuario, parece que esa podría ser la mejor opción (al menos hasta que alguien responda correctamente esta pregunta).Respuestas:
Respuesta corta: debe usar #ajax ['ruta'].
Respuesta larga:
Tener una devolución de llamada ajax no ayuda, ya que ctools crea sus formas de manera diferente afaik. La devolución de llamada realizada por system / ajax no puede encontrar la definición completa del formulario, por lo tanto, no puede encontrar un elemento para procesar la solicitud de ajax. El uso de #ajax [ruta] solo activa un elemento de menú.
Puede verificarlo usted mismo volcando el formulario cuando use #ajax [devolución de llamada]
Modifiqué el simplecontext_content_type_edit_form agregando el widget de autocompletado del usuario y su campo, que funcionan :)
Como ahora usa la ruta #ajax, necesita agregar un elemento de menú como me gustó
Un truco sobre #attached [js]: el js en línea debe ser clave => valor como:
He usado Firebug para verificar el valor resultante, no el efecto resultante. Espero que esto ayude a solucionar su problema.
fuente
Tuve un problema similar, en el que quería incluir un tipo de elemento Media en un complemento de tipo de contenido CTools, que también usa ajax para seleccionar una imagen.
Utiliza su propia configuración de 'ruta' ajax, en lugar de la configuración de 'devolución de llamada', pero al seleccionar una imagen, el formulario se reconstruyó sin el elemento multimedia por completo.
Rastreé esto al hecho de que drupal_rebuild_form no pudo encontrar ni la función de contenedor de formularios CTools, ni la función de formulario de configuración real. Así que lo arreglé agregando estas líneas de código al formulario de configuración de ctools:
Tal vez me falta algo obvio por qué los archivos de inclusión no se cargan, pero incluirlos me solucionó el problema manualmente.
fuente
por mi parte, tuve que escribir una función de envoltura de formulario en el archivo .module e incluir el panel manualmente (donde se define el contenido del formulario original) así:
Ahora, durante la llamada ajax, Drupal puede recuperar mi formulario para poder usar la API de formulario AJAX estándar.
fuente