Rumah >pembangunan bahagian belakang >tutorial php >Tutorial Menggunakan Derivatif Plugin Drupal 8 dengan berkesan

Tutorial Menggunakan Derivatif Plugin Drupal 8 dengan berkesan

Christopher Nolan
Christopher Nolanasal
2025-02-16 11:26:121001semak imbas

Tutorial Menggunakan Derivatif Plugin Drupal 8 dengan berkesan

Takeaways Key

contoh

fungsi tersebut untuk diisytiharkan secara manual melalui kelas plugin baru dan bentuk yang berkaitan.

Tetapi bagaimana jika kita memerlukan contoh Tutorial Menggunakan Derivatif Plugin Drupal 8 dengan berkesan

yang diisytiharkan secara dinamik bergantung kepada beberapa faktor yang luaran kepada subsistem kecil kita? Sebagai contoh, apabila mengisytiharkan cangkuk _info di Drupal 7, kita boleh mendapatkan senarai

sesuatu , gelung di atasnya dan mengisytiharkan item baru dalam array yang dikembalikan untuk setiap individu sesuatu . Sistem menu melakukan ini untuk menyediakan blok baru untuk setiap menu yang sama ada dengan Drupal Core atau kemudiannya dibuat melalui UI. Jadi bagaimana dengan Drupal 8? Kami telah melihat bahawa untuk setiap plugin jenis tertentu kita perlu mengisytiharkan kelas PHP yang berbeza. Untuk membuat blok baru, kami memerlukan kelas baru. Untuk membuat blok lain, kami memerlukan kelas lain. Jadi di manakah looping

kita lihat di Drupal 7 berlaku? Jawapan ringkas untuk ini adalah: dalam derivatif plugin

. Dalam artikel ini kita akan meneroka jawapan yang panjang untuk itu dan belajar apa yang terbitan dan bagaimana kita boleh menggunakannya. Bagi yang terakhir, kami akan membina contoh di dalam modul demo yang boleh didapati di repositori git ini dan yang semestinya akan membantu kami memahami dengan lebih baik apa yang sedang berlaku. Untuk contoh yang lebih kompleks, sistem menu sangat bagus kerana ia menyediakan blok individu untuk setiap menunya (sama dengan Drupal 7 tetapi menggunakan plugin).

Apa yang akan kita lakukan sebenarnya sangat mudah. Kami akan melaksanakan fungsi blok nod asas yang mana untuk semua nod artikel di laman web kami kami akan mempunyai blok. Tidak masuk akal? Pasti. Sekiranya kita melakukan ini untuk semua nod di laman web kita? Pasti tidak! Tetapi ia adalah pelaksanaan yang sangat asas yang dimaksudkan untuk menjaga perkara yang pendek dan menunjukkan penggunaan derivatif plugin.

derivatif plugin

derivatif plugin adalah cara di mana plugin jenis tertentu boleh diwakili dalam sistem sebagai pelbagai contohnya sendiri. Dalam erti kata lain, plugin boleh merujuk kelas deriver yang bertanggungjawab untuk menyediakan senarai definisi plugin yang berdasarkan plugin awal (bermula dari definisi asas yang sama) tetapi mempunyai data konfigurasi atau definisi yang sedikit berbeza. SistemMenublock yang kami sebut di atas adalah contoh yang hebat. Ia adalah satu plugin yang mempunyai banyak derivatif kerana terdapat menu di laman web ini.

Untuk pergi sedikit lebih mendalam, apabila senarai semua plugin jenis tertentu diminta, pengurus plugin menggunakan mekanisme penemuannya untuk memuat semua plugin jenis ini. Jika mekanisme itu dihiasi dengan derivativediscoverydecorator, pengurus akan dapat mengambil derivatif. Untuk melakukan ini, penemuan derivatif mencari kelas deriver pada setiap plugin dan, jika ia mendapati satu, meminta untuk senarai ini.

Pengurus jenis plugin yang memperluaskan kelas asas DefaultPluginManager biasanya mempunyai mekanisme penemuan derivatif yang menghiasi penemuan lalai (anotasi). Ini adalah corak yang paling biasa dalam sistem plugin teras Drupal: penemuan anotasi yang dibungkus oleh derivatif.

