[TYPO3-german] Wie übergebe ich Objekte aus einer Action an eine andere über mehrere Templates?

christian ewigfrost christian-kulozik at gmx.net
Wed Oct 18 14:32:46 CEST 2017


Erst einmal, nicht wundern dass diese Frage etwas naiv klingen mag. Dies ist das erste mal dass ich mit Typo3 arbeite, geschweige denn eine Extension entwerfe.

Zur Problemstellung:

Per Formular lasse ich einen user Objekte einer Klasse ("Appliance" genannt) erzeugen. Diese können mit ihren properties gelistet werden. Durch die "show" Action kann der user sich ein Objekt aus der Liste im Detail ansehen und die zugehörigen Objekte der Klasse "Host" (1-n Relation im Extension Builder gewählt). Das funktioniert wunderbar. Nun soll allerdings anhand dieser Relation der user in der Lage sein per Formular direkt unter der Host Liste, Hosts zu eben dieser "Appliance" hinzuzufügen. Ich kann Host Objekte ohne Relation erzeugen lassen, aber wie kann ich diese Relation zu eben diesem "Appliance" Objekt wählen? Ich weiß dass man mit der attach funktion der Klasse arbeiten muss, aber hierzu muss ich ja eben jenes "Appliance" Objekt an die Action "createhost" übergeben, damit ich die attach() Funktion der Klasse bzw. des Objektes "Appliance" nutzen kann. Wie mach ich das? 

Mein code sieht so aus:

Ich "assigne" das Objekt $appliance an den view des Templates show:


public function showAction(\Cjk\Icingaconfgen\Domain\Model\Appliance $appliance)
    {
        $this->view->assign('appliance', $appliance);
    }



Das Template "show" um die Detailansicht einer Appliance mit Hosts zu generieren... :


<html xmlns:f="......" data-namespace-typo3-fluid="true">
<f:layout name="Default" />

<f:section name="main">
<h1>Single View for Appliance</h1>

<f:flashMessages />
<f:render partial="Appliance/Properties" arguments="{appliance:appliance}" />

<h2>Assigned Hosts</h2>
<table class="tx_icingaconfgen" >
	<tr>
		<th><f:translate key="tx_icingaconfgen_domain_model_appliance.kundeuid" /></th>
		<th><f:translate key="tx_icingaconfgen_domain_model_appliance.ipv4extern" /></th>
		<th><f:translate key="tx_icingaconfgen_domain_model_appliance.ipv4intern" /></th>
		<th><f:translate key="tx_icingaconfgen_domain_model_appliance.sshport" /></th>
		<th>  </th>
		<th>  </th>
	</tr>

	<f:for each="{appliance.hosts}" as="host">
		<tr>
			<td><f:link.action action="show" arguments="{host : host}"> {host.hostid}</f:link.action></td>
			<td><f:link.action action="show" arguments="{host : host}"> {host.kundennummer}</f:link.action></td>
			<td><f:link.action action="show" arguments="{host : host}"> {host.hostname}</f:link.action></td>
			<td><f:link.action action="show" arguments="{host : host}"> {host.ipv4}</f:link.action></td>
			<td><f:link.action controller="Host" action="edit" arguments="{host : host}">Edit</f:link.action></td>
			<td><f:link.action controller="Host" action="delete" arguments="{host : host}">Delete</f:link.action></td>
		</tr>
	</f:for>
</table>
</br>

<h2>Add   Host</h1>

<f:flashMessages /> 

<f:render partial="FormErrors" arguments="{object:Host}" /> 

<f:form action="createhost" arguments="{appliance:appliance}" name="newHost" object="{Appliance, newHost}">
<f:render partial="Host/FormFields" />
	<f:form.submit value="Add new Host" />
</f:form>

<f:link.action action="list">Back to list</f:link.action><br />

</f:section>
</html>



Die Action "createhost" im ApplianceController... Eben an diese Action will ich das zuvor an die view assignete Objekt $appliance wieder übergeben, damit ich mit der Funktion attach() eine Relation zw. $appliance und dem erzeugten Host Objekt bewirken kann:

   public function createhostAction(\Cjk\Icingaconfgen\Domain\Model\Host $newHost)
    {
	$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
	$hostrep = $objectManager->get(\Cjk\Icingaconfgen\Domain\Repository\HostRepository::class);
        	
        $hostx = $this->objectManager->get('Cjk\\Icingaconfgen\\Domain\\Model\\Host');
        $hostx->setHostid($newHost->getHostid());
	$hostx->setKundennummer($newHost->getKundennummer());
	$hostx->setHostname($newHost->getHostname());
	$hostx->setIpv4($newHost->getIpv4());
       
        $hostrep->add($hostx);
	
	$this->forward('show');
       
    }



More information about the TYPO3-german mailing list