2015-04-14 2 views
1

Я пытаюсь получить фильтр ветви, который будет сортировать сущности по количеству баллов. Мой класс Город получил атрибут оценка с добытчиками и сеттеров, и я создал это расширение:Статический вызов на ветке фильтра

<?php 

namespace AOFVH\HomepageBundle\Twig; 
use Twig_Extension, Twig_SimpleFilter, Twig_Environment; 

class ScoreExtension extends \Twig_Extension 
{ 
public function getFilters() 
{ 
    return array(
     $filter = new Twig_SimpleFilter('score', array('AOFVH\FlyBundle\Entity\City', 'getScore')) 
    ); 
} 

public function getName() 
{ 
    return 'score_extension'; 
} 
} 

, который я называю так:

 {% for cit in cities|score %} 
     <a href="{{ path('aofvh_city', {'name': cit.name}) }}"> 
     <div class="col-lg-4 col-md-12" style="margin-bottom:10px;"> 
     <img src="{{ asset('Cities/'~cit.name~'.png') }}" class="img" alt="Cinque Terre" width="300" height="300"> 
     <h2>{{cit.name}}</h2> 
     </div> 
     </a> 

     {% endfor %} 

Но по какой-то причине, я не могу получить его визуализации, а I git эта ошибка

ContextErrorException: Runtime Notice: call_user_func_array() expects parameter 1 to be a valid callback, non-static method AOFVH\FlyBundle\Entity\City::getScore() should not be called statically 

Я что-то пропустил?

+0

Вы хотите пойти получить счет города в шаблоне веточки? вы можете показать нам вызов фильтра в вашем шаблоне, пожалуйста, – Med

+0

Я только что добавил свой звонок –

+0

Я, вероятно, что-то пропустил, но не могу просто сделать '{% для cit в cities.getScore()%}'? – Brewal

ответ

1

Второй аргумент конструктора Twig_SimpleFilter требует наличия callable.

Если вы передаете ему имя класса и имя метода, он будет вызывать этот метод этого класса статический:

array('SomeClass', 'someMethod')

Если вы, вместо этого, передать ему экземпляр класса и методы имя, оно будет вызывать этот метод внутри объекта:

array($this->someInstance, 'someMethod')

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

+0

Огромное вам спасибо! –

0

Вам нужно будет сделать что-то вроде этого, используя фактическую переменную, которая будет отфильтрована. Здесь, я думаю, что cities это коллекция:

class ScoreExtension extends \Twig_Extension 
{ 

    public function getFilters() 
    { 
     return array(
      $filter = new Twig_SimpleFilter('score', array($this, 'getCityScore')) 
     ); 
    } 

    public function getCityScore($cities) 
    { 
     $scores = array(); 

     foreach ($cities as $city) { 
      $scores[] = $city->getScore(); 
     } 

     return $scores; 
    } 

    public function getName() 
    { 
     return 'score_extension'; 
    } 

} 
Смежные вопросы