কিভাবে অ্যাজাক্সের সাথে ওয়েবফর্ম প্রোগ্রামে জমা দিতে হবে?


8

আমি ড্রুপাল 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;
}

আরও এক ধাপ এগিয়ে যাওয়ার জন্য আমি এখনই প্রক্রিয়াজাত ফর্মটি থেকে ত্রুটিগুলি পেতে চাই যাতে আমি এগুলিকে জসন অবজেক্ট দিয়ে ফিরে পাঠাতে পারি। কোন ধারনা ?

উত্তর:


4

আমি অনুরূপ কিছু করছিলাম এবং বেশিরভাগই আমার পক্ষে কাজ করার জন্য ই ডি সেন্ট চামাসের সমাধান পেয়েছি। যাইহোক, আমার কয়েকটি জিনিস যুক্ত করার দরকার ছিল:

প্রথমে, ফর্ম প্রক্রিয়া করার আগে আমাকে form_state অ্যারেতে যুক্ত করতে হয়েছিল

'method' => 'post',

তারপরে, নীচের দিকে, ফর্মটি প্রসেস করার জন্য কিছু সামঞ্জস্য এবং ত্রুটি বার্তাগুলি যদি থাকে তবে:

  // Prevent the form from redirecting the request
  $form_state['no_redirect'] = TRUE;
  // Executing the pressed button action
  drupal_build_form($form_id, $form_state);
  // See if the form submitted successfully
  if (!$form_state['executed']) {
    // If the form didn't submit successfully, get the errors
    // which are set bu drupal_set_message
    $messages = drupal_get_messages('error');
    $messages = implode('<br />', $messages['error']);
  }
  else {
    // If form submitted successfully, create a nice message.
    $messages = "Thanks for contacting us! We will let you know when the Beta is live!";
  }
  // drupal_json_output seems to confuse some browsers, who want to save as a file 
  print drupal_json_encode(array(
    'message' => $messages,
    'status' => $form_state['executed'],
  ));

এটি করার সর্বোত্তম উপায় কিনা তা আমি নিশ্চিত নই, তবে এটি আমার পক্ষে কার্যকর হয়েছে। অবশ্যই, আপনি কেবল এগিয়ে যেতে এবং ত্রুটি বার্তাগুলি রেন্ডার করতে এবং সম্পূর্ণরূপে রেন্ডার করা ত্রুটি বার্তা বাক্সটি ফিরিয়ে দিতে চান এবং এছাড়াও, আপনি $ form_state অ্যারে থেকে "নিশ্চিতকরণ বার্তা" কেড়ে নিতে পারেন যাতে আপনি সাফল্যের বার্তাটি নিয়ন্ত্রণ করতে পারেন ওয়েবফর্ম UI।


এটি দুর্দান্ত, তবে আমি ব্যর্থতা বজায় রাখছি ($ form_state ['মৃত্যুদণ্ডপ্রাপ্ত'] = মিথ্যা)। এবং drupal_get_messages ('ত্রুটি') তে কিছুই নেই। ভাবছি কীভাবে আমি এটি ডিবাগ করতে পারি।
সাইবারটোস্ট

আমার স্পষ্ট করা উচিত যে আমি কার্লের মাধ্যমে জমা দেওয়ার চেষ্টা করছি, যেমন কার্ল -vvv -X POST -H "এক্স-রিকভেস্টড-উইথ: এক্সএমএলএইচটিপিআরকেস্ট" -ড 'দাখিল [যোগাযোগ_ফুলনাম] = আমার% 20 নাম এবং জমা [যোগাযোগ_মিল] = পরীক্ষা% 40 উদাহরণ। com এবং জমা দেওয়া [যোগাযোগ_message] = পরীক্ষার% 20 ম্যাসেজ '" লোকালহোস্ট / ফুবার / 31 "। সামগ্রীটি প্রেরণ হয়ে যায় এবং ফর্ম_স্টেটটি জনবহুল হয় তবে দ্রুপাল_ফর্ম_বিল্ড () কার্যকর করা / জমা দেয় না।
সাইবারটোস্ট

-1

আমাকে যদি ভুল হয় তবে বলুন তবে যেহেতু একটি ওয়েবফর্ম জমা দেওয়া নোড, তাই কেন সরাসরি আপনার নোডকে প্রোগ্রামাগ্রামিকভাবে তৈরি করবেন না page callback(ক্ষেত্রের বৈধতা সহ (বা জাভাস্ক্রিপ্ট ব্যবহার করে জমা দেওয়ার আগে করতে পারতেন))

এটি কিছু হতে পারে

if(!function_exists("node_object_prepare"))
{
  include_once(drupal_get_path('module', 'node') . '/node.pages.inc');
}
$node = new stdClass();                                                         
$node->is_new = TRUE;
$node->type = 'YOUR_NODE_TYPE_HERE';                                
node_object_prepare($node);

// then all the fields you need

node_validate($node);
$node = node_submit($node);
node_save($node);
$nid = $node->nid;

এট ভয়েইল! :)


3
আসলে ওয়েবফর্ম সাবমিশনগুলি নোড নয়। ওয়েবফর্ম সাবমিশনের নিজস্ব টেবিলগুলিতে সঞ্চয় করে। সুতরাং আমরা জমাটি যুক্ত করতে নতুন নোড তৈরি করতে পারি না। তবুও আমি ফর্মটি কার্যকর হওয়ার পরে পুরো ওয়েবফর্ম বৈধতা কর্মপ্রবাহটি ট্রিগার করাতে চাই যাতে এটি প্রয়োজনীয় ক্ষেত্রগুলি ইত্যাদি পরীক্ষা করে ...
E. ডি সেন্ট চামাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.