Hi people,

i developed a little module to generate voucher-codes out of userpoints. The user can choose how many userpoints he wants to redeem. I.e. 250, 500, 750 or 1000. To make that possible, my module (called "userpoints_redeem") has a little form with a dropdown-menue that holds the values and a submit-button. All that is shown in a block.

I implemented the following workflow: _FORM -> _VALIDATE -> _SUBMIT and everthing works fine (the feedback for the user that the transaction has happened is solved with drupal_set_message()).

Now i want to insert a confirm_form to let let the user confirm the transaction. But the confirm_form doesnt show up in the block. Means like: nothing happens.

My question: is it possible to show the confirm_form in that block? Or do i have to put that all in the page? I havent found anything on the net about it.

Thanks in advance
Fabian

Comments

Jaypan’s picture

This works for me:

<?php
function confirm_form_block_block($op = 'list', $delta = 0, $edit = array())
{
    if($op == 'list')
    {
        $block = array();
        $block[0]["info"] = t('Confirm Form');
        return $block;
    }
    elseif($op == 'view')
    {
        $block['subject'] = t('Confirm Form');
        $block['content'] = drupal_get_form('confirm_form_block_form');
        return $block;
    }
}

function confirm_form_block_form($form_state)
{
    $form['item'] = array
    (
        '#type' => 'value',
        '#value' => 1,
    );
    return confirm_form($form, t('Can you see this form?'), '<front>', t('Can you see this form?'));
}

function confirm_form_block_form_submit($form, &$form_state)
{
    $form_state['redirect'] = '<front>';
}
?>

Think the Drupal forums suck? Add your agreement here: https://www.drupal.org/node/2641072

stone_d’s picture

Hm - i got the following workflow and its definately happening nothing after i pressed the submit-button. Do you know whats wrong with it?

<?php
function userpoints_redeem_form() {

    global $user;
    $userid = $user->uid;
    $userpoints_amount = userpoints_get_current_points($userid, 45);
   
    /* Fill the arrays for the dropdown */
    $userpoints = array('250','500','750','1000');
    $euros = array('5','15','30','50');   
    $amount = 0;
   
    /*Fill the array for the select-dropdown and disable the values that are not selectable due to less userpoints*/
    for($i = 0; $i <  count($userpoints); $i++) {
        $values[$userpoints[$i]] = $userpoints[$i] . " userpoints = " . $euros[$i] . " EUR";
        if($userpoints_amount < $userpoints[$i]) {
            $disabled[$i] = $userpoints[$i];
        } else {
            
        }   
    }   
   
    /*If User has less than */
    if($userpoints_amount < $userpoints[0]) {
        $text_redeem = "<span class="red_font">Sie ben&ouml;tigen mindestens 250 userpoints, um einen Gutschein einzul&ouml;sen</span>";
    } else {
        $text_redeem = "Wie viele userpoints m&ouml;chten Sie einl&ouml;sen?";
    }   
   
    $form['userpoints_amount'] = array(
    '#type' => 'select',
    '#title' => t($text_redeem),
    '#values' => $values,
    '#options' => $values,
    '#disabled_options' => $disabled,
    );
   
    if($userpoints_amount >= $userpoints[0]) {
        $form['userpoints_amount']['#description'] = t('Wenn Sie auf "GUTSCHEIN ANFORDERN" klicken, wird Ihnen ein Gutscheincode per E-Mail zugeschickt.');
    }
   
    $form['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Gutschein anfordern'),
     
    );
   
    if (count($disabled) == 4) {
        $form['submit']['#disabled'] = TRUE;
    }
   
    return $form;
}

function userpoints_redeem_form_validate($form, &$form_state) {
    global $user;
    $userpoints_amount = userpoints_get_current_points($user->uid, 45);    
   
    if($form_state['values']['userpoints_amount'] > $userpoints_amount) {
        form_set_error('userpoints_amount', t('Sie besitzen nicht gen&uuml;gend userpoints (= weniger als 250)'));
    }
    if($user->uid=='') {
        drupal_set_message('Ihr Benutzer konnte nicht validiert werden');
    }
}

