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


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.