Pandangan berada di teras Drupal 8. Kita semua tahu bahawa sekarang. Twig adalah enjin templat baru di Drupal 8. Ini juga kita tahu. Tetapi adakah kita tahu bagaimana untuk berinteraksi secara programatik dengan yang pertama untuk tema pandangan menggunakan yang kedua? Selain daripada templat paparan utama seperti mana -mana subsistem lain, kami mempunyai alternatif yang lebih kuat dalam bentuk plugin pandangan (paparan, gaya, baris dan medan).
Dalam artikel ini, kita akan melihat bagaimana kita boleh membuat plugin gaya tersuai untuk pandangan di Drupal 8. Kami akan menggunakan markup tab bootstrap sebagai matlamat dan melaksanakan output tab untuk hasil pandangan kami. Dalam konfigurasi paparan, tetapan gaya akan membolehkan kami menentukan medan mana yang akan digunakan sebagai salinan navigasi tab, meninggalkan seluruh medan yang ditunjukkan dalam tab tab masing -masing. Pada asasnya, setiap hasil pandangan akan mewakili tab - jadi contoh ini tidak sesuai untuk pandangan yang mempunyai lebih daripada beberapa hasil. Matlamat utama adalah untuk menggambarkan bagaimana kita boleh membuat plugin gaya pandangan kita sendiri di Drupal 8.
kami tidak akan menutup butiran mengenai bagaimana anda boleh menggunakan bootstrap dalam projek anda. Walau bagaimanapun, anda boleh menyemak halaman dokumentasi mengenai aset atau artikel ini tentang cara memastikan pengguna tanpa nama dapat mendapat manfaat daripada jQuery yang dimuatkan pada halaman. Dan jika anda ingin melihat kod yang kami tulis terlebih dahulu, anda boleh menemuinya dalam repositori ini dalam modul demo.
Plugin Gaya Pandangan adalah yang bertanggungjawab untuk memberikan penyenaraian . Contoh -contoh penting plugin gaya teras adalah Senarai Unformatted , Senarai HTML , Table atau grid . Mereka digunakan oleh plugin paparan dan mereka seterusnya menggunakan plugin baris yang mewakili satu item dalam penyenaraian.
Di Drupal 8, semua jenis plugin paparan dibina menggunakan sistem plugin baru dan berkongsi beberapa fungsi biasa (mereka sentiasa meluas dari pluginbase pandangan yang sama).
Mari kita buat plugin gaya kita sendiri yang boleh digunakan oleh kebanyakan jenis paparan (halaman, blok, dll) dan yang menggunakan plugin baris medan.
Langkah pertama adalah untuk membuat kelas plugin kami yang terletak di folder plugin/paparan/gaya modul kami:
<span>namespace Drupal<span>\demo\Plugin\views\style</span>; </span><span>use Drupal<span>\Core\Form\FormStateInterface</span>; </span><span>use Drupal<span>\views\Plugin\views\style\StylePluginBase</span>; </span> <span>/** </span><span> * A Views style that renders markup for Bootstrap tabs. </span><span> * </span><span> * <span>@ingroup views_style_plugins </span></span><span> * </span><span> * @ViewsStyle( </span><span> * id = "bootstrap_tabs", </span><span> * title = @Translation("Bootstrap Tabs"), </span><span> * help = @Translation("Uses the Bootstrap Tabs component."), </span><span> * theme = "demo_bootstrap_tabs", </span><span> * display_types = <span>{"normal"} </span></span><span> * ) </span><span> */ </span><span>class BootstrapTabs extends StylePluginBase { </span> <span>/** </span><span> * Does this Style plugin allow Row plugins? </span><span> * </span><span> * <span>@var <span>bool</span> </span></span><span> */ </span> <span>protected $usesRowPlugin = TRUE; </span> <span>/** </span><span> * Does the Style plugin support grouping of rows? </span><span> * </span><span> * <span>@var <span>bool</span> </span></span><span> */ </span> <span>protected $usesGrouping = FALSE; </span> <span>/** </span><span> * <span>{@inheritdoc} </span></span><span> */ </span> <span>protected function defineOptions() { </span> <span>$options = <span>parent::</span>defineOptions(); </span> <span>$options['tab_nav_field'] = array('default' => ''); </span> <span>return $options; </span> <span>} </span> <span>/** </span><span> * <span>{@inheritdoc} </span></span><span> */ </span> <span>public function buildOptionsForm(&$form, FormStateInterface $form_state) { </span> <span><span>parent::</span>buildOptionsForm($form, $form_state); </span> <span>$options = $this->displayHandler->getFieldLabels(TRUE); </span> <span>$form['tab_nav_field'] = array( </span> <span>'#title' => $this->t('The tab navigation field'), </span> <span>'#description' => $this->t('Select the field that will be used as the tab navigation. The rest of the fields will show up in the tab content.'), </span> <span>'#type' => 'select', </span> <span>'#default_value' => $this->options['tab_nav_field'], </span> <span>'#options' => $options, </span> <span>); </span> <span>} </span><span>} </span>
Jenis Plugin Drupal Kami mencipta contoh IS Viewsstyle dengan beberapa konfigurasi asas yang diluluskan dalam anotasi. Meninggalkan yang jelas, kami mempunyai kekunci Tema dan Display_Types yang patut disebut. Yang pertama mengisytiharkan fungsi tema mana plugin gaya ini akan digunakan untuk menjadikan datanya sementara yang kedua mengisytiharkan jenis plugin paparan yang boleh digunakan oleh (dalam kes kami semua jenis paparan yang tidak menentukan jenis tersuai: normal). Untuk maklumat lanjut mengenai semua konfigurasi anotasi yang tersedia untuk jenis plugin ini, lihat kelas anotasi DrupalViewSanNotationViewSstyle.
Menggunakan dua sifat kelas, kami mengisytiharkan bahawa gaya kami menggunakan plugin baris tetapi tidak membenarkan kumpulan. Pastikan anda menyemak kelas induk untuk mengetahui lebih lanjut mengenai pilihan lain yang boleh ditentukan seperti ini. Sebagai contoh, kelas yang kami luangkan sudah mengisytiharkan bahawa medan pandangan boleh digunakan dengan plugin gaya.
Seperti yang dinyatakan sebelum ini, menggunakan kedua -dua kaedah kami membuat pilihan plugin dan membentuk elemen untuk dapat menentukan medan mana yang harus bertindak sebagai navigasi tab. Menggunakan pengendali paparan semasa ($ this-> displayHandler) kami boleh memuatkan semua medan paparan yang tersedia yang telah ditambah oleh pembina tapak. Dan elemen bentuk baru ini akan tersedia pada bentuk tetapan gaya:
Tema
<span>namespace Drupal<span>\demo\Plugin\views\style</span>; </span><span>use Drupal<span>\Core\Form\FormStateInterface</span>; </span><span>use Drupal<span>\views\Plugin\views\style\StylePluginBase</span>; </span> <span>/** </span><span> * A Views style that renders markup for Bootstrap tabs. </span><span> * </span><span> * <span>@ingroup views_style_plugins </span></span><span> * </span><span> * @ViewsStyle( </span><span> * id = "bootstrap_tabs", </span><span> * title = @Translation("Bootstrap Tabs"), </span><span> * help = @Translation("Uses the Bootstrap Tabs component."), </span><span> * theme = "demo_bootstrap_tabs", </span><span> * display_types = <span>{"normal"} </span></span><span> * ) </span><span> */ </span><span>class BootstrapTabs extends StylePluginBase { </span> <span>/** </span><span> * Does this Style plugin allow Row plugins? </span><span> * </span><span> * <span>@var <span>bool</span> </span></span><span> */ </span> <span>protected $usesRowPlugin = TRUE; </span> <span>/** </span><span> * Does the Style plugin support grouping of rows? </span><span> * </span><span> * <span>@var <span>bool</span> </span></span><span> */ </span> <span>protected $usesGrouping = FALSE; </span> <span>/** </span><span> * <span>{@inheritdoc} </span></span><span> */ </span> <span>protected function defineOptions() { </span> <span>$options = <span>parent::</span>defineOptions(); </span> <span>$options['tab_nav_field'] = array('default' => ''); </span> <span>return $options; </span> <span>} </span> <span>/** </span><span> * <span>{@inheritdoc} </span></span><span> */ </span> <span>public function buildOptionsForm(&$form, FormStateInterface $form_state) { </span> <span><span>parent::</span>buildOptionsForm($form, $form_state); </span> <span>$options = $this->displayHandler->getFieldLabels(TRUE); </span> <span>$form['tab_nav_field'] = array( </span> <span>'#title' => $this->t('The tab navigation field'), </span> <span>'#description' => $this->t('Select the field that will be used as the tab navigation. The rest of the fields will show up in the tab content.'), </span> <span>'#type' => 'select', </span> <span>'#default_value' => $this->options['tab_nav_field'], </span> <span>'#options' => $options, </span> <span>); </span> <span>} </span><span>} </span>
<span>/** </span><span> * Implements hook_theme(). </span><span> */ </span><span>function demo_theme($existing, $type, $theme, $path) { </span> <span>return array( </span> <span>'demo_bootstrap_tabs' => array( </span> <span>'variables' => array('view' => NULL, 'rows' => NULL), </span> <span>'path' => drupal_get_path('module', 'demo') . '/templates', </span> <span>), </span> <span>); </span><span>} </span>
Templat
<span>/** </span><span> * Prepares variables for views demo_bootstrap_tabs template. </span><span> * </span><span> * Template: demo-bootstrap-tabs.html.twig. </span><span> * </span><span> * <span>@param <span>array</span> $variables </span></span><span> * An associative array containing: </span><span> * - view: The view object. </span><span> * - rows: An array of row items. Each row is an array of content. </span><span> */ </span><span>function template_preprocess_demo_bootstrap_tabs(&$variables) { </span> <span>$view = $variables['view']; </span> <span>$rows = $variables['rows']; </span> <span>$variables['nav'] = array(); </span> <span>// Prepare the tab navigation. </span> <span>$field = $view->style_plugin->options['tab_nav_field']; </span> <span>if (!$field || !isset($view->field[$field])) { </span> <span>template_preprocess_views_view_unformatted($variables); </span> <span>return; </span> <span>} </span> <span>$nav = array(); </span> <span>foreach ($rows as $id => $row) { </span> <span>$nav[$id] = array( </span> <span>'#theme' => 'views_view_field', </span> <span>'#view' => $view, </span> <span>'#field' => $view->field[$field], </span> <span>'#row' => $row['#row'], </span> <span>); </span> <span>} </span> <span>template_preprocess_views_view_unformatted($variables); </span> <span>$variables['nav'] = $nav; </span><span>} </span>
Perkara pertama yang kami berikan ialah item navigasi tab (dari pembolehubah NAV kami). Semasa melengkapkan melalui array ini, kami juga menggunakan nilai indeks gelung untuk memungkiri item pertama yang aktif dan dapat menargetkan kandungan kandungan tab di bawah menggunakan ID yang unik. Untuk nilai sebenar item, kami hanya mencetak array render yang kami buat dalam preprocessor kami dan Drupal menjaga rendering itu. Bahawa dikatakan, mungkin idea yang baik untuk memastikan bidang yang anda gunakan di sini agak pendek, tanpa pautan dan markup biasa. Tajuk mungkin akan berfungsi dengan baik. Tetapi ini adalah masalah mengkonfigurasi pandangan dengan sewajarnya.
Di bawah navigasi, kami mencetak baris paparan sebenar, menggunakan indeks gelung yang sama untuk memungkiri baris pertama sebagai anak tetingkap tab aktif dan mengenal pasti mereka secara unik supaya navigasi di atas dapat mengawal penglihatan mereka. Bagi kandungannya, kami mencetak seluruh baris. Pembolehubah Konten (yang disediakan di dalam template_process_views_view_unformatted) dan yang mengandungi semua medan dalam pandangan kami. Dan jika kita mahu tidak memasukkan medan yang kita gunakan untuk navigasi, kita hanya boleh mengecualikan satu dari paparan dalam konfigurasi paparan. Ia masih akan muncul dalam navigasi (kerana kita secara jelas mencetaknya di sana) tetapi tidak di anak tetingkap utama.
dan di sana kita memilikinya. Plugin gaya pandangan untuk mengeluarkan hasil paparan sebagai tab bootstrap. Apa yang kita perlukan sekarang ialah memastikan aset bootstrap dimuatkan dan hanya mengkonfigurasi pandangan kami untuk menggunakan plugin gaya baru. Perlu diingat bahawa ini tidak dimaksudkan untuk pandangan dengan banyak hasil dan ia hanya berfungsi sebagai contoh untuk menunjukkan cara membuat plugin gaya.
Jika anda mempunyai soalan, komen, atau cadangan, sila tinggalkannya di bawah!
Membuat plugin gaya tersuai di Drupal 8 melibatkan beberapa langkah. Pertama, anda perlu membuat modul baru jika anda tidak mempunyai satu. Kemudian, dalam direktori Src/Plugin/Views/Style modul anda, buat fail PHP untuk plugin gaya tersuai anda. Fail ini harus mengandungi kelas yang memanjangkan kelas StylePluginbase dan termasuk anotasi @ViewSstyle. Anotasi mentakrifkan ID, tajuk, dan teks bantuan untuk plugin anda. Setelah menentukan kaedah yang diperlukan dalam kelas anda, anda boleh mengaktifkan plugin gaya baru anda melalui antara muka admin drupal.
Bagaimana saya boleh menambah pembolehubah ke templat paparan di Drupal 8? Selesai melalui fungsi pra -proses dalam fail .theme tema anda. Fungsi ini harus mengikuti corak tema_name_process_views_view__view_name__display_id, dan ia harus mengambil hujah tunggal, yang merupakan pelbagai pembolehubah. Anda boleh menambah pembolehubah baru ke array ini, dan mereka akan tersedia dalam templat ranting anda. Membuat plugin gaya tersuai di Drupal 8, anda boleh menggunakannya dengan pandangan melalui antara muka Admin Drupal. Edit paparan dan pergi ke bahagian format. Klik pada tetapan format dan pilih plugin gaya tersuai anda dari senarai. Setelah menyimpan pandangan, ia akan diberikan menggunakan plugin gaya tersuai anda.
Logik bersyarat dalam template Views di Drupal 8 boleh dilaksanakan menggunakan penyataan Twig IF. Dalam kod ranting anda, anda boleh menggunakan kata kunci jika untuk menguji keadaan, dan kemudian sertakan markup atau kod yang berbeza bergantung kepada sama ada keadaan itu benar atau palsu. 8?
Mewujudkan pandangan responsif dalam Drupal 8 melibatkan menggunakan teknik reka bentuk responsif dalam templat pandangan anda. Ini termasuk menggunakan pertanyaan media CSS untuk menyesuaikan susun atur dan penampilan pandangan pada saiz skrin yang berbeza, dan menggunakan unit fleksibel seperti peratusan untuk lebar dan ketinggian dan bukannya unit tetap seperti piksel.
Atas ialah kandungan terperinci Pandangan Theming di Drupal 8 - Plugin Gaya Custom. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!