Astuce Drupal7 : Widget de modification de champ

Nous voulions ajouter une fonctionnalité à notre widget de fichier de tel sorte qu'il pourrait identifier quand exclure un fichier des résultats de recherche. Les fichiers sont indexés et recherchés avec apachesolr et Tika. Donc, notre idée était d'ajouter une case à cocher au widget du fichier et de sauveguarder sa valeur. Un crochet indice de mise à jour de apachesolr saura si un fichier peut être mis dans l'index ou non. Nous allons sauveguarder l'exclusion en tant que champ dans la table file_managed.

Créez la table:

<?php
/**
Ajouter exclusion du champ de recherche
 **/
function glue_update_7006() {
  
db_add_field('file_managed''exclude', array('type' => 'int''not null' => TRUE'description' => 'Exclude.'));
}
</
Php>

<
b>Comment modifier le widget </b>
Modifier la forme normale d'un widget sur le champ ne marchera pas, car le tableau n'est pas entièrement construitCe que nous devons faire est d'utiliser les fonctions #AfterBuild fournis par render API. A ce satde toutes les infos nécessaires pour modifier les widgets du formulaire sont présentes. Voici comment faire:

<php>
/**
 * Implanter hook_form_alter
 */
function glue_form_measure_node_form_alter(&$form, &$form_state, $form_id) {
  //Obtenir lang
  if (is_numeric(arg(1))) {
    // Mettre en forme l'
etat pour que l'ajout d'un autre permette de l'utiliser car le chemin n'est pas un noeud/[id]/modifier mais/system/ajax
    $form_state
['glue_measure_nid'] = arg(1);
  }
  
// Node est déjà en cache statique afin que nous puissions le charger
 
$node node_load($form_state['glue_measure_nid']);   
    
  
// Ajouter la case à cocher excluant la recherche
 
$field_attachments_lang field_language('node'$node'field_attachments');  
  
$form_state['field_attachments_lang'] = $field_attachments_lang;
  
$form['field_attachments'][$field_attachments_lang]['#after_build'][] = 'glue_afterbuild_search_exclude';
  
$form['#submit'][] = 'glue_afterbuild_search_exclude_submit'
}
?>

Avec une modification du formulaire crochet , on ajoute une fonction AfterBuild personnalisée et une fonction soumettre. Notez que nous stockons le champs des langues dans l'etat du frmulaire puisque nous allons en avoir besoin dans la fonction AfterBuild.

<?php
/ **
 
Fonction AfterBuild pour exclure des fichiers dans la recherche
 
* /
function 
glue_afterbuild_search_exclude($element, &$form_state) {
  foreach (
$element as $key => $item) {
    if (
is_numeric($key) && $item['#value']['fid']) {
      
$element[$key]['display_search']['#type'] = 'checkbox';
      
$element[$key]['display_search']['#checked'] = false;
      
$element[$key]['display_search']['#title'] = t('Exclude in search results');

      
$result db_select('file_managed''f')
          ->
fields('f')
          ->
condition('fid'$element[$key]['#value']['fid'], '=')
          ->
execute();
      
$file $result->fetch();

      if (
$file->exclude == 1) {
        
$element[$key]['display_search']['#value'] = 0;
        
$element[$key]['display_search']['#checked'] = true;
      }
      
      
$element[$key]['display_search']['#attributes']['class'][0] = 'field-attach-exclude-search';
      
$element[$key]['display_search']['#id'] = $element[$key]['display']['#id'] . '-exlude-search';

      
$element[$key]['display_search']['#name'] = 'field_attachments[' $element[$key]['#language'] . '][' $key '][display-exclude-search]';
    }
  }

  return 
$element;
}
?>

Dans la fonction AfterBuild , nous pouvons effectivement modifier le tableau pour ajouter notre case à cocher.

Enfin dans la fonction de soumettre, nous stockons nos valeurs.

<?php
/**
 * Formulaire de soumission pour exclure des fichier dans la recherche
 */
function glue_afterbuild_search_exclude_submit($form$form_state) {
  foreach (
$form_state['values']['field_attachments'][$form_state['field_attachments_lang']] as $key => $item) {    
    
$file file_load($item['fid']);
    if (
$file) {
      if (isset(
$item['display-exclude-search']) && $item['display-exclude-search'] == 1) {
        
$value 1;
      }
      else {
        
$value 0;
      }
      
db_update('file_managed')
          ->
fields(array('exclude' => $value,))
          ->
condition('fid'$file->fid'=')
          ->
execute();
    }
  }
}
?>

Le résultat: