it-swarm.com.de

Hook Form ändern für Auswahlliste

Ich habe versucht, einen Textfeldfilter für Titel in eine nach Inhaltstyp gefilterte Auswahlliste zu konvertieren, indem ich die Hook-Form alter:

function myhook_form_alter(&$form, &$form_state, $form_id) {

  if($form_id == 'views_exposed_form'){

      // load nodes filtered by content type - news
      $nodes = node_load_multiple(array(), array('type' => 'news'));

      // Build an array    
      $dropdown_array = array('' => '--Any--');
      foreach ($nodes as $node) {
         $key = $node->title;
         $value = $node->title;

         $dropdown_array[$key] = $value;        
      }

      // Alter form
      $form['title'] = array(     
         '#type' => 'select',
         '#default_value' => '1',        
         '#options' => $dropdown_array,
      ); 

   }//endif

}

Der obige Code funktioniert gut. Jetzt frage ich mich, ob es eine bessere, kürzere, effizientere oder ordnungsgemäße API gibt, die implementiert werden kann. Ich bin ein Neuling in der drupal Programmierung. Lernen, mehr drupal zu programmieren. Bitte beraten. Vielen Dank.

3
Adamtan

Wenn Sie wissen, dass diese Liste nicht mehr als ein paar Dutzend Knoten umfasst (Sie müssen einige Tests mit mehr Elementen durchführen), würde ich das Laden vollständiger Knoten einfach vermeiden - es ist nicht erforderlich, wenn Sie nur den Titel benötigen.
Dieser Aufruf kann zu einem erheblichen Datenbank-Treffer werden (=> Seite wird langsamer geladen und verlangsamt andere Besucher der Site), wenn Sie der Site weitere Knoten hinzufügen.
Wenn Sie node_load() aufrufen, Drupal erstellt das vollständige Knotenobjekt, dh es sucht nach allen zusätzlichen Feldern, die Sie hinzugefügt haben, Einstellungen und ruft entsprechende Knoten-Hooks von anderen auf Vermeiden Sie es, kleine Details zu nennen, wann immer Sie können.

Folgendes können Sie stattdessen verwenden:

function myhook_form_alter(&$form, &$form_state, $form_id) {

  if($form_id == 'views_exposed_form'){

      $nodes = db_select('node', 'n')
        ->fields('n', array('title'))
        ->condition('type', 'news')
        ->orderBy('n.title', 'ASC')
        ->execute();
      $dropdown_array = array('' => t('-- Any --'));
      foreach ($nodes as $node) {
        $dropdown_array[$node->title] = $node->title;
      }

      // Alter form
      $form['title'] = array(     
         '#type' => 'select',
         '#default_value' => '1',        
         '#options' => $dropdown_array,
      ); 

   }//endif

}

Schauen Sie sich auch das Ausgewählte Modul für Drupal - es ermöglicht Ihnen, ein viel schöneres ausgewähltes Formularelement als das Standardmodul zu haben. Die Installation ist ziemlich einfach.
Sie können eine Demo sehen hier .

5
Aram Boyajyan