2012-07-02 2 views
0

Я пишу свое первое расширение extbase для TYPO3 с вложенными моделями на данный момент.TYPO3 Extbase: Вложенные модели в жидкости

следующие модели существует:

Автор - атрибуты: название и описание

Новости - атрибуты: название, дата, автор

Автор входит в модели новостей, как это

/** 
* @var Tx_Extbase_Persistence_ObjectStorage<Tx_Simplenews_Domain_Model_Author> 
* @lazy 
* @cascade remove 
**/ 
protected $author = 0; 

Отладка в жидкости также работает, но объект автора имеет ключ uuid (например, «000000007d9412bd000000000217f7d0»), который изменяется при каждом запросе.

Я просто хочу показать имя автора в каждой новости. Одно имя.

Так я должен петлевой корыта объект автор, чтобы найти ключ и отобразить имя так:

<f:for each="{oneNews.author}" as="author"> 
    <td>{author.name}</td>` 
</f:for> 

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

<f:for each="{news}" as="oneNews"> 
    <td>{oneNews.author.name}</td> 
</f:for> 

не будет работать.

Заранее благодарен!

+0

У вас есть подходящие геттеры для '$ authors'? Опубликуйте весь класс модели новостей. –

+0

полная версия News.php: https://gist.github.com/f4b8efaac83200454cb6 –

+0

Возможно, вы захотите сравнить свой код с новостным расширением: http://git.typo3.org/TYPO3v4/Extensions/news.git – pgampe

ответ

1

Получил ответ

Я только что обновил следующий код в news.php (модель):

/** 
* @var Tx_Extbase_Persistence_ObjectStorage<Tx_Simplenews_Domain_Model_Author> 
* @lazy 
**/ 
protected $author; 

Конструктора:

public function __construct() { 
    $this->author = new Tx_Extbase_Persistence_ObjectStorage(); 
} 

Getter:

/** 
* @return Tx_Simplenews_Domain_Model_Author 
*/ 
public function getAuthor() { 
    $author = $this->author; 
    $author->rewind(); // rewinds the iterator to the first storage element 
    return $author->current(); // returns the current storage entry. 
} 

сейчас Я могу получить доступ к au имя тора с {oneNews.author.name}

0

Я создал фиктивное расширение новостей, которое перечисляет новости так, как вы этого хотите. См. this git repository. Я не знаю, что пошло не так в вашем случае. BTW, я использовал Extension Builder, чтобы создать расширение и только что изменил шаблон List.html для News.

+0

Я попытался удалить аннотацию '@ lazy' и $ author без инициализации. Но до сих пор не удается напрямую получить доступ к объекту автора. –

+0

Я просто хотел создать расширение без расширителя, чтобы понять extbase. Спасибо за фиктивное расширение, теперь у меня есть ответ. Подождите несколько минут. –

+0

. ИМХО. Соглашение о настройке конфигурации имеет много преимуществ. Однако неосторожные ошибки могут произойти так легко. Вот почему я думаю, что Extension Builder - очень хороший способ начать работу. У вас есть работающий код, в котором вы можете применить свои изменения и получить дополнительную информацию о Extbase/Fluid с каждой настройкой. –

0

Итак, почему вы используете объектStorage для Author в первую очередь? ObjectStorages предназначены для хранения нескольких объектов. Итак, пока в новостях о вашем can not есть два или более авторов одновременно, вам вообще не нужен объектStorage для этого свойства. Тогда вам не нужно просто возвращать первый объект objectStorage через ваш метод getAuthor(). Это, кстати, делает устаревший объект хранилища устаревшим.

Я предполагаю, что в новостях есть только один автор.Попробуйте это:

Новости Модель:

/** 
* @var Tx_Simplenews_Domain_Model_Author 
**/ 
protected $author; 

/** 
* @param Tx_Simplenews_Domain_Model_Author $author 
* @return void 
*/ 
public function setAuthor(Tx_Simplenews_Domain_Model_Author $author) { 
    $this->author = $author; 
} 

/** 
* @return Tx_Simplenews_Domain_Model_Author 
*/ 
public function getAuthor() { 
    return $this->author; 
} 

В вашей Fluid-шаблона вы до сих пор:

{oneNews.author.name} 

Таким образом, просто не использовать objectStorage, если вам не нужно это.

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