Zum Inhalt springen

Extbase fe_users auslesen klappt nicht?

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

Tags: Frontend-Benutzer, Frage

r0n ·

Hallo Leute,

ich habe mir ein wenig selbst geholfen und bin ein Stück weiter gekommen:
Jedoch habe ich ein weiteres Problem:

In meiner Tabelle soll unter der Spalte 'page' die uid der gespeicherten Seite erfasst werden.

Lasse ich mir das Objekt direkt vor der Datenübergabe add() ausgeben bekomme ich folgendes:

Tx_Myext_Domain_Model_Collection Object
(
    [cookie:protected] => 79b4b6f0b7016f4fc5618e63cee2f8c3
    [sorting:protected] => 
    [page:protected] => Tx_Myext_Domain_Model_Page Object
        (
            [title:protected] => Content
            [uid:protected] => 21
            [_localizedUid:protected] => 21
            [_languageUid:protected] => 
            [_isClone:private] => 
        )

    [last:protected] => 
    [uid:protected] => 
    [_localizedUid:protected] => 
    [_languageUid:protected] => 
    [_isClone:private] => 
)

Sprich, er hat die ausgewählte Seite als Objekt. Leider wird die Uid der Seite, nicht in der DB gespeichert.?!

Ich habe mir nun mehrere Extensions angeschaut, jedoch konnte ich keinen Fehler entdecken. Muss ich eventuell noch was im TS oder im TCA ändern?

Für eine Hilfe wäre ich dankbar.

sunixzs ·

N'Abend,

ein kleiner Hinweis am Rande, damit man sich nicht möglicherweise den Wolf nach einem Fehler absucht:

Beim FE-User-/FE-Group-Datensatz unter "Erweitert -> Datensatztyp" "Tx_Extbase_Domain_Model_FrontendUser" auswählen.

Extbase schaut erst, ob "$TCA['fe_groups']['ctrl']['type']" gesetzt ist. Wenn nicht, wird dieser und der "fe_users" Wert auf "tx_extbase_type" gesetzt. Zusätzlich wird das TCA geändert, damit man obiges Auswahl-Feld im Datensatz bekommt.

Gesehen hatte ich das nicht im Backend, sondern erst, als ich nach stundenlangem Testen und Fehlersuche die Extension Extbase durchforstet habe und in ext_tables.php fündig wurde.

Kennt jemand den Grund, dass Extbase erst Zugriff auf die Users/Groups bekommt, nachdem ein Redakteur dies im Datensatz ändert? Kann man das irgendwie übergehen? Ich stelle mir gerade vor, dass alle alten User und Groups geändert werden müssen, wenn eine Extbase-Extension mit User/Group-Zugriff in die Typo3-Installation einzug hält. Für neue User/Groups könnte man den Wert im BE-User-TS voreinstellen:

# TCAdefaults.TABELLE.SPALTE = WERT
TCAdefaults.fe_users.tx_extbase_type = Tx_Extbase_Domain_Model_FrontendUser
TCAdefaults.fe_groups.tx_extbase_type = Tx_Extbase_Domain_Model_FrontendUserGroup

Schönen Abend

sun

typonewbe ·
r0n schrieb

Hallo,
ich habe leider gleiches Problem. Nur versuche ich Daten aus der pages Tabelle zu lesen.

Model:

<?php

class Tx_Myext_Domain_Model_Page extends Tx_Extbase_DomainObject_AbstractValueObject {

	/**
	*
	* @var string
	* @validate NotEmpty
	*/

	protected $title;	

	/**
	* Getter for title
	* @return string title
	*/
	public function getTitle() {
		return $this->title;
	}	

}

?>

Repo:

<?php
class Tx_Myext_Domain_Repository_PageRepository extends Tx_Extbase_Persistence_Repository {

}

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

Durch

$this->pageRepository->findAll();

Müsste ich doch alle Seitentitel bekommen oder nicht?

Könnte mir da jemand helfen, oder vielleicht einen Link geben, wo das Mapping auf andere Tabellen vom Start bis Ende beschrieben ist?

Ich bin für jede Hilfe dankbar.

Hallo bist du schon weiter bzw. hast eine Lösung?
Hab abgesehen von fe_users nicht wieder damit gearbeitet.
Mir aber mal meine pages angesehen.
dort gibt es kein Feld recordType also wird das wahrscheinlich so nicht klappen denke mal du müsstest das Feld noch zu pages hinzufügen und dann bei jeder Seite diesen RecordType auswählen.
Desweiteren müsstes du vielleicht

$TCA['fe_users']['columns']['tx_extbase_type']['config']['items'] = "Tx_MyExt_FeUserModel"

