2011-10-10 42 views
22

Có cách nào để cập nhật thuộc tính của đối tượng trong cành không?Cập nhật các thuộc tính đối tượng trong cành

Một đối tượng như sau sẽ được chuyển cho cành:

object 
    property1 
    property2 

Tôi muốn cập nhật property1 như thế này:

{% set object.property1 = 'somenewvalue' %} 

Đoạn mã trên không hoạt động, nhưng là nó có thể làm một cái gì đó như thế này trong cành? Nếu không, có cách nào để viết một phần mở rộng hoặc vĩ mô để làm điều này?

+0

Xin vui lòng bỏ qua câu trả lời của tôi dưới đây, nó rất lạc hậu và không còn là câu trả lời được chấp nhận nữa. Thật không may tôi không thể xóa nó vì nó là câu trả lời được chấp nhận. – rdjs

+0

@rdjs Cảm ơn bạn đã cho tôi biết! Tôi đã đổi câu trả lời được chấp nhận! – F21

+0

Câu trả lời được chấp nhận chỉ hoạt động đối với mảng và băm, không phải đối tượng. – Duane

Trả lời

40

Bạn có thể làm điều đó bởi các đối tượng sáp nhập:

{% set object = object|merge({'property1': 'somenewvalue'}) %} 
+0

+1 cách tuyệt vời để làm điều này. Hoàn hảo cho kịch bản sử dụng duy nhất. – Frizi

+25

'Bộ lọc hợp nhất chỉ hoạt động với các mảng hoặc hashes' – gondo

+0

http://twig.sensiolabs.org/doc/filters/merge.html – Jekis

4

Một cách có thể thiết lập một tài sản là tạo ra một phương pháp trong đối tượng mà thực sự tạo ra các đặc tính mới:

class Get extends StdClass 
    { 

    protected function setProperty($name,$value = null) 
    { 
    $this->$name = $value; 
    } 

    } 
+1

Tôi phải đặt phương thức này là công khai, nhưng nó thực sự là một giải pháp tốt đẹp –

+0

Cái gì? Và làm thế nào trên thế giới mà bạn gọi từ Twig? –

+0

@BrunoSantos 'object.setProperty (" propertyName ", 3)' điều này sẽ đặt/tạo 'propertyName' thành' 3' –

1

tôi đã có cùng một vấn đề trong mẫu trình đơn knp của tôi. Tôi muốn hiển thị một trường thay thế bằng khối label mà không cần sao chép. Tất nhiên đối tượng bên dưới cần setter cho thuộc tính.

{%- block nav_label -%} 
    {%- set oldLabel = item.label %} 
    {%- set navLabel = item.getExtra('nav_label')|default(oldLabel) %} 
    {{- item.setLabel(navLabel) ? '' : '' }} 
    {{- block('label') -}} 
    {{- item.setLabel(oldLabel) ? '' : '' }} 
{%- endblock -%} 
-3
{{ set(object, 'property', value) }} 
+0

chỉ hoạt động đối với yii2 – Ros

0

Nếu tài sản của bạn là mảng (object-> bất động sản [ 'chìa khóa']), bạn có thể làm một cái gì đó như thế này:

{% set arr = object.property|merge({"key":['some value']}) %} 
{{ set(object, 'property', arr) }} 

Đó tương đương với:

this->property['key'][] = 'some value'; 
+0

Bạn đã tiết kiệm thời gian của mình :) –

+1

một lần nữa, chỉ yii2 – certainlyakey

Các vấn đề liên quan