Thay đổi dạng hook Drupal 8

Trong một trong những bài học trước, chúng ta đã biết hook là gì, trong bài học này, chúng ta sẽ làm việc với hook hook_form_alter[] trong thực tế và thêm chức năng vào biểu mẫu hiện có

Ví dụ về mã có thể được tìm thấy tại github.
https. //github. com/levmyshkin/drupalbook8

Trong bài học này, chúng ta sẽ bắt đầu xem xét các hook trong thực tế, sau đó chúng ta sẽ quay lại hook và xem xét một vài ví dụ khác. Bây giờ, hãy bắt đầu với hook_form_alter[]

Để thêm móc nối vào mô-đun, chúng ta cần tạo một tệp có tên MODULENAME. mô-đun, vì vậy chúng tôi sẽ tạo một tệp có tên drupalbook. mô-đun. Đây sẽ là một tệp PHP nơi lưu trữ các hook và hàm phụ trợ của chúng ta, phần còn lại tốt hơn là sử dụng các tệp và lớp riêng biệt trong thư mục src. Cho đến nay, bạn chỉ có thể thêm một thẻ mở vào tệp

Bây giờ hãy thêm hook_form_alter[]. Nếu bạn đang sử dụng PhpStorm, hãy bắt đầu viết tên của các hook và PhpStorm sẽ đề nghị bạn chọn một trong các hook. Khi bạn chọn một hook theo cách này, PhpStorm sẽ tự động thay thế các đối số vào trong hàm và bạn không cần phải nhớ hoặc tìm trong phần trợ giúp những đối số nào bạn cần thêm

Khi bạn muốn thêm hook, bạn cần thay thế từ hook bằng tên module của bạn, sau đó drupal sẽ tự động chèn mã của bạn vào vị trí hook. Kết quả là, bạn nên có chức năng này

/**
 * Implements hook_form_alter[].
 */
function drupalbook_form_alter[&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id] {
 
}

Trong bài học trước, chúng ta đã xem xét rằng để được lưu trữ trong $form, $form_state, trong $form_id, chúng ta sẽ phải lưu trữ id biểu mẫu mà chúng ta đã xác định trong phương thức thích hợp

9. 8. Làm việc với biểu mẫu trong Drupal. Thêm biểu mẫu cấu hình theo chương trình

Bây giờ chúng ta hãy mở rộng hình thức thêm khóa API mà chúng ta đã làm trong bài học trước. Để làm điều này, chúng ta cần xác định id của biểu mẫu, bạn có thể xem nó trong phương thức này

function getFormId[] {
  return 'drupalbook_admin_settings';
}

Hoặc mở trình kiểm tra DOM và xem thuộc tính id trong HTML

Ở đây chúng ta cần thay thế - [dấu gạch ngang] bằng _ [dấu gạch dưới]. Nhưng hãy cẩn thận, id trong thuộc tính thẻ biểu mẫu có thể được tăng lên sau một yêu cầu AJAX, ví dụ: drupalbook-admin-settings-0, drupalbook-admin-settings-1, drupalbook-admin-settings-2, v.v. Chúng ta cần một phần không có số ở cuối, đây là phần được hình thành từ id của biểu mẫu, được chỉ định trong phương thức getFormId[]

Bây giờ, chúng tôi cần giới hạn việc thực thi mã của mình chỉ dành cho biểu mẫu drupalbook_admin_settings, bởi vì mã trong hook_form_alter[], sẽ được thực thi hoàn toàn cho tất cả các biểu mẫu được tạo thông qua API biểu mẫu Drupal

[$form_id == 'drupalbook_admin_settings'] {
  // Further code here.
}

Bên trong nếu chúng ta có thể viết mã của mình cho biểu mẫu API chính. Hãy thêm phần giữ chỗ cho các trường văn bản để các trường trống hiển thị nội dung cần viết

