按第一个字符过滤数据 - Typo3/Extbase 插件

filter data by first character - Typo3/Extbase plugin

我必须制作一个 typo3 扩展,它在下拉菜单中显示街道。 现在我需要在顶部从 A 到 Z 分页。

然后单击这些链接必须过滤掉以相应的 character.i 开头的街道试图在调用
的城市控制器中执行 listByChar 操作 $cities = $this->cityRepository->findByChar();
但我不知道如何将字符作为参数传递.. 我希望可以通过使用 uri viewhelper
(<f:uri.action controller="***" action="***" arguments="{***}" />).

这就是我 show/handle 我 show.html 的街道:

<select onchange="location = this.options[this.selectedIndex].value;">
    <option>Straße auswählen</option>
    <f:for each="{city.streets}" as="street">
        <option value="<f:uri.action controller="Street"  action="show"  arguments="{street : street}" />" >{street.name}</option>
    </f:for>
</select>

这些是我的职能:

/classes/controller/cityController.php

/**
 * action listByChar
 *
 * @return void
 */
public function listByCharAction() {
    $cities = $this->cityRepository->findByChar();
    $this->view->assign('cities', $cities);

}

/classes/domain/repository/CityRepository.php

public function findByChar($char){
    *** I yet didn't figure this part out either :C
}   

如您所料,您可以将 char 作为 uri.action viewhelper 的参数传递。由于您只需要街道名称的第一个字符,因此请使用 f:format.crop

show.html:

<select onchange="location = this.options[this.selectedIndex].value;">
    <option>Straße auswählen</option>
    <f:for each="{city.streets}" as="street">
        <option value='<f:uri.action controller="Street"  action="show"  arguments="{char : \"{street.name -> f:format.crop(maxCharacters: 1, append: '')}\"}" />' >{street.name}</option>
    </f:for>
</select>

在您的控制器中,您可以使用 $this->request->getArgument('char') 获取传递的参数。如果我错了请纠正我,但看起来 streetsCity 相关并且有自己的模型和存储库。因此,在您的城市控制器中注入街道存储库,并在您的街道存储库中使用 findByChar 函数。

/classes/controller/cityController.php:

 /**
 * streetRepository
 *
 * @var \VENDOR\ExtensionName\Domain\Repository\StreetRepository
 * @inject
 */
 protected $streetRepository;

 /**
 * action listByChar
 *
 * @return void
 */
 public function listByCharAction() {
    $streets = $this->streetRepository->findByChar( $this->request->getArgument('char') );
    $this->view->assign('streets', $streets);
 }

/classes/domain/repository/StreetRepository.php:

public function findByChar($char){
    $query = $this->createQuery();
    $query->matching($query->like('name', $char . '%'));
    return $query->execute();
}