Cách thực hành tốt nhất cho khóa ngôn ngữ cho những người khác không có tiếng vang trong hook_form_alter


30

Tôi đang sửa đổi trong một hình thức trong mô-đun tùy chỉnh của tôi. Mã trông như:

function my_module_form_alter(&$form, &$form_state, $form_id) {

    if ($form_id == "someID") {

        $form['field_charity_author']['und'][0]['value']['#value'] = arg(3);
        //$form['field_charity_author']['#type'] = 'hidden';

    }

}

Tuy nhiên, tôi nghĩ mã hóa cứng undlà xấu. Điều gì nên là cách thích hợp để sửa đổi các trường biểu mẫu đúng trong trường hợp này?


Nhận xét này có lẽ không liên quan vì nó đã được hỏi từ lâu. Một cách đơn giản tôi sử dụng nó bằng cách sử dụng một foreachvòng lặp. Nếu đó chỉ là LANGUAGE_NONE, thì đó là một lần chạy. Theo nghĩa form_alter, nó nên thay đổi về mặt kỹ thuật bất cứ ngôn ngữ nào mà biểu mẫu có.
AyeshK

Câu trả lời:


40

Thật không may, tự trả lời của bạn không phải là phổ quát. Ngôn ngữ trường và ngôn ngữ nút không giống nhau.
Ngôn ngữ trường chỉ cần thiết nếu bạn đang sử dụng API dịch trường (ví dụ: Dịch thực thể ). Khi bạn bắt đầu sử dụng nó, một số trường được chuyển đổi thành có thể dịch.

Các lĩnh vực có thể dịch có mã ngôn ngữ, mà thực sự có ý nghĩa. Nhưng nếu trường không thể dịch được, mã ngôn ngữ sẽ luôn là (và cho tất cả các loại nội dung, thực thể, v.v.) - LANGUAGE_NONE(tốt nhất nên sử dụng hằng LANGUAGE_NONEvà không phải chuỗi 'und').
Vì vậy, với giải pháp của bạn, bạn có thể gặp tình huống khi một nút là tiếng Nga, nhưng một trường của nút sử dụng LANGUAGE_NONE.
Hạnh phúc, các trường được gắn vào biểu mẫu bằng '#language'khóa, luôn chứa mã ngôn ngữ chính xác.

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang][0]['value']['#value'] = $value;

Nếu bạn không có quyền truy cập vào biểu mẫu đính kèm, các hàm API của Ngôn ngữ trường có thể hữu ích.


4
Đây là câu trả lời đúng duy nhất trong chủ đề này.
Bojan Zivanovic

Phương pháp này cũng có thể được sử dụng trong khi truy xuất đường dẫn trường hình ảnh của loại nút / nội dung. Cảm ơn
Jayaram R

10

Nếu bạn biết loại thực thể và gói, hãy sử dụng một cái gì đó giống như đoạn mã sau, gọi trường_l Language () .

$field_language = field_language('node', $node, 'field_charity_author');  
$form['field_charity_author'][$field_language][0]['value']['#value'] = arg(3);

Nó sẽ tìm ra ngôn ngữ phù hợp và sẽ hoạt động trong các trang web đa ngôn ngữ.

Cũng có một cái nhìn tại field_get_items () .


Điều này đúng như cách API.
Nikit

Nếu nút chưa được tạo thì sao?
AgA

@Nikit Tôi không chắc lắm, vì ngôn ngữ hiển thị và ngôn ngữ biểu mẫu không giống nhau. Tác giả thay đổi một số hình thức và nó có thể là hình thức để tạo nút mới hoặc để thêm bản dịch mới của nút hiện có.
kalabro

@kalabro - ngôn ngữ hiển thị và ngôn ngữ biểu mẫu - giống nhau ở bối cảnh hiện tại.
Nikit

4

Toàn bộ undthỏa thuận là một trong những điều khó chịu hơn trong Drupal 7 không hoạt động tốt trong thực tế như khi nó được thiết kế.

Dù sao, bạn có thể có được ngôn ngữ đầu tiên bằng cách sử dụng array_keysnhư thế này:

function my_module_form_alter(&$form, &$form_state, $form_id) {

  if ($form_id == "someID") {
      $langs = array_keys($form['field_charity_author']);
      $form['field_charity_author'][$langs[0]][0]['value']['#value'] = arg(3);
  }
}

Điều đó nên làm việc tất cả các thời gian.


Cảm ơn câu trả lời của bạn. Tôi đang dán những gì tôi đã làm để khắc phục vấn đề này trong một câu trả lời khác. :)
Shafiul

Tôi có thể sử dụng $ langs để truy cập giá trị của cùng một trường trong form_state không?
AgA

Điều này có thực sự an toàn? Bạn có thể chắc chắn $ langs [0] luôn là mục mảng chính xác không?
rooby

0

(Trả lời câu hỏi của riêng tôi trong trường hợp nó giúp được ai đó. Câu trả lời có hiệu quả với tôi.)

Tôi có thể viết dòng sau để có được ngôn ngữ:

$lang = $form['language']['#value'];    //  Instead of "und"


0

lại: câu trả lời của kalabro

mã của anh ấy không làm việc cho tôi - mã của tôi hơi khác một chút

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang]['#value'] = $value;

[$ lang] [0] đã trả lại "u" nhưng giá trị đầy đủ của [$ lang] là "und" và tôi cũng không cần ['value'], vì $ form ['FIELDNAME'] ['# ngôn ngữ' ] không phải là một mảng, nó là một chuỗi.


1
Ký tự thứ 0 của 'und' là 'u'. Bạn đang ở trong một mê cung của những đoạn nhỏ ngoằn ngoèo, tất cả các mảng.
Chris Burgess
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.