entity_metadata_wrapper ()로 필드 값을 지우는 방법은 무엇입니까?


20

필드가있는 엔티티가 있고 field_foo해당 필드의 값을 지우고 싶다고 가정하십시오 .

무엇을 전달해야 $wrapper->set()합니까?

나는 시도 NULL하고 array()둘 다 오류 메시지를 생성합니다.


1
EntityStructureWrapper::clear()또는 EntityValueWrapper::clear()방법 을 찾고 있습니까?
Clive

::clear직접 updateParent호출 set하는 것은 빈 값 으로 호출하는 방식으로 호출 되지 않으므로 필드를 빈 값으로 설정하는 것과 다릅니다 . 무엇보다도, updateParent보장 setter callback속성 정보 (참조에 정의는 drupalcontrib.org/api/drupal/... )라고합니다.
Alice Heaton

답변:


24

문제는 필드의 데이터 유형과 호환되는 빈 값을 설정해야한다는 것입니다. 그렇지 않으면 예외가 발생합니다. 따라서 문자열을 전달 NULL하거나 전달 array()하면 오류가 발생합니다.

명심해야 할 또 다른 사항은 전달하는 데이터가 필드가 단일 값인지, 다중 값 필드인지 또는 여러 속성을 가진 필드인지에 따라 달라진다는 것입니다.

필드가 단일 값이고 필드의 랩퍼가 EntityValueWrapper 의 인스턴스 인 경우 해당 데이터 유형과 호환 되는 빈 값을 지정해야합니다 . 예를 들어 다음 두 가지 방법은 동일합니다.

$wrapper->title = '';
$wrapper->title->set('');

그러나 데이터 유형이 title필드 와 호환되지 않기 때문에 다음 세 가지 예에서 예외가 발생 합니다.

$wrapper->title->set();
$wrapper->title->set(NULL);
$wrapper->title->set(array());

필드가 여러 속성 (예 : a valueformat속성을 모두 정의한 형식화 된 텍스트 필드 )과 EntityStructureWrapper 인스턴스가있는 필드 인 경우 array()또는 NULL올바른 빈 값이됩니다. 따라서 다음을 수행 할 수 있습니다.

$wrapper->field_formatted_text = array();
$wrapper->field_formatted_text = NULL;

그러나이 경우 빈 문자열을 전달하면 오류가 발생했을 것입니다. value대신 속성을 비워 두도록 선택할 수 있습니다 .이 경우 문자열은 올바른 데이터 유형입니다.

$wrapper->field_formatted_text->value = '';

마지막으로, 필드가 다중 값 필드 (따라서 래퍼가 EntityListWrapper 의 인스턴스 인 경우 ) array이거나 NULL올바른 빈 값이면 다음 세 줄은 동일합니다.

$wrapper->field_example_multiple->set();
$wrapper->field_example_multiple = array();
$wrapper->field_example_multiple = NULL;

참고 : clear랩퍼 에서 메소드를 호출하는 것은 필드를 빈 값으로 설정하는 것과 다릅니다. 필드가 빈 값으로 설정 되면 필드의 상위 랩퍼에서 EntityMetadataWrapper :: updateParent 를 호출합니다 . 이를 통해 hook_entity_property_infosetter callback의해 정의 된 사항 이 호출됩니다. 전화 clear는 그렇게하지 않습니다.


1
참고 필드가 다수 인 경우 그 같은 설정이 필요 array()하거나 NULL필드가 비어있을 수 없기 때문에, 실패 할 수 있습니다. 이것은 $node빈 필드를 프로그래밍 방식으로 저장할 수있는 일반적인 필드 할당과 는 다릅니다 (Drupal의 자체 UI를 통해서는 저장되지 않습니다). 이 경우 해결 방법은입니다 array(N). 여기서 N은 존재하지 않지만 참조 된 엔터티의 ID입니다. 이 ID로 저장되므로 데이터가 관계형으로 "파손 된"것입니다. 그러나 올바른 작업을 모두 수행하는 경우 (예 : Display Suite 또는 패널 사용) 테마 레이어에 영향을 미치지 않아야합니다.
JP

$w->field_allowed_regions->set(array(null));다중 값 분류법 참조 필드에서 작동 한 유일한 옵션입니다.
놀라운

제 경우에는 단일 값을 가진 엔티티 참조 필드가 있습니다. 다음은 나를 위해 일했습니다 : $ wrapper-> field_entity_reference-> set (NULL);
Marcos Buarque

3

또한 다른 답변과 의견에 필드가 복수 인 경우, 그리고 , 필요 이전에 언급 한 바와 같이 당신은 할 수 없습니다 사용

$wrapper->field_example_multiple->set()

$wrapper->field_example_multiple->set(NULL)

도도 $wrapper->field_example_multiple->set(array()),

그러나 모든 값의 필드를 지우려면 다음을 사용할 수 있습니다.

$wrapper->field_example_multiple->set(array(NULL));

실제로 이것은 다중 값 필드가 '필수'로 설정되어 있는지 여부에 관계없이 작동하므로 코드를 강력하게 유지하기 위해 항상 이것을 사용하는 것이 좋습니다.

(물론, 필드가 '필수'인 경우 어쨌든 완전히 지워서는 안되지만 코드에서 전체 엔티티 또는 유사한 것을 삭제하기위한 예비 단계로 수행 할 수 있으므로 시간이있을 수 있습니다 합법적이어야합니다.)


`$ wrapper-> field_example_multiple-> set (array (NULL))``을 사용하면 데이터 배열에 NULL 요소가 생깁니다. 이 방법은 값을 지우지 않고 값 배열을 단일 NULL값으로 설정합니다 .
Alex Skrypnyk

좋은 지적. 필요한 값을 지우지 않는 것에 대한 나의 의견으로 되돌아갑니다. 의도적으로 불가능할 수도 있습니다.
Martin Q

사실, 필수 필드에는 null이 아닌 값이 하나 이상 있어야합니다. 필요한 다중 값 필드를 재설정하려면 새 값으로 덮어 쓰십시오. 즉 :$product_display->field_product = array($product_id);
Interdruper

2

다른 의견에 나열된 복잡성은 필수 필드에만 관련이있는 것으로 보입니다. 필드가 필요하지 않은 경우 다음과 같이 간단합니다.

$wrapper->field_foo = NULL;

랩퍼를 사용하여 필드의 특성을 점검 할 수 있습니다.

$properties = $wrapper->getPropertyInfo();
$field_required = !empty($properties['field_foo']['required']);

상황에 따라 다음을 사용하여 한 필드의 속성을 가져올 수도 있습니다.

$wrapper->getPropertyInfo('field_foo');

1

이 문제에 대한 또 다른 해결책은 EntityMetadataWrapper::clear

$entity_wrapper->field->clear()


EntityMetadataWrapper :: clear 메서드는 "protected"로 선언되므로 코드에서 호출 할 수 없습니다. "public"메서드 만 개체 외부에서 직접 액세스 할 수 있습니다.
Interdruper
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.