Làm thế nào để tạo ra một liên minh của hai quan điểm?


36

Tôi đang cố gắng để có được sự kết hợp của các nút và bình luận của người dùng được sắp xếp theo "ngày đăng". Bài đăng này liên kết đến các dự án hộp cát cho D6 nhưng không có gì cho 7.

Bài đăng này có một ví dụ về việc sử dụng hook_view_pre_execute () và SQL UNION trong D6. Điều này không hoạt động cho D7 với lượt xem 3.

Tôi đã xem qua bình luận của merlinofchaos

Bởi vì chúng tôi hiện đang sử dụng trình tạo truy vấn mới của Drupal, truy vấn là một đối tượng Chọn mà bạn sẽ phải sửa đổi hoặc thay thế. Tra cứu lớp cơ sở dữ liệu mới của Drupal 7 để biết thêm thông tin.

Có ai có một ví dụ về cách làm điều này hoặc bất kỳ giải pháp nào khác để kết hợp hai quan điểm không?


Đây là một ý tưởng nhiều hơn là một câu trả lời thực sự: bạn sẽ có thể tạo chế độ xem dựa trên người dùng, sẽ tham gia cả các nút và nhận xét (cuối cùng cả hai chỉ là thực thể :). Trong nỗ lực đầu tiên của tôi, tôi đã không làm được điều này bởi vì các khung nhìn không cung cấp mối quan hệ từ người dùng đến coment. Nhưng điều đó nên dễ dàng thay đổi. (hoặc tôi chỉ quên một cái gì đó).
mojzis

Tôi nghĩ đó là câu trả lời giống như dưới đây: kt sẽ yêu cầu hai bộ lọc theo ngữ cảnh (content. Mượt = người dùng đã đăng nhập HOẶC bình luận. Tác giả = người dùng đã đăng nhập).
uwe

Tôi không nghĩ vậy :) Tôi có nghĩa là một quan điểm dựa trên người dùng, tham gia các nút và bình luận. nhưng tôi có cảm giác rằng có một số vấn đề với mối quan hệ giữa người dùng và bình luận - tôi đã không quản lý để hiển thị các bình luận.
mojzis

Tôi chỉ đoán nhưng bạn không thể sử dụng searchapi để lập chỉ mục nhiều loại thực thể cùng một lúc? Khi bạn đã có nó và bạn có một trường được sử dụng bởi cả hai phần, bạn có thể sử dụng nó để tạo ra một khung nhìn như thế.
Daniel Wehner

1
Có một dự án hộp cát 'Lượt xem Liên kết' cho drupal 7, vui lòng kiểm tra drupal.org/sandbox/jalama/1785294 ,
Anoop Joseph

Câu trả lời:


15

Đây là một ví dụ hoạt động và thử nghiệm:

