phalcon: вольт получить значение из массива, ключ которого взят из переменной

В phalcon templating engine volt (который похож на twig) вы можете получить все записи:

{% for product in products %}
    Name: {{ product.name }}
    Description: {{ product.description }}
    price: {{ product.price}}
{% endfor  %}

Итак, в моем сценарии я создаю шаблон crud, который будет использоваться для разных типов моделей. В этом шаблоне я хотел добиться того, чтобы все столбцы в этом представлении не были жестко запрограммированы. Поэтому я сохраняю столбцы, которые хотел показать в массиве (определенный в контроллере и передаваемый в представление):

$cols = ['name','description','price']

В представлении, чтобы он отображал все столбцы:

{% for product in products %}
   {% for col in cols %}
       {{ col }}: {{ product.col }}
   {% endfor  %}
{% endfor  %}

Очевидно, что это приведет к ошибке, потому что в продукте нет "col".

Есть ли решение или альтернатива для этого?

3 ответа

Решение

В то время как я ломал голову над расширением вольт, я нашел более простое решение:

  1. Преобразуйте объект модели в массив. В контроллере: $products->toArray()

  2. Просто, в представлении, чтобы отобразить конкретное значение конкретного ключа из массива: {{ product[key] }}

Проблема решена, хотя, поскольку она теперь не в форме объекта, я не могу получить доступ к свойству объекта с помощью точки, как {{ product.some_field }}вместо {{ product['some_field'] }},

Вы должны использовать функцию readAttribute(): http://forum.phalconphp.com/discussion/1231/volt-access-to-object-property-using-variable

{{ product.readAttribute(col) }}

Другое решение:

В app/config/service.php:

$di->set('volt', function($view, $di) {
    $volt = new VoltEngine($view, $di);
    $volt->setOptions(array(
        'compiledPath' => APP_PATH . 'cache/volt/'
    ));
    $compiler = $volt->getCompiler();
    // Add this filter
    $compiler->addFilter('getAttribute', function ($resolvedArgs, $exprArgs) {
        return vsprintf('%s->{%s}', explode(', ', $resolvedArgs));
    });

    return $volt;
}, true);

И теперь вы можете получить атрибут как в вольт:

product|getAttribute(key)
Другие вопросы по тегам