在存储库中设置模型的虚拟 属性
Setting a virtual property of model in repository
我为 Typo3 创建了一个扩展程序来对零售商进行径向搜索。用户可以搜索一个位置,它会显示该位置附近 10 到 50 公里半径范围内的每个零售商。现在我想显示每个零售商到该位置的距离。因此,我在我的域模型中设置了一个 属性:
/**
* distance
*
* @var float
*/
protected $distance = '';
/**
* Returns the distance
*
* @return float distance
*/
public function getDistance() {
return $this->distance;
}
/**
* Sets the distance
*
* @param string $distance
* @return void
*/
public function setDistance($distance) {
$this->distance = $distance;
}
存储库中的距离是这样计算的:
$query->statement('SELECT uid,pid,name,address,city, (6371 * acos(cos(radians( '.$lat.' )) * cos(radians( lat )) * cos(radians( lng ) - radians( '.$lng.' )) + sin(radians( '.$lat.' )) * sin(radians( lat )))) AS distance FROM tx_abcretailer_domain_model_retailer HAVING distance <= '.$distance.' ORDER BY distance ASC');
return $query->execute();
然后我想像这样在我的流体模板中显示它:
<f:for each="{retailers}" as="retailer">
<tr>
<td class="label">{retailer.name}</td>
<td>{retailer.address}</td>
<td>{retailer.zipcode} {retailer.city}</td>
<td>{retailer.distance} km</td>
</tr>
</f:for>
但这不起作用,我对如何让 属性 工作并向用户显示距离有点迷茫。
编辑:
这也是控制器操作:
public function searchAction(){
$arguments = $this->request->getArguments();
$context = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Context\Context::class);
$this->view->assign("lang", $context->getPropertyFromAspect('language', 'id'));
$retailers = $this->retailerRepository->search($arguments);
$this->view->assign('retailers', $retailers);
$this->view->assign('arguments', $arguments['searchRetailer']);
}
您只需要在您的控制器上定义它:假设用户的位置正在改变,您不需要静态的“当前”位置,因此您必须在呈现列表之前设置距离。
我猜你在某种 listAction 中,所以这里有一个例子:
public function listAction() {
foreach($retailers as $retailer) {
$retailerDistance = $this->retailerRepository->getRetailerDistance($variable1, $variable2, $variable3)
$retailer->setDistance(retailerDistance);
}
}
根据Patricks的反馈,让我们为“后代”构建一个小指南,可能会遇到这个问题post。
如何将数据库查询的虚拟字段自动映射到 TYPO3 模型
- 将虚拟字段添加到具有正确类型的模型中setter/getter
- 将字段作为直通添加到 TCA
- 不要将字段添加到数据库 table 本身
- 在查询中添加带有
as <name>
的字段
我为 Typo3 创建了一个扩展程序来对零售商进行径向搜索。用户可以搜索一个位置,它会显示该位置附近 10 到 50 公里半径范围内的每个零售商。现在我想显示每个零售商到该位置的距离。因此,我在我的域模型中设置了一个 属性:
/**
* distance
*
* @var float
*/
protected $distance = '';
/**
* Returns the distance
*
* @return float distance
*/
public function getDistance() {
return $this->distance;
}
/**
* Sets the distance
*
* @param string $distance
* @return void
*/
public function setDistance($distance) {
$this->distance = $distance;
}
存储库中的距离是这样计算的:
$query->statement('SELECT uid,pid,name,address,city, (6371 * acos(cos(radians( '.$lat.' )) * cos(radians( lat )) * cos(radians( lng ) - radians( '.$lng.' )) + sin(radians( '.$lat.' )) * sin(radians( lat )))) AS distance FROM tx_abcretailer_domain_model_retailer HAVING distance <= '.$distance.' ORDER BY distance ASC');
return $query->execute();
然后我想像这样在我的流体模板中显示它:
<f:for each="{retailers}" as="retailer">
<tr>
<td class="label">{retailer.name}</td>
<td>{retailer.address}</td>
<td>{retailer.zipcode} {retailer.city}</td>
<td>{retailer.distance} km</td>
</tr>
</f:for>
但这不起作用,我对如何让 属性 工作并向用户显示距离有点迷茫。
编辑: 这也是控制器操作:
public function searchAction(){
$arguments = $this->request->getArguments();
$context = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Context\Context::class);
$this->view->assign("lang", $context->getPropertyFromAspect('language', 'id'));
$retailers = $this->retailerRepository->search($arguments);
$this->view->assign('retailers', $retailers);
$this->view->assign('arguments', $arguments['searchRetailer']);
}
您只需要在您的控制器上定义它:假设用户的位置正在改变,您不需要静态的“当前”位置,因此您必须在呈现列表之前设置距离。
我猜你在某种 listAction 中,所以这里有一个例子:
public function listAction() {
foreach($retailers as $retailer) {
$retailerDistance = $this->retailerRepository->getRetailerDistance($variable1, $variable2, $variable3)
$retailer->setDistance(retailerDistance);
}
}
根据Patricks的反馈,让我们为“后代”构建一个小指南,可能会遇到这个问题post。
如何将数据库查询的虚拟字段自动映射到 TYPO3 模型
- 将虚拟字段添加到具有正确类型的模型中setter/getter
- 将字段作为直通添加到 TCA
- 不要将字段添加到数据库 table 本身
- 在查询中添加带有
as <name>
的字段