Zum Inhalt springen

suchformular mit mehreren input-feldern

Erstellt am 20. November 2014 · 3 Antworten · letzte Antwort am 21. November 2014

Tags: Frage

npre ·

hallo,

habe mir ein suchformular mit mehreren input feldern gebastelt. es geht darum, dass man in einem terminkalender nach dem namen, dem ort und dann auch noch datum suchen kann. die ausgabe des formulares sieht so aus und funktioniert auch (datum habe ich mal da weg gelassen):

<f:form class="filterForm" method="post" action="list" name="demand" object="{demand}">
        <f:form.textfield property="name" />
        <f:form.select property="ort" options="{terminKalenders}" optionValueField="ort" optionLabelField="ort" prependOptionLabel="bitte wählen" />
        <f:form.submit id="findtermin" value="Termin finden"/>
        <div class="clr"></div>
	</f:form>

nun habe ich im TerminKalenderController.php die listAction wie folgt erweitert:

public function listAction(\Terminkalender\Mwterminkalender\Domain\Model\Demand $demand = NULL, \Terminkalender\Mwterminkalender\Domain\Model\Name $name = NULL) {
	
	 /* load filter contents */ 
	 $this->view->assign('demand', $demand);
	 
	 /* create hotel list */
	 if($demand !== NULL) {
	   $terminKalenders = $this->terminKalenderRepository->findDemanded($demand);
	 }
	 else {
		 
	   $terminKalenders = $this->terminKalenderRepository->findAll();
	 }

	 $this->view->assign('terminKalenders', $terminKalenders);
	      
}

und dann habe ich im ordner model ein Demand.php angelegt:

<?php
namespace Terminkalender\Mwterminkalender\Domain\Model;



class Demand extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
 
	/**
	 * name
	 *
	 * @var string
	 * @validate NotEmpty
	 */
	protected $name = '';
	
	/**
	 * ort
	 *
	 * @var string
	 * @validate NotEmpty
	 */
	protected $ort = '';
	
	/**
	 * Returns the name
	 *
	 * @return string $name
	 */
	public function getName() {
		return $this->name;
	}

	/**
	 * Sets the name
	 *
	 * @param string $name
	 * @return void
	 */
	public function setName($name) {
		$this->name = $name;
	}
	
	
	
	/**
	 * Returns the ort
	 *
	 * @return string $ort
	 */
	public function getOrt() {
		return $this->ort;
	}

	/**
	 * Sets the ort
	 *
	 * @param string $ort
	 * @return void
	 */
	public function setOrt($ort) {
		$this->ort = $ort;
	}

	

} // end of class

und dann im repository TerminKalenderRepository.php folgendes rein gegeben:

namespace Terminkalender\Mwterminkalender\Domain\Repository;

/**
 * The repository for TerminKalenders
 */
class TerminKalenderRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
	
	public function findDemanded(\Terminkalender\Mwterminkalender\Domain\Model\Demand $demand = NULL) {
	  $query = $this->createQuery();
	  $constraints = array(); //to collect all filter constraints

	  if ($demand !== NULL) {
		//name
		if ($name->getName() !== NULL) {
		   $namens = $name->getName();
	    }
	    $constraints[] = $query->like('name', '%' . $namens . '%');
		
		//ort
		if ($demand->getOrt() !== NULL) {
		   $orts = $demand->getOrt();
	    }
	    $constraints[] = $query->like('ort', '%' . $orts . '%');

		if(sizeof($constraints) > 0) {
		   $query->matching($query->logicalAnd($constraints));
		   $terminKalenders = $query->execute();
		   return $terminKalenders;
	   	}
	 }
	
	 return $this->findAll();
	
	}// end findDemanded

	
}

mein problem ist, dass ich, sobald ich beide felder (name und ort) abfrage, ein fehler kommt. sobald ich aber nur 1 (name oder ort als formularefeld und auch im demand.php und repository) abfrage, funktioniert das ganze perfekt und mir wird die liste der terminen entsprechend der suchabfrage ausgegeben.

weiß jemand, wo da der fehler liegt, bzw. was ich bei abfragen von mehreren feldern beachten muss? danke schon für eure hilfe!

