Rumah >pembangunan bahagian belakang >tutorial php >Membina Modul Drupal 8: Blok dan Borang

Membina Modul Drupal 8: Blok dan Borang

Jennifer Aniston
Jennifer Anistonasal
2025-02-21 08:45:09550semak imbas

Building a Drupal 8 Module: Blocks and Forms

mata teras

    Drupal 8 memperkenalkan konsep baru blok sebagai plugin, membolehkan mereka digunakan semula di seluruh laman web. Blok boleh dibuat dalam UI dan digunakan beberapa kali.
  • Dalam Drupal 8, anda boleh membuat blok tersuai yang mengembalikan teks yang boleh dikonfigurasikan. Ini boleh dilakukan dengan membuat jenis blok baru dalam UI dan menggunakannya di seluruh laman web.
  • Drupal 8 membolehkan menambah borang konfigurasi ke blok. Ini membolehkan pengguna mengedit blok, menentukan nama dalam medan teks, dan blok itu akan memaparkan ucapan kepada nama itu.
  • pembangunan modul Drupal 8 melibatkan mewujudkan bentuk yang mudah. Fungsi definisi bentuk dikumpulkan bersama dalam kelas. Nilai borang yang dikemukakan hanya dicetak pada skrin untuk menunjukkan bagaimana ia berfungsi.
  • Dalam Drupal 8, anda boleh membuat borang tersuai dengan menentukan kelas borang dalam modul tersuai. Kelas borang harus melanjutkan kelas "formbase" dan melaksanakan tiga kaedah: "getFormId ()," membina () ", dan" submitform () ".

Perhatikan bahawa sesetengah bahagian kod mungkin ketinggalan zaman kerana proses pembangunan berterusan Drupal 8 pada masa penulisan. Sila lihat repositori ini, saya cuba mengemas kini kod sampel dan menjadikannya berfungsi dengan versi Drupal 8 terkini.

Di bahagian pertama siri ini, kita mulakan dengan asas -asas dan mempelajari pembangunan modul Drupal 8. Kami telah belajar bagaimana Drupal memahami fail yang diperlukan oleh modul kami, bagaimana proses penghalaan berfungsi, dan bagaimana untuk membuat pautan menu secara programatik dalam cara konfigurasi.

Dalam tutorial ini, kami akan melihat lagi modul kotak pasir yang terdapat di repositori ini dan melihat dua ciri penting: blok dan bentuk. Untuk melakukan ini, kami akan membuat blok tersuai yang mengembalikan beberapa teks yang boleh dikonfigurasikan. Selepas itu, kami akan membuat borang mudah untuk mencetak nilai yang dikemukakan pengguna ke skrin.

Drupal 8 blok

Perubahan baru yang sejuk ke API Blok dalam D8 adalah untuk membuat blok lebih menonjol dengan menjadikannya sebagai plugin (konsep baru). Ini bermakna mereka adalah ciri -ciri yang boleh diguna semula (di latar belakang), kerana anda kini boleh membuat blok dalam UI dan menggunakannya semula di seluruh laman web - anda tidak lagi terhad kepada menggunakan blok sekali sahaja.

Mari buat jenis blok mudah yang akan dicetak ke skrin secara lalai

Hello World! . Kami hanya perlu menggunakan fail kelas dalam folder Src/Plugin/Block yang terletak di akar modul. Mari namakan Demoblock Jenis Blok baru kami, sudah tentu ia perlu berada dalam fail bernama Demoblock.php. Dalam fail ini kita boleh mulakan dengan yang berikut:

<code class="language-php"><?php
namespace Drupal\demo\Plugin\Block;

use Drupal\block\BlockBase;
use Drupal\Core\Session\AccountInterface;

/**
 * Provides a 'Demo' block.
 *
 * @Block(
 *   id = "demo_block",
 *   admin_label = @Translation("Demo block"),
 * )
 */

class DemoBlock extends BlockBase {

  /**
   * {@inheritdoc}
   */
  public function build() {
    return array(
      '#markup' => $this->t('Hello World!'),
    );
  }

  /**
   * {@inheritdoc}
   */
  public function access(AccountInterface $account) {
    return $account->hasPermission('access content');
  }

}</code>