function userpoints_redeem_form_confirm (&$form_state) {
  $desc = 'The following new items will be created ... your code here';
  // Tell the submit handler to process the form
  $form['process'] = array('#type' => 'hidden', '#value' => 'true');
  // Make sure the form redirects in the end
  $form['destination'] = array('#type' => 'hidden', '#value' => 'user/%user/points');

  return confirm_form($form, 'Are you sure?', 'user/%user/points', $desc, 'Continue','Start again');
}

function userpoints_redeem_form_submit($form, &$form_state) {
    $form['destination'] = array('#type' => 'hidden', '#value' => 'user/%user');       
 
    if (isset($form_state['values']['process'])) {
        drupal_set_message(t('Sie haben ' . $form_state['values']['userpoints_amount'] . ' userpoints eingel&ouml;st. Der Gutscheincode wurde Ihnen per E-Mail zugeschickt.'));
        global $user;
        $params = array(
        'uid' => $user->uid,
        'points' => -($form_state['values']['userpoints_amount']),
        'description' => "Gutscheincode: " . $vouchercode ." im Wert von " . $eur . " EUR",
        'operation' =>  $vouchercode,
        'display' => false,
        'tid' => 45,
        );
        unset($form_state['storage']);
        userpoints_userpointsapi($params);
       
        return true;
    }

    $form_state['rebuild'] = TRUE;
}

function userpoints_redeem_block($op='list', $delta=0) {
  // listing of blocks, such as on the admin/block page 
    global $user;
    $userpoints_amount = userpoints_get_current_points($user->uid, 45);
    $block_content .= "<b>Ihr aktueller Kontostand: " . $userpoints_amount . " userpoints</b><br><br>";
     
    if ($op == "list") {
        $block[0]["info"] = t('Userpoints redeem');
        return $block;
    } else if ($op='view') {
   
    $block_content .= drupal_get_form('userpoints_redeem_form');
   
    if ($block_content == '') {
        return;
    }   
   
    $block['subject'] = 'Userpoints redeem';
    $block['content'] = $block_content;
    return $block;
  }
} // end userpoints_redeem_block
?>
Jaypan’s picture

You aren't calling this function anywhere: userpoints_redeem_form_confirm()

Think the Drupal forums suck? Add your agreement here: https://www.drupal.org/node/2641072

stone_d’s picture

Thanks again ...

Well - im also not calling the _VALIDATE-function explicitly... i thought _form_confirm is a hook thats implemented automatically into the workflow after the validate-function. But maybe i was wrong in assuming this :)
So where should i return the confirm_form in my workflow?

Thanks in advance

Jaypan’s picture

_validate() and _submit() functions are automatically called by drupal_get_form(), but _confirm() isn't called (as far as I know at least - I've never seen that anywhere).

Basically, you can re-write your form function like this:

<?php
function mymodule_form($form_state)
{
  if(!isset($form_state['storage']['confirm']))
  {
    // do your normal $form definition here
    return $form;
  }
  else
  {
    // do your confirm form here
    return confirm_form($form);
  }
}

function mymodule_form_validate($form, &$form_state)
{
  if(!isset($form_state['storage']['confirm']))
  {
    // put any initial validation here. This only be called the first time through, not when the confirm button has been pushed.
  }
}

function mymodule_form_submit($form, &$form_state)
{
    if(!isset($form_state['storage']['confirm']))
    {
      $form_state['storage']['confirm'] = TRUE; // this will cause the form to be rebuilt, entering the confirm part of the form
    }
    else
    {
      // this is where you do your processing after they have pressed the confirm button
    }
}
?>

Think the Drupal forums suck? Add your agreement here: https://www.drupal.org/node/2641072

stone_d’s picture

man - that rocks!!! Thank you very much. This code is working as i wanted it to!
Even i dunno if that the correct/best way to solve this problem, it is solved ... so ;)

Thank you very much!

916Designs’s picture

So I got your example working! Yes!

One caveat, had to add $form_state['rebuild'] = TRUE; right after setting confirm to true, otherwise the form would just reload its current state or do nothing.

So the submit function that worked for me (ignore php tag):

<?php
function mymodule_form_submit($form, &$form_state)
{
    if(!isset($form_state['storage']['confirm']))
    {
      $form_state['storage']['confirm'] = TRUE; // this will cause the form to be rebuilt, entering the confirm part of the form
      $form_state['rebuild'] = TRUE;
    }
    else
    {
      // this is where you do your processing after they have pressed the confirm button
    }
}
?>

Thank you so much for the post!