A word on value lists

Some form elements require fetching value lists from the database. CiviCrm offers the following facilities to help building form elements with custom data:

Generating form elements

Text input

$form->add( 'text', 'nom', ts( 'Contact Name' ) );

Textarea

$form->addElement('textarea','address_format', ts('Display Format'));  

Hidden fields

$form->addElement('hidden','contact_edit_prefences', null, array('id'=> 'contact_edit_prefences') );

Checkboxes

$form->addElement('checkbox', 'is_active', ts('Is this CiviCRM Profile active?') );      

Radio buttons

$gender = array('' => ts('- any gender -')) + CRM_Core_PseudoConstant::gender( );
foreach ($gender as $key => $var) {
  $genderOptions[$key] = HTML_QuickForm::createElement('radio', null, ts('Gender'), $var, $key);
}
$form->addGroup($genderOptions, 'gender_id', ts('Gender'));

Tri-value Boolean fields

(documentation missing -- there's probably a better way to do this)

$boolean = array();
$boolean[] = &HTML_QuickForm::createElement('radio', NULL, NULL, 'Yes', 1);
$boolean[] = &HTML_QuickForm::createElement('radio', NULL, NULL, 'No', 0);
$boolean[] = &HTML_QuickForm::createElement('radio', NULL, NULL, 'Either', '');
$form->addGroup( $boolean, 'handicap', ( 'Handicap' ) );

Combo boxes

$stateProvince = array('' => ts('- any state/province -')) + CRM_Core_PseudoConstant::stateProvince( );
$form->addElement('select', 'state_province_id', ts('Individual\'s State'), $stateProvince);

Multiple selections

$includeCountry =& $form->addElement('advmultiselect', 'countryLimit', 
   ts('Available Countries') . ' ', $country,
   array('size' => 5,
         'style' => 'width:150px',
         'class' => 'advmultiselect')
   );

$includeCountry->setButtonAttributes('add', array('value' => ts('Add >>')));
$includeCountry->setButtonAttributes('remove', array('value' => ts('<< Remove')));

Date fields

(some documentation missing)

$yearsInPast   = 0;
$yearsInFuture = 1;
$dateParts     = implode( CRM_Core_DAO::VALUE_SEPARATOR, array( 'Y', 'M' ) );

$form->add( 'date', 'date_birth',
            ts('Birth Date'),
            CRM_Core_SelectValues::date('custom', $yearsInPast, $yearsInFuture, $dateParts ) );

See also:

Modifying existing form elements

This is particularly useful in a CiviCRM hookBuildForm()

Remove an element

$form->removeElement('cvv2');

Although in this specific case, removing the cvv2 field for online payment (contribution forms) caused weird loops in the forms without throwing an error message, so setting a value and hiding it (in the smarty templates) was easier:

$cvv2 =& $form->getElement('cvv2');
$cvv2->setValue('000');

or

$defaults['cvv2'] = '000';
$form->setDefaults($defaults);

Radio buttons (ex: donation amount)

function civicrmdesjardins_civicrm_buildForm($formName, &$form) {
  /*
   * Donation forms: format amount 10.00$ to 10$
   */
  if ($formName == 'CRM_Contribute_Form_Contribution_Main') {
    $amounts  =& $form->getElement('amount');
    $elements =& $amounts->getElements();

    foreach ($elements as $key => $val) {
      $text = $elements[$key]->getText();
      $text = preg_replace('/\.00 \$/', '$', $text);
      $elements[$key]->setText($text);
    }
  }
}

Force a default value

    if ($form->elementExists('activity_type_id')) {
      $e =& $form->getElement('activity_type_id');
      $e->setValue(1);
      $e->freeze();
    }

Removing the WYSIWYG on a specific field

For example: the "Generate PDF letter" can mess up a template if it has smarty inside it.

/**
 * hook_civicrm_buildForm
 */
function fooexample_civicrm_buildForm( $formName, &$form ) {
  if ($formName == 'CRM_Contact_Form_Task_PDF') {
    // Remove the WYSIWYG on the PDF letter form.
    $e = $form->getElement('html_message');
    $form->removeElement('html_message');

    $attributes = array('value' => $e->getValue());
    $form->addElement('textarea','html_message', $e->getLabel(), $attributes);

    $form->assign('editor', 'textarea');
  }
}

References

4012888888881881

CiviCrm/QuickForm (last edited 2018-05-19 01:28:48 by gabriel)