2016-10-18 15 views
1

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

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

Это мой :

/** 
* 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 ...

ответ

3

Кто-нибудь знает, почему $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: не обновлять свойство в БД:

$person->_memorizePropertyCleanState('password'); 

Примечание: после того, как вы запомните состояние собственности, _getCleanProperty() возвращает значение, которое было задано с помощью метода set*() - не оригинал, присутствующий в db (если вы установили значение differnet).

+0

Спасибо за подробный ответ! Функция '_getCleanProperty()' работает – andreas