【发布时间】:2020-11-25 14:34:54
【问题描述】:
我为 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']);
}
【问题讨论】:
-
你有控制器吗?这个查询在哪里执行?
-
应该可以。由于
distance是浮动的,也许Extbase 只是挑剔你的setter 声明了string? (更改该 phpdoc 后清除系统缓存...) -
我赞同@JonasEberle 所说的话。必须完全按照您刚刚尝试的方式进行,我能看到的唯一区别是 setter/getter 一直是浮动的,包括属性的默认值定义(对于浮动应该是 0.0 而不是 '')
-
另外我的 TCA 看起来像这样 ` 'radius' => [ 'config' => [ 'type' => 'passthrough', ], ],` 并且数据库中没有 SQL 字段桌子。整个领域是纯虚拟的
-
@Waldgeist 就是这样。这是TCA。我完全忘记了。非常感谢!
标签: mysql model typo3 repository extbase