TableSort sorgu olmadan kullanılabilir mi?


15

Modülümde, bazı tablolarım için TableSort kullanıyorum, ama aynı zamanda doğrudan bir sorguya bağlı olmayan kod tarafından oluşturulan bazı tablolar var. Bu tablolar tema ('table') ile de oluşturulur ve böylece $ header ve $ row dizileri bulunur. TableSort'u bunlarda da kullanmak mümkün müdür, belki de sıralama fonksiyonumu yazarak?

Dokümantasyon tablesort.inc için (bu mümkün önermek görünüyor tema bir çağrı ( 'table') ile oluşturulan tüm tablolar kullanıcı tabloyu o sütuna göre sıralamak için tıklayın anlamına sahip sütun başlıklarının seçeneğine sahip ). Ancak, bunun nasıl yapılacağına dair herhangi bir talimat veya örnek bulamadım. Şimdiye kadar bulduğum her şey bir sorguya dayanıyor. Drupal 7 kullanıyorum.

Yanıtlar:


10

Tablesort aslında birlikte çalışan iki farklı sistemden oluşur.

İlk bölüm, doğrudan theme_table () içinde gerçekleşen veya bundan çağrılan öğelerdir . Tek yaptığı, $ _GET üzerinden varsayılan bir sıralama veya geçersiz kılma varsa tablo başlıklarını sıralama göstergesiyle görüntülemek ve bunlara tıklayabilmeniz için bağlantı oluşturmasıdır.

İkinci bölüm, varsayılan sıralama yönüne veya $ _GET geçersiz kılmasına göre eklendiği sorguyu ayarlayan TableSort sorgu genişleticisidir.

Bu iki sistem aslında oldukça ayrılmıştır, sadece birlikte kolayca çalışır, çünkü verilerini aynı $ başlık yapısından alırlar ve $ _GET parametreleri için aynı yardımcı işlevleri ve adlandırma kurallarını kullanırlar. Ancak hiçbir şey bunlardan sadece birini kullanmanıza engel olmaz.

Sorunuzu gerçekten yanıtlamak için, yalnızca oluşturma kısmına ihtiyacınız varsa, TableSort :: orderbyHeader () öğesine benzer bir şey yaptığınızdan emin olmanız gerekir . OrderBy () çağrısı yerine, bir dizi sıralama işlevi kullanır veya bir web hizmetine veya başka bir şeye argüman olarak iletirsiniz.

Bunun tersi için, TableSort sorgu genişleticisi tarafından tanınması için temelde tablesort_header () öğesine eşdeğer bir bağlantı görüntülediğinizden emin olmanız gerekir .


Beni doğru yöne yönlendirdiğiniz için teşekkür ederim, şimdi çalıştırıyorum. Aynı şeyi başarmaya çalışanlar için, yorum alanına sığmadığı için adımlarımı ayrı bir cevaba koydum.
Viski

15

Berdir sayesinde çalıştım . Daha ayrıntılı olarak bu şekilde çalışır.

$ Headers dizisindeki (sütun) dizileri 'data', 'field' ve isteğe bağlı olarak 'sort' anahtarlarını içeriyorsa, tablesort "otomatik olarak" tetiklenir. Bu, sütun başlıklarında 'sıralama' ve 'sıra' ile bağlantılar oluşturur ve küçük oku ve benzerlerini gösterir.

Kendi sıralamanızı yapmak için geçerli sıra ayarlarını tablesort_get_order ve tablesort_get_sort ile alın ve bu değerleri kendi sıralama işleviniz için kullanın. Tablesort_get_order tarafından döndürülen dizideki 'sql' anahtarı, sıralama için kullanılacak alan adını içerir.

$ Users dizisine sahip ve her kullanıcı için bazı ayrıntılar içeren bir örnek (test edilmemiş) örnek kod:

// setup the table data that we want to show
$tableData = array();
foreach ($users as $userDetails) {
  $tableData[] = array(
      'name' => $userDetails['name'],
      'visits' => $userDetails['visits'],
      'views' => $userDetails['views'],
      'comments' => $userDetails['comments']
  );
}

// headers array, sorting by default on comments
$headers = array(
    array('data' => t('Name'), 'field' => 'name'),
    array('data' => t('Visits'), 'field' => 'visits'),
    array('data' => t('Views'), 'field' => 'views'),
    array('data' => t('Comments'), 'field' => 'comments', 'sort' => 'desc')
);

// getting the current sort and order parameters from the url
$order = tablesort_get_order($headers);
$sort = tablesort_get_sort($headers);

// sort the table data accordingly (write your own sort function)
$tableData = my_array_sort($tableData, $order['sql'], $sort);

// create the array with rows for theme table
$rows = array();
foreach ($tableData as $entry) {
  $rows[] = array(
      array('data' => $entry['name']),
      array('data' => $entry['visits']),
      array('data' => $entry['views']),
      array('data' => $entry['comments']),
  );
}

// add any attributes and sent everything to theme table
$attributes = array('class' => array('my_class'));
$table = array('header' => $headers, 'attributes' => $attributes, 'rows' => $rows);
$html = theme('table', $table);

1
stackoverflow.com/a/19454643/763010 Burada bana yardımcı oldu write your own sort function.
tyler.frankenstein

4

İşte ben viski cevabı bitti kod. Varlık alanı sorgusunu kullanır.

 $query = new EntityFieldQuery();
  $query
  ->entityCondition('entity_type', 'vehicle')
  ->entityCondition('bundle', 'car');
  $result=$query->execute();
  $ids=array_keys($result['vehicle']);
  $values=entity_load('vehicle',$ids);
  $rows=array();
  foreach($values as $val){
    $rows[]=array('data'=>array(
      'id'=>$val->id,
      'title'=>$val->title,
      'price'=>$val->field_price['und'][0]['value'],
      'model'=>$val->field_model['und'][0]['value'],
      'color'=>$val->field_color['und'][0]['value'],
      'speed'=>$val->field_speed['und'][0]['value'],

    ));
  }


  // We are going to output the results in a table with a nice header.
  $header = array(
    // The header gives the table the information it needs in order to make
    // the query calls for ordering. TableSort uses the field information
    // to know what database column to sort by.
    array('data' => t('Entity Id'),'field' => 'id'),
    array('data' => t('Title'),'field' => 'title'),
    array('data' => t('Price'),'field' => 'price'),
    array('data' => t('Model'),'field'=>'model'),
    array('data' => t('Color'),'field'=>'color'),
    array('data' => t('Speed'),'field'=>'speed'),

  );

  $order = tablesort_get_order($header);
  $sort = tablesort_get_sort($header);
  $sql=$order['sql'];
  if($sort=='desc') {

    usort($rows, function($a, $b) use($sql) {
    return $a['data'][$sql] > $b['data'][$sql]? -1 : 1;

  });

  }
  if($sort=='asc') {
      usort($rows, function($a, $b) use ($sql) {
        return $a['data'][$sql] < $b['data'][$sql]? -1 : 1;
      });
  }

  $output = theme('table', array(
    'header' => $header,
    'rows' => $rows,
  ));

  return $output;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.