所以这就是我要做的事情:
1。我创建并呈现以下表单元素:
$form['rb_download_' . $doc_id] = array(
'#type' => 'submit',
'#name' => 'doc_' . $doc_id,
'#prefix' => "<div id='rb_doc_order_{$doc_id}'>",
'#suffix' => '</div>',
'#value' =>variable_get('rb_order_button', "buyOnline"),
'#ahah' => array(
'event' => 'click',
'path' => "rb/case/doc_order_js/$case->nid/$doc_id",
'wrapper' => "rb_doc_order_{$doc_id}",
'effect' => 'fade',),
);
2。 action函数返回并用新元素替换上面的元素:
function rb_case_doc_order_js($case, $doc_id) {
$button['rb_download_' . $doc_id] = array(
'#type' => 'submit',
'#name' => 'doc_' . $doc_id,
'#prefix' => "<div id='rb_doc_order_{$doc_id}'>",
'#suffix' => '</div>',
'#value' => variable_get('rb_order_confirm', "Remove from cart"),
//'#attributes' => array('class' => 'ahah-processed'),
'#ahah' => array(
'event' => 'click',
'path' => "rb/case/doc_unorder_js/$case->nid/$doc_id",
'wrapper' => "rb_doc_order_{$doc_id}",
'effect' => 'fade',),
);
$output .= drupal_render($button);
$output .= "<script type='text/javascript'>\n";
$output .= "cart_block_item_count($count);\n";
$output .= "Drupal.ahah;\n";
$output .= "</script>\n";
print drupal_json($output);
}
第3。结果是旧按钮被上面的按钮替换,但新按钮未启用AJAX
。
我需要做些什么才能让新的返回元素AHAH
准备就绪?
答案 0 :(得分:2)
好吧,我无法确切知道如何让文件执行上述操作。但我确实找到了一个解决方法(在我的情况下,涉及在客户端的两个不同的submit元素对象值之间切换,以便它的AHAH行为不会丢失)。在服务器端,我只是检查不同的值,并根据结果采取行动:
<强> 1。根据条件
定义具有不同值的元素 if (empty($rb_item) ||($rb_item['node_checkout_nid'] != $node_checkout_nid)) {
//if (true) {
$form['rb_download_' . $doc_id] = array(
'#type' => 'submit',
'#name' => 'doc_' . $doc_id,
'#prefix' => "<div id='rb_doc_download_{$doc_id}'>",
'#suffix' => '</div>',
'#value' => variable_get('rb_doc_download_button', "buyOnline"),
'#ahah' => array(
'event' => 'click',
'path' => "rb/case/doc_download_js/$case->nid/$doc_id",
'wrapper' => "rb_doc_download_{$doc_id}",
'effect' => 'none',
'method' => 'append',
),
);
unset($_SESSION['rb_case']['rb_dowload_' . $doc_id]);
}
else {
$form['rb_download_' . $doc_id] = array(
'#type' => 'submit',
'#name' => 'doc_' . $doc_id,
'#prefix' => "<div id='rb_doc_download_{$doc_id}'>",
'#suffix' => '</div>',
'#value' => variable_get('rb_return_button', "Remove from cart"),
'#ahah' => array(
'event' => 'click',
'path' => "rb/case/doc_download_js/$case->nid/$doc_id",
'wrapper' => "rb_doc_download_{$doc_id}",
'effect' => 'none',
'method' => 'append',
),
);
}
<强> 2。 action函数检查表单的值,并返回元素的切换值:
function rb_case_doc_download_js($case, $doc_id) {
//Add code that will change how the form elements are rendered here ...
//Now get form with possible new values and send toggle value back to the javascript on client side.
$form_state = array('storage' => NULL, 'submitted' => FALSE);
$form_build_id = $_POST['form_build_id'];
$form = form_get_cache($form_build_id, $form_state);
$args = $form['#parameters'];
$form_id = array_shift($args);
$form_state['post'] = $form['#post'] = $_POST;
$form['#programmed'] = $form['#redirect'] = FALSE;
//Toggle the form element value between <<Add to Cart>> and <<Remove from Cart>>
$toggle_on = variable_get('rb_doc_download_button', "buyOnline");
$toggle_off = variable_get('rb_return_button', "Remove from cart");
if ($form['rb_download_' . $doc_id]['#value'] == $toggle_on) {
$toggle = $toggle_off;
$form['rb_download_' . $doc_id]['#value'] = $toggle;
}
else {
$toggle = $toggle_on;
$form['rb_download_' . $doc_id]['#value'] = $toggle;
}
drupal_process_form($form_id, $form, $form_state);
$form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
$output .= "<script type='text/javascript'>\n";
$output .= "cart_block_item_count($count);\n";
$output .= "rb_button_toggle('rb_doc_download_{$doc_id}', '$toggle');\n";
$output .= "</script>\n";
print drupal_json($output);
}
第3。客户端的JavaScript函数更改元素的值,但对象保持其AJAX行为:
/**
* Change the button name
*/
function rb_button_toggle(target, name) {
alert(target);
alert(name);
if (target && name) {
$(':submit', document.getElementById(target)).attr('value', name);
}
}
<强> 4。这对我有用:)
如果可以解决这个问题,请随意添加上述解决方案。