Zum Inhalt springen

Fluid übergabe von Arguments

Erstellt am 10. Juli 2013 · 9 Antworten · letzte Antwort am 10. Juli 2013

Tags: Fluid, Kategorien, Frage

Halion ·

Hallo Leute,

ich habe eine Frage zu einem Fluid Template:

ich bekomme Kategorien ausgegeben und würde diese gerne an einen weiteren view übergeben.

Allerdings bekomme ich diese nicht ausgelesen...

<f:for each="{categories}" as="wert" key="key">
 	<li>{key} => {wert}</li>
</f:for>
<f:link.action action="view" arguments="{reference:reference, categories:categories}">

In der foreach bekomme ich die Werte ausgegeben, allerdings in der view versuche ich die categories auszulesen und bekomme keine Ausgabe..
Den Parameter reference bekomme ich per {reference} ausgelesen

Im Controller habe ich diese auch assigned mit:

$this->view->assign('references', $references);
$this->view->assign('category', $category);
$this->view->assign('categories', $categories);

Wäre super wenn jemand einen Tip hat!

Gruß
Halion

kainobi ·

Du kannst keine "Collection" (ich nehme mal an dass Deine "categories" entweder ein QueryResult oder ein ObjectStorage sind) als Link-Argument übergeben...

Halion ·

Der link auf hat folgende Parameter im Frontend:

&tx_references_reference[categories][0]=17&tx_references_reference[categories][1]=15&tx_references_reference[categories][2]=36&tx_references_reference[categories][3]=16

Das sieht doch schon so aus als ob die übergeben werden....

kainobi ·

Dann scheitert es wohl am rekonstruieren der Objekte vor dem Action-Aufruf. Kannst Du mal den Code der Ziel-Action inkl. Annotations posten?

Halion ·

Muss ich eigentlich im Controller als Parameter den übergebenen Parameter auch definieren?

Hier die action view:

{namespace ext = Tx_ExtbaseComponents_ViewHelpers}
<f:if condition="{reference}">
	<ext:cache.tag object="{reference}" />
	<div id="slideshow-title" class="slideshow-privat">
	<h1>cat: {categories.3} </h1>
	<f:for each="{categories}" as="cat" key="i">
	<h1>cat: {cat} </h1>
	
	</f:for>
	{categories}
		<h1>{reference}</h1>
		<f:if condition="{category.uid} != never">
				<f:then>
					<h2>{category}</h2>
				</f:then>
		</f:if>
	</div>
</f:if>
KarlKappe ·

Hi,

was kainobi meinte, war nicht das HTML-Template, sondern der PHP-Code in Deiner View-Action. Da musst Du nämlich die übergebenen Parameter entgegennehmen und wieder an das View übergeben.

VG Karl

Halion ·

das ist die action aus dem Controller:
da habe ich den Parameter categories nicht drin...:

	 * Render given reference
	 * @param Tx_References_Domain_Model_Reference $reference
	 * @return void
	 */
	public function viewAction(Tx_References_Domain_Model_Reference $reference, Tx_References_Domain_Model_Category $category=null) {
		$this->setPageTitle($reference->getMetaTitle());
		$this->setPageDescription($reference->getMetaDescription());
		
		
		
		
		$this->view->assign('reference', $reference);
		$this->view->assign('category', $category);
		$this->view->assign('categories', $categories);
	}
Halion ·

und das die vorgelagerte indexview:

public function indexAction(Tx_References_Domain_Model_Category $category=null) {
		if (!$category && $this->request->hasArgument('category')) {
			$category = $this->request->getArgument('category');
		}

		$submitted = $category ? true : false;
		if (!$category) {
			$category = $this->categoryRepository->findByUid(intval($this->settings['categories']['includeUidList']));
		}

		if ($category instanceof Tx_References_Domain_Model_Category) {
			$categories = $this->categoryRepository->findChildren($category);
			$references = $this->referenceRepository->withPagination($this, 'findByCategory', array($category));
			for ($i=0; $i<count($categories); $i++) {
				$categoryObj = $categories[$i];
				if ($categoryObj->getUid() === intval($this->settings['categories']['includeUidList'])) {
					unset($categories[$i]);
					break;
				}
			}

		} else {
			$categories = $this->categoryRepository->findAll();
			$references = $this->referenceRepository->withPagination($this, 'findAll');
		}

		if ($category instanceof Tx_References_Domain_Model_Category) {
			$this->setPageTitle($category->getMetaTitle());
			$this->setPageDescription($category->getMetaDescription());
		}

		$this->view->assign('references', $references);
		$this->view->assign('category', $category);
		$this->view->assign('categories', $categories);
		$this->view->assign('submitted', $submitted);
	}
kainobi ·

Bei deiner viewAction sehe ich 3 Probleme:

1. Du übergibst in der URL "categories", aber in der Action deklarierst du "category"
2. Du übergibst eine Collection von Categories, aber in der Action definierst Du als Typ das Category-Model, was aber keine Collection sein kann
3. Du hast keine @param Annotation (weder für die $category, noch für $categories)

Allerdings weiss ich nicht, wie du das Action-Argument als Collection definieren kannst (habe ich so noch nie gemacht). Wenn Du Glück hast, geht es aber so:

/**
 * Render given reference
 * @param Tx_References_Domain_Model_Reference $reference
 * @param Tx_Extbase_Persistence_ObjectStorage<Tx_References_Domain_Model_Category> $categories
 * @return void
 */
public function viewAction(Tx_References_Domain_Model_Reference $reference, Tx_Extbase_Persistence_ObjectStorage $categories=null) { ... }
Halion ·

Danke für deine Hilfe, allerdings bekomme ich dann die folgende Exception:

#1231178878: Given property name is not of type string.

arrghhhh...🙁