Bu bunu yapmak için temiz bir yol gibi görünüyor gibi varlık değerlerine erişmek için Entity Metadata Wrapper sınıfları (Drupal 7 varlık modülü tarafından tanımlanan) kullanarak bakıyordum.
Ancak bu biraz garip kılan birkaç şey var. Aşağıdaki field_something
gibi bir alan tanımlayan bir içerik türü için bir sarıcı var varsayalım :
$wrapper = entity_metadata_wrapper('node', node_load($nid));
$value = $wrapper->field_something->value();
Sahip olduğum ilk sorun, elde ettiğim şeyin gerçek bir değer (dize, varlık, vb.), Başka bir meta veri yapısı sarıcısı (alanlar birden çok değere sahip olduğunda) veya bir dizi (ne zaman alanlar birden fazla özelliğe sahiptir).
Bu soruları info()
yöntemi kullanarak cevaplamak için bir yol buldum :
$info = $wrapper->field_something->info();
$is_multi_value = (strpos($info['type'], 'list<') === 0);
$has_multiple_properties = isset($info['property info']]);
Ancak bu pek pratik değildir. Bir alanı önceden tanımını bilmeden kullanmak istediğimde, birkaç durumu dikkate almalıyım. Bu benim kodumu oldukça ağır yapar.
Bununla başa çıkmak için bazı kodlar yazdım:
- Tek bir değer alanı olsa bile, her zaman bir dizi döndürmemizi sağlar;
- Birden çok özellik olduğunda, ilk sütunun değerini döndürün.
Nokta 1 burada arayan tek bir değer alanı olup olmadığını bilmek istemiyorsa, her zaman işe yarayacaktır. Nokta 2 bazı durumlarda çalışır, hepsi değil, uygulandığında uygundur.
İşte kod:
function entity_metadata_simple_values($field) {
$fields = array();
$values = array();
$info = $field->info();
if (strpos($info['type'], 'list<') === 0) {
foreach ($field->getIterator() as $field_iteration) {
$fields[] = $field_iteration;
}
} else {
$fields[] = $field;
}
foreach ($fields as $final_field) {
$ff_info = $final_field->info();
if (isset($ff_info['property info'])) {
$column = reset(array_keys($ff_info['property info']));
$values[] = $final_field->{$column}->value();
} else {
$values[] = $final_field->value();
}
}
return $values;
}
Yani sorum şu: Alan türü bilinmediğinde meta veri sarmalayıcısından değer alma sorununu çözmenin daha basit / daha iyi yolları var mı?