it-swarm-ko.tech

hook_form_alter의 "und"언어 키에 대한 모범 사례

사용자 정의 모듈에서 양식을 수정하고 있습니다. 코드는 다음과 같습니다

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';

    }

}

그러나 하드 코딩 und이 잘못되었다고 생각합니다. 이 경우 양식 필드를 올바르게 수정하는 올바른 방법은 무엇입니까?

30
Shafiul

불행히도, 당신의 자기 답은 보편적이지 않습니다. 필드 언어와 노드 언어는 동일하지 않습니다.
필드 번역 API는 필드 변환 API를 사용하는 경우에만 필요합니다 (예 : Entity translation ). 사용을 시작하면 일부 필드가 번역 가능으로 변환됩니다.

번역 가능한 필드에는 언어 코드가 있으므로 실제로 의미가 있습니다. 그러나 필드를 번역 할 수없는 경우 언어 코드는 항상 (모든 컨텐츠 유형, 엔티티 등) — LANGUAGE_NONE (상수 LANGUAGE_NONE 문자열이 아닌 'und').
따라서 솔루션을 사용하면 노드가 러시아어 일 때 상황이 발생할 수 있지만 노드의 필드는 LANGUAGE_NONE.
행복하게, 필드는 '#language' 키. 항상 올바른 언어 코드가 포함되어 있습니다.

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

첨부 된 양식에 액세스 할 수없는 경우 Field Language API functions 가 유용 할 수 있습니다.

40
kalabro

엔터티 유형과 번들을 알고 있으면 field_language () 를 호출하는 다음 코드와 같은 것을 사용하십시오.

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

올바른 언어를 파악하고 다국어 사이트에서 작동합니다.

field_get_items () 도 살펴보십시오.

10
Attiks

전체 und 거래는 Drupal 7)에서 실제로 설계되지 않았을 때 제대로 작동하지 않은 더 성가신 것 중 하나입니다.

어쨌든 array_keys 다음과 같이 :

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);
  }
}

항상 작동합니다.

4
googletorp

다시 : kalabro의 답변

그의 코드가 나를 위해 작동하지 않았습니다-내 코드는 조금 다릅니다

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

[$ lang] [0]에서 "u"를 반환했지만 [$ lang]의 전체 값이 "und"이고 $ form [ 'FIELDNAME'] [ '# language'때문에 [ 'value']도 필요하지 않았습니다. ]는 배열이 아니고 문자열이었습니다.

0
decibel.places

(누군가를 돕기 위해 내 자신의 질문에 답하십시오. 답이 저에게 효과적이었습니다.)

언어를 얻기 위해 다음 줄을 쓸 수 있습니다.

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