按第一个字符过滤数据 - 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')
获取传递的参数。如果我错了请纠正我,但看起来 streets
与 City
相关并且有自己的模型和存储库。因此,在您的城市控制器中注入街道存储库,并在您的街道存储库中使用 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();
}
我必须制作一个 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')
获取传递的参数。如果我错了请纠正我,但看起来 streets
与 City
相关并且有自己的模型和存储库。因此,在您的城市控制器中注入街道存储库,并在您的街道存储库中使用 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();
}