سؤال

كيف يمكنك بناء نموذج خطوة بخطوة يستخدم AJAX عبر Drupal لسحب خطوة النموذج التالية؟

فمثلا،

Step 1:
   I like Baseball
   I don't like Baseball.

عندما ينقر هذا الشخص على إما أو لا يعجبه ، أرغب في استخدام Ajax للتعرف على الجزء التالي من النموذج وسحبه ، وإزالة/إخفاء القسم الأول نظرًا لعدم الحاجة إليه ، وتقديم القسم التالي.

مثال:

Step 1:
   I like Baseball
   *click
(fade out)


Step 2:
   My favorite team is __________
   The player I like most is __________

ما هي أفضل طريقة للقيام بذلك من خلال API Form Drupal؟ أعرف كيفية بناء النماذج والوحدات النمطية ، لكنني لم أستخدم أياكس بعد. أعلم أن هناك بعض الأشياء الموجودة هناك من المفترض أن تساعد ، لكنني أردت أن أعرف ما إذا كان أي شخص هنا قد فعل ذلك وكيف اقتربوا منه.

هل كانت مفيدة؟

المحلول

قد ترغب في إلقاء نظرة على Ahah المساعد الوحدة النمطية.

نصائح أخرى

عادةً ما أقوم بإنشاء شكل كامل مع Fieldsets ، ثم التحكم فيها يدويًا بواسطة jQuery.
أفترض أن هناك الكثير من الوحدات الجاهزة للذهاب في دروبال ، بعضها:
http://drupal.org/project/conditional_fields / http://drupal.org/project/multistep
ايضا: http://www.google.ru/search؟q=drupal+multistep+ajax+form

إذا كنت لا ترغب في كتابة أي رمز ، ولا تحتاج إلى أن تكون البيانات التي تم إدخالها هي العقد drupal ، أقترح استخدام وحدة WebForm. يحتوي على واجهة مستخدم بسيطة جدًا لأشكال البناء ، ويسمح لك بالقيام بأشكال متعددة الحقول الشرطية. يمكنك بعد ذلك تصدير النتائج على أنها CSV ، وإرسالها بالبريد الإلكتروني ، إلخ.

لقد قدمت إلى حلول لهذه المشكلة في Drupal 7. أولاً أحلها مع Ajax كما هو مطلوب (إذا كان شخص ما يريد تحويل هذا إلى Drupal6) ، ومع ذلك يجب أن يكون من الأفضل حل هذا باستخدام السمة #States. لذلك جعل أيضا حل في القاع باستخدام الحالات.

كيفية حل هذا باستخدام Ajax:

function ajax_in_drupal_form($form, &$form_state)
{
    $baseball = array(
        'like' => t('I like Baseball'),
        'unlike' => t('I don\'t like Baseball')
    );

    $form['step'] = array(
        '#prefix' => '<div id="baseball-wrapper">',
        '#suffix' => '</div>',
    );

    if ($form_state['values']['baseball'] == 'like') {
        $form['step']['team'] = array(
            '#type' => 'textfield',
            '#title' => t('My favorite team is'),

        );
        $form['step']['player'] = array(
            '#type' => 'textfield',
            '#title' => t('The player I like most is'),
        );
    }
    else if ($form_state['values']['baseball'] == 'unlike') {
        $form['step']['other'] = array(
            '#type' => 'textfield',
            '#title' => t('What do you like'),
        );
    }
    else {
        $form['step']['baseball'] = array(
            '#type'    => 'radios',
            '#options' => $baseball,
            '#title'   => t('Select your option'),
            '#ajax' => array(
                'callback' => 'ajax_update_step_callback',
                'wrapper'  => 'baseball-wrapper',
            ),
        );
    }

    return $form;
}

function ajax_update_step_callback($form, $form_state) {
    return $form['step'];
}

فيما يلي الحل باستخدام #States (الطريقة المفضلة لحلها):

function states_in_drupal_form($form, &$form_state)
{
    $baseball = array(
        'like' => t('I like Baseball'),
        'unlike' => t('I don\'t like Baseball')
    );

    // step 1
    $form['step']['baseball'] = array(
        '#type'    => 'radios',
        '#options' => $baseball,
        '#title'   => t('Select your option'),
        '#states' => array(
            'invisible' => array(':input[name="baseball"]' => array('checked' => TRUE),
            ),
        )

    );

    // step 2 like baseball
    $form['step']['team'] = array(
        '#type' => 'textfield',
        '#title' => t('My favorite team is'),
        '#states' => array(
            'visible' => array(':input[name="baseball"]' => array('checked' => TRUE)),
            'visible' => array(':input[name="baseball"]' => array('value'   => 'like')),
        )
    );
    $form['step']['player'] = array(
        '#type' => 'textfield',
        '#title' => t('The player I like most is'),
        '#states' => array(
            'visible' => array(':input[name="baseball"]' => array('checked' => TRUE)),
            'visible' => array(':input[name="baseball"]' => array('value'   => 'like')),
        )
    );

    // step 2 I don't like baseball
    $form['step']['other'] = array(
        '#type' => 'textfield',
        '#title' => t('What do you like'),
        '#states' => array(
            'visible' => array(':input[name="baseball"]' => array('checked' => TRUE)),
            'visible' => array(':input[name="baseball"]' => array('value'   => 'unlike')),
        )
    );

    return $form;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top