Entity_metadata_wrapper () ile bir alan değerini nasıl temizlersiniz?


20

field_fooÜzerinde alan bulunan bir varlığım olduğunu ve bu alanın değerini silmek istediğimizi varsayalım .

Neye geçmeliyim $wrapper->set()?

Denedim NULLve array()her ikisi de bir hata mesajı üretiyor.


1
Aradığınız EntityStructureWrapper::clear()veya EntityValueWrapper::clear()yöntemler belki?
Clive

::clearDoğrudan arama , alanı boş bir değere ayarlamakla eşdeğer değildir, çünkü boş bir değerle arama updateParentyapma biçimini çağırmaz set. Başka şeylerin yanında, updateParentgaranti setter callbackİşletme bilgisine (bkz tanımlanan drupalcontrib.org/api/drupal/... ) denir.
Alice Heaton

Yanıtlar:


24

Sorun, alanınızın veri türüyle uyumlu boş bir değer ayarlamanız gerektiğidir. Bunu yapmazsanız, bir istisna oluşacaktır. Geçme NULLveya array()ne zaman bir dize nedenle bir hata yükseltecektir bekleniyor.

Akılda tutulması gereken bir başka şey de, ilettiğiniz verilerin alanınızın tek bir değer mi, çok değerli bir alan mı yoksa birden çok özelliği olan bir alan mı olduğuna bağlı olacağıdır.

Alanınız tek bir değerse (ve dolayısıyla alanın sarmalayıcısı EntityValueWrapper örneğiyse ) , söz konusu veri türüyle uyumlu boş bir değer atamalısınız . Örneğin, aşağıdaki iki yöntem eşdeğerdir:

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

Bununla birlikte, veri türleri titlealanla uyumlu olmadığından aşağıdaki üç örnek bir istisna oluşturacaktır :

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

Saha birden (örneğin a hem tanımlanmış bir biçimlendirilmiş metin alanı, özellikleri olan bir saha ise valueve formatdolayısıyla mülkiyet) ve bir örneği EntityStructureWrapper ardından array()ya NULLdoğru boş değer olacaktır. Böylece aşağıdakileri yapabilirsiniz:

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

Ancak bu durumda, boş bir dizenin iletilmesi bir hataya neden olur. valueBunun yerine özelliği boş bırakmayı seçmiş olabileceğinizi unutmayın; bu durumda bir dize doğru veri türüdür:

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

Son olarak, alanınız çok değerli bir alansa (ve bu nedenle paketleyiciniz EntityListWrapper örneğiyse ) arrayveya NULLdoğru boş değerlerse ve aşağıdaki üç satır eşdeğerdir:

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

Not: clearYöntemin sarmalayıcılarda çağrılması, alanı boş bir değere ayarlamakla eşdeğer değildir. Alan boş bir değere ayarlandığında , alanın üst sarıcısında EntityMetadataWrapper :: updateParent öğesini çağırır . Bu setter callback, hook_entity_property_info tarafından tanımlananların çağrılmasını sağlar. Aramak clearbunu yapmaz.


1
Alan birden fazla ve gerekliyse, alan boş olamayacağından, olarak array()veya ayarının NULLbaşarısız olabileceğini unutmayın. Bu, $nodeboş bir gerekli alanı programlı olarak kaydedebileceğiniz normal alan atamasından farklıdır (Drupal'ın kendi kullanıcı arayüzü üzerinden kaydetmez). Bu durumda, geçici bir çözümdür array(N); burada N, henüz var olmayan ancak başvurulan bir varlığın kimliğidir. Bu kimlikle kaydedileceğini ve verilerinizin ilişkisel anlamda tartışmalı bir şekilde "bozulduğunu" unutmayın; ancak orada doğru şeyleri (ör. Display Suite veya Panelleri kullanma) yapıyorsanız tema katmanını etkilememelidir.
JP

$w->field_allowed_regions->set(array(null));çok değerli sınıflandırma referans alanım için çalışan tek seçenektir.
İnanılmaz

Benim durumumda tek bir değere sahip bir varlık referans alanı var. Aşağıdakiler benim için çalıştı: $ wrapper-> field_entity_reference-> set (NULL);
Marcos Buarque

3

Ayrıca diğer cevaplar ve yorumlar için alanında birden fazla olması durumunda, ve , gerekli Daha önce belirtildiği gibi olamaz kullanımı

$wrapper->field_example_multiple->set()

$wrapper->field_example_multiple->set(NULL)

ne de olsa $wrapper->field_example_multiple->set(array()),

ancak bunun yerine, tüm değerlerinin alanını temizlemek istiyorsanız aşağıdakileri kullanabilirsiniz:

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

Aslında, bu çoklu değer alanı 'zorunlu' olarak ayarlanmış olsun veya olmasın çalışır ve bu nedenle kodunuzun sağlam olduğundan emin olmak için her zaman bunu kullanmanızı öneririm.

(Tabii ki, alan 'zorunlu' ise, belki de yine de tamamen temizlememelisiniz, ancak kodunuz bunu tüm varlığı veya benzer bir şeyi silmek için bir ön adım olarak yapıyor olabilir, bu nedenle sadece meşru olun.)


`$ Wrapper-> field_example_multiple-> set (dizi (NULL))` kullanıldığında veri dizisinde bir NULL öğesinin bulunmasına neden olacağını unutmayın. Bu yöntem değerleri temizlemez, bunun yerine değerler dizisini tek bir NULLdeğere ayarlar .
Alex Skrypnyk

İyi bir nokta. Sanırım bu bizi gerekli bir değeri silmeme konusundaki düşünceme geri döndürüyor. Muhtemelen bilerek imkansız hale getirilmiştir.
Martin Q

Aslında, zorunlu bir alanın boş olmayan en az bir değeri olmalıdır. Gerekli çok değerli bir alanı sıfırlamak istiyorsanız, yeni değerle üzerine yazmanız yeterlidir. Yani:$product_display->field_product = array($product_id);
Interdruper

2

Diğer yorumlarda listelenen karmaşıklıkların yalnızca zorunlu bir alanla ilgili olduğu görülmektedir. Alan gerekli değilse, bu oldukça basit olmalıdır:

$wrapper->field_foo = NULL;

Alanın özelliklerini kontrol etmek için sarmalayıcıyı kullanabilirsiniz:

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

Bağlama bağlı olarak, aşağıdakileri kullanarak yalnızca bir alanın özelliklerini alabilirsiniz:

$wrapper->getPropertyInfo('field_foo');

1

Bu sorunun başka bir çözümü olabilir EntityMetadataWrapper::clear

$entity_wrapper->field->clear()


EntityMetadataWrapper :: clear yöntemi "korumalı" olarak bildirilir, bu nedenle kodunuzdan çağrılamaz: yalnızca "genel" yöntemlere doğrudan nesnenin dışından erişilebilir.
Interdruper
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.