TYPO3 - Обадете се на друго хранилище

Възможно ли е да се извика функция в различни контролери? Трябва да извикам FindByCategoryGrouped($catId) в designRepository.php и getCategories($catId) от categoryRepository.php

public function listAction() {
    $this->settings['flexform']['showCategory'] ? $catId = $this->settings['flexform']['showCategory']:$catId = $this->settings['listView']['showCategory'];
    // print $catId;
    if (!$catId || $this->settings['flexform']['showCategory'] == '-1') {
        $designs = $this->designRepository->findAll(); 
    } else {
        // $designs = $this->designRepository->findByCategory($catId);
        $designs = $this->designRepository->findByCategoryGrouped($catId);  // THIS
        $categories = $this->categoryRepository->getCategories($catId); // THIS
    }
    // indhold forsvinder hvis næste linje slettes
    $this->view->assign('designs', $designs, "L", $GLOBALS['TSFE']->sys_language_uid);
    $this->view->assign('catId', $catId);
    $this->view->assign('categories', $categories);
}

person Jeppe Donslund    schedule 01.11.2013    source източник


Отговори (1)


Можете да инжектирате всяко хранилище на всяко инсталирано разширение extbase. Просто добавете кода за инжектиране на зависимост към вашия контролер. В зависимост от вашата версия на TYPO3 е или:

TYPO3 >= 6.0:

/**
 * @var \Vendor\Extension\Domain\Repository\SomeRepository
 * @inject
 */
protected $someRepository;

Имайте предвид, че анотацията @inject не се представя много добре в сравнение със специален метод за инжектиране. Така че, ако трябва да промените производителността на приложението си и имате много инжекции в контролера си, трябва да помислите за преминаване към методи на инжектиране:

/**
 * @var \Vendor\Extension\Domain\Repository\SomeRepository
 */
protected $someRepository;

/**
 * @param \Vendor\Extension\Domain\Repository\SomeRepository
 */
public function injectSomeRepository(\Vendor\Extension\Domain\Repository\SomeRepository $someRepository) {
  $this->someRepository = $someRepository;
}

TYPO3 = 4.7:

/**
 * @var Tx_MyExtension_Domain_Repository_SomeRepository
 * @inject
 */
 protected $someRepository;

TYPO3 ‹ 4.7

/**
 * @var Tx_MyExtension_Domain_Repository_SomeRepository
 */
 protected $someRepository;

/**
 * Inject SomeRepository
 * @param Tx_MyExtension_Domain_Repository_SomeRepository $someRepository
 * @return void
 */
public function injectSomeRepository(Tx_MyExtension_Domain_Repository_SomeRepository $someRepository) {
  $this->someRepository = $someRepository;
}

Във всеки случай можете да използвате $this->someRepository с всичките му методи в контролера, в който сте инжектирали хранилището.

Редактиране: коригирана печатна грешка.

Редактиране: След като добавите инжектиране на зависимост, трябва да изчистите кеша!

person Daniel    schedule 01.11.2013
comment
Моето listAction в кода по-горе е от designController.php. В този файл трябва ли да добавя /** * (at)var \Vendor\Extension\Domain\Repository\SomeRepository * (at)inject */ protected $someRepository; Или трябва да създам categoryController.php и да го добавя там? - person Jeppe Donslund; 01.11.2013
comment
Не е необходимо да създавате нов контролер. Просто инжектирайте categoryRepository във вашия DesignController, както направихте (надявам се) с designRepository... - person Daniel; 01.11.2013
comment
'class DesignController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController { /** * designRepository * * (at)var \TYPO3\OrigKentaurProducts\Domain\Repository\DesignRepository * (at)inject / protected $designRepository ; /* * (at)var \TYPO3\OrigKentaurProducts\Domain\Repository\CategoryRepository * (at)inject */ protected $categoryRepository;' И: '$categories = $this-›categoryRepository-›getCategories($catId);' Това ми дава извикване на членска функция getCategories() на не-обект В CategoryRepository.php имам: 'публична функция getCategories($catId){' - person Jeppe Donslund; 01.11.2013
comment
Съжалявам за липсващите прекъсвания на редовете. - person Jeppe Donslund; 01.11.2013
comment
Вашият CategoryRepository.php е в същата папка като designRepository. Уверете се, че са, казвате на extbase, че са. - person Daniel; 01.11.2013
comment
След това проверете пространствата от имена в двете хранилища. Трябва да е TYPO3\OrigKentaurProducts\Domain\Repository\. - person Daniel; 01.11.2013
comment
И след като добавите инжектиране на зависимост, трябва да изчистите кеша - person Daniel; 01.11.2013
comment
Фантастично е: Сега всичко работи. Много ви благодаря за отделеното време. - person Jeppe Donslund; 04.11.2013
comment

При дадени две купчини можете да изчислите пресечната точка на елементи за O(M log M + N log N) време и резултатът е подреден. Подреденият масив вече е куп, така че не е необходимо допълнително време.

Пример за синтаксис на Python:

# Given arrays heap1, heap2.

intersection = []
while len(heap1) > 0 and len(heap2) > 0:
    if heap1[0] == heap2[0]:
        # Common element, part of the intersection.
        intersection.append(heap1[0])
        heap.heappop(heap1)
        heap.heappop(heap2)
    elif heap1[0] > heap2[0]:
        heap.heappop(heap1)
    else:
        heap.heappop(heap2)

# intersection now contains the common elements of heap1 and heap2,
# in max-to-min order, so it already meets the heap invariant.
- person Daniel; 04.11.2013
comment
в моя случай трябваше да деактивирам/активирам разширението, за да работи - person Gerson; 25.07.2014