Twig: الوصول الديناميكي إلى خصائص الكائن

تم إنشاؤها على ٥ أبريل ٢٠١٠  ·  17تعليقات  ·  مصدر: twigphp/Twig

سيعود obj ['prop'] القيمة فقط إذا كانت obj عبارة عن مصفوفة ولا توجد طريقة للحصول على خاصية الكائن إذا كان لدينا اسمها في متغير: سيعود obj [propName] فارغًا

التعليق الأكثر فائدة

بامكانك ان تحاول
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

ال 17 كومينتر

يمكنك استخدام تدوين النقطة الذي سيتحقق من كل من المصفوفات والكائنات ، لذا سيبحث obj.name أولاً عن obj ['name'] ثم obj-> name and last obj-> getName () وهذا موضح أيضًا في التوثيق تحت فرع الغصين للمصممين.

أعتقد أن مشكلة artyv تتعلق بالوصول إلى خصائص الكائن ديناميكيًا بدلاً من مجرد الوصول إلى الإزاحات / الخصائص. انظر رمز المثال الخاص بي.

/* php */
$obj = new stdClass;
$obj->foo = "bar";
$template->render(array('obj, $obj));

/* twig */
{% set prop as "foo" %}
{{ obj.foo }} 
// outputs "bar" 

{{ obj.$prop }} 
// (pseudo-code)
// would compile down to {{ obj.foo }} and output "bar"

jwpage صحيح ، اسم الخاصية ، الذي أحتاج إلى الحصول عليه هو متغير آخر ، لذلك أنا بحاجة إلى ما يعادل كود php هذا:
obj $ -> {$ propName}
لأن $ obj هو كائن بسيط ولا يقوم بتطبيق ArrayAccess

لن يتم تضمين هذه الميزة في Twig. Twig هو نظام قالب ، وليس لغة كاملة الميزات. من الواضح أن الخصائص الديناميكية خارج نطاق Twig.

أعتقد أن مكون المسلسل يمكن استخدامه لتحويل مثيلات stdClass المتداخلة إلى مصفوفات متداخلة.

أعتقد أنه بمجرد طبع فئة stdClass إلى مصفوفة فإنه سيتم تحويلها. لماذا تجعل الأمر أكثر صعوبة مما هو عليه بالفعل :)

[~] php -r '$class = new stdClass;$class->prop = "hejsa";print_r((array) $class);'      
Array
(
    [prop] => hejsa
)

henrikbjorn : نعم ، اكتب أعمال الصب ، لكنها لا تعمل بشكل متكرر وهذا هو السبب في أنني كنت أقترح مكون المسلسل. من الواضح أنه إذا كنت تعرف أنه ليس لديك بنية متداخلة بعمق ، فمن الواضح أنه تم طرحها على مصفوفة وبذلك تكون قد انتهيت.

واجهت نفس المشكلة وقمت بحلها باستخدام مرشح. أعلم أنها ليست الطريقة الصحيحة للقيام بالأشياء ولكنها بالتأكيد تبدو أنظف.

يتلخص الأمر في الأساس في هذا:

function twig_get_filter()
{
    $params = func_get_args();
    $object = array_shift($params);
    $field = implode('', $params);
    return $object->$field;
}

ويمكنك استخدامه كالتالي:

{{ object|get(text, '_', language, '_', type) }}

من الواضح أن الخصائص الديناميكية خارج نطاق Twig.

لماذا ا؟ أحاول تطوير شيء مثل symfony datagrid وأود استخدام شيء مثل هذا:

{# columns #}
{% for name, column in grid.columns %}
<td>{{ column.render(row[name])|raw }}</td>
{% endfor %}

لا أرى أي حل أفضل من تطبيق طريقة مثل Twig_Template :: getAttribute في مجموعة البيانات الخاصة بي. أنا أحب كم هو عالمي.

نظرًا لأنها حالة حافة ولأنه يمكنك بسهولة إنشاء وظيفة تقوم بما تريده بسهولة تامة (لم يتم اختبارها):

function twig_array_get_function($array, $name)
{
    return $array[$name];
}

استعمال:

row|array_get(name)

نعم ، الأمر سهل بالنسبة للمصفوفات. المشكلة هي أنني يجب أن أقوم أيضًا بتنفيذ الوصول إلى حواجز الكائنات وما إلى ذلك والتي تم تنفيذها بالفعل في Twig (ولكن لا توجد طريقة لكيفية استخدام هذا الرمز).

أخبار جيدة! اعتبارًا من 1.2 ، يمكنك الآن الحصول على سمة ديناميكية على متغير عبر الوظيفة attribute (انظر c609060).

من الجيد أن نرى الدعم قد أضيف لهذا. لقد بدأت للتو مع Twig. ما مدى صعوبة تغيير بناء الجملة إلى شيء مثل

{{كائن. {خاصية}}} أو {{كائن. {طريقة} (attrs)}}

أعتقد أنها أنظف قليلاً من {{سمة (كائن ، طريقة ، وسيطات)}}

ربما يمكنك أن توجهني في الاتجاه الصحيح؟ لم أتصفح جميع التعليمات البرمجية المصدر حتى الآن.

@ rspenc29 : لا أريد أن

لا مشكلة. سأجد حلا لها.

ASD مخصص

بامكانك ان تحاول
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات