Zum Inhalt springen

Extbase fe_users auslesen klappt nicht?

Erstellt am 12. Januar 2011 · 27 Antworten · letzte Antwort am 19. Oktober 2012 · Seite 2 von 2

Tags: Frontend-Benutzer, Frage

Eydamos ·

Hi,

es ist eigentlich problemlos möglich andere Tabellen auszulesen.
Ich habe schon zwei Extensions geschrieben die auf andere Tabellen zugreifen.

Am einfachsten ist es wenn man den Extension Kickstarter nutzt und dort dann die Felder anlegt die man nutzen will.
Der Extbase Kickstarter legt alles passend an.
Warscheinlich fehlen bei euch noch irgendwelche Kommentare.
Nach dem erzeugen der Extension muss man nurnoch in der setup.txt das mapping einstellen.

plugin.tx_myext {
	persistence.classes {
		Tx_Myext_Domain_Model_Page {
			mapping {
				tableName = pages
			}
		}
	}
}

Im TCA muss man übrigens nichts eintragen, damit das mapping funktioniert. Das TCA ist nur für die Darstellung/Bearbeitung der Datensätze im Backend.

Ich habe es damit auch geschafft die tx_dam und die static_countries auszulesen wobei man für diese Tabellen eigene Funktionen im Repository braucht, da man auf diese PID's nicht ohne änderung der querySettings zugreifen kann.

oliver_g ·

Hi,

welche Kommentare könnten fehlen?

/*
 * Backend User Object
 */
 class Tx_Profiletool_Domain_Model_BackendUser extends Tx_Extbase_DomainObject_AbstractEntity {

 	/**
	 * User Name:
	 *
	 * @var string $username
	 * @validate Alphanumeric, StringLength(minimum = 4, maximum = 255)
	 */
	protected $username;
	
 	/**
	 * Sets the real name
	 *
	 * @param string $username
	 * @return void
	 */
	public function setUsername($username) {
		$this->username = $username;
	}

	/**
	 * Returns the real name
	 *
	 * @return string
	 */
	public function getUsername() {
		return $this->username;
	}
	
	/**
	 * Real Name:
	 *
	 * @var string $realName
	 * @validate Alphanumeric, StringLength(minimum = 4, maximum = 255)
	 */
	protected $realName;
	
 	/**
	 * Sets the real name
	 *
	 * @param string $realName
	 * @return void
	 */
	public function setRealName($realName) {
		$this->realName = $realName;
	}

	/**
	 * Returns the real name
	 *
	 * @return string
	 */
	public function getRealName() {
		return $this->realName;
	}
	
 }

und hier das Repository:

/**
 * Repository for Tx_Profiletool_Domain_Model_BackendUser
 */
 class Tx_Profiletool_Domain_Repository_BackendUserRepository extends Tx_Extbase_Persistence_Repository {
	
 	/**
 	 * findAll
 	 * 
 	 * @return Tx_Profiletool_Domain_Model_BackendUser
 	 */
 	public function findAll() {
 		
 		//$extbaseFrameworkConfiguration = Tx_Extbase_Dispatcher::getExtbaseFrameworkConfiguration();
		//$pidList = implode(', ', t3lib_div::intExplode(',', $extbaseFrameworkConfiguration['persistence']['storagePid']));
		$query = $this->createQuery();
		$query->statement('SELECT * from be_users where 1');
		return $query->execute();
 	}
 	
	/**
	 * findByUids
	 * 
	 * @return Tx_Extbase_Persistence_ObjectStorage
	 */
	public function findByUids(array $uids=array()) {
		$query = $this->createQuery();
		
		$query->getQuerySettings()->setRespectStoragePage(FALSE);
		$query->matching(	
				$query->in("uid", $uids)
		);
		
		$storage = t3lib_div::makeInstance('Tx_Extbase_Persistence_ObjectStorage');
		
		foreach($query->execute() as $result) {
			$storage->attach($result);		
		}
		
		return $storage;
	}
	
	/**
	 * findByUid
	 * 
	 * @param integer $uid
	 * 
	 * @return Tx_Profiletool_Domain_Model_BackendUser
	 */
 	public function findByUid($uid) {
		$query = $this->createQuery();

		$query->getQuerySettings()->setRespectStoragePage(FALSE);
		$query->matching(	
				$query->equals("uid", $uid)
		);

		return $query->execute();
	}
}

