Extbase - Objekte handeln

Aus Wikizone
Wechseln zu: Navigation, Suche

Links

Extbase Extensions - Snippets und Glossar

https://typo3.org/api/typo3cms/class_t_y_p_o3_1_1_c_m_s_1_1_extbase_1_1_persistence_1_1_object_storage.html

Zu m:n Verbindungen allgemenin: http://blog.undkonsorten.com/datenbankrelationen-typo3-irre-extension

Objekte abfragen

In m:n Verbindung

$author->getBook()->rewind();
$author->getBook()->current()->getTitle();
// or example with some more functionality
private function getDeviceClassUidFromRma($rma){
	if(count($rma->getMetadevice())){
		$myDevice = $rma->getMetadevice();
		$myDevice->rewind();
		$deviceUid = $myDevice->current()->getDevice()->getDeviceClass()->getUid();
		return $deviceUid;
	}else return false;
}

Objekte erstellen

Wenn das Repository im Controller injected wurde:

$this->miniObjectRepository->add($newMiniObject);
$this->redirect('list');

Kindobjekte erstellen

Hier kann man nicht einfach erstellen sonst ist die Datenbankverbindung zum Elternobjekt nicht vorhanden. Also muß man vorher im View das Mutterobjekt durchschleifen und danach im Controller die Verknüpfung berücksichtigen:

Controller

/**
 * addForm action - displays a form for adding a post
 *
 * @param \Lobacher\Simpleblog\Domain\Model\Blog $blog
 * @param \Lobacher\Simpleblog\Domain\Model\Post $post
 */
public function addFormAction(
        \Lobacher\Simpleblog\Domain\Model\Blog $blog,
        \Lobacher\Simpleblog\Domain\Model\Post $post = NULL) {
    $this->view->assign('blog',$blog);
    $this->view->assign('post',$post);
}

--> Fluid

<f:form action="{action}" object="{post}" name="post" arguments="{blog:blog}" additionalAttributes="{role:'form'}">

--> Controller Wenn man nicht injekten will wie in dem Beispiel muß man über den objectManager gehen um das Elternobjekt (hier den Blog) zu holen.

/**
 * add action - adds a post to the repository
 *
 * @param \Lobacher\Simpleblog\Domain\Model\Blog $blog
 * @param \Lobacher\Simpleblog\Domain\Model\Post $post
 */
public function addAction(
        \Lobacher\Simpleblog\Domain\Model\Blog $blog,
        \Lobacher\Simpleblog\Domain\Model\Post $post) {
    $post->setPostdate(new \DateTime());
    //$this->postRepository->add($post);
    $blog->addPost($post);
$this->objectManager->get(  'Lobacher\\Simpleblog\\Domain\\Repository\\BlogRepository' )->update($blog);
    $this->redirect('show','Blog',NULL,array('blog'=>$blog));
}

Objekte löschen

Kindobjekte in m:n Beziehungen löschen

Über die Annotation @cascade remove im Model werden nur die Beziehungen gelöscht nicht die Kindobjekte. Sollen diese ebenfalls gelöscht werden geht das so: http://www.typo3.net/forum/thematik/zeige/thema/117172/

    $company = $this->companyRepository->findByUid(5);
    $members = $company->getMembers();
    $memberClone = clone $members;
    $members->removeAll($memberClone);
    $this->companyRepository->update($company);
    $this->companyRepository->remove($company);

Manuell persistieren

Normalerweise wird nach Ende einer Action automatisch persistiert. Will man das schon vorher erreichen (um z.b. in der gleichen Action die Änderungen noch anzuzeigen oder wenn man gleich zu einer Detailansicht Action weiterleiten will (dann braucht man die uid) kann man das so machen: http://stackoverflow.com/questions/19588474/typo3-extbase-get-uid-of-non-persisted-object

/**
 * persistence manager
 *
 * @var \TYPO3\CMS\Extbase\Persistence\PersistenceManagerInterface
 * @inject
 */
protected $persistenceManager;

// ...

$this->persistenceManager->persistAll();