二月 8, 2016 | 後端和Drupal

該如何排序Drupal Views Exposed Form Filter Element? "#weight"居然不管用

前言

Drupal 7 的 Form API是熟悉Drupal開發的人最常看的網頁,因為有互動的地方,就會有Form,而在Drupal裡面,跟Form有關的最重要的就是Drupal Form API,在Form之中,要排序只需要在每個element裡面加上“#weight”這個屬性即可進行排序,然而在Views的Exposed Form裡面,"#weight"是無法使用的

傳統做法

使用hook_form_form_id_alter($form,$form_states)這個function可以在Form產生出來前,進行更動,若是傳統要更改排序的做法將會是以下程式,通過更改每個Field的「#weight」來改動對應field的位置。
以下範例主要想要將Exposed Form三個欄位,分別是custom field 1,custom field 2,custom field 3,而排序方式想要改成1->3->2

<?php
function hellosanta_form_views_exposed_form_alter(&$form, &$form_state){
  $form['field_custom_field_1']['#weight']=-10;
  $form['field_custom_field_3']['#weight']=-8;
  $form['field_custom_field_2']['#weight']=-7;

}
?>

以上完全不管用

解決的方法

其實在Views Exposed Form Filter裡,要重新排序是需要針對Form['#info']才有辦法的,以下為範例

<?php
function hellosanta_form_views_exposed_form_alter(&$form, &$form_state){

  // 這裏是您想要把您指定的element移到的位子
  $insert_index = 2;

  $element_to_insert = array();
  $element_to_insert['filter-sort'] = array(
    'value' => 'field_custom_field_3',  //這個為你想要變動的那個欄位名稱
  );

  $form_info_top = array_slice($form['#info'], 0, $insert_index);
  $form_info_bottom = array_slice($form['#info'], $insert_index);
  $new_form_info = $form_info_top + $element_to_insert + $form_info_bottom;
  $form['#info'] = $new_form_info;

}
?>  

結論

其實Exposed Form Filter的排序問題是很常遇到的,例如今天是餐廳網頁,往往就需要做地點、分類、交通、關鍵字等等Exposed的Form Filter來給客戶,而順序會是很重要的UI之一,因此這樣的做法,可以解決日後,Exposed Form的Element順序問題,分享給大家。