मैं वेबफ़ॉर्म पर Drupal 7. मैं प्रस्तुत करने के लिए एक अजाक्स कार्यान्वयन पर काम कर रहा हूँ किसी भी अच्छे खोजने के लिए सक्षम नहीं था hook
वेबफ़ॉर्म सबमिट बटन और रूप में '#ajax' जोड़ें तो मैं एक करने के लिए एक नज़र था बदलने के लिए Drupal 6 मॉड्यूल है कि एक बाहरी स्क्रिप्ट से इस कार्यक्षमता को लागू करता है।
इसलिए मैंने अपने स्वयं के मॉड्यूल और जावास्क्रिप्ट कोड के साथ जाने का फैसला hook_menu()
किया Drupal 7 में मैंने जो कस्टम मेनू कॉलबैक परिभाषित किया है , उसके लिए एक अजाक्स पोस्ट अनुरोध को आग लगाने के लिए ।
जावास्क्रिप्ट हिस्सा ठीक काम करता है, लेकिन मैं वेबफॉर्म को प्रोग्रामेटिक रूप से सबमिट करने की कोशिश कर रहा हूं।
यहाँ मेरा जावास्क्रिप्ट कोड है:
function formSubmit(event, formId) {
event.preventDefault();
var form = jQuery("#" + formId);
var postData = form.serialize();
var nodeId = formId.substring(20);
var msg = '';
msg += form.find('#edit-submitted-name').attr('value') ? '' : 'Please enter your name';
console.log(form.find('#edit-submitted-name').attr('value'));
console.log(form.find('#edit-submitted-e-mail').attr('value'));
if(msg) {
alert(msg);
} else {
jQuery.ajax({
url: Drupal.settings.basePath + 'webform_ajax/' + nodeId,
fid:formId,
type: 'POST',
data: postData,
success: function(ajaxData) {
console.log(ajaxData);
console.log('Hello world');
// can't get here
}
});
}
}
और मेरा मॉड्यूल कोड (webform_ajax मॉड्यूल पर आधारित):
function custom_menu() {
$items = array();
$items['webform_ajax/%'] = array(
'page callback' => '_custom_webform_ajax',
'page arguments' => array(1,2),
'access callback' => '_custom_webform_ajax_access',
);
return $items;
}
function _custom_webform_ajax($nid, $data) {
//$sid = $_POST['details']['sid'];
$local_POST = $_POST;
$form_build_id = $_POST['form_build_id'];
$form_id = 'webform_client_form_' . $nid;
$node = node_load($nid);
$submission = array();
$form_state = array();
$form = form_get_cache($form_build_id, $form_state);
$form_array = drupal_rebuild_form($form_id, $form_state, array($form_state, $node, $submission), $form_build_id);
$form_state['clicked_button'] = $form_array['actions']['submit'];
if (is_array($local_POST['submitted'])) {
foreach ($local_POST['submitted'] as $submit_index => $submit) {
$form_state['storage']['submitted'][$submit_index] = $submit;
$form_state['values']['submitted'][$submit_index] = $submit;
}
}
// Clearing empty values from $form_state
if (is_array($form_state['values']['submitted'])) {
foreach ($form_state['values']['submitted'] as $value_index => $value) {
if (!$value) {
unset($form_state['values']['submitted'][$value_index]);
}
}
}
// Executing the pressed button action
drupal_execute($form_id, $form_state, $node, array());
// Get the HTML for the error messages
$error_html = theme('status_messages', 'error');
// Building the resulting form after the processing of the button
$form_array = drupal_rebuild_form($form_id, $form_state, array($form_state, $node, $submission), $form_build_id);
$form = drupal_render_form($form_id, $form_array);
return drupal_json_output(array(
'message' => $error_html,
'status' => 'sent',
));
}
function _custom_webform_ajax_access() {
// Todo: Add webform access conditions
return true;
}
जब मैं अपना फॉर्म जमा करता हूं तो मुझे 500 सर्वर त्रुटियां मिलती हैं।
मुझे लगता है कि डी 6 और डी 7 फॉर्म एपीआई काफी अलग हैं और मुझे यकीन नहीं है कि कहां से काम शुरू करना है। मैंने इसे डीबग करने की कोशिश की है, लेकिन मैं यह पता नहीं लगा सकता कि 500 त्रुटियों को क्या पैदा कर रहा है।
मैं वेबफॉर्म 3 का उपयोग करता हूं और जो मॉड्यूल मैंने कोड लिया है वह वेबफॉर्म के संस्करण 3 पर भी Drupal 6 के लिए निर्भर करता है। लेकिन दोनों मॉड्यूल को एक ही प्रकार के कार्य और एक ही प्रकार की कार्यक्षमता प्रदान करनी चाहिए। पहला वर्कअराउंड: यह उन मानों से आ सकता है जो मैं पास करता हूं जो डी 7 फॉर्म एपी के साथ संगत नहीं होगा।
मेरे लॉग में मेरे पास है:
Argument 1 passed to drupal_array_nested_key_exists() must be an array, null given, called in D:\wamp\www\productionsite\includes\form.inc on line 1986 and defined in drupal_array_nested_key_exists() (line 6296 of D:\wamp\www\productionsite\includes\common.inc).
- संपादित करें -
मैं अब लाइन से लाइन डिबगिंग कर रहा हूं, अंत में कोड का यह टुकड़ा डी 7 मॉड्यूल बनने लायक हो सकता है;)
मुझे D7 के दस्तावेज़ में पाया गया कि drupal_rebuild_form () तर्क D6 से बदल गए हैं, और यह कि $form_state
अब इस स्तर पर खाली नहीं हो सकता, इसलिए मैंने अपना कोड इस तरह से अपडेट किया:
$form_state = array('submitted' => false, 'values' => array());
$form = form_get_cache($form_build_id, $form_state);
$form_array = drupal_rebuild_form($form_id, $form_state, $form);
अब मैं drupal_execute () के समतुल्य को खोजने का प्रयास कर रहा हूं, जो D7 में अब मौजूद नहीं है।
- संपादित करें (2) -
मुझे कुछ दिन पहले यह काम मिला और समाधान साझा करने के लिए वापस आया, और शायद कुछ सलाह और सुधार सुझाव मिले।
<?php
function custom_menu() {
$items = array();
$items['webform_ajax/%'] = array(
'page callback' => '_custom_webform_ajax',
'page arguments' => array(1,2),
'access callback' => '_custom_webform_ajax_access',
);
return $items;
}
function _custom_webform_ajax($nid, $data) {
$local_POST = $_POST;
$form_build_id = $_POST['form_build_id'];
$form_id = 'webform_client_form_' . $nid;
$node = node_load($nid);
$submission = array();
$form_state = array(
'submitted' => false,
'values' => array(),
'build_info' => array(
'args' => array(
$node,
array(),
FALSE
)
)
);
$form = form_get_cache($form_build_id, $form_state);
$form_array = drupal_rebuild_form($form_id, $form_state);
// Add the clicked button before processing the form
$form_state['clicked_button'] = $form_array['actions']['submit'];
if (is_array($local_POST['submitted'])) {
foreach ($local_POST['submitted'] as $submit_index => $submit) {
$form_state['values']['submitted'][$submit_index] = $submit;
}
}
// Clearing empty values from $form_state
if (is_array($form_state['values']['submitted'])) {
foreach ($form_state['values']['submitted'] as $value_index => $value) {
if (!$value) {
unset($form_state['values']['submitted'][$value_index]);
}
}
}
$form_state['values']['details']['nid'] = $nid;
// Executing the pressed button action
drupal_build_form($form_id, $form_state);
return drupal_json_output(array(
'message' => t('Your submission has been received. Thank you for contacting us.'),
'status' => 'sent',
));
}
function _custom_webform_ajax_access() {
// TODO: Add user role / perm check
return true;
}
एक कदम आगे जाने के लिए मैं अब संसाधित रूप से त्रुटियों को प्राप्त करना चाहूंगा, ताकि मैं उन्हें जसन ऑब्जेक्ट के साथ वापस भेज सकूं। कोई विचार ?