/**
 * 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());

  }
}

Điều này làm việc cho hầu hết các quan điểm. Tuy nhiên, một số plugin kiểu có thể làm những thứ lạ mắt không hoạt động với kỹ thuật này (mô-đun Lịch tôi đang nhìn bạn).



2

Tôi đã kết thúc bằng cách sử dụng db_query () để tạo các UNION SQL và sau đó kết xuất nó thành một bố cục bảng bao gồm các máy nhắn tin sử dụng hàm theme ().

Đối với người dùng, nó trông giống như chế độ xem mặc định. Lợi ích khác là tôi có thể tối ưu hóa truy vấn rất nhiều. Tôi đang hiển thị "hoạt động của bạn tôi" và nếu bạn sử dụng chế độ xem thì nó sẽ tạo danh sách bạn bè của bạn và sử dụng nó trong mệnh đề "IN" SQL rất chậm nếu bạn có hơn 50 hoặc 100 bản ghi.

Tôi có thể thu hẹp danh sách bạn bè đó chỉ còn những người đã đăng nhập vào trang web trong x ngày qua.

Đây là một mẫu mã:

  // 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();

1

Để tham khảo trong tương lai, đây là cách tôi kết hợp hai chế độ xem dựa trên cùng một bảng. Các nguyên tắc tương tự cũng nên được áp dụng cho các khung nhìn dựa trên các bảng khác nhau với cùng một lượng trường.

Trong trường hợp dưới đây, chỉ id được chọn vì định dạng được đặt thành thực thể được hiển thị. Nhưng nếu bạn đang đi với các trường, bạn luôn có thể thêm các trường giả vào truy vấn có ít trường hơn khi tôi thêm dấu thời gian bên dưới.

/**
 * 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()
    );
  };
}

0

Tôi tưởng tượng một cái gì đó dọc theo những dòng này:

/** 
* 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;
  }
}

Mặc dù tôi chưa thử nó.

Một số liên kết có thể giúp:

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

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


1
Điều này dường như không hoạt động đầy đủ. $ view-> truy vấn là đối tượng trung gian mà Views sử dụng để xây dựng truy vấn. Lựa chọn là $ view-> build_info ['truy vấn']. Khi bạn chỉnh sửa tương ứng, tôi không thể vượt qua lỗi "Lỗi nghiêm trọng: Gọi đến phương thức không xác định ChọnQuery :: render_pager ()".
mpdon Arena

1
Mã kiểm tra cơ sở dữ liệu có các ví dụ về công đoàn api.drupal.org/api/drupal/ và và api.drupal.org/api/drupal/ trộm
mikeytown2


Cách duy nhất có thể có thể hoạt động là nếu cả hai chế độ xem gần như giống hệt nhau.
Dalin

0

Tôi đã bắt gặp một mô-đun có tên Chế độ xem trường , cho phép bạn nhúng chế độ xem dưới dạng trường trong chế độ xem khác. Tôi chưa thử cái này bao giờ, nhưng nó có thể hữu ích cho bạn.


2
Mặc dù Chế độ xem trường thực sự có thể nhận được cả nhận xét và nút, tôi không tin có một cách để sắp xếp các trường, chỉ trong chúng.
Letharion

0

Các EntityFieldQuery Xem Backend hỗ trợ truy vấn cho nhiều loại đối tượng cùng một lúc. Vì vậy, nó có thể được sử dụng để truy vấn cho cả các nút và bình luận. Cả hai loại thực thể đều sử dụng một thuộc uidtính để liên kết với tác giả của chúng, do đó, ở cấp độ API EntityFieldQuery :: propertyCondition () có thể được sử dụng để chọn các nút và nhận xét từ một người dùng. Tôi đoán các phụ trợ lượt xem cung cấp tính năng tương tự.


có vẻ như họ vừa xóa tính năng này để truy vấn nhiều thực thể: drupal.org/node/1564740
uwe

0

Một cách tiếp cận khác nhau có thể là tạo nguồn cấp dữ liệu của các nút và nhận xét (với bộ lọc theo ngữ cảnh của mã định danh người dùng trong URL) và sau đó kết hợp hai nguồn cấp dữ liệu vào nguồn cấp dữ liệu mới và hiển thị thông tin này theo ngày đăng.


-2

Toàn cầu được sử dụng : Các lĩnh vực PHP ? Bạn có thể sử dụng chúng để nối băng keo với nhau một Chế độ xem kết hợp cả hai.

Tạo Chế độ xem nội dung với Nội dung: Tiêu đề và Nội dung: Các trường Nhận xét (Không bao gồm hiển thị).

Thêm trường PHP tính toán gần đây hơn, ngày cập nhật lần cuối hoặc ngày nhận xét cuối cùng của người dùng và đặt giá trị của trường thành ngày đó. Thêm trường đó như là một điều kiện sắp xếp.

Thêm một trường tương tự xuất ra một liên kết đến nhận xét hoặc đến nút.

Nghe có vẻ tốt cho tôi!


ý tưởng thú vị. Nó sẽ yêu cầu hai bộ lọc theo ngữ cảnh (content. Mượt = người dùng đã đăng nhập HOẶC bình luận. Tác giả = người dùng đã đăng nhập).
uwe

Hy vọng sẽ có được sự phục hồi tuyệt vời cho cái này ...;)
Johnathan Elmore

2
Hiệu suất đạt được từ phương pháp này sẽ rất đáng sợ. Số lượng truy vấn cơ sở dữ liệu tiềm năng được thực hiện có thể nội trú trên thiên văn học.
Rider_X
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.