Zum Inhalt springen

Fehler bei der Ausgabe eines fe_users mit bestimmter Uid

Erstellt am 3. Dezember 2015 · 3 Antworten · letzte Antwort am 5. Dezember 2015

Tags: Frontend-Benutzer, Frage

Unbekannter Benutzer ·

Hallo Community,

ich bin nun seit ein paar Tagen dabei eine Testextension zu schreiben, mit der man die fe_users auslesen und im Frontend anzeigen kann.

Die List-View funktioniert soweit auch schon und es werden alle Benutzer angezeigt. Das Problem was ich jetzt habe, liegt darin, dass wenn ich in der Listenansicht einen User auswähle und zur Show-Ansicht wechseln möchte, dann kommt der folgende Fehler.

#1297759968: Exception while property mapping at property path ""😮bject with identity "6" not found.

Mein Code sieht wie folgt aus.

Mein Model

/**
 * MyUser
 */
class MyUser extends \TYPO3\CMS\Extbase\Domain\Model\FrontendUser {

	
}

Mein Repository

/**
 * The repository for MyUsers
 */
class MyUserRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {

	/**
	 *
	 * @param int $pid
	 * @return
	 */
	public function findByPid($pid) {
		$query = $this->createQuery();
		$query->getQuerySettings()->setRespectStoragePage(FALSE);
		$query->matching($query->equals('pid',$pid));
		$result = $query->execute();
		return $result;
	}
	
	/**
	 * 
	 * @param int $uid
	 * @return
	 */
	public function findByUid($uid) {
		$query = $this->createQuery();
		$query->getQuerySettings()->setRespectStoragePage(FALSE);
		$query->matching($query->equals('uid',$uid));
		$result = $query->execute();
		return $result;
	}
}

Wie man sieht habe ich hier die Funktionen findByPid und findByUid überschrieben, da ich mit den Standard-Funktionen in der List-View sonst keine Ausgabe erhalten hätte.

Mein Controller

/**
 * MyUserController
 */
class MyUserController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {

	/**
	 * myUserRepository
	 *
	 * @var \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
	 * @inject
	 */
	protected $myUserRepository = NULL;
	
	/**
	 * action list
	 *
	 * @return void
	 */
	public function listAction() {
		$myUsers = $this->myUserRepository->findByPid(36);
		$this->view->assign('myUsers', $myUsers);
	}

	/**
	 * action show
	 *
	 * @param \Xos\XosTester\Domain\Model\MyUser $myUser
	 * @return void
	 */
	public function showAction(\Xos\XosTester\Domain\Model\MyUser $myUser) {
		$this->view->assign('myUser', $MyUser);
	}

}

Meine List-View

<f:layout name="Default" />

<f:section name="main">
<h1>Listing for MyUser</h1>

<f:debug title="Debuginformationen">{myUsers.0}</f:debug>

<f:flashMessages renderMode="div" />

<table  class="tx_xostester" >
	<tr>
		<th> Username </th>
	</tr>

	<f:for each="{myUsers}" as="myUser">
		<tr>
			<td><f:link.action action="show" arguments="{myUser : myUser}"> {myUser.username} </f:link.action></td>
		</tr>
	</f:for>
</table>

</f:section>

Mit dem Debug-Tag erhalte ich auch Informationen zu dem entsprechenden User.

Ich nutze zur Zeit Typo3 Version 6.2.10.

Ich habe gefühlt das halbe Netz durchsucht und nichts gefunden (oder vielleicht habe ich auch einfach falsch gesucht). Hatte jemand von euch dieses Problem schon und konnte es lösen oder hat jemand eine Idee was man da jetzt noch machen könnte?

Vielen Dank schon mal im Voraus

Grüße
Benni

freshman17 ·

Ergänze mal deine setup.txt um folgendes

# object mapping
config.tx_extbase.persistence.classes {
	Xos\XosTester\Domain\Model\MyUser {
		mapping {
			tableName = fe_users
			columns {
			}
		}
	}
}
Unbekannter Benutzer ·

Hallo freshman17,

soweit stand fast alles schon in meinem setup, allerdings stehen diese Werte nicht in der setup.txt sonder in der ext_typoscript_setup.txt.

Hier mal noch zur Einsicht die Inhalte der Dateien.

Meine constants.txt

plugin.tx_xostester {
	view {
		# cat=plugin.tx_xostester/file; type=string; label=Path to template root (FE)
		templateRootPath = EXT:xos_tester/Resources/Private/Templates/
		# cat=plugin.tx_xostester/file; type=string; label=Path to template partials (FE)
		partialRootPath = EXT:xos_tester/Resources/Private/Partials/
		# cat=plugin.tx_xostester/file; type=string; label=Path to template layouts (FE)
		layoutRootPath = EXT:xos_tester/Resources/Private/Layouts/
	}
	persistence {
		# cat=plugin.tx_xostester//a; type=string; label=Default storage PID
		storagePid = 36
	}
}

Meine setup.txt

plugin.tx_xostester {
	view {
		templateRootPath = {$plugin.tx_xostester.view.templateRootPath}
		partialRootPath = {$plugin.tx_xostester.view.partialRootPath}
		layoutRootPath = {$plugin.tx_xostester.view.layoutRootPath}
	}
	persistence {
		storagePid = {$plugin.tx_xostester.persistence.storagePid}
	}
	features {
		# uncomment the following line to enable the new Property Mapper.
		rewrittenPropertyMapper = 1
	}
}

Den CSS-Teil habe ichh ier mal wegelassen, ich denke mal der dürfte irrelevant sein für mein Problem.

Und meine ext_typoscript_setup.txt

config.tx_extbase{
    persistence{
        classes{

            TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
                subclasses {
                    Tx_XosTester_MyUser = Xos\XosTester\Domain\Model\MyUser
					
          		}
            }
            Xos\XosTester\Domain\Model\MyUser {
                mapping {
                    tableName = fe_users
                    columns {}
                    recordType >
                }
            }
            
    	}
    }
}

Ich habe jetzt lediglich noch den Wert columns hinzugefügt. Leider hat das auch nicht den gewünschten Erfolg gebracht.

Wie gesagt mit dem <f:debug> in meinem List-Template erhalte ich die richtigen Informationen zu meinem User und in der for-Schleife werden auch alle User richtig ausgegeben. Sobald ich jedoch einen User anklicke und in die Detailansicht gehen möchte, erhalte ich eine Typo3-Fehler (s.o.).

Woran könnte das noch liegen?

Unbekannter Benutzer · · Beste Antwort

Okay das Problem hat sich gelöst 🙂

Es lag an der Konfiguration des mappings.

Im Endeffekt musste ich vier Änderungen vornehmen.

1. Mapping in der ext_typoscript_setup.txt

Anstatt

recordType >

muss dort stehen

recordType = Tx_XosTester_myUser

Zudem konnten dann die selbstgeschriebenen Funktionen
findByUid
findByPid
entfernt werden.

Zuletzt musste dann noch dere RecordType der entsprechenden User im Backend gesetzt werden.