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


30

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

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이 잘못 되었다고 생각 합니다. 이 경우 양식 필드를 올바르게 수정하는 올바른 방법은 무엇입니까?


이 의견은 오래 전에 요청 된 것이므로 관련이 없을 것입니다. foreach루프 를 사용하여 사용하는 간단한 방법 입니다. LANGUAGE_NONE 인 경우 단일 실행입니다. form_alter 의미에서 양식의 언어를 기술적으로 변경해야합니다.
AyeshK

답변:


40

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

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

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

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


4
이것은이 스레드에서 유일한 정답입니다.
보얀 지 바노비치

이 방법은 노드 / 콘텐츠 유형의 이미지 필드 경로를 검색하는 동안에도 사용할 수 있습니다. 감사합니다
Jayaram R

10

엔티티 유형과 번들을 알고 있다면 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 ()도 살펴보십시오 .


이것은 API 방식으로 정확합니다.
Nikit

노드가 작성되지 않은 경우는 어떻습니까?
AgA

@Nikit 표시 언어와 양식 언어가 같지 않기 때문에 잘 모르겠습니다. 작성자는 일부 양식을 변경하며 새 노드를 작성하거나 기존 노드의 새 변환을 추가하기위한 양식 일 수 있습니다.
kalabro

@kalabro-표시 언어 및 양식 언어-현재 상황에서 동일합니다.
Nikit

4

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

항상 작동합니다.


답변 주셔서 감사합니다. 이 문제를 해결하기 위해 내가 한 일을 다른 답변으로 붙여 넣습니다. :)
Shafiul

form_state에서 같은 필드의 값에 액세스하기 위해 $ langs를 사용할 수 있습니까?
AgA

정말 안전한가요? $ langs [0]이 항상 올바른 배열 항목인지 확신 할 수 있습니까?
rooby

0

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

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

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

5
이것은 잘못이다. kalabro의 답변을 참조하십시오 .
보얀 지 바노비치

0

다시 : kalabro의 답변

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

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

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


1
'und'의 0 번째 문자는 'u'입니다. 당신은 꼬인 작은 통로, 모든 배열의 미로에 있습니다.
Chris Burgess
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.