Wie gesagt, ich krieg nur die Ids, das Objekt wird nicht gebaut. Das Mapping habe ich wie in meinem vorherigen Post eingebunden.

Eydamos ·

Hi,

soweit sind die Dateien fehlerfrei.

$storage = t3lib_div::makeInstance('Tx_Extbase_Persistence_ObjectStorage');
 
		foreach($query->execute() as $result) {
			$storage->attach($result);		
		}
 
		return $storage;

Das musst du normal nicht machen $query->execute() liefert schon ein ObjectStorage zurück.

Bleiben also nurnoch zwei Fragen übrig:
1) Woher weißt du, dass du nur die ID zurückgegeben bekommst und nicht das ganze Objekt?
2) Zeig mal bitte deine Controller Classe möglicherweise fehlt da noch die initialisierung des Repositorys oder etwas anderes.

P.S.
du kannst im Setup das mapOnProperty weglassen, wenn du die selben Namen nutzt oder die konvertierung greift.
Beispiel: tx_dam.file_mime_type passt auch ohne mapping wenn deine Property im Model fileMimeType heißt, da Extbase automatisch versucht die _ in CamelCase umzuwandeln fürs mapping.

oliver_g ·

Hi,

Initialisierung im Controller:

/**
	 * backendUserRepository
	 *
	 * @var Tx_Profiletool_Domain_Repository_BackendUserRepository
	 */
	protected $backendUserRepository;

	/**
	 * injectBackendUserRepository
	 *
	 * @param Tx_Profiletool_Domain_Repository_BackendRepository $backendUserRepository
	 * @return void
	 */
	public function injectBackendUserRepository(Tx_Profiletool_Domain_Repository_BackendUserRepository $backendUserRepository) {
		$this->backendUserRepository = $backendUserRepository;
	}

Ja die findByUids-Methode war eh nur experimentell.

Ich habe mir die Daten so angeschaut: t3lib_utility_debug::debug($result->toArray()); // Sonst gibts ja memoryLimit
Und auf die Objecteigenschaften zugreifen geht nicht, weil es nur ein String (eben die Id) ist.

Eydamos ·

Hi also hast du das debugging im repository gemacht?

Bin mir nicht sicher, aber kann sein, das er dort noch nicht das Model baut, sondern erst beim zurückgeben (durch funktionen die beim beenden einer Funktion aufgerufen werden).

Mach das debugging also am besten im controller.
Du hast zwei Möglichkeiten: entweder du nutzt dann die TYPO3 debugging Funktion (wobei ich normal t3lib_div::debug($var, 'comment'); nutze) oder du nutzt den Debugger den ich als Anhang hinzugefügt habe.

Den habe ich mal irgendwo gefunden, ist noch beta und nicht im TER. Da kannst du die Variable direkt übergeben und musst nicht ->toArray() machen. Der Debugger filtert unnütze Sachen raus und entfernt dubletten so das das Array dargestellt werden kann

Tx_ExtDebug::var_dump($var);

Soweit ich das von deinen Codeschnipseln gesehen habe sollte alles korrekt sein. Ich habe nichts anderes gemacht und bei mir geht es.

T3X_ext_debug.t3x
4kB
oliver_g ·

Hi, nein ich hab im Controller mittels debug(...->toArray()) geschaut.

Das beste ist, einfach das Repository links liegen lassen und eigenen (funktionierenden) Datenlayer einbauen...

Eydamos ·

Ne das beste ist es auf jeden Fall nicht. Das hat schon alles seinen Sinn. Und wie gesagt bei mir läuft alles problemlos ich musste nur die setup.txt ändern und fertig. Also hast du irgendwo einen Fehler gemacht.

Zip mal deinen aktuellen stand oder mach ne t3x und schick sie mir mal. Ich bin mir sicher ich find den Fehler wenn ich das im Gesmatbild sehe.

oliver_g ·

Hi, die ExtDebug Extension funktioniert nicht. Es erscheint:

