Lập trình xác nhận một nút?


7

Tôi đang lập trình tạo ra nhiều nút. Rõ ràng chúng phải có giá trị trước khi lưu trữ chúng. Các $nodeđối tượng như vậy có các trường CCK trộn với các trường tùy chỉnh.

Bởi vì các trình xác nhận chỉ thiết lập một form_set_error()và hầu như không bao giờ trả về kết quả xác thực, tôi phải đi qua máng hình thức để biết liệu một nút có hợp lệ hay không.

Tôi gọi node_validate(), sau đó form_get_errors()(mà, lần lượt gọi form_set_error()).

Dường như có một số vấn đề với phương pháp này:

  • form_set_error()đặt tin nhắn với drupal_set_message(); đối với những thứ như cron (người dùng không có phiên), điều này sẽ thêm các thông báo lỗi liên tục mồ côi vào cơ sở dữ liệu (chúng sẽ không bao giờ được in, do đó không bao giờ bị xóa).
  • mảng trả về lỗi được tạo để được sử dụng trong mảng dạng đa chiều. Đặc biệt với các trường CCK, tôi phải đào khá sâu để tìm ra lỗi thực tế.
  • Tôi chỉ muốn lưu trữ một nút, vì vậy tôi không quan tâm đến hình thức người dùng phải đối mặt; sử dụng API biểu mẫu chỉ cảm thấy sai.

Có một phương pháp đơn giản hơn, thanh lịch hơn?


Là vấn đề mà nguồn dữ liệu của bạn mà bạn đang sử dụng có thể có dữ liệu không hợp lệ trong đó hay chỉ là bạn đang cố xác thực mã của chính mình?
mpdon Arena

Tôi chỉ muốn tránh lưu trữ các nút "không hợp lệ", theo bất kỳ định nghĩa nào nếu chúng hợp lệ. Nếu, giả sử, một hình ảnh là bắt buộc, người ta có thể cho rằng chủ đề sẽ có thể hiển thị hình ảnh đó, bất kể. Nếu các nhà nhập khẩu của tôi bắt đầu lưu các nút mà không có những hình ảnh này, chủ đề sẽ in các liên kết hình ảnh bị hỏng.
berkes

Câu trả lời:


5

Không có cách nào khác, vì các hook mà các mô-đun cần triển khai để xác thực một nút là hook_validate()(nếu mô-đun thực hiện một loại nội dung) và hook_nodeapi ('xác thực') (cho tất cả các mô-đun khác). Các hook đó nhận được một $formtham số và được gọi là form_set_error () trong trường hợp có lỗi xác thực.

Cách dễ dàng hơn để tìm nếu có lỗi được đặt cho một biểu mẫu là sử dụng form_get_errors(), nó trả về mảng với tất cả các lỗi được đặt với form_set_error(), hàm cũng được gọi từ form_error().

Trong trường hợp có nhiều hơn một nút được xác thực, bạn sẽ cần gọi form_set_error(NULL, '', TRUE)trước node_validate(), sau đó lấy từ form_get_errors()mảng chứa thông báo lỗi; Nếu điều này là trống, không có thông báo lỗi.

form_set_error(NULL, '', TRUE);

// node_validate() call.

$errors = form_get_errors();

if (!empty($errors)) {
  // Some module reported an error.
}

Ngoài ra, bạn có thể sử dụng đoạn mã sau để xác minh không có mô-đun nào báo lỗi, sau khi bạn gọi node_validate():

if (!empty($_SESSION['messages']['error'])) {
  // Some module reported an error.
}

Trước khi gọi node_validate()từ tác vụ cron, bạn sẽ cần đặt $_SESSION['messages']['error']thành một mảng trống; theo cách đó, bạn chắc chắn rằng các lỗi được báo cáo trong mảng là do các móc xác thực nút gây ra.

$_SESSION['messages']là biến được sử dụng từ drupal_set_message()để lưu trữ các thông điệp được truyền đến hàm.

function drupal_set_message($message = NULL, $type = 'status', $repeat = TRUE) {
  if ($message) {
    if (!isset($_SESSION['messages'])) {
      $_SESSION['messages'] = array();
    }

    if (!isset($_SESSION['messages'][$type])) {
      $_SESSION['messages'][$type] = array();
    }
    // …
  }
  // …
}

công việc này trên drupal 7 phải không?
Lucifer

Câu hỏi dành cho Drupal 6; bạn cần thay đổi một chút mã cho Drupal 7.
kiamlaluno

bạn có thể chỉ cho bạn cách làm trong drupal 7
Lucifer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.