2012-04-20 2 views
3

После создания модели и добавить его в хранилище, я хочу, чтобы иметь новый идентификатор для различных целей (создания почты, обновления других полей вне мира Extbase)Как получить идентификатор после сохранения модели ExtBase?

$page = t3lib_div::makeInstance('Tx_MyExt_Domain_Model_Page'); 
$page->setTitle('Hello World'); 
$this->pageRepository->add($page); 

На данный момент $page не получил ID еще нет, uid имеет значение null.

$page->getUid(); // returns null 

Когда он это понял? И как я могу получить во время выполнения?

ответ

3

В ExtBase объекты «управляются». Это означает, что каждая транзакция persistence (добавление/удаление/обновление) просто указывается в базовой логике, но пока не выполняется до соответствующего времени (например, завершения обработки запроса). Таким образом, только потому, что вы добавляете объект в репозиторий, это еще не значит, что он еще добавлен. Это происходит, как только вызывается $persistenceManager->persistAll(), что вам не нужно делать вручную, когда-либо. Дело в том, что ваш объект $page не будет иметь UID, пока он не будет сохранен, и именно поэтому $page->getUid() возвращает null. Look here for a great explanation.

Я подозреваю, что вы пытаетесь сделать что-то вне объекта ExtBase/MVC. По крайней мере, в последний раз я получил null, когда я попытался получить UID объекта, потому что я не работал в рамках соответствующим образом.

Однако, если вы разместите еще какой-нибудь код и дадите нам более полную картину того, чего вы пытаетесь достичь, возможно, мы сможем помочь вам добраться до точки, где у этого объекта есть UID. Например, если вы находитесь в объекте Controller, сообщите нам, какой метод действия вы используете, или если вы находитесь в объекте репозитория, сообщите нам, что вы пытаетесь получить из репозитория, и где/как вы планируете при использовании результатов запроса.

EDIT

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

$this->view->assign('page', $page); 

, а затем на ваш взгляд, вы можете использовать объект страницы в ссылке:

<f:link.action action="show" arguments="{page:page}"> 
    See this page object 
</f:link.action> 

А потом в шоу действия вашего контроллера вы можете показать страницу:

public function showAction(Tx_MyExt_Domain_Model_Page $page) { 
    // Do whatever you need to show the page in the `Show.html` template 
} 

Я действительно только гадать здесь. Если вы можете дать нам более полную картину того, что вы пытаетесь сделать, что ваши действия должны делать, и что-то подобное, мы можем ответить на ваш вопрос немного увереннее.

(Я также предполагаю, что ваш объект страницы не является заменой для обычных страниц TYPO3 и что они совершенно разные. Гораздо проще иметь дело с этими страницами TYPO3 через интерфейсный интерфейс, чем на php уровень.)

+0

После того как я создал эту страницу, я хочу, чтобы отправить ссылку на новую страницу пользователя. К сожалению, ссылка не работает atm. – AdON

+0

Прошу прощения за эту ссылку.Это действительно лучший ресурс для понимания структуры ExtBase. [FLOW3] (http://flow3.typo3.org/documentation/guide.html) похож на ExtBase, но немного более современный. Чтение об этом может быть полезно для общих идей в системе MVC/ORM. – peter

+0

О, спасибо за ваши усилия и по этому вопросу;) Я еще не был достаточно точным, чтобы упомянуть, что я хочу отправить ссылку на новую страницу по электронной почте. – AdON

1

Вы можете вызвать менеджер перманентного явно в контроллере, как этот

#TYPO3 4.x 
$persistenceManager = $this->objectManager->create('Tx_Extbase_Persistence_Manager'); 
$persistenceManager->persistAll(); 

#TYPO3 6.x 
$persistenceManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager'); 
$persistenceManager->persistAll();