Zum Inhalt springen

List Datensätze sortierbar im FE

Erstellt am 6. September 2012 · 7 Antworten · letzte Antwort am 6. September 2012

Tags: Frage

kjuuze ·

Hallo
(Ich wollte keine alten Leichen ausgraben, darum hier ein neuer Thread)

Ich möchte in der List die Einträge für den Webseitenbenutzer sortierbar machen. Und zwar wie üblich per Click auf den Titel der Spalte. Ich seh da momentan einfach nicht durch. Was ich bisher zusammengetragen habe:

Repository:

public function sortByCol($col) {
		$query = $this->createQuery();
		$query->getQuerySettings()->setRespectSysLanguage(FALSE);
		$query->matching()->setOrderings($col);
		$result = $query->execute();				
		return $result;
	}

Controller listAction:

$arguments = $this->request->getArguments();
$argument = $arguments['sorting'];
$order = explode(':',$arguments['order']);
if($order[1] == 'ASC') {
	$ordering = array($order[0].'' => Tx_Extbase_Persistence_QueryInterface::ORDER_ASCENDING);
} else {
	$ordering = array($order[0].'' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING);		
}
$sorting = $this->fervesRepository->sortByCol($ordering);

List.html:

<f:link.action action="list" arguments="{sorting : ASC}">Spaltentitel</f:link.action>

Ich geh mal davon aus, dass der Link in List.html nicht korrekt ist. Evtl. sind ja noch weitere Fehler zu finden. Wenn mir jemand helfen könnte, wäre ich äusserst dankbar!

Vielen Dank und liebe Grüsse
Markus

Unbekannter Benutzer ·

Abgesehen davon, dass du das Argument ja direkt in der listAction als parameter bekommen kannst:

$arguments = $this->request->getArguments();
$argument = $arguments['sorting'];
$order = explode(':',$arguments['order']);

Woher soll das "order" argument kommen wenn ich unten deinen Link so sehe? Der Link übeträgt ein Argument mit dem Key "sorting" und dem Value "ASC", d.h. $argument wird "ASC" enthalten, aber $order wird leer sein soweit ich sehe...

kjuuze ·

Ookay o.O

Um die Fehlerquellen mal eingrenzen zu können, lasse ich den Link aussenvor und versuche momentan Folgendes:

listAction

/**
  * action list
  *
  * @return void
  */
public function listAction() {
  $fervess = $this->fervesRepository->findAll();
  $this->view->assign('fervess', $fervess);
  $ordering = array('chassis' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING);		
  $this->fervesRepository->sortByCol($ordering);
}

(Repository und Spaltenname stimmen beide. Model nennt sich "Ferves")

Repository

/**
  * Sort by Cols 
  * @param array $col col
  * @return object 
  **/
public function sortByCol($col) {
	$query = $this->createQuery();
	$query->getQuerySettings()->setRespectSysLanguage(FALSE);
	//Sortiert alle angegebenen Spalten
	$query->matching()->setOrderings($col);
	$result = $query->execute();				
	return $result;
}

Die Funktion sortByCol habe ich aus einem alten Thread in diesem Forum kopiert. Ich selbst habe von Extbase momentan noch nicht die grosse Ahnung und verstehe darin nicht alles. Kommt nun die Info vom Kontroller nicht korrekt im Repository an, oder ist was an der Funktion sortByCol faul?

Vielen Dank für jegliche Hinweise ;-)

Unbekannter Benutzer ·

So wie du es jetzt hast wirst du ja niemals rausfinden was passiert.

/**
  * action list
  *
  * @return void
  */
public function listAction() {
  $fervess = $this->fervesRepository->findAll();
  $this->view->assign('fervess', $fervess);
  $ordering = array('chassis' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING);		
  $this->fervesRepository->sortByCol($ordering);
}

Du gibst an dein Template nur die "unsortierte" Liste von findAll() weiter, ob sortByCol irgendwas macht wirst du so niemals feststellen. Versuchs mal so:

/**
  * action list
  *
  * @return void
  */
public function listAction() {
 $ordering = array('chassis' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING);		
  
  $fervess = $this->fervesRepository->sortByCol($ordering);
  $this->view->assign('fervess', $fervess);
 
}

Sollte eine Liste sortiert nach chassis ausgeben.

Im Repository würd ich es auch so machen:

