web-dev-qa-db-fra.com

Comment supprimer la description du format dans le champ du formulaire date_popup?

Comment puis-je supprimer la description du format dans le champ du formulaire date_popup?

$form['payable_by'] = array(
    '#type' => 'date_popup',
    '#title' => $amount !== '' ? t('Instalment payable date for instalment @label', array('@label' => $amount)) : t('Instalment payable date for new instalment'),
    '#title_display' => 'invisible',
    '#default_value' => $payable_by,
    '#parents' => array('instalment', $key, 'payable_by'),
        '#date_format' => 'Y-m-d',
        '#date_year_range' => '-0:+1',
  );

Veuillez vérifier l'image

enter image description here

5
Umar

Normalement, vous devez simplement définir la propriété # description de l'élément de formulaire, et elle sera rendue. Avec l'élément date_popup implémenté par le module Date, il semble que ce ne soit pas possible: l'élément form est composé de deux sous-éléments pour lesquels la valeur de la # description la propriété n'est pas prise en compte.

Comme il y a deux branches, je vais rapporter ce que j'ai remarqué dans l'instantané de développement pour les deux branches.

Branche 7.x-2

L'élément "date_popup" est défini avec code suivant .

function date_popup_element_info() {
  $timepicker = date_popup_get_preferred_timepicker();
  $type['date_popup'] = array(
    '#input' => TRUE,
    '#tree' => TRUE,
    '#date_timezone' => date_default_timezone(),
    '#date_flexible' => 0,
    '#date_format' => variable_get('date_format_short', 'm/d/Y - H:i'),
    '#timepicker' => variable_get('date_popup_timepicker', $timepicker),
    '#date_increment' => 1,
    '#date_year_range' => '-3:+3',
    '#date_label_position' => 'above',
    '#process' => array('date_popup_element_process'),
    '#value_callback' => 'date_popup_element_value_callback',
    '#theme_wrappers' => array('date_popup'),
  );
  if (module_exists('ctools')) {
    $type['date_popup']['#pre_render'] = array('ctools_dependent_pre_render');
  }
  return $type;
}

L'élément a une fonction de processus qui exécute le code suivant.

  $element['#tree'] = TRUE;
  $element['#theme_wrappers'] = array('date_popup');

  if (!empty($element['#ajax'])) {
    $element['#ajax'] += array(
      'trigger_as' => array('name' =>$element['#name']),
      'event' => 'change',
    );
  }

  $element['date'] = date_popup_process_date_part($element);
  $element['time'] = date_popup_process_time_part($element);

En regardant le code de date_popup_process_date_part(), je remarque le code suivant.

  $sub_element['#value'] = $sub_element['#default_value'];
  // TODO, figure out exactly when we want this description. In many places it is not desired.
  $sub_element['#description'] = ' '. t('E.g., @date', array('@date' => date_format_date(date_now(), 'custom', date_popup_date_format($element))));

Comme le code que date_popup_element_process() exécute avant de renvoyer l'élément est le suivant, il existe toujours une alternative.

  $context = array(
   'form' => $form,
  );
  drupal_alter('date_popup_process', $element, $form_state, $context);

En implémentant hook_date_popup_process_alter(), vous pouvez supprimer la description.

function mymodule_date_popup_process_alter(&$element, &$form_state, $context) {
  unset($element['date']['#description']);
  unset($element['time']['#description']);
}

Un code similaire est présent dans la branche 6.x-2 .

Branche 7.x-1

Il y a peu de différences avec la branche que j'ai décrite précédemment. (Voir le référentiel de code .)

Le premier est le code qui dans date_popup_process_date_part() définit la description, qui est la suivante.

  $sub_element['#value'] = $sub_element['#default_value'];
  // TODO, figure out exactly when we want this description. In many places it is not desired.
  $sub_element['#description'] = ' '. t('Format: @date', array('@date' => date_format_date(date_now(), 'custom', date_popup_date_format($element))));
  return $sub_element;

La deuxième différence est que date_popup_element_process() (la fonction de processus pour cet élément) n'invoque pas hook_date_popup_process_alter().

function date_popup_element_process($element, $form_state, $form) {
  date_popup_add();
  module_load_include('inc', 'date_api', 'date_api_elements');

  $element['#tree'] = TRUE;
  $element['#theme_wrappers'] = array('date_popup');

  $element['date'] = date_popup_process_date($element);
  $element['time'] = date_popup_process_time($element);

  if (isset($element['#element_validate'])) {
    array_Push($element['#element_validate'], 'date_popup_validate');
  }
  else {
    $element['#element_validate'] = array('date_popup_validate');
  }
  return $element;
}

La seule alternative dans ce cas serait d'implémenter hook_element_info_alter () pour ajouter une fonction de processus à l'élément.

function mymodule_element_info_alter(&$type) {
  if (isset($type['date_popup'])) {
    $type['date_popup']['#process'][] = 'mymodule_date_popup_process';
  }
}

function mymodule_date_popup_process($element, $form_state, $complete_form) {
  unset($element['date']['#description']);
  unset($element['time']['#description']);

  return $element;
}

Le code de la branche 6.x-1 est similaire au code de la branche 6.x-2.

Dans les deux cas, le commentaire rapporté dans le code du module Date suggère qu'ils modifieront le code pour ne pas utiliser la description qui est maintenant affichée. Pour cette raison, je suggère d'implémenter le code nécessaire dans un module personnalisé et de supprimer ce code une fois le module Date modifié.

13
kiamlaluno

essaye ça:

function promo_quote_date_popup_process($element, $form_state, $complete_form) {
      unset($element['date']['#description']);
      unset($element['date']['#title']);
      return $element;
}
function promo_quote_element_info_alter(&$type) {
  if (isset($type['date_popup'])) {
    $type['date_popup']['#process'][] = 'promo_quote_date_popup_process';
  }
}
0
Hung Tran

Dans d 6.x, il n'y a pas de crochet info_alter. Mais vous pouvez résoudre ce problème en utilisant pre_render.

Dans votre définition de formulaire ou par modification de formulaire, vous devez ajouter une définition de pré-rendu. Comme ceci par exemple (dans la définition du formulaire):

$form['dateformname'] = array(
  '#title' => t('The date'),
  '#type' => 'date_popup',
  '#pre_render' => array('MODULENAME_date_prerender'),
);

Et puis implémentez cette fonction prérendeur où vous pouvez annuler la description du sous-élément de données. Exemple:

function MODULENAME_date_prerender($element) {
  unset($element['date']['#description']);
  return $element;
}
0
Thomas Brix