[$form_id == 'drupalbook_admin_settings'] {
  $form['drupalbook_api_key']['#attributes']['placeholder'] = 'API key';
  $form['drupalbook_api_client_id']['#attributes']['placeholder'] = 'API client ID';
}

Để áp dụng hook_form_alter[], hãy xóa bộ đệm

Mặc dù #attributes không được liệt kê trong tài liệu dưới dạng khóa có thể có cho trường văn bản

https. //api. drupal. tổ chức/api/drupal/lõi%2

Tuy nhiên, khóa này vẫn có thể được sử dụng để chỉ định các thuộc tính của thẻ. lớp, giữ chỗ, các thuộc tính rel khác nhau. Bảng rõ ràng hơn dành cho Drupal 7 Form API

https. //api. drupal. org/api/drupal/developer%21topics%21forms_api_reference. html/7. x

Bạn có thể tìm thấy #attributes tại đây cho các trường văn bản

Các giá trị thuộc tính được đặt trong API biểu mẫu khi tạo [kết xuất] một thành phần biểu mẫu trong phương thức setAttributes

https. //api. drupal. org/api/drupal/core%21lib%21Drupal%21Core%21Render%21Element%

Mặc dù điều này không được nêu trong biểu mẫu tài liệu API, nhưng bạn có thể tự mình thấy rằng nó hoạt động

Bạn cũng có thể xem những giá trị khác mà bạn có thể đặt cho các trường biểu mẫu trong lớp FormElement cơ sở.
https. //api. drupal. org/api/drupal/core%21lib%2

Drupal Form API nhìn không rõ ràng và khó hiểu, ra là vậy, mình vẫn chưa hiểu một số chỗ trong đó. Nhưng để sử dụng API này đủ đơn giản và đủ rõ ràng, nếu bạn có sẵn một mẫu đang hoạt động. Do đó, nếu bạn có bất kỳ câu hỏi nào và bạn không biết cách thực hiện ở dạng này hay dạng kia, hãy tìm trên Internet và bạn sẽ tìm thấy một ví dụ hoạt động 100%. Bạn cần biết rằng tất cả các biểu mẫu đều đi qua tất cả các API của Drupal Cache, Render, Theming và bất kỳ trường nào trong biểu mẫu mà bạn có thể thay đổi thông qua hook_form_alter[] và bạn đã có thể tìm hiểu cách thực hiện điều đó thông qua Google. Ngoài ra, bạn càng biết nhiều về API biểu mẫu và bạn càng phân tích các ví dụ với nó, thì API biểu mẫu này sẽ trở nên dễ dàng và rõ ràng hơn đối với bạn. Và đừng lo lắng rằng nó quá lớn, chỉ cần sử dụng phần bạn cần ngay bây giờ

Xác thực
Bây giờ chúng ta hãy xem cách sử dụng các chức năng xác thực thông qua API biểu mẫu. Hãy kiểm tra trường Key API để nó bắt đầu bằng từ google, ví dụ google-KEY123a3sa. Nếu ban đầu chúng ta viết mã cho biểu mẫu của mình, chúng ta có thể chèn phương thức validateForm[] và thực hiện tất cả các kiểm tra trong đó.

/**
 * {@inheritdoc}
 */
public function validateForm[array &$form, FormStateInterface $form_state] {
 
}

Nhưng thường thì các biểu mẫu chúng tôi làm việc nằm trong các mô-đun được đóng góp và tốt hơn là viết mã cho các biểu mẫu đó trong các mô-đun tùy chỉnh. Vì vậy, hãy thêm một chức năng xác thực mới vào biểu mẫu

['#validate'][] = 'drupalbook_settings_validate';

Trong mảng #validate, chúng tôi lưu trữ tất cả các chức năng xác thực và gọi lại. Gọi lại là một cuộc gọi của một chức năng theo tên của nó, tôi. e. chúng ta sẽ thêm mảng ['callback_function1', 'callback_function2'] và sau đó lấy các tên này từ mảng và drupal sẽ gọi các hàm này. Trong trường hợp này, drupal sẽ gọi các hàm này để kiểm tra biểu mẫu của chúng ta. Và bây giờ chúng ta cần tạo hàm drupalbook_settings_validate trong file drupalbook. mô-đun. Trong hàm này chúng ta sẽ có các tham số $form, $form_state

