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:
Ekstrak hasil dari setiap pandangan 'tipe konten' sebagai daftar argumen. Selain menampilkan hasil tampilan, saya perlu memuat daftar NID yang sedang ditampilkan.
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.
Jawaban:
Tak jauh dari kepala saya
Dengan tampilan 'get_nids', dan 'get_related', get_related mengambil
nid
argumen, yang disetel untuk menerima beberapa nilai. Opsi ini disembunyikan di bawah "lebih", di bagian bawah jendela konfigurasi.Pilihan 1:
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.
sumber
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 :
Kemudian, jika Anda ingin benar-benar memuat nilai dari bidang dalam node, Anda akan menggunakan
node_load
untuk mengambil lebih banyak info dari node yang Anda inginkan, seperti:Sekarang
$ans_node
adalah array (atau objek, saya lupa) yang berisi semua info di semua bidang dalam node. Voa!sumber
Ok solusi berkode (ada beberapa area) tapi di sini ada satu:
Langkah 2 kode
Haruskah ini menjadi jawaban yang terpisah ?? atau edit ??
sumber