kelas derivatif

Sekarang kita tahu apa peranan derivatif plugin, mari kita buat kelas deriver pertama kita yang akan digunakan oleh plugin blok kami (yang akan kita buat dalam satu minit).

di dalam src/plugin/derivative/nodeblock.php modul demo Kami mempunyai yang berikut:

<?php

/**
 * @file
 * Contains \Drupal\demo\Plugin\Derivative\NodeBlock.
 */

namespace Drupal\demo\Plugin\Derivative;

use Drupal\Component\Plugin\Derivative\DeriverBase;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Provides block plugin definitions for nodes.
 *
 * @see \Drupal\demo\Plugin\Block\NodeBlock
 */
class NodeBlock extends DeriverBase implements ContainerDeriverInterface {

  /**
   * The node storage.
   *
   * @var \Drupal\Core\Entity\EntityStorageInterface
   */
  protected $nodeStorage;

  /**
   * Constructs new NodeBlock.
   *
   * @param \Drupal\Core\Entity\EntityStorageInterface $node_storage
   *   The node storage.
   */
  public function __construct(EntityStorageInterface $node_storage) {
    $this->nodeStorage = $node_storage;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, $base_plugin_id) {
    return new static(
      $container->get('entity.manager')->getStorage('node')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function getDerivativeDefinitions($base_plugin_definition) {
    $nodes = $this->nodeStorage->loadByProperties(['type' => 'article']);
    foreach ($nodes as $node) {
      $this->derivatives[$node->id()] = $base_plugin_definition;
      $this->derivatives[$node->id()]['admin_label'] = t('Node block: ') . $node->label();
    }
    return $this->derivatives;
  }
}
Semua kelas kami perlu dilaksanakan adalah DeriverInterface dan melaksanakan dua kaedahnya. Kami menggunakan ContainerDeriverInterface sebaliknya kerana kami mahu membuat Container Deriver kami sedar. Kenapa? Kerana kita menggunakan suntikan ketergantungan untuk memuatkan pengurus entiti Drupal supaya kita dapat mengakses penyimpanan nod (ini adalah pembina dan kaedah membuat ()). Di samping itu, kelas Deriver kami meluas dari kelas Deriverbase kerana sudah menjaga salah satu kaedah yang diperlukan (getDerivativedefinition ()).

Akhirnya, GetDerivatived Definitions () adalah kaedah yang bertanggungjawab untuk menyediakan pelbagai definisi plugin yang berasal dari plugin yang menggunakan kelas ini. Ia menerima $ base_plugin_definition sebagai hujah (definisi plugin sebenar yang menggunakan deriver ini) dan kami menggunakannya untuk membina definisi derivatif kami. Dalam kes kami, kami secara tidak sengaja memuat semua nod artikel dan, bagi setiap daripada mereka, membuat definisi berasingan yang berbeza hanya dengan mempunyai admin_label yang berbeza (ini adalah harta di kelas anotasi drupalcoreblockannotationblock). Pelbagai derivatif dikemukakan oleh ID derivatif (dalam kes kami ID nod yang akan kami gunakan kemudian).

Titik yang sangat penting yang perlu kita buat di sini ialah memuatkan semua nod dan membuat plugin dari mereka tidak pernah menjadi idea yang baik. Apa yang mungkin menarik adalah untuk melaksanakan fungsi yang mana nod individu boleh didedahkan sebagai blok melalui kotak semak atau sesuatu seperti itu.

plugin blok

Sekarang kita mempunyai kelas deriver kita, mari kita buat plugin blok mudah yang menggunakannya untuk menghasilkan beberapa contohnya sendiri (satu untuk setiap nod artikel).

di dalam src/plugin/block/nodeblock.php:

<?php

/**
 * @file
 * Contains \Drupal\demo\Plugin\Derivative\NodeBlock.
 */

namespace Drupal\demo\Plugin\Derivative;

use Drupal\Component\Plugin\Derivative\DeriverBase;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Provides block plugin definitions for nodes.
 *
 * @see \Drupal\demo\Plugin\Block\NodeBlock
 */
class NodeBlock extends DeriverBase implements ContainerDeriverInterface {

  /**
   * The node storage.
   *
   * @var \Drupal\Core\Entity\EntityStorageInterface
   */
  protected $nodeStorage;

  /**
   * Constructs new NodeBlock.
   *
   * @param \Drupal\Core\Entity\EntityStorageInterface $node_storage
   *   The node storage.
   */
  public function __construct(EntityStorageInterface $node_storage) {
    $this->nodeStorage = $node_storage;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, $base_plugin_id) {
    return new static(
      $container->get('entity.manager')->getStorage('node')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function getDerivativeDefinitions($base_plugin_definition) {
    $nodes = $this->nodeStorage->loadByProperties(['type' => 'article']);
    foreach ($nodes as $node) {
      $this->derivatives[$node->id()] = $base_plugin_definition;
      $this->derivatives[$node->id()]['admin_label'] = t('Node block: ') . $node->label();
    }
    return $this->derivatives;
  }
}

Perkara pertama yang kita perhatikan dalam anotasi plugin ini adalah kunci deriver yang menunjuk ke kelas yang kami buat sebelum ini. Dan itu pada dasarnya semua yang kita perlukan untuk pasangan kedua. Penghias penemuan derivatif mengendalikan pengangkat berat.

Kebanyakan selebihnya adalah bangunan blok asas yang harus kita kenal. Apa yang menarik ialah kita boleh menggunakan kaedah getDerivativativeId () untuk mengambil ID nod yang kita gunakan juga sebagai ID derivatif yang dipaparkan dan, dengan menggunakannya, kita memuatkan objek nod dan membina blok sebagai output nod sebenar. Akhir sekali, di dalam kaedah blockAccess () kami memastikan bahawa blok ini mempunyai pemeriksaan akses yang sama seperti nod sebenar itu sendiri. Jadi jika pengguna semasa tidak mempunyai akses untuk melihat nod semasa, blok tidak akan muncul.

Sekarang jika kita membersihkan cache dan menavigasi ke antara muka susun atur blok kita harus melihat beberapa blok yang dipanggil blok nod: [tajuk nod]. Anda boleh meletakkan ini di mana anda mahu dan mereka akan menjadikan nod yang berkaitan.

Kesimpulan

Dalam artikel ini, kami telah melihat derivatif plugin dan melihat contoh mudah bagaimana mereka bekerja. Kunci mengambil topik ini ialah derivatif plugin adalah cara kami secara dinamik mengisytiharkan pelbagai contoh plugin yang sama. Mereka biasanya membantu kami mengubah fungsi yang dikonfigurasikan pengguna (mis. Menu) ke dalam plugin (mis. Blok menu).

Untuk menggambarkan penggunaan derivatif, kita telah melihat teknik yang sangat mudah yang membolehkan kita menjadikan nod artikel sebagai blok. Kita harus ingat walaupun tidak mencuba ini di laman web dengan banyak nod artikel tetapi melaksanakan fungsi tambahan yang membatasi bilangan nod yang terdedah. Anda tahu, jadi kami tidak merosakkan laman web kami.

soalan? Komen? Apa -apa sahaja yang anda ingin jelaskan lagi? Marilah kita tahu!

Soalan Lazim (Soalan Lazim) Mengenai Menggunakan Derivatif Plugin Drupal 8 Berkesan

Apakah derivatif plugin Drupal 8 dan mengapa mereka penting? Ini amat berguna apabila anda mempunyai sebilangan besar tugas yang sama untuk dilaksanakan, tetapi setiap tugas memerlukan konfigurasi yang sedikit berbeza. Dengan menggunakan derivatif plugin, anda boleh membuat plugin asas tunggal dan kemudian menghasilkan seberapa banyak variasi plugin yang anda perlukan, masing -masing dengan konfigurasi uniknya sendiri. Ini dapat memudahkan kod anda dan menjadikan laman web Drupal 8 anda lebih cekap dan mudah dikendalikan. . Pertama, anda perlu membuat plugin asas yang mentakrifkan fungsi asas yang semua derivatif akan dikongsi. Seterusnya, anda perlu membuat kelas derivatif plugin yang memanjangkan plugin asas dan melaksanakan derivativeInterface. Kelas ini bertanggungjawab untuk menjana derivatif individu. Akhirnya, anda perlu mendaftarkan derivatif plugin anda dengan pengurus plugin Drupal supaya dapat ditemui dan digunakan. Derivatif boleh digunakan dengan modul tersuai. Malah, mereka amat berguna dalam konteks ini, kerana ia membolehkan anda membuat modul asas tunggal dan kemudian menghasilkan pelbagai variasi modul itu, masing -masing dengan konfigurasi uniknya sendiri. Ini dapat memudahkan proses pembangunan dan menjadikan modul tersuai anda lebih efisien dan lebih mudah untuk dikendalikan. dan boleh digunakan dalam pelbagai senario. Beberapa kes penggunaan biasa termasuk membuat pelbagai contoh plugin blok, masing -masing dengan konfigurasi yang berbeza; Menjana pautan menu berganda dari plugin asas tunggal; dan mewujudkan pelbagai variasi modul tersuai, masing -masing disesuaikan dengan tugas atau keperluan tertentu. Trek plugin asas dan semua derivatifnya, memastikan bahawa mereka semua terkini dan berfungsi dengan betul. Ini boleh dilakukan melalui pengurus plugin Drupal, yang menyediakan antara muka berpusat untuk menguruskan semua plugin anda. Di samping itu, penting untuk mengkaji semula dan mengemas kini derivatif plugin anda untuk memastikan mereka terus memenuhi keperluan anda dan keperluan pengguna laman web anda.

Adakah terdapat sebarang batasan atau cabaran dengan menggunakan derivatif plugin Drupal 8? Salah satu cabaran utama ialah mereka boleh menjadi kompleks untuk menubuhkan dan mengurus, terutamanya bagi pemaju yang baru untuk Drupal atau tidak biasa dengan sistem pluginnya. Di samping itu, kerana setiap derivatif adalah variasi plugin asas tunggal, perubahan kepada plugin asas berpotensi memberi kesan kepada semua derivatifnya, jadi pengurusan dan ujian yang berhati-hati diperlukan. Plugin parti?

Ya, derivatif plugin Drupal 8 boleh digunakan dengan plugin pihak ketiga. Walau bagaimanapun, penting untuk diperhatikan bahawa tidak semua plugin pihak ketiga direka untuk menyokong derivatif, jadi anda mungkin perlu melakukan kerja tambahan untuk menjadikannya serasi. Sentiasa periksa dokumentasi untuk plugin khusus yang anda gunakan untuk melihat apakah ia menyokong derivatif dan bagaimana melaksanakannya. Boleh meningkatkan prestasi tapak dengan mengurangkan jumlah kod yang perlu dilaksanakan untuk setiap tugas. Dengan mencipta plugin asas tunggal dan kemudian menghasilkan pelbagai derivatif, anda boleh mengelakkan menulis dan melaksanakan kod berasingan untuk setiap tugas. Ini boleh menyebabkan peningkatan prestasi yang ketara, terutamanya untuk laman web dengan sebilangan besar tugas yang sama. boleh mencabar kerana sifat dinamik mereka. Walau bagaimanapun, Drupal menyediakan beberapa alat dan teknik untuk membantu dengan ini. Salah satu yang paling berguna ialah modul Devel, yang menyediakan pelbagai alat debugging dan pembangunan. Di samping itu, ciri -ciri pembalakan dan pelaporan ralat Drupal dapat memberikan maklumat yang berharga mengenai sebarang isu yang timbul. Untuk mengetahui lebih lanjut mengenai derivatif plugin Drupal 8. Dokumentasi Drupal rasmi adalah tempat yang bagus untuk bermula, kerana ia memberikan maklumat yang komprehensif mengenai semua aspek pembangunan Drupal, termasuk derivatif plugin. Di samping itu, terdapat banyak tutorial, catatan blog, dan perbincangan forum yang tersedia yang meliputi topik ini secara mendalam.

Atas ialah kandungan terperinci Tutorial Menggunakan Derivatif Plugin Drupal 8 dengan berkesan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn