it-swarm-vi.com

Làm cách nào để tạo một trường chỉ chấp nhận các giá trị duy nhất?

Tôi đang sử dụng mô đun Bộ sưu tập trường vì tôi có một số mối quan hệ phức tạp giữa các trường và tôi đã cố gắng tích hợp nó với mô đun Trường duy nhất , nhưng không thành công, bởi vì - Trường duy nhất mô-đun không được mô-đun Bộ sưu tập trường hỗ trợ.

Có một phương pháp đơn giản hơn để kiểm tra xem giá trị là duy nhất và lỗi hiển thị để xác thực, nếu giá trị không phải là duy nhất?

Thật không may, Drupal 7 không có tính năng này theo mặc định, vì vậy phải có một phương pháp để làm điều này.

4
Ek Kosmos

Cuối cùng, đây là cách tôi đã điều chỉnh và giải quyết các đề xuất từ ​​mẫu @tostinni, @stefgosselin, @ uwe999 và các câu trả lời khác:

/**
 * implementation of hook_form_alter().
 */
function CUSTOM_MODULE_form_alter(&$form, &$form_state, $form_id) {
    switch ($form_id) {
        case 'MY_FORM_ID':
            // add custom validation callback
            $form['#validate'][] = 'CUSTOM_MODULE_MY_FORM_ID_validate';
            break;
            ...
        default:
            break;
    }
}

sau đó tất cả các chức năng tôi thực hiện trong:

/**
 * implementation of hook_form_FORM_ID_alter
 */
function CUSTOM_MODULE_MY_FORM_ID_validate(&$form, &$form_state) {

    //retrieve the value for your field
    $value = $form_state['values']['field_MY_FIELD']['und'][0]['value'];

    //Execute a count query to see if there's other similar values.
    $query = new EntityFieldQuery;
    $query->entityCondition('entity_type', 'field_collection_item')
            ->fieldCondition('field_MY_FIELD', 'value', $value)
            ->count();
    $count = $query->execute();
    if ($count > 0) {
        form_set_error('field_MY_FIELD', 'Unique field value is already used.');
    }
}

Tôi đã cố gắng làm việc với entity_metadata_wrapper nhưng tiếc là tôi không thành công.

Cảm ơn bạn cho câu trả lời của bạn.

1
Ek Kosmos

Bạn cần thực hiện điều này trong một mô-đun tùy chỉnh, đây là một mã mẫu để đạt được điều này:

function custom_node_validate($node, $form) {
  if ($node->type == 'page') {
    //retrieve the value for your field using Entity API
    $wrapper = entity_metadata_wrapper('node', $node);
    $value = $wrapper->field_collection->field_unique->value();

    //Execute a count query to see if there's other similar values.
    $query = new EntityFieldQuery;
    $query->entityCondition('entity_type', 'field_collection_item')
      ->fieldCondition('field_unique', 'value', $value)
      ->count();
    $count = $query->execute();
    if ($count > 1) {
      form_set_error('field_unique', 'Unique field value is already used.');
    }
  }
}

Một vài lời từ chối:

  • Tôi thực sự bị dự trữ bởi sự phức tạp của Cánh đồng API bộ sưu tập trường và khá phức tạp để tìm thông tin tốt về cách truy xuất giá trị và thực hiện truy vấn.
  • Tôi thực sự thích thực hiện các truy vấn SQL (xem Cách thay đổi phần thứ ba của cài đặt trường ) nhưng tôi đã cố gắng chỉ sử dụng API thay vì thực hiện một truy vấn đơn giản trên bảng field_data_field_unique. Tuy nhiên nó có thể chưa hoàn hảo, vì vậy xin vui lòng hòa nhập.
  • form_set_error () không đánh dấu trường, tôi không thể tìm đúng tên.

Dưới đây là tài liệu tôi đã sử dụng:

Chỉnh sửa: Theo lời khuyên của chx, để chuyển trực tiếp field_name Cho fieldCondition().

8
tostinni

Tôi chưa lập trình một mô-đun nào nhưng có vẻ như việc viết một hook trên form_alter sẽ dễ dàng hơn và sau đó truy vấn vào trường "số sê-ri" hiện tại của bạn để đảm bảo rằng nó là duy nhất.

4
uwe

Về cơ bản, Ek Kosmos có ý tưởng cơ bản. Cách đơn giản nhất là tạo một mô-đun nhỏ tùy chỉnh , điều này có lợi thế là cách ly tính năng bạn muốn xây dựng và ghi nhớ quy tắc số 1, bạn thực sự không bao giờ muốn hack bất cứ thứ gì trong lõi, trừ khi bạn thực sự không thể tránh được.

Khi bạn đã thiết lập tệp .info của mình trong một thư mục và tệp .module sẵn sàng hoạt động như được chỉ ra trong nhiều cách thực hiện trên chủ đề , bạn tận dụng sức mạnh của hook_form_alter bằng cách viết một hàm có tên tên mô-đun của bạn _form_alter trong tệp mô-đun của bạn và bạn biết rằng chức năng đó sẽ được gọi.

Bạn có thể sẽ cần một thay đổi câu lệnh chuyển đổi trong biểu mẫu) để thực hiện các hành động cụ thể tùy thuộc vào id id id ,

Bạn có thể cần thử thêm một thuộc tính (#validate) để thêm lệnh gọi hàm trên mảng biểu mẫu, là tên hàm của hàm xác thực tùy chỉnh của riêng bạn.

Cái gì đó như:

   // #validate adds callback to custom validator.
   $validators = $form['#validate'][]; // Save existing validation calls. 
   //  Not clear in docs, but this is important!

  // In your case, you may want to add a method callback with this attribute.                                   
  $form['#validate'][] = $validators . ' _custom_validate';

Tất nhiên, trong chức năng xác nhận của bạn, bạn có thể ghi nhật ký lỗi, chuyển hướng, gán thông báo lỗi hoặc thông báo.

Đừng đọc mẫu api và tải xuống các ví dụ mẫ .

Nếu bạn cần trợ giúp và ví dụ galore, hãy tải xuống các mô-đun đóng góp và xem cách người khác giải quyết con thú, hoặc gửi câu hỏi ở đây khi bạn đi cùng.

Chúc mừng hạnh phúc, may mắn.

1
stefgosselin

Hãy thử với xác thực trường mô-đun, sử dụng trình xác nhận duy nhất. Thêm quy tắc xác thực, chọn phạm vi duy nhất, toàn cầu, thực thể, gói.

1
ghr