Twig - как изначально отобразить отношения RedBean внутри шаблона? - PullRequest
2 голосов
/ 06 марта 2012

Я пытаюсь заставить Twig Symfony хорошо играть с RedBean .

Я могу отображать данные bean-объекта верхнего уровня, но ни одно из его отношений.

Вот что я имею в виду:

В моем контроллере я вызываю Twig стандартным способом (несколько псевдо-код):

// Controller
$vars = array(
    'people' = R::find('person')
);

return $this->app['twig']->render('index.twig',$vars);

Мои бобы структурированы следующим образом:

PERSON
->id
->first_name
->last_name
->company <-- (this represents a 'company' bean)

COMPANY
->id
->name

Внутри index.twig , я могу легко вывести имя человека вот так ...

{% for person in people %}
    {{person.first_name}}
{% endfor %}

... но я хочу иметь доступ к связанному компоненту компании, как это ...

{% for person in people %}
    **{{person.company.name}}**
{% endfor %}

Как мне сделать это из шаблона веточки, не требуя дополнительной логики контроллера / модели?

Ответы [ 3 ]

4 голосов
/ 06 марта 2012

Это показывает основную проблему:

protected function testQuery()
{
    $persons = \R::find('personx');
    foreach($persons as $person)
    {
        //$person->company;

        if ($person instanceof \ArrayAccess && isset($person['company']))
        {
            echo 'Got Array' . "\n";
        }
        echo get_class($person) . ' ' . $person->name . ' ' . $person->company->name . "\n";
    }
}

То, что происходит, - то, что компания загружается лениво, когда вы делаете $ person-> company.Twig проверяет наличие свойства компании, прежде чем загружать его, и не находит его.Если вы раскомментируете строку $ person-> company, то тест пройден, и все будет хорошо.

Я не видел в RedBeans ничего, что позволяло бы загружать его.Вы можете запустить свой контроллер и просто вызвать $ person-> company для каждого человека.Или вы можете попробовать возиться с Twig_Template :: getAttribute ();Или, может быть, даже использовать запросы и работать с массивами.

1 голос
/ 01 мая 2017

Попробуйте это:

{% for person in people %}
    **{{person.__get('company').name}}**
{% endfor %}
1 голос
/ 09 ноября 2014

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

Я понимаю, что OP не хотел создавать дополнительные функциональные возможности модели, но это решение состоит минимум из 4 строк - так что не так много работы.

Я создал оболочку для моделизатем мой компонент ссылался на связанный компонент в методе open().open() вызывается автоматически, когда R::load() вызывается для связанной таблицы.Таким образом, для ситуации ОП модель будет выглядеть следующим образом:

class Model_Person extends RedBean_SimpleModel{
    public function open(){
        $this->ownCompany;
    }
}

Простая ссылка ownCompany запускает отложенную загрузку, которая теперь позволяет Twig получить доступ к свойству.

...