Seperti semua fail kelas lain, kami pertama kali ruang nama kelas kami. Kemudian kami menggunakan kelas blockbase supaya kami dapat melanjutkannya, dan kelas AccountInterface supaya kami dapat mengakses pengguna yang sedang dilog masuk. Seterusnya adalah sesuatu yang anda tidak pernah melihat di Drupal 7: Komen.

Anotasi adalah alat penemuan PHP yang terletak di blok komen dalam fail yang sama dengan definisi kelas. Dengan menggunakan anotasi ini, kami membiarkan Drupal tahu bahawa kami ingin mendaftarkan jenis blok baru (@block) dengan id demo_block dan admin_label dengan

blok demo (diluluskan melalui sistem terjemahan).

Seterusnya, kami melanjutkan kelas Blockbase ke Demoblock kami sendiri, di mana kami melaksanakan dua kaedah (kaedah yang paling biasa yang akan anda lakukan). Kaedah binaan () adalah yang paling penting kerana ia mengembalikan array yang boleh diberikan bahawa blok akan dicetak. Kaedah akses () mengawal akses untuk melihat blok ini. Hujah yang disampaikan kepadanya adalah contoh kelas AccountInterface, di mana ia adalah pengguna semasa.

Satu lagi perkara yang menarik untuk diperhatikan ialah kita tidak lagi menggunakan fungsi T () secara global untuk terjemahan, tetapi sebaliknya merujuk kepada kaedah T () yang dilaksanakan dalam kelas induk kelas.

itu sahaja, anda boleh membersihkan cache dan pergi ke halaman konfigurasi susun atur blok. Perkara yang sejuk ialah anda mempunyai jenis blok di sebelah kanan (anda boleh menapis melalui mereka) di mana anda boleh meletakkan satu atau lebih jenis blok ini ke dalam pelbagai kawasan di laman web ini.

konfigurasi blok Drupal 8

Sekarang kita telah belajar bagaimana untuk membuat jenis blok baru untuk digunakan dalam UI, mari kita menggali lebih jauh ke dalam API dan menambah borang konfigurasi kepadanya. Kami akan membolehkannya mengedit blok, menentukan nama di medan teks, dan blok itu akan menyapa nama itu, dan bukannya menyapa

dunia

. Pertama, kita perlu menentukan bentuk yang mengandungi medan teks kami. Jadi, dalam kelas Demoblock kami, kami boleh menambah kaedah baru yang dipanggil BlockForm ():

Pelaksanaan API bentuk ini harus kelihatan sangat mirip dengan Drupal 7. Walau bagaimanapun, terdapat beberapa kandungan baru di sini. Pertama, kita mengambil array bentuk $ dari kelas induk (jadi kita membina borang yang sedia ada dengan menambahkan bidang kita sendiri). Standard OOP Standard. Kami kemudian mengambil dan menyimpan konfigurasi blok ini. Kelas BlockBase mentakrifkan kaedah getConfiguration () yang melakukan ini untuk kita. Kami meletakkan nilai demo_block_settings sebagai #default_value sekiranya ia telah ditetapkan.
<code class="language-php">/**
 * {@inheritdoc}
 */
public function blockForm($form, &$form_state) {

  $form = parent::blockForm($form, $form_state);

  $config = $this->getConfiguration();

  $form['demo_block_settings'] = array(
    '#type' => 'textfield',
    '#title' => $this->t('Who'),
    '#description' => $this->t('Who do you want to say hello to?'),
    '#default_value' => isset($config['demo_block_settings']) ? $config['demo_block_settings'] : '',
  );

  return $form;
}</code>

Seterusnya, adalah pengendali penyerahan untuk borang ini, yang akan memproses nilai medan kami dan menyimpannya dalam konfigurasi Chunk:

Kaedah ini juga terletak di kelas Demoblock, dan semua yang dilakukan adalah menyimpan nilai medan demo_block_settings sebagai item baru dalam konfigurasi blok (menggunakan nama yang sama dengan kunci untuk konsistensi).
<code class="language-php">/**
* {@inheritdoc}
*/
public function blockSubmit($form, &$form_state) {

 $this->setConfigurationValue('demo_block_settings', $form_state['values']['demo_block_settings']);

}</code>

Akhirnya, kita perlu menyesuaikan kaedah binaan () kami untuk memasukkan nama untuk bertanya:

<code class="language-php"><?php
namespace Drupal\demo\Plugin\Block;

use Drupal\block\BlockBase;
use Drupal\Core\Session\AccountInterface;

/**
 * Provides a 'Demo' block.
 *
 * @Block(
 *   id = "demo_block",
 *   admin_label = @Translation("Demo block"),
 * )
 */

class DemoBlock extends BlockBase {

  /**
   * {@inheritdoc}
   */
  public function build() {
    return array(
      '#markup' => $this->t('Hello World!'),
    );
  }

  /**
   * {@inheritdoc}
   */
  public function access(AccountInterface $account) {
    return $account->hasPermission('access content');
  }

}</code>

Setakat ini, ini sepatutnya kelihatan mudah. Kami sedang mencari konfigurasi blok dan menggunakannya untuk pernyataan bercetak jika nilai medan kami telah ditetapkan. Jika tidak, pernyataan biasa digunakan. Anda boleh membersihkan cache dan mengujinya dengan mengedit blok yang anda berikan ke zon dan menambah nama yang anda ingin minta. Satu perkara yang perlu diperhatikan ialah anda masih mempunyai tanggungjawab untuk membersihkan input pengguna apabila mencetak ke skrin. Untuk keringkasan, saya tidak memasukkan langkah -langkah ini.

Drupal 8 Form

Perkara terakhir yang akan kita pelajari dalam tutorial ini ialah cara membuat bentuk mudah. Oleh kerana batasan ruang, saya tidak akan meliputi aspek pengurusan konfigurasinya (menyimpan nilai konfigurasi yang dikemukakan melalui borang). Sebaliknya, saya akan menggambarkan definisi bentuk mudah di mana nilai yang dikemukakan hanya dicetak pada skrin untuk menunjukkan bagaimana ia berfungsi.

Dalam Drupal 8, fungsi definisi bentuk dikumpulkan dalam kelas. Oleh itu mari kita tentukan kelas demoform mudah kita dalam src/form/demoform.php:

<code class="language-php">/**
 * {@inheritdoc}
 */
public function blockForm($form, &$form_state) {

  $form = parent::blockForm($form, $form_state);

  $config = $this->getConfiguration();

  $form['demo_block_settings'] = array(
    '#type' => 'textfield',
    '#title' => $this->t('Who'),
    '#description' => $this->t('Who do you want to say hello to?'),
    '#default_value' => isset($config['demo_block_settings']) ? $config['demo_block_settings'] : '',
  );

  return $form;
}</code>

Selain aspek OOP, semuanya harus sangat mirip dengan Drupal 7. API bentuk tidak berubah (kecuali untuk menambah beberapa elemen bentuk baru dan enkapsulasi sedemikian). Jadi apa yang berlaku di atas?

Pertama, kami ruang nama kelas dan menggunakan kelas formbase teras supaya kami dapat melanjutkannya dengan kelas demoform kami sendiri. Kemudian kami melaksanakan 4 kaedah, 3 daripadanya harus kelihatan sangat akrab. Kaedah getFormID () adalah baru dan wajib dan hanya digunakan untuk mengembalikan nama mesin borang. Kaedah BuildForm () sekali lagi wajib, yang membina borang. Bagaimana? Sama seperti biasa dari Drupal 7. Kaedah Validate () adalah pilihan dan tujuannya juga harus sangat jelas dari D7. Akhirnya, kaedah SubmitForm () melakukan pemprosesan komit. Sangat logik dan teratur.

Jadi apa yang kita mahu capai dengan borang ini? Kami mempunyai medan e -mel (elemen bentuk baru di Drupal 8) yang kami mahu pengguna mengisi. Secara lalai, Drupal memeriksa sama ada nilai yang dimasukkan sebenarnya adalah alamat e -mel. Tetapi dalam fungsi pengesahan kami, kami pastikan ia adalah alamat e -mel .com dan jika tidak, kami akan menetapkan ralat borang pada medan itu. Akhirnya, pengendali penyerahan hanya mencetak mesej pada halaman.

Perkara terakhir yang perlu kita lakukan untuk menggunakan borang ini adalah untuk menyediakannya dengan laluan. Oleh itu, edit fail demo.routing.yml dan tambahkan yang berikut:

