Zum Inhalt springen

Repository ruft ungefragt falsche Methode(n) auf.

Erstellt am 10. Oktober 2011 · 1 Antwort · letzte Antwort am 24. Oktober 2011

Tags: Frage

tobla ·

Hallo zusammen

Ich hab einen ziemlich verzwickten Fall. Hoffe, ihr könnt mir weiterhelfen.
Situationsbeschrieb
Ich hab ein Repository für meine 'Entry'-Objekte. Entry besitzt unter Anderem die Attribute 'category', 'street', 'streetNumber', 'postcode', 'city', 'latitude' und 'longitude'.

class Tx_"MyExtension"_Domain_Repository_EntryRepository extends Tx_Extbase_Persistence_Repository {

Das Repository besitzt zwei methoden:

public function findByProperties(Tx_"MyExtension"_Domain_Model_EntryCategory $category = NULL,$name ="", $street ="", $streetNumber ="", $postcode ="", $city="",$includeSubCategories = FALSE) { ... }
public function findByCoordinates($latMin = 46.04, $latMax = 46.86, $longMin = 7.3085, $longMax = 7.5715) { ... }

'findByProperties' gibt alle Entry Objekte zurück, die den angegebenen Parametern entsprechen. 'findByCoordinates' sollte alle Objekte zurückliefern, deren Koordinaten zwischen den min/Max werten liegen (vollständigen Code siehe unten).

Verwendet werden die beiden Methoden im 'SearchController'. Die action 'searchEntryAction' ruft

$this->view->assign('entries',$this->entryRepository->findByProperties($category,$searchValues['name'], $searchValues['street'], $searchValues['streetNumber'], $searchValues['postcode'], $searchValues['city'],true));

mit den Parametern aus dem Suchformular auf. Dies funktioniert soweit korrekt. Auch das SQL Statement stimmt mit der Anfrage überein. (Um das SQL Statement sichtbar zu machen, hab ich in der 'Typo3DbBackend.php' der Methode 'replacePlaceholders' ein 'var_dump($sqlString);' ergänzt - Ich weiss, das ist unschön, aber die einzige Methode, Extbase zum Reden zu bringen...).

Nun das Problem:
Im 'SearchController' gibt es noch eine Methode 'searchPlaceAction', die

$this->view->assign('entries',$this->entryRepository->findByCoordinates($latMin,$latMax,$lngMin,$lngMax));

ausführt. Dabei passiert was ganz komisches: Das 'EntryRepository' ruft 'findByCoordinates' auf, führt den Code in der Methode aus (var_dumps alle i.o.), führt die Datenbankabfrage jedoch nicht aus und ruft 'findByProperties' auf (logischerweise mit leeren Parametern) und gibt entsprechend alle 'Entry' Objekte aus.

Kommentieren ich die Methode 'findByCoordinates' aus, so gibt Extbase beim Ausführen von

$this->view->assign('entries',$this->entryRepository->findByCoordinates($latMin,$latMax,$lngMin,$lngMax));

keinen Kommentar aus, Kommentiere ich jedoch 'findByProperties' aus und führe den gleichen Befehl aus, so wirft Extbase eine Exception.

Extbase ruft hier also aus irgend einem Grund die falsche Methode auf. #angry#
Sieht jemand von euch hier den Wald unter all den Bäumen??

Code

  public function findByCoordinates($latMin = 46.04, $latMax = 46.86, $longMin = 7.3085, $longMax = 7.5715) {
    
   	var_dump('call: findByCoordinates');
 	    	
    	$query = $this->createQuery();
       	
		$querySearch = $query->logicalAnd(
			$query->logicalAnd(
				$query->greaterThan('latitude',$latMin),
				$query->lessThan('latitude',$latMax)
			),
			$query->logicalAnd(
				$query->greaterThan('longitude',$longMin),
				$query->lessThan('longitude',$longMax)
			)
		);
       	
        $queryMatch = $query->matching($querySearch);  
    	return $queryMatch->execute();
    }
   public function findByProperties(Tx_"MyExtension"_Domain_Model_EntryCategory $category = NULL,$name ="", $street ="", $streetNumber ="", $postcode ="", $city="",$includeSubCategories = FALSE) {

   	var_dump('call: findByProperties');
    	$query = $this->createQuery();
    	
       	$querySearch = $query->logicalAnd(
		$query->logicalAnd(
			$query->logicalAnd(
				$query->like('name','%'.$name.'%'),
				$query->like('street','%'.$street.'%')
			)
		),
		$query->logicalAnd(
			$query->logicalAnd(
				$query->like('street_number','%'.$streetNumber.'%'),
				$query->like('postcode','%'.$postcode.'%')
			),
			$query->like('city','%'.$city.'%')
		)
	);
				
	if($category) {
		$queryCategory = $query->equals('category', $category);
		
		if($includeSubCategories) {
			
			$subCategories = $category->getSubCategories();
			
            		foreach($subCategories as $subCategory) {
            			$queryCategory = $query->logicalOR(
            				$queryCategory,
            				$query->equals('category', $subCategory)
				);
            		}	
            	}
         
            	$querySearch = $query->logicalAnd(
            		$queryCategory,
            		$querySearch
           	);
        }
       	
        $queryMatch = $query->matching($querySearch);    	    	
    	return $queryMatch->execute();
    }
tobla ·

Ich hab's gefunden. Manchmal sieht man wirklich den Wald vor lauter Bäumen nicht. Ich hab auf einer Seite zwei Plugins eingebunden und nicht beachtet, dass beide eine Datenbankabfrage machen. entsprechend wird von Beiden 'var_dump($sqlString);' aufgerufen. Dies erweckt den Eindruck, das eine Plugin rufe ungefragt eine Datenbankabfrage ab.

Der Grund für die leere Rückgabe der findByCoordinates-Methode lag an einem Berechnungsfehler der Koordinaten.