首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在存储库中设置模型的虚拟属性

在存储库中设置模型的虚拟属性
EN

Stack Overflow用户
提问于 2020-11-25 14:34:54
回答 2查看 85关注 0票数 0

我为Typo3创建了一个扩展,用于对零售商进行径向搜索。用户可以搜索一个位置,并显示每个零售商在该位置附近的半径从10到50公里。现在我想显示每个零售商到地点的距离。因此,我在域模型中设置了一个属性:

代码语言:javascript
复制
/**
 * 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;
}

存储库中的距离计算如下:

代码语言:javascript
复制
$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();

然后我想把它显示在我的流体模板上,像这样:

代码语言:javascript
复制
<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>

但这不起作用,我有点不知道如何让属性工作,并向用户显示距离。

编辑:这里还有控制器操作:

代码语言:javascript
复制
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']);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-26 07:10:50

根据Patricks的反馈,让我们为“子孙后代”构建一个小小的指南,这可能会在这篇文章上出现问题。

如何将数据库查询的虚拟字段自动化到TYPO3模型

将虚拟字段添加到模型中,类型正确的setter/getter

  • Add将字段添加到TCA,passthrough

  • Don't将字段添加到DB表本身,在查询中添加

  • ,使用as <name>

添加字段

票数 1
EN

Stack Overflow用户

发布于 2020-11-25 15:26:55

您只需要在Controller上定义它:假设用户的位置正在改变,您不需要静态的“当前”位置,因此必须在列表呈现之前设置距离。

我想你是在某种listAction中,所以这里有一个例子:

代码语言:javascript
复制
public function listAction() {
   foreach($retailers as $retailer) {
       $retailerDistance = $this->retailerRepository->getRetailerDistance($variable1, $variable2, $variable3)
       $retailer->setDistance(retailerDistance);
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65006759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档