2014-12-15 3 views
1

Возможно, я полностью ошибаюсь в своей проблеме, но, надеюсь, кто-то поймет мою борьбу и может указать мне в правильном направлении.Пользовательский объект в symfony 2

Я хочу получить некоторые значения из моей сущности Student \ Preference в моей сущности Студент, чтобы я мог загрузить их в Listmapper.

В моей сущности Student я это:

/** 
    * @ORM\OneToMany(targetEntity="Map\Bundle\StudentBundle\Entity\Student\Preference", mappedBy="student") 
    */ 
    protected $status; 

    /** 
    * Get Status 
    * 
    * @param \Map\Bundle\StudentBundle\Entity\Student\Preference $preference 
    * @return string 
    */ 

// When I change $preference to null here I get an error that my instance must be an object of Entity\Student\Preference , but none was given 

public function getStatus(\Map\Bundle\StudentBundle\Entity\Student\Preference $preference = null) 
{ 
    $string = ''; 

    $string .= ($preference->getVoorrangChecked() ? "Declined" : "Accepted"); 
    $string .= "by"; 
    $string .= $preference->getControleur(); 
    $string .= "at"; 
    $string .= $preference->getDateUpdated(); 

    return $string; 
} 

Но почему-то не признает $ предпочтения. Это дает мне эту ошибку:

Error: Call to a member function getPreferenceChecked() on null 

Но в моей сущности Student \ Preference Я, конечно, есть все эти функции. Может ли кто-нибудь указать мне в правильном направлении? Я действительно застрял здесь. Я что-то наблюдаю, что-то забыл?

Это мой listMapper:

protected function configureListFields(ListMapper $listMapper) 
{ 
     $listMapper 
      ->add('remote') 
      ->add('name') 
      ->add('dobformatted', null, array('label' => 'Birthday')) 
      ->add('status'); //Here is where the string generated by getStatus should be 
} 

ответ

1

Вы должны изменить объявление функции для:

public function getStatus(\Map\Bundle\StudentBundle\Entity\Student\Preference $preference)

Добавляя = null в конце вашего параметра, вы делаете Preference опциональный аргумент. Если вы ничего не передадите, значение $preference будет null. Таким образом, в этот момент у вас нет объекта Preference и он не может вызвать функции-члены.

Поскольку ваша функция требует существования объекта Preference, вы не хотите делать его необязательным. Кроме того, когда вы строите строку, я заметил, что у вас нет соответствующего интервала. Вы получите строки, такие как DeclinedbySomethingat2015-01-01 вместо Declined by Something at 2015-01-01. Вы хотите добавить, что в Вы можете также использовать sprintf:.

$string .= ($preference->getVoorrangChecked() ? "Declined" : "Accepted"); 
$string .= " by "; 
$string .= $preference->getControleur(); 
$string .= " at "; 
$string .= $preference->getDateUpdated(); 

или

return sprintf("%s by %s at %s", 
    ($preference->getVoorrangChecked() ? "Declined" : "Accepted"), 
    $preference->getControleur(), 
    $preference->getDateUpdated() 
); 
+0

Привет, спасибо за ваш четкий ответ, но когда я удаляю = null, он дает мне предупреждение, что getStatus() должен быть экземпляром Maps \ Bundle \ StudentBundle \ Entity \ Student \ Preference, не указанным .. – Matheno

+2

Правильно, это то, что ты хочешь. Вам нужно передать объект предпочтения функции, иначе он не будет работать. Ваш вызов должен выглядеть как 'getStatus ($ preference);' –

+0

Хм .. Я так понимаю, но как я могу получить это значение в моем списке, вы можете использовать только поля, объявленные в вашей организации, там? – Matheno

1

Я установил это немного по-другому,

В моей listMapper я добавил:

$listMapper 
      ->add('remote') 
      ->add('name') 
      ->add('dobformatted', null, array('label' => 'Birthday')) 
      ->add('preference', 'string', array('template' => 'StudentBundle:CRUD:list_field_status.html.twig')); 

В моем лице:

/** 
    * @ORM\OneToOne(targetEntity="Map\Bundle\StudentBundle\Entity\Student\Preference", mappedBy="student") 
    * @ORM\OrderBy({"preference_id" = "ASC"}) 
    */ 
    protected $preference; 


/** 
* @param mixed $preference 
*/ 
public function setPreference($preference) 
{ 
    $this->preference = $preference; 
} 

/** 
* @return mixed 
*/ 
public function getPreference() 
{ 
    return $this->preference; 
} 

И в новой веткой для этого поля:

{% if object.preference.getControleur is not null %} 
<td>{{ "%s by %s at %s"| format((object.preference.getPreferenceChecked ? "Declined" : "Accepted") , object.preference.getControleur, object.preference.getDateUpdated|date('Y-m-d')) }}</td> 
{% else %} 
<td>Not checked yet.</td> 
{% endif %} 

Я надеюсь, что это поможет кому-то из один день.