2016-10-18 21 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对象是在数据库第一次从属性映射发生时(内部Extbase操作将您的POST数据转换为\My\Vendor\Domain\Model\Person实例)获取的。

当您调用$this->personRepository->findByUid($person->getUid()); Extbase不会进行数据库查找,而是直接从内存中获取对象,从而产生$oldPerson === $person。并且由于$person已经更改了密码(通过POST数据),所以$oldPerson->getPassword()也返回更改后的值。

此问题的可能解决方案是获得净资产

如果模型的属性已更改,但尚未保存有几乎总是以获取原始值(例如,一个可能性,存在于D b)。您可以使用模型的方法_getCleanProperty($propertyName)此:

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

可选如果你甚至不想password场的DB更新,你甚至可以记忆净资产状态,它会告诉Extbase:不要在数据库更新属性:

$person->_memorizePropertyCleanState('password'); 

注意:你记住属性状态后,_getCleanProperty()将返回值,这是由set*()方法设置 - 不是db中的原始数据(如果您设置了不同的值)。

+0

感谢您的详细解答! '_getCleanProperty()'函数正在工作 – andreas