dort dein Page Model eintragen.
PS: hab absichtlich fe_users dringelassen weil ich dort mein Model definiert habe
Also auf Pages um bauen.
Eventuell hilft das weiter

Gruß typonewbe

typonewbe ·
r0n schrieb

Hallo,
ich habe leider gleiches Problem. Nur versuche ich Daten aus der pages Tabelle zu lesen.

Model:

<?php

class Tx_Myext_Domain_Model_Page extends Tx_Extbase_DomainObject_AbstractValueObject {

	/**
	*
	* @var string
	* @validate NotEmpty
	*/

	protected $title;	

	/**
	* Getter for title
	* @return string title
	*/
	public function getTitle() {
		return $this->title;
	}	

}

?>

Repo:

<?php
class Tx_Myext_Domain_Repository_PageRepository extends Tx_Extbase_Persistence_Repository {

}

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

Durch

$this->pageRepository->findAll();

Müsste ich doch alle Seitentitel bekommen oder nicht?

Könnte mir da jemand helfen, oder vielleicht einen Link geben, wo das Mapping auf andere Tabellen vom Start bis Ende beschrieben ist?

Ich bin für jede Hilfe dankbar.

Hallo bist du schon weiter bzw. hast eine Lösung?
Hab abgesehen von fe_users nicht wieder damit gearbeitet.
Mir aber mal meine pages angesehen.
dort gibt es kein Feld recordType also wird das wahrscheinlich so nicht klappen denke mal du müsstest das Feld noch zu pages hinzufügen und dann bei jeder Seite diesen RecordType auswählen.
Desweiteren müsstes du vielleicht

$TCA['fe_users']['columns']['tx_extbase_type']['config']['items'] = "Tx_MyExt_FeUserModel"

dort dein Page Model eintragen.
PS: hab absichtlich fe_users dringelassen weil ich dort mein Model definiert habe
Also auf Pages um bauen.
Eventuell hilft das weiter

Gruß typonewbe

typonewbe ·
r0n schrieb

Hallo,
ich habe leider gleiches Problem. Nur versuche ich Daten aus der pages Tabelle zu lesen.

Model:

<?php

class Tx_Myext_Domain_Model_Page extends Tx_Extbase_DomainObject_AbstractValueObject {

	/**
	*
	* @var string
	* @validate NotEmpty
	*/

	protected $title;	

	/**
	* Getter for title
	* @return string title
	*/
	public function getTitle() {
		return $this->title;
	}	

}

?>

Repo:

<?php
class Tx_Myext_Domain_Repository_PageRepository extends Tx_Extbase_Persistence_Repository {

}

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

Durch

$this->pageRepository->findAll();

Müsste ich doch alle Seitentitel bekommen oder nicht?

Könnte mir da jemand helfen, oder vielleicht einen Link geben, wo das Mapping auf andere Tabellen vom Start bis Ende beschrieben ist?

Ich bin für jede Hilfe dankbar.

Hallo bist du schon weiter bzw. hast eine Lösung?
Hab abgesehen von fe_users nicht wieder damit gearbeitet.
Mir aber mal meine pages angesehen.
dort gibt es kein Feld recordType also wird das wahrscheinlich so nicht klappen denke mal du müsstest das Feld noch zu pages hinzufügen und dann bei jeder Seite diesen RecordType auswählen.
Desweiteren müsstes du vielleicht

$TCA['fe_users']['columns']['tx_extbase_type']['config']['items'] = "Tx_MyExt_FeUserModel"

dort dein Page Model eintragen.
PS: hab absichtlich fe_users dringelassen weil ich dort mein Model definiert habe
Also auf Pages um bauen.
Eventuell hilft das weiter

Gruß typonewbe

oliver_g ·

Hallo,

daran hänge ich auch gerade. Ich schaffe es nicht eine Tabelle (be_users) anzubinden. Ich habe das Mapping in der ext_typoscript_setup so gesetzte:

module.tx_profiletool {
	persistence {
		classes  {
			Tx_Profiletool_Domain_Model_BackendUser {
				mapping {
					tableName = be_users
					recordType = Tx_Profiletool_Domain_Model_BackendUser
					
					columns {
						username.mapOnProperty = username
						realName.mapOnProperty = realName
					}
				}
			}
		}
	}

und das entsprechende BackendUser Object inkl. RepositoryObject angelegt. Ich bekomme leider nix geliefert außer die Ids. Selbst wenn ich die findAll() überschreibe und direkt mit $query->statement abfrage bekomme ich nur Ids. Was mache ich falsch?

Es kann doch nicht so schwer sein, eine andere Tabelle einzubinden. Funktioniert das mittlerweile überhaupt in ExtBase? Oder ist das nur halbherzig implementiert?

Danke
Oliver

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ß