【问题标题】:Setting a virtual property of model in repository在存储库中设置模型的虚拟属性
【发布时间】: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


【解决方案1】:

根据 Patricks 的反馈,让我们为“未来几代人”构建一个小指南,可能会偶然发现这篇文章。

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

  1. 使用正确的类型 setter/getter 将虚拟字段添加到模型中
  2. 将该字段作为直通添加到 TCA
  3. 不要将字段添加到数据库表本身
  4. 在查询中添加带有as &lt;name&gt; 的字段

【讨论】:

    【解决方案2】:

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

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

    public function listAction() {
       foreach($retailers as $retailer) {
           $retailerDistance = $this->retailerRepository->getRetailerDistance($variable1, $variable2, $variable3)
           $retailer->setDistance(retailerDistance);
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多