언어로 작업 할 때 가장 좋은 방법은 무엇입니까?


51

이 양식을 사용하여 모듈의 데이터에 액세스하기 시작했습니다. ( 주석 # 1 참조 )

$node->field_test[$node->language][0]['value']

나는 그것이 꽤 좋은 해결책처럼 보였지만 같은 질문을 더 아래에서 발견 했다 .

'und'는 언어가없는 엔터티 필드, 번역 할 수없는 필드 및 모든 필드 인 엔터티 변환 모듈이없는 것으로 가정합니다. 또한 다양한 7.x 버전의 Drupal간에 차이가 있습니다. 데이터가 저장된 언어 코드에 따라 정렬
하는 field_get_items()기능 을 사용하는 것이 좋습니다.

그리고 지금 내가 사용하는 것이 길을 무너 뜨릴 수 있는지 모르겠습니다.

답변:


39

Entity API 모듈 을 사용하는 것이 큰 도움이되고 코드를 더 읽기 쉽게 만듭니다. 노드의 언어와 필드의 언어가 다를 수 있으므로 위 코드는 항상 작동하지는 않습니다.

엔티티 API 모듈 및 랩퍼를 사용하면 다음 코드를 사용할 수 있습니다.

 $node_wrapper = entity_metadata_wrapper('node', $node);
 $field_val = $node_wrapper->field_test->value();

이것은 방탄이어야합니다. 엔티티 모듈을 사용하는 것에 대한 한 가지 사항은 존재하지 않는 필드에 액세스하려고하면 불쾌한 오류와 통지 및 잘못된 동작 대신 예외가 발생한다는 것입니다.

이것을 피하기 위해 다음과 같이 시도 / 잡을 수 있습니다.

try {
  $field_val = $node_wrapper->field_doesnt_exist->value();
} catch (EntityMetadataWrapperException $e) {
  $field_val = 'default/fallback value';
}

또는 내부적으로 isset()어떤 EntityMetadataWrapper핸들을 사용할 수 있습니까?

$field_val = 'default/fallback value';
if (isset($node_wrapper->field_doesnt_exist)) {
  $field_val = $node_wrapper->field_doesnt_exist->value();
}

이 기능 entity_metadata_wrapper()은 더 이상 사용되지 않습니까? 필자는 모듈에서 이것을 호출하려고 시도 Fatal error: Call to undefined function entity_metadata_wrapper()했으며 Dreamweaver의 Drupal 7.12 설치에서 소스 검색을 수행했으며 코드의 다른 곳에서 0 개의 결과를 얻었습니다!
Aditya MP

1
aditya-이것은 엔티티 API 모듈에 있으며 코어에는 없습니다.
lazysoundsystem

1
@adityamenon 게으른 것처럼 이것은 핵심이 아니지만 ... Drupal 8 일 것입니다. 엔티티 API는 적어도 크게 향상 될 것입니다. Drupal 7의 엔터티 시스템에 필요한 모든 API를 만들 시간이 없었기 때문에 엔터티 API 모듈이 달성하려고하는 것입니다.
googletorp

감사합니다, 나는 대답을 제대로 읽고 Entity API 프로젝트 페이지에 대한 링크를 따르지 않는 바보였습니다 :)
Aditya MP

1
entity_metadata_wrapper의 소스 코드를 살펴보고 인스턴스화 및 확장 된 모든 클래스를 통해 토끼 트레일을 따라 가면 더 쉽게 필드 조작이 가능 해지면 가치가 있는지 궁금합니다. 부트 스트랩에 다른 3k + 코드 줄을 추가하고 모든 변수 할당을 처리하기 위해 더 많은 메모리를 차지합니다 ... 더 가벼운 것이 있습니까? $node->field_name[LANGUAGE_NONE][0]['value'] = 'foo';실제로 가장 효율적인 방법 인 것 같습니다 .
Charlie Schliesser 2016 년

19

읽기 위해서는 항상 field_get_items () 를 사용할 수 있어야 합니다.이 언어는 올바른 언어를 선택하고 필드에 값이 있는지 확인합니다.

불행히도, 필드 API는 7.x에서 매우 제한되어 있습니다. 예를 들어 첫 번째 필드 항목을 얻는 방법이 없으며 단일 함수 호출로 값을 얻는 것에 대해 감히 묻지 않아도됩니다 ... 그리고 field_set_items ( ) 대응.

예, 엔티티 API 모듈 훨씬 더 많은 API를 제공하여 상당히 많은 오버 헤드를 제공합니다 (기본적으로 모든 단일 값을 수많은 중첩 된 속성 정보 배열이 첨부 된 래퍼 객체로 변환합니다). 엔터티 래퍼를 덤프하려고하면 일반적으로 읽을 수없는 배열이 없거나 벽이 생깁니다.


1
Drupal 8에서 이러한 종류의 기능이 향상 될 수 있다는 말을 들으면서 그렇다면 이러한 종류의 일이 어떻게 진행되고 있는지 알아내는 방법은 무엇입니까? 모듈 페이지를 제외하고는 나에게 미로와 같습니다! :)
Clive

1
글쎄, 항상 희망이 있습니다 :) 그리고 Drupal 8에서 진행중인 일에 대한 높은 수준의 개요조차도 유지하기가 어렵습니다. 한 가지 방법은 이니셔티브를 따르는 것입니다. 그러나 이것은 기존 지침의 직접적인 목표는 아닙니다. 엔티티 API 모듈의 일부가 코어로 이동 / 이동되고 있습니다 (지금 엔티티 클래스가 있으며 기존 엔티티가 새 시스템으로 변환 됨). 따라서 필드를 처리하기 위해 해당 클래스에서 직접 메소드를 가져올 가능성이 있습니다. 커밋 된 변경의 경우 새 변경 기록 시스템이 좋은 자원입니다 ( drupal.org/list-changes/drupal 참조) .
Berdir

훌륭합니다. 바로 제가 찾던 것입니다. 정말 고마워요! :) 당신이 내 사이트에 대한 주제가 아니라는 것을 알고 내 질문에 신경 쓰지 않기를 바랍니다 ... 핵심에 기여하고 싶지만 오픈 소스에 결코 관여하지 않았 으면합니다. 조금 어려워 ... 시작하기 좋은 곳이 좋네요 :)
Clive

Clive : drupalofficehours.org를 확인하십시오 . 사람들이 기여를 시작하는 데 도움이됩니다. 더 많은 자료가 있습니다. 또한 핵심 개발자가 자주 또는 핵심 개발자가 될 DrupalCamp 인 사용자 그룹 회의에 참석하는 것이 좋습니다. groups.drupal.org에서 지역 그룹을 찾아서 해결할 수 있어야합니다. drupical.org 도 유용 할 수 있습니다.
wizonesolutions 2016

-2
$node = node_load($lot_id);
$field_language = field_language('node', $node, 'field_name');
$node->field_name[$field_language][0]['value'] = $custom_value;

이것이 왜 질문에 대답하는지에 대한 간단한 설명을 추가 할 수 있습니까?
무료 Radical
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.