/**
 * Custom validation callback.
 */
function drupalbook_settings_validate[&$form, \Drupal\Core\Form\FormStateInterface $form_state] {
 
}

Và bây giờ, hãy thêm kiểm tra trường Khóa API

/**
 * Custom validation callback.
 */
function drupalbook_settings_validate[&$form, \Drupal\Core\Form\FormStateInterface $form_state] {
  if [strpos[$form_state->getValue['drupalbook_api_key'], 'google'] === FALSE] {
    $form_state->setErrorByName['drupalbook_api_key', t['API Key must start from "google".']];
  }
}

Chúng ta sử dụng toán tử so sánh khó ===, bởi vì nếu google ở ​​đầu chuỗi, strpos[] trả về 0 và đối với PHP [0 == FALSE] sẽ trả về TRUE, vì trong PHP '', 0, NULL,

Bây giờ, mỗi khi bạn lưu biểu mẫu cài đặt, một kiểm tra sẽ được thực hiện và nếu kiểm tra không được thông qua, drupal sẽ tạo ra lỗi và cài đặt sẽ không được lưu

Gửi
Sau khi tất cả các hàm xác thực đã hoạt động và không có lỗi nào xảy ra, lệnh gọi drupal gửi hàm, chúng hoạt động sau khi gửi dữ liệu từ biểu mẫu. Bạn đã thấy phương thức submitForm[] trong bài học trước, nơi chúng ta lưu dữ liệu vào cấu hình. Nhưng chúng tôi có thể thực hiện các hành động khác khi gửi, chẳng hạn như thay đổi dữ liệu hoặc lưu một số dữ liệu vào các thực thể khác. Hãy thực hiện một chức năng xác thực khác sẽ hiển thị một thông báo bổ sung về cách sử dụng Khóa API. Trong hook_form_alter[] chúng ta sẽ thêm tên hàm.

________số 8

Bây giờ trong hàm drupalbook_settings_settings_submit[], nơi chúng ta cũng chuyển $form, $form_state vào các tham số, chúng ta sẽ hiển thị thông báo

/**
 * Custom submit callback.
 */
function drupalbook_settings_submit[&$form, \Drupal\Core\Form\FormStateInterface $form_state] {
  \Drupal::messenger[]->addStatus[
    t[htmlentities['Insert API key in your  tag:  .']]
  ];
}

We use the htmlentites[] function to ensure that all special characters we use to output the "" tags are not deleted by the drupal. All HTML text is cut out of the t[] function, so that it cannot be pasted into the text, for example, if such a code contains javascript redirect to another site, it will be redirected when displaying messages. That's why we use the htmlentities function to display the tags.

Thông báo sẽ không được hiển thị nếu các chức năng xác thực không thành công, chỉ khi không có lỗi trong biểu mẫu, chúng tôi mới thấy thông báo

Trước đây, hàm drupal_set_message được sử dụng trong drupal để xuất tin nhắn

function getFormId[] {
  return 'drupalbook_admin_settings';
}
0

Nhưng bây giờ mọi người cố gắng thống nhất và dẫn đến việc sử dụng OOP ở mọi nơi

Dưới đây là toàn bộ mã hiện tại của drupalbook. tập tin mô-đun

function getFormId[] {
  return 'drupalbook_admin_settings';
}
1

Điều này kết thúc bài học của chúng ta về API biểu mẫu, nhưng không kết thúc nghiên cứu về API biểu mẫu, chúng ta sẽ không gặp lại các chức năng xác thực, gửi và các trường khác nhau. Chúng ta cũng sẽ hiểu trong một trong các bài học cách sử dụng AJAX và form_states thông qua API biểu mẫu

Chủ Đề