Я должен сделать расширение typo3, которое показывает улицы в выпадающем меню. Теперь мне нужно разбиение на страницы вверху, идущее от А до Я.
Нажав на эти ссылки, вы должны отфильтровать улицы, начиная с соответствующего символа. listByChar
попытался сделать действие listByChar
в контроллере городов, вызывающем $cities = $this->cityRepository->findByChar();
но я понятия не имею, как передать символ в качестве аргумента. Я ожидал, что это будет возможно с помощью браузера uri viewhelper
(<f:uri.action controller="***" action="***" arguments="{***}"/>
).
Вот как я показываю/обрабатываю улицы в своем 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
}
Как вы ожидали правильно, вы можете передать символ в качестве аргумента в url.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();
}