আমি ড্রুপাল on এ ওয়েবফর্ম জমা দেওয়ার জন্য একটি অজ্যাক্স বাস্তবায়নে কাজ করছি I hook
ওয়েবফর্ম সাবমিট বাটনটি পরিবর্তন করতে এবং ফর্মটিতে '# জাজাক্স' যুক্ত করতে আমি কোনও ভাল পাইনি তাই আমার একটি দ্রুপাল 6 মডিউলে নজর ছিল যে বাহ্যিক স্ক্রিপ্ট থেকে এই কার্যকারিতা প্রয়োগ করে।
তাই আমি একটি কাস্টম মেনু কলব্যাক আমি সংজ্ঞায়িত করেছেন একটি Ajax পোস্ট অনুরোধ আগুনে আমার নিজের মডিউল এবং জাভাস্ক্রিপ্ট কোড দিয়ে যেতে সিদ্ধান্ত নিয়েছে 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
}
});
}
}
এবং আমার মডিউল কোড (ওয়েবফর্ম_জ্যাক্স মডিউলের উপর ভিত্তি করে):
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 সংস্করণের উপর নির্ভর করে তবে ড্রুপাল 6 এর জন্য But তবে উভয় মডিউলই একই ধরণের এবং একই ধরণের কার্যকারিতা সরবরাহ করতে পারে। প্রথম কাজ: এটি আমি যে মানগুলি দিয়েছি তা থেকে D7 ফর্ম এপিআইয়ের সাথে সামঞ্জস্যপূর্ণ হবে না।
আমার লগ এ আছে:
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 মডিউল হয়ে উঠতে পারে;)
আমি ডি 7 ডকুমেন্টেশনে পেয়েছি যে ড্রুপাল_রেবিল্ড_ফর্ম () যুক্তিগুলি ডি 6 থেকে পরিবর্তিত হয়েছে এবং $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 () এর সমতুল্য সন্ধান করার চেষ্টা করছি, যা ডি 7-এ আর নেই।
- সম্পাদনা (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;
}
আরও এক ধাপ এগিয়ে যাওয়ার জন্য আমি এখনই প্রক্রিয়াজাত ফর্মটি থেকে ত্রুটিগুলি পেতে চাই যাতে আমি এগুলিকে জসন অবজেক্ট দিয়ে ফিরে পাঠাতে পারি। কোন ধারনা ?