我正在尝试从Tx_Extbase_Domain_Repository_FrontendUserRepository运行一个简单的查询。除了findByUid(),我甚至找不到任何工作,甚至连findAll()。
在我的控制器中,我有这个代码似乎有效:
/**
* @var Tx_Extbase_Domain_Repository_FrontendUserRepository
*/
protected $userRepository;
/**
* Inject the user repository
* @param Tx_Extbase_Domain_Repository_FrontendUserRepository $userRepository
* @return void */
public function injectFrontendUserRepository(Tx_Extbase_Domain_Repository_FrontendUserRepository $userRepository) {
$this->userRepository = $userRepository;
}
/**
* action create
*
* @param Tx_BpsCoupons_Domain_Model_Coupon $newCoupon
* @return void
*/
public function createAction(Tx_BpsCoupons_Domain_Model_Coupon $newCoupon) {
...... some code .....
$user = $this->userRepository->findByUid(($GLOBALS['TSFE']->fe_user->user[uid]));
$newCoupon->setCreator($user);
...... some code .....
}
但在另一个函数中我想查找一个用户而不是uid,而是一个名为vipnumber的fe_users列(一个int列),所以我试过
/**
* check to see if there is already a user with this vip number in the database
* @param string $vip
* @return bool
*/
public function isVipValid($vip) {
echo "<br/>" . __FUNCTION__ . __LINE__ . "<br/>";
echo "<br/>".$vip."<br/>";
//$ret = $this->userRepository->findByUid(15); //this works!! but
$query = $this->userRepository->createQuery();
$query->matching($query->equals('vip',$vip) );
$ret = $query->execute(); //no luck
.................
,这也不是
$ret = $this->userRepository->findAll();
一个人如何工作而不是其他工作?在我的设置中,我已经放了 config.tx_extbase.persistence.classes.Tx_Extbase_Domain_Model_FrontendUser.mapping.recordType&gt; 这似乎是fiondByUid工作所必需的,是不是要阻止对方工作?
我正在使用typo3 v 4.5.30和extbase 1.3
由于
答案 0 :(得分:1)
如果$this->userRepository->findByUid(15);
有效,则没有理由$this->userRepository->findAll();
不应该这样做。但是$this->userRepository->findAll();
不返回单个Object而是返回所有对象的集合,因此您必须迭代它们。
如果你向fe_users添加一个列,你必须将它添加到TCA和你的extbase模型(你需要一个getter和一个setter)!之后,您可以在存储库中调用findByProperty($property)
。在您的情况下将是
$user = $this->userRepository->findByVipnumber($vip);
这将返回所有将$ vip设置为Vipnumber的UserObject。如果您只想检查$ vip是否已被使用,可以致电
$user = $this->userRepository->countByVipnumber($vip);
代替。这显然会返回拥有此$ vip的用户数量;
您永远不会在存储库外使用$query = $this->createQuery();
。
要将属性添加到fronenduser模型,您可以创建自己的模型Classes / Domain / Model / FronendUser.php:
class Tx_MyExt_Domain_Model_FrontendUser extends Tx_Extbase_Domain_Model_FrontendUser {
/**
* @var string/integer
*/
protected $vipnumber;
}
添加一个getter和一个setter。现在,您可以像创建模型一样创建自己的FrontendUserRepository并扩展extbase。您在Controller中使用此存储库。现在你几乎就在那里:通过typoscript告诉Extbase,你的模型正在使用fe_users表,一切都应该有效:
config.tx_extbase {
persistence{
Tx_MyExt_Domain_Model_FrontendUser{
mapping {
tableName = fe_users
}
}
}
}
要在存储库中禁用storagePids,您可以在存储库中使用此代码:
/**
* sets query settings repository-wide
*
* @return void
*/
public function initializeObject() {
$querySettings = $this->objectManager->create('Tx_Extbase_Persistence_Typo3QuerySettings');
$querySettings->setRespectStoragePage(FALSE);
$this->setDefaultQuerySettings($querySettings);
}
在此之后,您的查询将适用于所有PID。
答案 1 :(得分:0)
我还没有机会与前端用户合作,所以我不知道在这种情况下是否适用以下内容:
在一个自定义表中,我偶然发现,extbase存储库会自动查看存储在每个条目中的pid,并根据设置的存储pid进行检查(如果未设置,可能还会检查当前的pid)。搜索uid通常意味着您有一个特定的数据集,因此可以在逻辑上忽略其他值的自动检查,这将支持您的体验。我尝试将扩展的存储pid设置为前端用户存储在ts-setup中的位置:
plugin.[replace_with_extkey].persistence.storagePid = [replace_with_pid]