фильтровать данные по первому символу - плагин Typo3 / Extbase

1

Я должен сделать расширение 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
}   
Теги:
model-view-controller
typo3
extbase

1 ответ

1
Лучший ответ

Как вы ожидали правильно, вы можете передать символ в качестве аргумента в 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();
}  
  • 0
    Я попытался отредактировать это, чтобы заставить его работать все, что мне нужно ... но все, что мне удалось заархивировать, - это ссылки, ведущие ко мне на белые страницы :( когда я передаю, например, 'A' в качестве аргумента, я не могу отправить его в хранилище напрямую ?
  • 0
    после включения отчетов об ошибках я вижу сообщение «Вызов функции-члена findByChar () для необъекта»
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню