Apakah ada cara untuk mencegat daftar NID yang dibuat oleh tampilan dan menggunakannya sebagai filter untuk tampilan lain?

8

Saya pada titik dalam pengalaman Drupal di mana saya berusaha untuk menyelesaikan tantangan desain situs di tingkat kode khusus menggunakan Drupal dan API Views. Seperti biasa, upaya saya yang tampaknya sederhana untuk memecahkan masalah telah menunjukkan kepada saya betapa saya belum tahu!

Saya memiliki bidang referensi simpul yang menunjuk ke konten 'fakta terkait' yang digunakan oleh banyak jenis konten dan subkategori untuk masing-masing jenis ini. Meskipun saya dapat membuat hubungan dan menampilkan 'fakta terkait' untuk tampilan, ada masalah. Pertama, saya ingin fakta-fakta terkait dimasukkan ke dalam blok terpisah dan untuk menampilkan satu daftar fakta terkait untuk seluruh daftar artikel yang disediakan oleh view. Tampilan tidak menangani duplikat apa pun untuk banyak id dengan referensi 'fakta terkait' yang sama. Selain itu, saya harus membuat tampilan 'fakta terkait' yang terpisah untuk setiap jenis konten dan subkategori yang akan cukup banyak.

Jika saya dapat membuat tampilan fakta terkait yang terpisah yang dapat menerima daftar nids sebagai argumen, tampilan fakta terkait dapat disederhanakan. Jadi pertanyaan saya adalah bagaimana caranya. Meskipun dimungkinkan dari dalam tampilan, saya mencari solusi php modul khusus , jadi saya perlu mencapai yang berikut:

  1. Ekstrak hasil dari setiap pandangan 'tipe konten' sebagai daftar argumen. Selain menampilkan hasil tampilan, saya perlu memuat daftar NID yang sedang ditampilkan.

  2. Panggil tampilan fakta terkait dan berikan daftar nid untuk digunakan sebagai filter atau filter kontekstual dalam tampilan 'fakta terkait'.

Informasi tambahan:

Dengan menggunakan strategi ini, saya mulai dengan mendefinisikan sebuah pandangan dan mencoba mengekstraksi hasil darinya. Upaya ini menyebabkan masalah menemukan hasil di objek tampilan ( lihat pertanyaan ini ). Setelah saya mendapatkan hasil, saya perlu membuat tampilan lain yang hasilnya sebagai filter. Saya telah melihat tampilan diimplementasikan dari kode sebagai termasuk file di mana semua parameter dikodekan, tetapi belum menemukan contoh yang mendefinisikan dan menghasilkan tampilan dan memanipulasi hasil menggunakan fungsi php. Contoh atau tautan apa pun akan dihargai.

Sejauh ini:

Dua jawaban telah membahas proses untuk menerapkan hasil tampilan dan menempatkannya di tampilan lain sebagai filter kontekstual. Tapi saya masih menghadapi masalah memiliki puluhan jenis konten dengan setidaknya selusin variasi panel konten tampilan di masing-masing. Alih-alih secara langsung menautkan setiap tampilan dengan fakta terkait, saya harus meminta semua view1 saya melihat kontennya meneruskan hasilnya ke tampilan tunggal, 'fakta terkait'.

CONTENT TYPE    SUB-CATEGORY       RELATED FACT (nid)
    Type 1 --------- General Info       101, 105 
                     Specifications     103, 105
                     Inspections        102 
                     Quality  
                     etc...   
   Type 2 ----------General Info       101, 106
                    Specifications     102, 103 
                    Cost factors       107
                    etc... 

View1 menemukan jenis konten tertentu dan berisi berbagai artikel subkategori yang diurutkan berdasarkan nilai dalam bidang subkategori. Selain itu berisi bidang referensi simpul untuk fakta terkait. Lihat satu filter untuk jenis konten dan subkategori dan memiliki bidang terbuka untuk tampilan dan bidang terlarang dengan node referensi fakta terkait.

View2 memfilter untuk artikel 'fakta terkait' dan berisi filter kontekstual yang ditetapkan untuk nid (meskipun pengaturan berlaku untuk URL)

Menggunakan kode dalam jawaban Letharion, loop foreach di baris 6 adalah menyusun daftar ID artikel, bukan id fakta terkait (artikel memegang referensi ke fakta terkait, tetapi fakta terkait tidak memiliki simpul referensi ke artikel) . Saya perlu mengekstrak id fakta terkait dari bidang fakta di setiap node. Saya telah memasukkan bidang fakta dalam definisi View1, tetapi tidak dapat menemukan hasilnya sejak perintah dpm ($ node); telah mogok dan saya tidak tahu di mana nilai disimpan dalam array.

Karena akan ada lebih dari satu View1 yang dikloning untuk tipe konten yang berbeda, saya pikir mungkin masuk akal untuk menggunakan hook_views_post_execute dan mengkodekannya sebagai berikut:

function mymodule_views_post_execute (&$sourceview) {

  $nids = '';
  foreach($sourceview->result as $node) {
    $nids += $node->nid . ',';  //I need field name for $node->facts

  }

  $nids = rtrim($nids, ',');
  $view = views_get_view('get_related');

  //dpm($nids);  // Fatal error: Cannot unset string offsets...

  $view->execute_display('panel_pane_1', array($nids));
  }

Akhirnya, saya tidak yakin apakah saya harus mengarahkan tampilan tampilan ke lokasi yang tepat atau apakah ini dilakukan hanya dengan menempatkan panel konten fakta terkait di lokasi panel melalui Panel UI dan membiarkan panel bertema menangani sisanya.

Ashlar
sumber
2
Apakah Drupal 7 ini? Jika demikian saya akan merekomendasikan menggunakan EntityFieldQuery untuk mengambil daftar node yang memenuhi kriteria Anda.
beth
Bisakah Anda menunjukkan beberapa contoh kode tempat API ini digunakan. Saya baru ke dunia Drupal coding dan perlu mengikuti contoh jenis dunia nyata untuk mencari tahu.
Ashlar
drupal.org/node/1343708 adalah halaman yang disebut "Cara menggunakan EntityFieldQueries".
beth

Jawaban:

3

Tak jauh dari kepala saya

Dengan tampilan 'get_nids', dan 'get_related', get_related mengambil nidargumen, yang disetel untuk menerima beberapa nilai. Opsi ini disembunyikan di bawah "lebih", di bagian bawah jendela konfigurasi.

Pilihan 1:

$view = views_get_view('get_nids');
// Repeating query, ensure the View is set to cache the results.
$view->preview('display_machine_name', array($arg1, $arg2));

$nids = '';
foreach($view->result as $node) {
  $nids += $node->nid . ',';
}
$nids = rtrim($nids, ',');
$view = views_get_view('get_related');
$view->execute_display('display_machine_name', array($nids));
print $view->render();

Pilihan 2:

Tambahkan tipe tampilan "konteks" ke get_nids, dan sampaikan konteks itu sebagai argumen ke tampilan panel konten get_related. Sayangnya, saya harus menebak bahwa konteks Views tidak memiliki dukungan untuk mengompresi banyak hasil menjadi satu konteks, sehingga mungkin memerlukan permintaan fitur di Ctools.

Opsi 3:

Beth memiliki saran yang sangat baik dalam komentar, yang menggunakan EntityFieldQuery , karena ketika Anda menginginkan solusi kode murni, itu juga akan bekerja dengan MongoDB . Tampilan meskipun memiliki keuntungan bahwa sebagian besar pekerjaan dapat dilakukan di UI, yang seringkali nyaman.

Pelajaran
sumber
Mengikuti kode di views_db_object untuk -> eksekusi metode (baris Views.inc 1060). Saya tidak melihat apa pun dalam kode metode yang membaca argumen (array ($ nid)). Juga, bagaimana cara mengonfigurasi tampilan 'get_related' untuk menerima nilai filter dalam argumen array ($ nids)? Apakah saya menetapkan filter ke 'konten terkait' dan filter kontekstual untuk menerima NID?
Ashlar
Maaf, Anda benar sekali, yang seharusnya mengeksekusi_display , menambahkan info tentang filter kontekstual untuk dijawab. :)
Letharion
Saya menambahkan lebih banyak info untuk menyelesaikan masalah menampilkan konten untuk fakta terkait dalam pertanyaan. Silakan lihat "Sejauh ini".
Ashlar
Maaf, saya tidak mengerti di mana masalahnya. Menurut posting Anda, bidang referensi simpul dibagi di antara jenis konten Anda, dan dengan demikian tampilan 'get_nids' akan mengumpulkan semua entitas yang dirujuk. Namun jika tidak, orang akan membutuhkan perulangan pada tampilan pertama.
Letharion
1
Hmm! Saya pikir saya bingung dan mungkin membuat ini lebih rumit daripada yang seharusnya. Terima kasih
Ashlar
2

Mencari bidang dalam sebuah simpul dan mengembalikan daftar NID adalah hal yang harus dilakukan oleh EntityFieldQueries . (Lihat juga: pertanyaan saya sendiri tentang topik ).

Sebuah contoh dari kode saya, yang berjalan di atas pengiriman formulir web, dan di mana saya mencari simpul tipe "Kuis Kunci Anzwer" untuk menemukan satu dengan bidang "Referensi Kuis" diisi dengan NID dari formulir web yang saat ini memvalidasi :

    $arg = arg();
    $nid = $arg[1]; //this finds us the NID of the current page
    $query = new EntityFieldQuery;  // this EntityFieldQuery searches through Entities for Nodes that point to the current Webform.
    $result = $query
        ->entityCondition('entity_type', 'node') // find nodes
        ->propertyCondition('status', 1) // that are published
        ->propertyCondition('type', 'quiz_answer_key')  // of type Quiz Answer Key
        ->fieldCondition('field_answer_quiz', 'nid', $nid, '=') // that point to the current node in their Quiz reference field
        ->execute(); // do the query
    $results        = $query->ordered_results; //grab the results

Kemudian, jika Anda ingin benar-benar memuat nilai dari bidang dalam node, Anda akan menggunakan node_loaduntuk mengambil lebih banyak info dari node yang Anda inginkan, seperti:

    $ans_key_id     = $results[0]->entity_id;
    $ans_node       = node_load($ans_key_id);       //once the correct node has been identified, load the contents of that node and suss out the answers 

Sekarang $ans_nodeadalah array (atau objek, saya lupa) yang berisi semua info di semua bidang dalam node. Voa!

beth
sumber
0

Ok solusi berkode (ada beberapa area) tapi di sini ada satu:

  1. Buat tampilan yang mendapatkan semua nid's output nid's ini sebagai daftar yang dibatasi koma, Anda dapat melakukan ini dengan menggunakan bidang sebagai output Anda dan mengatur pengaturan gaya Anda ke Style Unfomatted, bidang gaya baris -> buat bidang nid sebaris dan gunakan koma sebagai pemisah.
  2. Dalam modul Anda buat fungsi yang memanggil tampilan ini dan mendapatkan output
  3. Buat tampilan kedua Anda (atau tampilan) menggunakan fungsi ini sebagai argumen dalam tampilan kedua Anda yang benar-benar menampilkan output, jadi di bawah argumen argumen harus berupa simpul: nid, Tindakan yang harus diambil harus diatur ke "sediakan default" dan Anda kemudian gunakan pengaturan kode PHP untuk memanggil fungsi Anda: return mymodule_get_nids (); pastikan dia mencentang "mengizinkan beberapa istilah per argumen" dicentang

Langkah 2 kode

function mymodule_get_nids() {
    $view = views_get_view('getmynids')) // View name
        $view->set_display('mynids'); // Display name
        $view->execute();
        if ($view->result) {
         return $view->preview(); // Can't remember if this needs to be echo or return try both.
        }
    }
}

Haruskah ini menjadi jawaban yang terpisah ?? atau edit ??

Andre
sumber
Saya mencari solusi kode. Saya akan mengklarifikasi pertanyaannya.
Ashlar
Harap perbaiki saya jika saya salah, tetapi sejauh yang saya tahu, ini bahkan tidak akan menyelesaikan masalah, karena Ashlar mencari untuk menarik data dari beberapa hubungan pada saat yang sama, sementara lampiran hanya akan "saat ini" satu? (Sudah lama sejak saya menggunakan lampiran, jadi saya bisa salah)
Letharion
Terima kasih atas usaha anda Saya menambahkan lebih banyak info untuk menyelesaikan masalah menampilkan konten untuk fakta terkait dalam pertanyaan. Silakan lihat "Sejauh ini".
Ashlar