Bagaimana cara membuat gabungan dua pandangan?

36

Saya mencoba untuk mendapatkan gabungan dari node dan komentar pengguna yang diurutkan berdasarkan "tanggal posting". Posting ini terhubung ke proyek-proyek kotak pasir untuk D6 tetapi tidak ada untuk 7.

Ini Posting memiliki contoh menggunakan hook_views_pre_execute () dan SQL UNION di D6. Ini tidak berfungsi untuk D7 dengan tampilan 3.

Saya menemukan komentar merlinofchaos

Karena kami sekarang menggunakan generator kueri Drupal yang baru, kueri tersebut adalah objek SelectQuery yang harus Anda modifikasi atau ganti. Cari lapisan database baru Drupal 7 untuk informasi lebih lanjut.

Adakah yang punya contoh bagaimana melakukan ini atau solusi lain untuk menggabungkan dua pandangan?

kamu
sumber
ini lebih merupakan ide daripada jawaban nyata: Anda harus dapat membuat tampilan berdasarkan pengguna, yang akan bergabung dengan node dan komentar (bukankah mereka berdua hanya entitas :)). Pada upaya pertama saya, saya gagal melakukan ini karena pandangan tidak menawarkan hubungan dari pengguna ke coment. Tapi itu harus mudah diubah. (atau saya baru saja melupakan sesuatu).
mojzis
Saya pikir itu adalah jawaban yang sama seperti di bawah ini: kt akan membutuhkan dua filter kontekstual (content.author = pengguna login ATAU comment.author = pengguna login).
uwe
i dont think so :) maksud saya tampilan berdasarkan pengguna, bergabung dengan node dan komentar. tetapi saya merasa bahwa ada beberapa masalah dengan hubungan antara pengguna dan komentar - saya tidak berhasil menampilkan komentar.
mojzis
Saya hanya menebak tetapi tidak dapatkah Anda menggunakan searchapi untuk mengindeks beberapa tipe entitas sekaligus? Setelah Anda memiliki itu dan Anda memiliki bidang yang digunakan oleh kedua bagian Anda dapat menggunakannya untuk membangun tampilan seperti itu.
Daniel Wehner
1
Ada proyek sandbox 'Views Unionize' untuk drupal 7, silakan periksa drupal.org/sandbox/jalama/1785294 ,
Anoop Joseph

Jawaban:

15

Berikut adalah contoh yang berfungsi dan diuji:

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

  }
}

Ini berfungsi untuk sebagian besar tampilan. Namun beberapa plugin gaya dapat melakukan hal-hal mewah yang tidak akan bekerja dengan teknik ini (modul Kalender saya melihat Anda).

Dalin
sumber
2

Saya akhirnya menggunakan db_query () untuk membuat SQL UNIONs dan kemudian merendernya menjadi tata letak tabel termasuk pager menggunakan fungsi theme ().

Bagi pengguna, tampilannya seperti default. Manfaat lainnya adalah saya bisa mengoptimalkan kueri banyak. Saya menunjukkan "kegiatan teman saya" dan jika Anda akan menggunakan tampilan untuk itu akan membuat daftar teman Anda dan menggunakannya dalam klausa SQL "IN" yang sangat lambat jika Anda memiliki lebih dari 50 atau 100 catatan.

Saya dapat mempersempit daftar teman hanya untuk orang-orang yang telah masuk ke situs dalam x hari terakhir.

Ini adalah contoh kode:

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

Untuk referensi di masa mendatang, inilah cara saya menggabungkan dua tampilan berdasarkan tabel yang sama. Prinsip yang sama juga harus diterapkan pada tampilan berdasarkan tabel yang berbeda dengan jumlah bidang yang sama.

Dalam kasus di bawah ini hanya id yang dipilih karena format diatur ke entitas yang diberikan. Tetapi jika Anda pergi dengan bidang, Anda selalu dapat menambahkan bidang dummy tambahan ke kueri yang memiliki lebih sedikit bidang seperti yang saya tambahkan cap waktu di bawah ini.

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

Saya membayangkan sesuatu seperti ini:

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

Meskipun saya belum mengujinya.

Beberapa tautan yang mungkin membantu:

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

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

cam8001
sumber
1
Tampaknya ini tidak berfungsi sepenuhnya. $ view-> query adalah objek perantara yang digunakan Views untuk membangun kueri. SelectQuery adalah $ view-> build_info ['query']. Ketika Anda mengedit sesuai, saya tidak bisa melampaui kesalahan "Kesalahan fatal: Panggilan ke metode tidak ditentukan SelectQuery :: render_pager ()" kesalahan.
mpdonadio
1
Kode tes basis data memiliki contoh serikat api.drupal.org/api/drupal/… dan api.drupal.org/api/drupal/…
mikeytown2
Satu-satunya cara ini mungkin berhasil adalah jika kedua tampilan hampir persis sama.
Dalin
0

Saya menemukan modul yang disebut Tampilan Bidang Tampilan , yang memungkinkan Anda untuk menyematkan tampilan sebagai bidang dalam tampilan lain. Saya sendiri belum mencobanya, tetapi mungkin bisa membantu Anda.

Marijke Luttekes
sumber
2
Sementara Tampilan Bidang Tampilan memang bisa mendapatkan komentar dan simpul, saya tidak percaya ada cara untuk menyortir bidang, hanya di dalamnya.
Letharion
0

The EntityFieldQuery Tampilan Backend dukungan query untuk beberapa jenis entitas pada saat yang sama. Jadi seharusnya bisa digunakan untuk query baik node dan komentar. Kedua tipe entitas menggunakan uidproperti untuk menautkan ke pembuatnya sehingga pada tingkat API EntityFieldQuery :: propertyCondition () harus dapat digunakan untuk memilih node dan komentar dari satu pengguna. Saya kira tampilan backend menyediakan fitur yang sama.

Pierre Buyle
sumber
sepertinya mereka baru saja menghapus fitur untuk menanyakan beberapa entitas: drupal.org/node/1564740
uwe
0

Pendekatan yang berbeda mungkin untuk membuat umpan dari simpul dan komentar (dengan filter kontekstual dari pengidentifikasi pengguna di URL) dan kemudian menggabungkan dua umpan ke dalam umpan baru, dan menampilkannya berdasarkan tanggal posting.

Sam Wilson
sumber
-2

Global Digunakan : PHP bidang ? Anda dapat menggunakannya untuk melakukan lakban bersama dengan Tampilan yang menggabungkan keduanya.

Buat Tampilan konten dengan Konten: Judul dan Konten: Bidang komentar (Tidak termasuk dari tampilan).

Tambahkan bidang PHP yang menghitung mana yang lebih baru, tanggal terakhir diperbarui, atau tanggal komentar terakhir oleh pengguna, dan tetapkan nilai bidang menjadi tanggal itu. Tambahkan bidang itu sebagai kondisi semacam.

Tambahkan bidang serupa yang menghasilkan tautan ke komentar atau ke simpul.

Kedengarannya bagus untuk saya!

Johnathan Elmore
sumber
ide yang menarik. Ini akan membutuhkan dua filter kontekstual (content.author = pengguna yang login ATAU comment.author = pengguna yang login).
uwe
Berharap untuk mendapatkan pemulihan epik yang satu ini ...;)
Johnathan Elmore
2
Kinerja yang dicapai dari pendekatan ini akan menakutkan. Potensi jumlah permintaan basis data yang dilakukan dapat meningkat pada astronomi.
Rider_X