it-swarm.asia

هل يمكنني استخدام ajax لاستهداف عناصر نموذج متعددة من إدخال واحد؟

أحاول استخدام ajax لتحديث جزأين مختلفين من نموذج drupal من طمس إدخال نموذج واحد فقط.

لدي عناصر ajax القياسية في إدخالي:

$my_form['my_input']['#ajax'] = array(
  'callback' => 'my_callback',
  'wrapper' => 'my_target_div',
  'event' => 'blur',
);

يعمل هذا جيدًا ، ويتبادل div عند تحديث الإدخال ... ومع ذلك أرغب أيضًا في تحديث إدخال نموذج آخر في مكان آخر في النموذج برمز مختلف نتيجة لطمس الإدخال الأصلي .

هل هذا ممكن ، أي أفكار؟

تحرير: للتوضيح ، إليك مثال عالمي الحقيقي:

  • نوع المحتوى 'فيلم'
  • تمت إضافة الحقل "primary_title"
  • عندما يتم تحديث "primary_title" ، يتحقق رد اتصال ajax من السلاسل المماثلة ويعيد html.
  • يتم إدراج أتش تي أم أل من رد الاتصال في div فارغة.

    هذا الجزء يعمل بشكل رائع!

أحاول أيضًا تعديل إدخال "العنوان" القياسي للعقدة ، وإعطائها قيمة "primary_title" بعد أن قمت ببعض التعبير العادي لترتيب السلسلة (إزالة "The" أو "A" من البداية وما إلى ذلك) النتيجة سيكون حقلي العنوان ، أحدهما يحتوي على العنوان الكامل "primary_title" والآخر المقتطع "العنوان" الذي سيكون مفيدًا لفرز السجلات وعرضها.

8
Rick

يبدو أنه يمكنك استهداف أجزاء مختلفة من النموذج باستخدام أوامر ajax ، ولكن يجب عليك اختيار إرجاع واحد فقط لأيٍّ من:

  • HTML أو

  • صفيف قابل للعرض أو

  • صفيف من أوامر AJAX

في الحالة التي كتبت عنها في الأصل ، كنت أحاول إرجاع صفيف من أوامر AJAX و صفيف قابل للعرض وهو ما لا يبدو ممكناً.

الكود الموجود في وحدة أمثلة يوضح استهداف أجزاء مختلفة من النموذج باستخدام مصفوفة من AJAX أوامر:

function ajax_example_advanced_commands_html_callback($form, $form_state) {
  $text = $form_state['values']['html_command_example'];

  $commands = array();
  $commands[] = ajax_command_html('#html_div', $text);
  $commands[] = ajax_command_replace("#html_status", "<div id='html_status'>Updated html_command_example with text=$text;  " . date('r') . "</div>");
  return array('#type' => 'ajax', '#commands' => $commands);
}

في نموذج التعليمات البرمجية هذا ، يحصل #html_div على $ text ، ويحصل #html_status بشكل منفصل على "تحديث html_command_example with text = $ text؛". شخص يخرج في موعد') . ""

موقعين مختلفين في نموذج مع قطعتين مختلفتين من المعلومات من رد اتصال أجاكس واحد!

بالنظر مرة أخرى إلى ما كنت أعمل عليه ، أدركت أنني لست بحاجة إلى إعادة حقل عنوان العقدة على الإطلاق. سيكون فقط مجالًا منفعيًا ، يُستخدم لفرز البيانات في القوائم.

لقد قمت بإخفاء الحقل في نموذج العقدة ويتم ملؤه في المرة الثانية التي يتم فيها إنشاء النموذج عند تشغيل رد اتصال ajax الأصلي.

13
Rick

خيار آخر من drupal.org :

يمكنك بسهولة استبدال النموذج بالكامل إذا كان ذلك أسهل. ما عليك سوى إضافة #prefix و #suffix إلى مصفوفة النموذج بالكامل ، ثم تعيين ذلك كـ #ajax ['wrapper']. (سيسمح لك هذا بتغيير عناصر النموذج المتعددة عبر مكالمة واحدة من أجاكس.) والسبب الوحيد لعدم القيام بذلك هو أن العملية تكون أسرع إذا تم نقل معلومات أقل.

يمكن أن يكون funciton رد الاتصال الخاص بك بسيطًا مثل:

function _callback($form, $form_state) {
  return $form;
}

يجب أن يتم استدعاؤها من مصفوفة #ajax على عنصر نموذج (field_whatever للمثال أدناه) المحدد في hook_form_FORM_ID_alter() (أو نوع من أنواع تغيير الشكل) حيث اختبر أيضًا $form_state وأدخل تعديلات على المصفوفة $form ، مثل:

 if (isset($form_state['values']['field_whatever'])){
     $form['field_something']['#disabled'] = TRUE;
     $form['field_something_else']['#disabled'] = FALSE;
 } else {
     $form['field_something']['#disabled'] = FALSE;
     $form['field_something_else']['#disabled'] = TRUE;
 }
0
cdmo

أنا جديد تمامًا على Drupal ولكن حتى الآن وجدت إطار عمل Ajax غير مرن إلى حد ما. إنه يعمل بشكل رائع طالما أنك تستخدمه كما هو مقصود. لذا في حالتك إذا كنت تعرف بعض JS أفضل ما في الأمر هو أن تجعل هذا النص بنفسك يجب أن يكون خفيفًا جدًا.

حظا طيبا وفقك الله!

0
silkAdmin