Обновить модель домена за исключением одного свойства в TYPO3 6.2

Я поддерживаю расширение TYPO3, которое управляет внешними пользователями в бэкэнде. Поэтому я расширяю FrontendUserRepository своей собственной моделью. Мое расширение обеспечивает операции CRUD, и у меня есть проблема с обновлением пароля существующих лиц. Идея состоит в том, чтобы обновлять пароль только в том случае, если поле пароля в форме редактирования заполнено, в противном случае (если оно оставлено пустым) значение старого пароля остается в базе данных.

Теперь все работало нормально с TYPO3 4.5, но теперь после обновления до 6.2 пустая строка сохраняется в базе данных при отправке формы редактирования с пустым полем пароля …

Это мое updateAction():

/**
* action update
*
* @param \My\Vendor\Domain\Model\Person $person
*
* @return void
*/
public function updateAction(\My\Vendor\Domain\Model\Person $person) {
// only hash and set password if not empty
if ($person->getPassword() == '') {
// if password was left empty, get current password from database
$oldPerson = $this->personRepository->findByUid($person->getUid());
$person->setPassword($oldPerson->getPassword()));
} else {
$person->setPassword(md5($person->getPassword()));
}

// save updated person to repository
$this->personRepository->update($person);

$this->flashMessageContainer->add('The person data was saved.');
$this->redirect('edit', NULL, NULL, array('person' => $person));
}

Кто-нибудь знает, почему $oldPerson->getPassword() не возвращает текущее значение для поля пароля из базы данных? Или есть другой способ «пропустить» свойство модели домена при обновлении всех других свойств? Странно то, что он работал в TYPO3 4.5 …

1

Решение

Кто-нибудь знает, почему $oldPerson->getPassword() не возвращает текущее значение для поля пароля из базы данных?

Это связано с тем, что Extbase имеет своего рода кэш 1-го уровня: если объект был извлечен из формы один раз, он не будет извлечен во второй раз из базы данных во время того же запроса, но будет возвращен непосредственно из памяти.

Итак, в вашем случае $person Объект выбирается из базы данных 1 раз, когда происходит сопоставление свойств (внутренняя операция Extbase, которая переводит ваши данные POST в экземпляр \My\Vendor\Domain\Model\Person).

Когда вы звоните $this->personRepository->findByUid($person->getUid()); Extbase не выполняет поиск в базе данных, но извлекает объект непосредственно из памяти, что приводит к $oldPerson === $person, И с тех пор $person уже изменил пароль (через данные POST), $oldPerson->getPassword() возвращает также измененное значение.

Возможным решением для этого является получить чистую собственность

Если свойство модели было изменено, но еще не сохранено, почти всегда есть возможность получить исходное значение (например, то, которое существует в дБ). Вы можете использовать _getCleanProperty($propertyName) Метод модели для этого:

$person->setPassword($oldPerson->_getCleanProperty('password')));

По выбору если вы даже не хотите обновления БД password поле, вы можете даже запомнить состояние чистой собственности, который скажет Extbase: не обновлять свойство в db:

$person->_memorizePropertyCleanState('password');

Заметка: после того, как вы запомните состояние объекта, _getCleanProperty() вернет значение, которое было установлено set*() Метод — не оригинальный, присутствующий в БД (в случае, если вы установили другое значение).

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]