쿼리없이 TableSort를 사용할 수 있습니까?


15

내 모듈에서는 일부 테이블에 대해 TableSort를 사용하고 있지만 코드로 생성되는 일부 테이블도 있으므로 쿼리에 직접 연결되지 않습니다. 이 테이블은 theme ( 'table')으로 작성되므로 $ header 및 $ rows 배열도 있습니다. 정렬 기능을 작성하면서 TableSort를 사용할 수도 있습니까?

tablesort.inc에 대한 문서 는 가능하다고 제안하는 것 같습니다 ( theme ( 'table')을 호출하여 만든 모든 테이블에는 사용자가 클릭하여 해당 열을 기준으로 테이블을 정렬 할 수있는 열 머리글 옵션이 있습니다 ). 그러나이 작업을 수행하는 방법에 대한 지침이나 예제를 찾지 못했습니다. 지금까지 찾은 모든 것은 쿼리를 기반으로합니다. Drupal 7을 사용하고 있습니다.

답변:


10

Tablesort는 실제로 함께 작동하는 두 개의 서로 다른 시스템으로 구성됩니다.

첫 번째 부분은 렌더링 입니다. theme_table () 내에서 직접 발생하거나 그로부터 호출되는 것입니다. 기본 정렬 또는 $ _GET을 통한 재정의가 존재하는 경우 정렬 표시와 함께 테이블 헤더를 표시하고 링크를 클릭하면 클릭 할 수 있습니다.

두 번째 부분은 기본 정렬 방향 또는 $ _GET 재정의에 따라 추가되는 쿼리를 조정 하는 TableSort 쿼리 확장기입니다.

이 두 시스템은 실제로 상당히 분리되어 있으며 동일한 $ header 구조에서 데이터를 가져오고 $ _GET 매개 변수에 동일한 도우미 함수 및 명명 규칙을 사용하기 때문에 쉽게 함께 작동합니다. 그러나 이것들 중 하나만 사용하는 것을 막을 수있는 것은 없습니다.

실제로 질문에 대답하려면 렌더링 부분이 필요한 경우 TableSort :: orderbyHeader () 와 비슷한 작업을 수행하면 됩니다. orderBy () 호출 대신 배열 정렬 함수를 사용하거나 웹 서비스 또는 다른 것에 대한 인수로 전달합니다.

반대의 경우 TableSort 쿼리 익스텐더가 인식 할 수 있도록 기본적으로 tablesort_header () 와 동일한 링크를 표시해야합니다 .


올바른 방향으로 나를 가리켜 주셔서 감사합니다. 지금 작동하고 있습니다. 동일한 결과를 얻으려는 사람들을 위해 의견 필드에 맞지 않기 때문에 단계를 별도의 답변에 넣었습니다.
위스키

15

Berdir 덕분에 작동했습니다. 이것이 더 자세하게 작동하는 방법입니다.

$ headers 배열의 (열) 배열에 'data', 'field'및 선택적으로 'sort'키가 포함되어 있으면 Tablesort가 "자동으로"트리거됩니다. 열 머리글에 '정렬'과 '순서'가있는 링크가 만들어지고 작은 화살표 등이 표시됩니다.

자체 정렬을 수행하려면 tablesort_get_ordertablesort_get_sort 를 사용 하여 현재 정렬 설정을 가져 와서 자체 정렬 기능에 해당 값을 사용하십시오. tablesort_get_order가 반환 한 배열의 키 'sql'에는 정렬에 사용할 필드 이름이 포함되어 있습니다.

각 사용자에 대한 세부 정보가 포함 된 $ users 배열이 포함 된 (예상치 않은) 예제 코드 :

// 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 은 여기에서 나를 도와주었습니다 write your own sort function.
tyler.frankenstein 1

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.