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();
}