php - data - drupal 8 cache
Drupal Ajax Cache (2)
Me he encontrado con este problema varias veces y no es un problema de almacenamiento en caché. El problema es que originalmente tendrás un <div>
envuelto alrededor de tu elemento mywrapper
, pero en tu devolución de llamada ajax lo estás reemplazando por una cadena ... el envoltorio <div>
por lo tanto se reemplaza y la próxima vez que presionas el botón el script no puede encontrar el <div>
que necesita reemplazar ya que no está allí.
Además, los argumentos para su función mycallback
deben pasarse por referencia, así que cambie la firma a esto: function mycallback(&$form, &$form_state) {
.
Intente hacer que su código se vea un poco más como este:
function mymodule_my_form($form, &$form_state) {
$form[''fieldset''] = array(
''#type'' => ''fieldset''
);
$form[''fieldset''][''my_element''] = array(
''#markup'' => ''Some initial markup'',
''#prefix'' => ''<div id="mywrapper">'',
''#suffix'' => ''</div>''
);
$form[''fieldset''][''mybutton''] = array(
''#type'' => ''button'',
''#value'' => t(''Send request''),
''#ajax'' => array(
''callback'' => ''mymodule_mycallback'',
''wrapper'' => ''mywrapper'',
''method'' => ''replace'',
''effect'' => ''fade'',
)
);
return $form;
}
function mymodule_mycallback(&$form, &$form_state) {
$form[''fieldset''][''my_element''][''#markup''] = ''New Markup'';
// Always, always, always return an element here, not a string.
// This makes sure the form state stays consistent.
return $form[''fieldset''][''my_element''];
}
Si tiene dudas, consulte el módulo de ejemplos , específicamente el ejemplo ajax_example_submit_driven_ajax()
en el módulo ajax_example
.
Estoy actualizando un módulo que he escrito de D6 a D7, y por lo tanto tengo que cambiar el viejo AHAH por el nuevo #ajax en los formularios.
Estoy realizando una solicitud de Ajax que crea un resultado y reemplaza un elemento de formulario con él. Esto básicamente funciona bien, pero después de la primera solicitud, el resultado se almacena en caché y no toma en cuenta los cambios en el formulario. Creo que esto es probablemente un problema del navegador, pero ¿podría ser que Drupal envíe un encabezado de expiración que induce al navegador a tomar la versión en caché? ¿Alguna otra idea?
El fragmento en hook_cache ():
$form[''fieldset''][''mybutton''] = array(
''#type'' => ''button'',
''#value'' => t(''Send request''),
''#ajax'' => array(
''callback'' => ''mycallback'',
''wrapper'' => ''mywrapper'',
''method'' => ''replace'',
''effect'' => ''fade'',
)
Un fragmento de la devolución de llamada:
function mycallback($form, $form_state) {
[..]
$form[''fieldset''][''mywrapper''][''#markup''] = ''test'';
return $form[''fieldset''][''mywrapper''][''#markup''];
}
Lo descubrí con la ayuda de la primera respuesta
Agregar envoltura nuevamente
function mymodule_mycallback(&$form, &$form_state) {
$form[''fieldset''][''my_element''][''#prefix''] = ''<div id="mywrapper">'';
$form[''fieldset''][''my_element''][''#suffix''] = ''</div>'';
// Always, always, always return an element here, not a string.
// This makes sure the form state stays consistent.
return $form[''fieldset''][''my_element''];
}
Y no creo que tengas que usar los punteros (&) al menos el módulo de ejemplo drupal no