TableSort สามารถใช้งานได้โดยไม่มีคิวรีหรือไม่?


15

ในโมดูลของฉันฉันกำลังใช้ TableSort สำหรับบางตารางของฉัน แต่ฉันยังมีตารางบางตารางที่สร้างขึ้นโดยรหัสดังนั้นไม่เชื่อมโยงโดยตรงกับแบบสอบถาม ตารางเหล่านี้ถูกสร้างด้วยธีม ('table') และมี $ header และ $ row arrays เป็นไปได้หรือไม่ที่จะใช้ TableSort กับสิ่งเหล่านั้นเช่นกันอาจจะเป็นการเขียนฟังก์ชั่นการเรียงลำดับของฉัน

เอกสารสำหรับ tablesort.inc ดูเหมือนว่าจะบอกว่ามันเป็นไปได้ที่ ( ตารางทั้งหมดที่สร้างขึ้นด้วยการเรียกร้องให้ธีม ( 'ตาราง') มีตัวเลือกของการมีส่วนหัวคอลัมน์ที่ผู้ใช้สามารถคลิกเพื่อจัดเรียงตารางตามคอลัมน์ที่ ) อย่างไรก็ตามฉันไม่พบคำแนะนำหรือตัวอย่างเกี่ยวกับวิธีการทำเช่นนี้ ทุกสิ่งที่ฉันพบตอนนี้ขึ้นอยู่กับข้อความค้นหา ฉันใช้ Drupal 7

คำตอบ:


10

Tablesort ประกอบด้วยสองระบบที่แตกต่างกันซึ่งทำงานร่วมกัน

ส่วนแรกคือการเรนเดอร์สิ่งที่เกิดขึ้นโดยตรงภายในtheme_table ()หรือถูกเรียกจากนั้น สิ่งที่มันทำคือการแสดงส่วนหัวของตารางที่มีตัวบ่งชี้การเรียงหากการเรียงลำดับเริ่มต้นหรือแทนที่ผ่าน $ _GET มีอยู่และทำให้พวกเขาเชื่อมโยงเพื่อให้คุณสามารถคลิกที่พวกเขา

ส่วนที่สองคือส่วนขยายแบบสอบถามTableSortที่ปรับแบบสอบถามที่เพิ่มขึ้นตามทิศทางการเรียงลำดับเริ่มต้นหรือการแทนที่ $ _GET

ระบบทั้งสองนี้ถูกแยกออกจากกันโดยความจริงเพียงแค่ทำงานร่วมกันได้อย่างง่ายดายเพราะพวกเขาได้รับข้อมูลจากโครงสร้างส่วนหัว $ แบบเดียวกันและใช้ฟังก์ชันตัวช่วยและการตั้งชื่อแบบแผนสำหรับพารามิเตอร์ $ _GET แต่ไม่มีอะไรหยุดคุณจากการใช้เพียงหนึ่งในสิ่งเหล่านี้

ที่จริงการตอบคำถามของคุณถ้าคุณเพียงแค่ต้องมีส่วนร่วมการแสดงผล, คุณเพียงแค่ต้องทำให้แน่ใจว่าจะทำสิ่งที่คล้ายกับTableSort :: orderbyHeader () แทนการโทร orderBy () คุณจะต้องใช้ฟังก์ชั่นการเรียงลำดับอาเรย์หรือส่งต่อเป็นอาร์กิวเมนต์ไปยังบริการเว็บหรือสิ่งอื่นใด

และในทางกลับกันคุณต้องตรวจสอบให้แน่ใจว่าคุณแสดงลิงค์ที่เทียบเท่ากับtablesort_header ()เพื่อให้เป็นที่รู้จักโดยตัวขยายคิวรี TableSort


ขอบคุณที่ชี้ให้ฉันไปในทิศทางที่ถูกต้องฉันได้ใช้งานได้แล้ว สำหรับผู้ที่พยายามบรรลุเป้าหมายเดียวกันฉันวางขั้นตอนไว้ในคำตอบแยกต่างหากเพราะมันไม่เหมาะสมในช่องแสดงความคิดเห็น
วิสกี้

15

ขอบคุณBerdirฉันทำให้มันใช้งานได้ นี่คือวิธีการทำงานในรายละเอียดเพิ่มเติม

Tablesort จะถูกเรียกใช้ "อัตโนมัติ" หากอาร์เรย์ (คอลัมน์) ในอาร์เรย์ $ headers มีปุ่ม 'data', 'field' และ 'sort' ซึ่งเป็นทางเลือก วิธีนี้จะสร้างลิงก์ที่มี 'เรียงลำดับ' และ 'เรียงลำดับ' ในส่วนหัวของคอลัมน์และแสดงลูกศรเล็ก ๆ

หากต้องการเรียงลำดับของคุณเองให้รับการตั้งค่าการเรียงลำดับปัจจุบันด้วยtablesort_get_orderและtablesort_get_sortและใช้ค่าเหล่านั้นสำหรับฟังก์ชันการเรียงลำดับของคุณเอง คีย์ 'sql' ในอาร์เรย์ที่ส่งคืนโดย tablesort_get_order มีชื่อเขตข้อมูลที่จะใช้สำหรับการเรียงลำดับ

ชิ้นส่วนของโค้ดตัวอย่าง (ยังไม่ทดลอง) ที่มีผู้ใช้ array $ ที่มีรายละเอียดบางอย่างสำหรับผู้ใช้แต่ละคน:

// 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/763010write your own sort functionช่วยให้ฉันที่นี่ด้วย
tyler.frankenstein

4

นี่คือรหัสที่ฉันได้รับคำตอบจากวิสกี้ มันใช้แบบสอบถามภาคสนาม

 $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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.