/**
  * Sort by Cols 
  * @param array $col col
  * @return object 
  **/
public function sortByCol($col) {
	$query = $this->createQuery();
	$query->getQuerySettings()->setRespectSysLanguage(FALSE);
	$query->setOrderings($col);				
	return $query->execute();
}

und eigentlich würde ich die Methode umbenennen in findAllAndSortBy($col)

kjuuze ·

Hey! Vielen Dank!!!
Du bist schon mal mein Held des Tages 😃

Jetzt müsste ich ja eigentlich nur noch mit getArguments(); die verschiedenen Links auslesen und in Abhängigkeit davon das Array $ordering befüllen. Hab ich dies geschafft, werde ich den Thread auf gelöst stellen und die Lösung posten.

Besten Dank nochmals! 🙂

MfG
Markus

Unbekannter Benutzer ·

Sowas in der Art:

/**
  * action list
  *
  * @param string $propertyNanme
  * @param boolean $orderAscending
  * @return void
  */
public function listAction($propertyName = 'chassis', $orderAscending = FALSE) {

 $ordering = array($propertyName => ($orderAscending ? Tx_Extbase_Persistence_QueryInterface::ORDER_ASCENDING : Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING);		
 
  $fervess = $this->fervesRepository->sortByCol($ordering);
  $this->view->assign('fervess', $fervess);
 
}
<f:link.action action="list" arguments="{propertyName: 'chassis', orderAscending: 0}">Spaltentitel</f:link.action>

Das würde beim ersten Aufruf die Liste nach Chassis absteigend sortieren. In den Links übergibst du dann "propertyName" und "orderAscending" (da dann 0 oder 1) wie im Beispiel. Das sollte es sein...

kjuuze ·

Ich habe nun eine funktionierende Version. Nun könnte man das aber noch verfeinern. Ich möchte nicht nur nach einer Spalte sortieren können, sondern nach beliebiger. Also müsste ich den Link dynamisch erstellen lassen. Gibt es in Fluid die Möglichkeite den Spaltennamen der Tabelle auszugeben? Mit {ferves.chassis} kriege ich ja den Inhalt der Zelle. Ich möchte aber "chassis" kriegen. Wäre dies möglich, könnte man mit einem Link in folgender Art, nach egal welcher Spalte sortieren, ohne dass man den Code ändern muss:

<f:link.action action="list" arguments="{order : 'ASC', col: {ferves.gibMirMeinenSpaltenNamen} }">-a-</f:link.action>

So würde ich einfach hinter jede Spalte, welche sortierbar sein soll, einen Link für ASC und einen für DESC einfügen. Im Controller könnte man so dann den Spaltennamen für's Ordering direkt aus den Arguments übernehmen. MIr <f:translate... wäre ich sprachabhängig, was ich vermeiden möchte.

Durch dich (Kitsunet) gingen mir heute schon einige Lichter auf, was das MVC-Modell betrifft, danke dir!

kjuuze ·

Das mit dem dynamischen erstellen kann aus meiner Sicht so gar nicht funktionieren. Wenn mich jemand belehren will, kann er dies gerne tun ;-)

Hier die aktuelle Lösung:

listAction:

public function listAction() {		
		$arguments = $this->request->getArguments();
		$col = $arguments['col'];
		$order = $arguments['order'];
		
		if(isset($col) && $order == 'ASC') {
		    $ordering = array($col => Tx_Extbase_Persistence_QueryInterface::ORDER_ASCENDING);
		} elseif (isset($col) && $order == 'DESC') {
		    $ordering = array($col => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING);
		} else {
		    $ordering = array('chassis' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING);
		}	
 
		$fervess = $this->fervesRepository->findAllAndSortBy($ordering);
		$this->view->assign('fervess', $fervess);
	}

Repository:

  /**
    * Sort by Cols 
    * @param array $ordering ordering
    * @return object 
    **/
    public function findAllAndSortBy($ordering) {
	    $query = $this->createQuery();
	    $query->getQuerySettings()->setRespectSysLanguage(FALSE);
	    $query->setOrderings($ordering);				
	    return $query->execute();
	}

Links:

<f:link.action action="list" arguments="{order : 'ASC', col: 'chassis' }">-a-</f:link.action>
<f:link.action action="list" arguments="{order : 'DESC', col: 'chassis'}">-d-</f:link.action>

Vielen Dank und freundliche Grüsse
Markus