it-swarm-ko.tech

두 개의 뷰를 결합하는 방법은 무엇입니까?

사용자 노드와 주석을 "게시 날짜"로 정렬하여 결합하려고합니다. 이 post 는 D6의 샌드 박스 프로젝트에 연결되지만 7에는 없습니다.

post 에는 D6에서 hook_views_pre_execute () 및 SQL UNION을 사용하는 예가 있습니다. 뷰가 3 인 D7에서는 작동하지 않습니다.

나는 merlinofchaos를 보았습니다 ' comment

우리는 이제 Drupal의 새로운 쿼리 생성기를 사용하고 있기 때문에 쿼리는 수정하거나 교체해야하는 SelectQuery 개체입니다. 자세한 내용은 Drupal 7의 새 데이터베이스 계층을 찾으십시오.

누구 든지이보기 또는 다른 솔루션을 사용하여 두 가지보기를 결합하는 방법에 대한 예가 있습니까?

36
uwe

작동하고 테스트 된 예는 다음과 같습니다.

/**
 * Implements hook_views_pre_execute().
 */
function mymodule_views_pre_execute(view &$view) {
  if ($view->name == 'my_view') {
    $query1 = &$view->build_info['query'];

    // Basic setup of the second query.
    $query2 = db_select('another_table', 'at')
      ->condition('some_field', 0, '>')
      ->condition('some_other_field', 12345);

    // The number of fields (and their aliases) must match query1.
    // Get the details with:
    // dpm($query1->getFields());
    $query2->addField('at', 'some_field', 'alias1');
    $query2->addField('at', 'some_other_field', 'alias2');
    $query2->addField('at', 'some_other_field2', 'alias3');
    $query2->addField('at', 'some_other_field3', 'alias4');

    // Verify that queries are very similar.
    // dpq($query1);
    // dpq($query2);

    // Matrimony.
    $query1 = $query2->union($query1, 'UNION ALL');

    // Manual test.
    // dpm($query1->execute()->fetchAll());

  }
}

이것은 대부분의 뷰에서 작동합니다. 그러나 일부 스타일 플러그인은이 기술로 작동하지 않는 멋진 작업을 수행 할 수 있습니다 (캘린더 모듈을보고 있습니다).

15
Dalin

뷰 추가 핸들러 모듈을 사용하여 두 개의 다른 뷰/디스플레이에서 SQL UNION 쿼리를 생성 할 수 있습니다.

Drupal.org에 대한 자세한 튜토리얼 here

https://www.drupal.org/project/views_extra_handlers screenshot of views alter settings

3
TechNikh

DB_query ()를 사용하여 SQL UNION을 만든 다음 theme () 함수를 사용하여 호출기를 포함한 테이블 레이아웃으로 렌더링했습니다.

사용자에게는 기본보기처럼 보입니다. 다른 장점은 쿼리를 많이 최적화 할 수 있다는 것입니다. 나는 "내 친구의 활동"을 보여주고 있는데, 만약 당신이 그것에 대한보기를 사용한다면 그것은 당신의 친구 목록을 생성하고 당신이 50 개 또는 100 개 이상의 레코드를 가지고 있다면 매우 느린 SQL "IN"절에서 그것을 사용할 것입니다.

지난 x 일 동안 사이트에 로그인 한 사람으로 만 친구 목록을 좁힐 수있었습니다.

이것은 코드 샘플입니다.

  // Two queries are required (friendships can be represented in 2 ways in the
  // same table). No point making two db calls though so a UNION it is.

  // Build up the first query.
  $query = db_select('flag_friend', 'f')
    ->condition('f.uid', $account->uid)
    ->condition('u.login', $timestamp, '>');
  $query->addExpression('f.friend_uid', 'uid');
  $query->innerJoin('users', 'u', 'u.uid = f.friend_uid');

  // Build up the second query.
  $query2 = db_select('flag_friend', 'f')
    ->condition('f.friend_uid', $account->uid)
    ->condition('u.login', $timestamp, '>');
  $query2->addExpression('f.uid', 'uid');
  $query2->innerJoin('users', 'u', 'u.uid = f.uid');

  // Return the results of the UNIONed queries.
  return $query->union($query2)->execute()->fetchCol();
2
uwe

나중에 참조하기 위해 동일한 테이블을 기준으로 두 개의 뷰를 결합한 방법입니다. 같은 양의 필드가있는 다른 테이블을 기반으로하는 뷰에도 동일한 원칙이 적용되어야합니다.

아래의 경우 형식이 렌더링 된 엔티티로 설정되므로 id 만 선택됩니다. 그러나 필드를 사용하는 경우 아래 타임 스탬프를 추가 한 것처럼 필드가 적은 쿼리에 더미 필드를 추가 할 수 있습니다.

/**
 * Implements hook_views_pre_execute().
 */
function MY_MODULE_views_pre_execute(&$view) {
  if ($view->name == 'VIEW_1' && $view->current_display == 'DISPLAY_OF_VIEW_1') {

    $view2 = views_get_view('VIEW_2');
    $view2->build('DISPLAY_OF_VIEW_2');

    $view->build_info['query']
    ->fields('table_alias', array('timestamp'))
    ->union(
        $view2->build_info['query']
        ->range()
        ->fields('table_alias', array('timestamp'))
        ->orderBy('timestamp', 'DESC')
    );

    $view->build_info['count_query']
    ->union(
        $view2->build_info['count_query']
        ->range()
    );
  };
}
1
duru

Views Field View 라는 모듈을 발견했습니다.이 뷰를 다른 뷰에 필드로 포함시킬 수 있습니다. 아직 시도하지는 않았지만 도움이 될 수 있습니다.

0
Marijke Luttekes

나는이 라인을 따라 뭔가를 상상한다.

/** 
* Implements hook_views_pre_execute().
*/     
function mymodule_views_pre_execute(&$view) {
  if ($view->name == 'myview') {
    $query = $view->query;
    $other_view = views_get_view('otherview');
    $other_query = $other_view->query;
    $query = $query->union($other_query);
    $view->query = $query;
  }
}

테스트하지는 않았지만.

도움이 될만한 링크들 :

http://api.drupal.org/api/drupal/includes!database!select.inc/function/SelectQueryInterface%3A%3Aunion/7

http://drupal.org/node/557318#comment-199191

0
cam8001

EntityFieldQuery Views Backend 는 동시에 여러 엔티티 유형에 대한 쿼리를 지원합니다. 따라서 노드와 주석을 모두 쿼리 할 수 ​​있어야합니다. 두 엔티티 유형 모두 uid 특성을 사용하여 작성자에게 링크하므로 API 레벨에서 EntityFieldQuery :: propertyCondition () 을 사용하여 단일 사용자의 노드 및 주석을 선택할 수 있어야합니다. 뷰 백엔드가 동일한 기능을 제공한다고 생각합니다.

0
Pierre Buyle

다른 접근 방식은 feeds 노드 및 주석 (URL의 사용자 식별자에 대한 상황 별 필터 사용)을 만든 다음 두 피드를 새 피드로 결합하여 게시 날짜별로 표시하는 것입니다.

0
Sam Wilson