Posted by bandierabianca on September 18, 2012 at 1:40pm
Hi everyone ^^
I have a problem with the callback function of an AJAX link.
In few words: I have a table with some rows; each one has an AJAX link, “Details”, that change the content of the form below ("$form['corsi']['esito_corso']") depending on which link is clicked.
This is my code:
<?php
//.........here I extract the information to put in the table
$header = …;
$rows = array();
if (!empty($entries)) {
foreach ($entries as $entry) {
$rows[] = array(
'dettagli' => l('Details', 'examples/anag_dettaglio_callback/nojs/' . $corso .'/'. $entry_id,
array('attributes' => array('class' => array('use-ajax')))),
// ….the other values
);
}
}else {
drupal_set_message(t('No entries meet the filter criteria.'));
}
$form['corsi']['table_corsi'] = array(
'#theme' => 'table',
'#header' => $header,
'#rows' => $rows,
'#empty' => t('Empty Rows'),
'#prefix' => '<div id="table_corsi_div"> <div class="vcase-anagrafiche-inline-field">',
'#suffix' => '</div></div>',
);
$form['corsi']['esito_corso'] = array(
'#type' => 'textfield',
'#title' => t('Esito Corso'),
'#size' => 15,
'#default_value' => '--',
'#attributes' => array('disabled' => 'disabled'),
'#prefix' => '<div id="esito_corso_div"><div class="vcase-anagrafiche-inline-field">',
'#suffix' => '</div>',
);
?>I've added an item in the array of the hook_menu:
<?php
// A menu callback is required when using ajax outside of the Form API.
$items['examples/anag_dettaglio_callback/%/%/%'] = array(
'page callback' => 'anag_dettaglio_response',
'access callback' => 'user_access',
'page arguments' => array(2,3,4),
//'access callback' => TRUE,
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
?>And the body of the function “ anag_dettaglio_response”:
<?php
function anag_dettaglio_response($type = 'ajax', $corso_call_id, $entry_id) {
if ($type == 'ajax') {
…....
$form['corsi']['esito_corso'] = array(
'#type' => 'textfield',
'#title' => t('Esito Corso'),
'#size' => 15,
'#value' => $dati[description''],
'#attributes' => array('disabled' => 'disabled'),
'#prefix' => '<div class="vcase-anagrafiche-inline-field">',
'#suffix' => '</div>',
);
….....
$commands = array();
$commands[] = ajax_command_replace("#esito_corso_div", render($form['corsi']['esito_corso']));
$page = array('#type' => 'ajax', '#commands' => $commands);
ajax_deliver($page);
}else {
…...
}
?>The problem is that when I click a link for the first time, the form content change correctly, but from the second time on the content remains the same.
Sorry for my poor english, I hope that I've been clear about my problem.
Thanks everyone ^^
Comments
It is not clear what you are
It is not clear what you are trying to do (ie what triggers the ajax code and what is suppose to change). I suspect the problem is related to how you are using ajax and that you have a form. Forms are only suppose to be changed in their form building function.
Sorry XD I'll try to explain
Sorry XD
I'll try to explain myself better.
I have a table and a textfield form below. Each row of the table has a link that makes change the value of the textfield depending on the result of a query in the db.
Since i wanted to do that without reload the page, i have decided to use AJAX. Infact the declaration of each link (as field of a table row) is like this:
<?php'dettagli' => l('Details', 'examples/anag_dettaglio_callback/nojs/' . $corso , array('attributes' => array('class' => array('use-ajax')))),
?>
Under the definition of the table, i have defined the textfield, like this:
<?php$form['corsi']['esito_corso'] = array(
'#type' => 'textfield',
'#title' => t('Esito Corso'),
'#size' => 15,
'#default_value' => '--',
'#attributes' => array('disabled' => 'disabled'),
'#prefix' => '<div id="esito_corso_div"><div class="vcase-anagrafiche-inline-field">',
'#suffix' => '</div>',
);
?>
For example, if i click the link in the first row (Row A) it sends to this path
<?php'examples/anag_dettaglio_callback/nojs/A'
?>
The definition of this path is set in the hook_menu:
<?php$items['examples/anag_dettaglio_callback/%/%'] = array(
'page callback' => 'anag_dettaglio_response',
'access callback' => 'user_access',
'page arguments' => array(2,3),
//'access callback' => TRUE,
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
?>
This recall the function "anag_dettaglio_response()"
<?php
function anag_dettaglio_response($type = 'ajax', $corso_call_id) {
if ($type == 'ajax') {
…....
$dati['description'] = // Extraction of the value
// this is the piece of the form that have to change
$form['corsi']['esito_corso'] = array(
'#type' => 'textfield',
'#title' => t('Esito Corso'),
'#size' => 15,
'#value' => $dati['description'],
'#attributes' => array('disabled' => 'disabled'),
'#prefix' => '<div class="vcase-anagrafiche-inline-field">',
'#suffix' => '</div>',
);
….....
// this command it's supposed to send the new version of the textfield form
$commands = array();
$commands[] = ajax_command_replace("#esito_corso_div", render($form['corsi']['esito_corso']));
$page = array('#type' => 'ajax', '#commands' => $commands);
ajax_deliver($page);
}
?>
?>
The first time i click a link, the value of the textfield change correctly, but after this the value don't change anymore.
The query is correct becuase i text it with the ajax-command append.The problem with this command is that it "append" a new textfield form, like it is supposed to do. So when i click another link, it displays the right value, but in an other textfield under the first.
I hope that i've been clear this time ^^
Sorry again for my confusion and thank you very much!!!
Good resource
Here is a useful piece of documentation on how to make ajax forms with Drupal: http://drupal.org/node/752056