<code class="language-php">/**
* {@inheritdoc}
*/
public function blockSubmit($form, &$form_state) {

 $this->setConfigurationValue('demo_block_settings', $form_state['values']['demo_block_settings']);

}</code>

Ini sepatutnya sama dengan apa yang kami jalankan halaman mudah dalam jawatan terdahulu. Satu -satunya perbezaan yang signifikan ialah di bawah lalai, kami menggunakan _form untuk menentukan bahawa sasaran adalah kelas bentuk. Oleh itu, nilainya ialah nama kelas yang kami buat.

Kosongkan cache dan navigasi ke demo/borang untuk melihat borang dan mengujinya.

Jika anda sudah biasa dengan drupal_get_form () dan ingin tahu cara memuatkan borang seperti yang anda lakukan di Drupal 7 sebelum ini, jawapannya adalah dalam kelas Drupal global. Jadi untuk mendapatkan borang, anda boleh menggunakan kaedah FormBuilder () dan lakukan yang berikut:

<code class="language-php"><?php
namespace Drupal\demo\Plugin\Block;

use Drupal\block\BlockBase;
use Drupal\Core\Session\AccountInterface;

/**
 * Provides a 'Demo' block.
 *
 * @Block(
 *   id = "demo_block",
 *   admin_label = @Translation("Demo block"),
 * )
 */

class DemoBlock extends BlockBase {

  /**
   * {@inheritdoc}
   */
  public function build() {
    return array(
      '#markup' => $this->t('Hello World!'),
    );
  }

  /**
   * {@inheritdoc}
   */
  public function access(AccountInterface $account) {
    return $account->hasPermission('access content');
  }

}</code>

Anda kemudian boleh mengembalikan $ borang, yang akan menjadi pelbagai bentuk borang.

Kesimpulan

Dalam artikel ini, kami terus meneroka pembangunan modul Drupal 8 dan memperkenalkan dua topik baru: blok dan bentuk. Kami telah belajar bagaimana untuk membuat jenis blok kita sendiri, yang boleh kita gunakan untuk membuat blok dalam UI. Kami juga belajar bagaimana untuk menambah konfigurasi tersuai kepadanya dan menyimpan nilai untuk kegunaan kemudian. Mengenai borang, kami telah melihat pelaksanaan mudah kelas Formbase, yang kami gunakan untuk mencetak nilai yang disampaikan pengguna ke skrin.

Dalam tutorial seterusnya, kami akan dengan cepat belajar tentang borang konfigurasi. Kami akan menggunakan sistem konfigurasi Drupal 8 untuk menjimatkan nilai pengguna yang dikemukakan. Di samping itu, kami akan belajar tentang bekas perkhidmatan dan suntikan pergantungan dan bagaimana mereka bekerja di Drupal 8. Jumpa lagi.

Soalan Lazim mengenai Bangunan Drupal 8 Modul: Blok dan Borang (FAQ)

Apakah struktur asas modul Drupal 8?

Modul Drupal 8 pada dasarnya adalah satu set fail yang mengandungi fungsi tertentu dan ditulis dalam PHP. Struktur asas modul Drupal 8 termasuk fail .info.yml, fail modul, dan fail pilihan lain, seperti .css, .js, .twig, dll. Fail .Info.yml digunakan untuk menyenaraikan nama modul, deskripsi, pakej, jenis, dan keserasian teras. Fail .Module adalah di mana kod PHP sebenar terletak.

Bagaimana untuk membuat blok tersuai di Drupal 8?

Membuat blok tersuai di Drupal 8 melibatkan mewujudkan modul tersuai baru dan menentukan plugin blok di dalamnya. Plugin Blok adalah fail kelas PHP yang mentakrifkan sifat dan kaedah blok. Ia harus diletakkan di direktori "Src/Plugin/Block" modul. Kelas plugin blok hendaklah melanjutkan kelas "blockbase" dan melaksanakan kaedah "membina ()", yang mengembalikan pelbagai kandungan blok yang boleh diperolehi.

Bagaimana untuk membuat borang tersuai di Drupal 8?