Fatal error: Call to undefined method Tx_Extbase_Reflection_PropertyReflection::setAccessible() in /home/oliver/Entwicklung/PHPLocal/typo3/typo3conf/ext/ext_debug/Classes/Error/Debugger.php on line 155

Wäre natürlich witzlos, wenn die jetzt nur ab PHP 5.3 geht...

oliver_g ·

Ich glaub ich spinn.

Jetzt liefert mir mein ObjectRepository bei einer simplen Anfrage auch nur eine Id des gefundenen Datensatzes zurück. Es scheitert am Aufbau des zugehörigen Domain Objects. Also z.B.:

/**
	 * 
	 * Searches an object or more by a part of a name
	 * @param string $name
	 * 
	 * @return Tx_Extbase_Persistence_QueryResult
	 */
	public function findByPartialName( $name ) {
		$query = $this->createQuery();
		$query->getQuerySettings()->setRespectStoragePage(FALSE);
			
		$query->matching(
				$query->equals('first_name', $name)
				
			
		);
		
		return $query->execute();
	}

Hat jemand schon mal dieses Problem gehabt?

oliver_g ·

Ich nehm meinen vorherigen Post zurück. War mein Fehler.

Ich muss auf bei einem Ergebnis, einen Indexzugriff machen, also z.B.:

$q = $query->execute();

return $q[0];

Solche Fehlerchen passieren häufig, wenn man mit einer (scheinbar) typenlosen Sprache arbeitet, und die IDE keine sauberen Vorgabe bzgl. Typen der Parameter und Rückgabewerte macht.

Gruß

Eydamos ·
oliver_g schrieb

Hi, die ExtDebug Extension funktioniert nicht. Es erscheint:

Fatal error: Call to undefined method Tx_Extbase_Reflection_PropertyReflection::setAccessible() in /home/oliver/Entwicklung/PHPLocal/typo3/typo3conf/ext/ext_debug/Classes/Error/Debugger.php on line 155

Wäre natürlich witzlos, wenn die jetzt nur ab PHP 5.3 geht...

Ja das kann gut sein, da ich schon ne halbe ewigkeit auf PHP 5.3 arbeite fällt mir sowas nicht auf.

oliver_g schrieb

Ich nehm meinen vorherigen Post zurück. War mein Fehler.

Ich muss auf bei einem Ergebnis, einen Indexzugriff machen, also z.B.:

$q = $query->execute();

return $q[0];

Solche Fehlerchen passieren häufig, wenn man mit einer (scheinbar) typenlosen Sprache arbeitet, und die IDE keine sauberen Vorgabe bzgl. Typen der Parameter und Rückgabewerte macht.

Gruß

sofern du keine findOneByProperty() Funktion nutzt bekommst du immer ein ObjektStorage zurück selbst wenn keine oder nur ein Datensatz gefunden wurde.
Willst du immer nur den ersten Datensatz erhalten mach einfach:

return $query->execute()->getFirst();
oliver_g ·

Jo, wahrscheinlich war das auch das "Problem" bei dem Auslesen der BackendUser.
Das Wissen rund um Extbase läppert sich so allmählich zusammen ;-)

Gruß

bberger ·

Ich habs noch nicht ganz begriffen.. was bringt mir dieser recordType und warum funktioniert meine Extension und liefert mir meine Objekte zurück wenn ich diesen auskommentiere, bzw. macht garnix mehr wenn ich den setze?

Ich meine, ich verstehe schon, dass extbase dann nach dem type sucht - aber was bringt mir das aus Entwicklersicht? Also aus welchem Grund möchte ich diese Einschränkung?!

kainobi ·
bberger schrieb

Ich meine, ich verstehe schon, dass extbase dann nach dem type sucht - aber was bringt mir das aus Entwicklersicht? Also aus welchem Grund möchte ich diese Einschränkung?!

Soweit ich weiß, wurde das eingeführt um "Single Table Inheritance" zu ermöglichen. Hab mich aber auch schon extrem daran gestört, weil das einige Sachen sehr umständlich macht. Man findet leider auch nirgendwo so richtig detaillierte Infos darüber...

Edit: siehe z.B. auch hier: #111471