Lưu một giá trị mới với entity_metadata_wrapper vào trường thực thể là một mảng


9

Tôi cần lưu một giá trị mới vào một trường trên một thực thể và tôi đã tự hỏi liệu có thể sử dụng entity_metadata_wrapper hay chỉ có thể đặt giá trị hiện tại?


đây là cách tôi được đặt giá trị $ Wrapper-> vimn_related_subjects-> set (mảng ($ key)); Nhưng nếu tôi muốn thêm một giá trị vào cuối mảng? điều đó có thể không?
Andrew Welch

Bạn đã thử $wrapper->vimn_related_subjects[] = $value;chưa
Clive

Câu trả lời:


31

Khi xử lý các trường đa giá trị, đối tượng trình bao bọc siêu dữ liệu thực thể được liên kết là một phiên bản của EntityListWrapper (Có thể nên duyệt API để xem các phương thức có sẵn. Ngoài ra, lớp này thực hiện giao diện ArrayAccess )

Vì vậy, cách đơn giản nhất để thêm các giá trị mới vào EntityListWrapper là sử dụng toán tử "[]":

$wrapper->field_example[] = $new_value;

Điều này tạo ra một mục mới và gán cho nó giá trị. Với phương thức này, delta (phần bù trong danh sách giá trị) được tạo tự động. Bạn cũng có thể tự đặt bù nếu bạn muốn. Bất kỳ phương pháp nào trong ba phương pháp sau đều tương đương:

$wrapper->field_example[$delta] = $new_value;
$wrapper->field_example->offsetSet($delta, $new_value);
$wrapper->field_example->get($delta)->set($new_value);

Trong cả ba trường hợp, điều này sẽ ghi đè lên các giá trị nếu delta đã tồn tại và tạo một mục mới nếu không.

Bạn cũng có thể trực tiếp thiết lập một mảng giá trị trên chính trường đó. Cả hai phương pháp đều tương đương nhau:

$value = array
  0 => array('property_example' => 'hello'),
  1 => array('property_example' => 'world')
);
$wrapper->field_example = $value;
$wrapper->field_example->set($value);

Tuy nhiên, điều này đòi hỏi bạn phải biết cấu trúc bên trong của trường mà bạn đang gán vì bạn không sử dụng trình bao bọc siêu dữ liệu của trường.

Cuối cùng, bạn có thể làm trống một trường đa giá trị bằng cách đặt nó thành một giá trị trống. Cả ba phương pháp đều tương đương nhau:

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

"EntityMetadataWrapperException: Mảng thuộc tính dữ liệu không xác định. Trong EntityStr structWrapper-> getPropertyInfo ()" Tôi đang thử cách tiếp cận thứ hai của bạn, mặc dù tôi đang nhắm mục tiêu một ngôn ngữ cụ thể. tức là $ Wrapper-> ngôn ngữ ($ lang) -> {$ field} -> set ($ new_array);
AlxVallejo

$w->field_allowed_regions->set(array(null));là tùy chọn bù trừ duy nhất hoạt động cho trường tham chiếu phân loại đa giá trị của tôi.
Không thể tin được vào

3

Tôi thấy rằng

$wrapper->field_example[]->set($new_value);

là một thất bại nghiêm trọng. Nhưng

$wrapper->field_example[NULL]->set($new_value);

đa được phep.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.