lg
npre

Unbekannter Benutzer ·

Welcher Fehler wird dir denn angezeigt ?
Füllst du beide Formular-Felder aus, oder nur eins ?

Mir fällt bei der Sache nur auf, dass du, sofern du nur ein Formularfeld ausgefüllt hast ( sagen wir beispielsweise mal, du hast nur "Ort" ausgefüllt und schickst das Formular ab ),
die Funktion

$constraints[] = $query->like('name', '%' . $namens . '%');

mit $namens aufgerufen wird, und $namens ist in diesem Fall nicht definiert. Eventuell kriegst du da schon deinen Fehler. Ansonsten würde das generierte Statement ja in dieser Art aussehen SELECT ... WHERE NAME LIKE %NULL% AND ...

Da name bei dir nicht leer sein sollte/darf, findest du dann natürlich nichts ( was dann aber nicht in einem Fehler enden dürfte, sondern nur in einer leeren Liste ).

Ich würde an deiner Stelle mal versuchen, die Zeilen 17 und 23 in den Klammernblock der vorhergehenden IF-Abfragen zu verschieben.

Edit:

Ich sehe aber auch gerade, dass du im Repository in Zeile 14 auf $name zugreifen willst. $name ist aber nirgendswo definiert, und du bekommst auch keinen Parameter $name... außerdem verstehe ich nicht, warum deine ListAction ein Objekt vom Typ Name als Parameter erhält. Den Namen übergibst du doch im Demand... ?

Den Parameter $name der ListAction verwendest du zumindest nirgendwo, außer im Repository, und da steht er dir nicht zur Verfügung. Wundert mich, dass das, wenn du es einzeln abfragst, funktionieren soll.

npre ·

hallo,

danke für die antwort und den hinweis. im repository hatte ich den name weil ich alles mögliche probierte, deshalb auch der versuch im controller und überhall halt. ich habe es dank deinem hinweis soweit hinbekommen, dass die suche funktioniert, wenn ich name UND ort eingebe. wenn ich nur den namen oder nur den ort eingebe und das andere inputfeld leer lasse, kommt folgende fehlermeldung: An error occurred while trying to call Terminkalender\Mwterminkalender\Controller\TerminKalenderController->listAction()

meine daten schauen nun so aus - controller.php

    public function listAction(\Terminkalender\Mwterminkalender\Domain\Model\Demand $demand = NULL) {
     
    /* load filter contents */
    $this->view->assign('demand', $demand);
     
    /* create hotel list */
    if($demand !== NULL) {
    $terminKalenders = $this->terminKalenderRepository->findDemanded($demand);
    }
    else {
     
    $terminKalenders = $this->terminKalenderRepository->findAll();
    }
     
    $this->view->assign('terminKalenders', $terminKalenders);
     
    }

repository:

    namespace Terminkalender\Mwterminkalender\Domain\Repository;
     
    /**
     * The repository for TerminKalenders
     */
    class TerminKalenderRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
     
    public function findDemanded(\Terminkalender\Mwterminkalender\Domain\Model\Demand $demand = NULL) {
    $query = $this->createQuery();
    $constraints = array(); //to collect all filter constraints
     
    if ($demand !== NULL) {
		if ($demand->getName() !== NULL) {			
		   $namens = $demand->getName();
		   $constraints[] = $query->like('name', '%' . $namens . '%');
	    }
		
		//ort
		if ($demand->getOrt() !== NULL) {
		   $orts = $demand->getOrt();
		   $constraints[] = $query->like('ort', '%' . $orts . '%');
	    }
	    

		if(sizeof($constraints) > 0) {
		   $query->matching($query->logicalAnd($constraints));
		   $heurigenKalenders = $query->execute();
		   return $heurigenKalenders;
	   	}
	 }
     
    return $this->findAll();
     
    }// end findDemanded
     
     
    }
npre ·

... habe den fehler schon gefunden! @validate NotEmpty bei name und ort gehört weg, weil es sonst ja nicht leer sein darf

	/**
* name
*
* @var string
* @validate NotEmpty -> das gehört weg!
*/
protected $name = '';