Membuat borang tersuai dalam Drupal 8 melibatkan mewujudkan modul tersuai baru dan menentukan kelas bentuk di sana. Kelas Borang adalah fail kelas PHP yang mentakrifkan sifat dan kaedah borang. Ia harus diletakkan dalam direktori "Src/Form" modul. Kelas borang harus melanjutkan kelas "formbase" dan melaksanakan tiga kaedah: "getFormId ()," membina () ", dan" submitform () ". Kaedah "BuildForm ()" mengembalikan array borang, dan kaedah "submitform ()" mengendalikan penyerahan borang.

Bagaimana untuk memaparkan blok di kawasan tertentu di laman Drupal 8 saya?

Untuk memaparkan blok di kawasan tertentu di laman Drupal 8, anda perlu pergi ke halaman susun atur blok di antara muka pengurusan. Di sini anda boleh menetapkan blok anda ke mana -mana bidang topik. Anda juga boleh mengkonfigurasi tetapan penglihatan blok berdasarkan laluan, jenis kandungan, peranan pengguna, dll.

Bagaimana untuk mengesahkan input borang adat Drupal 8?

Untuk mengesahkan input ke borang tersuai Drupal 8, anda boleh mengatasi kaedah "ValidateForm ()" dalam kelas bentuk. Apabila mengemukakan borang, kaedah ini dipanggil sebelum kaedah "SubmitForm ()". Dalam kaedah "ValidateForm ()", anda boleh menambah logik pengesahan dan hubungi kaedah "SetError ()" untuk menetapkan mesej ralat untuk elemen borang (jika pengesahan gagal).

Bagaimana untuk menukar borang yang ada di Drupal 8?

Untuk menukar borang sedia ada di Drupal 8, anda boleh melaksanakan fungsi "Hook_Form_Form_ID_ALTER ()" dalam modul. Fungsi ini dipanggil apabila membina borang, yang membolehkan anda mengubah suai array borang. "Form_id" harus digantikan dengan id borang yang ingin anda ubah.

Bagaimana untuk mengemukakan borang secara programatik di Drupal 8?

Untuk mengemukakan borang secara programatik di Drupal 8, anda boleh membuat contoh kelas borang dan panggil kaedah "SubmitForm ()" di atasnya. Walau bagaimanapun, sebelum memanggil kaedah ini, anda perlu menyediakan objek keadaan bentuk dan menetapkan nilai elemen bentuk di dalamnya.

Bagaimana untuk membuat borang konfigurasi di Drupal 8?

Untuk membuat borang konfigurasi di Drupal 8, anda boleh menentukan kelas bentuk yang memanjangkan kelas "ConfigFormBase" dan bukannya kelas "Formbase". Kelas "ConfigFormBase" menyediakan kaedah lain untuk memproses data konfigurasi, seperti "getIdiBleConfignames ()" dan "config ()". Data konfigurasi disimpan dalam sistem konfigurasi Drupal dan boleh diakses dari mana saja dalam kod.

Bagaimana untuk membuat borang pelbagai langkah di Drupal 8?

Untuk membuat borang pelbagai langkah di Drupal 8, anda boleh menggunakan objek FormStateInterface untuk menyimpan data antara langkah-langkah. Dalam kaedah "BuildForm ()", anda boleh menyemak langkah semasa dalam keadaan bentuk dan mengembalikan array bentuk yang berbeza untuk setiap langkah. Dalam kaedah "Hantar Form ()", anda boleh menyemak langkah semasa, kemudian simpan data dan pergi ke langkah seterusnya, atau memproses komit akhir.

Bagaimana untuk membuat borang AJAX di Drupal 8?

Untuk membuat borang AJAX di Drupal 8, anda boleh menambah atribut "#ajax" ke elemen bentuk dalam kaedah "BuildForm ()". Harta ini harus menjadi array yang menentukan fungsi panggil balik yang akan dipanggil apabila elemen itu dicetuskan. Fungsi panggil balik harus mengembalikan sebahagian daripada borang untuk dikemas kini atau satu set perintah Ajax.

Output yang disemak semula ini mengekalkan format dan penempatan imej asal semasa memansuhkan kandungan untuk keaslian.

Atas ialah kandungan terperinci Membina Modul Drupal 8: Blok dan Borang. 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
Artikel sebelumnya:IronMQ dan Laravel: PersediaanArtikel seterusnya:IronMQ dan Laravel: Persediaan