TYPO3 с extbase: UriBuilder (или что-то подобное) в бэкэнд-хуке

1

Я написал бэкэнд-крючок в TYPO3 (с extbase) для отправки электронной почты, когда установлены определенные значения таблицы. Теперь мне нужно сделать свой крючок, чтобы создать URL-адрес интерфейса. Но я, похоже, не могу ухватиться за UriBuilder. Как создать правильный URL-адрес frontend в контексте бэкэнда-крючка? Я пробовал это:

$uriBuilder = $objectManager->get('\TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder');
$link = $uriBuilder->setTargetPageUid($this->formPageId)->buildFrontendUri();

что приводит к следующей ошибке:

Fatal error: Call to a member function typoLink_URL() on a non-object in /data/www/path/typo3/sysext/extbase/Classes/Mvc/Web/Routing/UriBuilder.php on line 640

Что это значит? Я также попытался вызвать $uriBuilder-> initializeObject(), но ошибка осталась прежней. Неужели я об этом совершенно неправильно, или я чего-то не хватает?

Теги:
typo3
extbase

4 ответа

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

Я нашел ответ, но бог знает, что это слишком запутанно, чтобы быть прав. То, что я сделал, это создать внешний вызов ajax в моем расширении, а в моем бэкэнд-крючке я вызвал страницу ajax, чтобы получить URL-адрес:

$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('\TYPO3\CMS\Extbase\Object\ObjectManager');
$libDiv = $objectManager->get('\TYPO3\CMS\Core\Utility\GeneralUtility');
$siteUrl = 'http://domain.com/';
//now set the ajax url
$url = $siteUrl.'index.php?type=1447752540&id='.$this->ajaxPageId;
//set headers because otherwise it doesn't work
$headers = array(
    'Cookie: fe_typo_user=' . $_COOKIE['fe_typo_user']
);
//as far as I understand it, this is the equivalent of file_get_contents
$result = $libDiv::getURL($url, false, $headers);

и мой плагин ничего не делает, кроме вызова uribuilder и создания желаемой ссылки.

... Я чувствую себя такой грязной.

0

Напишите это перед классом

use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Utility\HttpUtility;
use TYPO3\CMS\Core\SingletonInterface;
use TYPO3\CMS\Extbase\Configuration\ConfigurationManager;
use TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;

Создать ссылку.

$GLOBALS['TSFE'] = GeneralUtility::makeInstance('TYPO3\\CMS\\Frontend\\Controller\\TypoScriptFrontendController',
                        $GLOBALS['TYPO3_CONF_VARS'], $id, $type);
                        $GLOBALS['TSFE']->connectToDB();
                        $GLOBALS['TSFE']->initFEuser();
                        $GLOBALS['TSFE']->determineId();
                        $GLOBALS['TSFE']->initTemplate();
                        $GLOBALS['TSFE']->getConfigArray();

                        $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\Extbase\\Object\\ObjectManager');

                        $configurationManager = $objectManager->get(ConfigurationManager::class);
                        /** @var ContentObjectRenderer $contentObjectRenderer */
                        $contentObjectRenderer = $objectManager->get(ContentObjectRenderer::class);

                        $configurationManager->setContentObject($contentObjectRenderer);
                        $uriBuilder = $objectManager->get(UriBuilder::class);
                        $uriBuilder->injectConfigurationManager($configurationManager);
                        $targetPage = $singleConfig['targetpid'];
                        $uriBuilder->setTargetPageUid($targetPage)->setArguments(array());

                        $url = $uriBuilder->buildFrontendUri();
0

Я создал FrontendUriBuilderClass, с помощью которого вы можете создать Frontend-Link для определенного действия с аргументами и так далее.

С помощью этого вспомогательного класса можно создать внешнюю ссылку Typo3 в бэкэнд. Не стесняйтесь использовать его!

/**
 * Class FrontendUriBuilder for creating a frontend link in the backend
 * @package PDVSysteme\Pdvsupportbase\Util
 */
class FrontendUriBuilder
{

private $pageId = 1;

private $extensionName = null;

private $pluginName = null;

private $actionName = null;

private $controllerName = null;

private $arguments = null;

private $host = null;

/**
 * FrontendUriBuilder constructor.
 */
public function __construct()
{
}

/**
 * @param int $pageId the target pageId
 * @return $this FrontendUriBuilder
 */
public function setPageId($pageId = 1){
    $this->pageId = $pageId;

    return $this;
}

/**
 * @param string $extensionName 
 * @return $this FrontendUriBuilder
 */
public function setExtensionName($extensionName){
    $this->extensionName = $extensionName;

    return $this;
}

/**
 * @param string $pluginName
 * @return $this FrontendUriBuilder
 */
public function setPlugin($pluginName){
    $this->pluginName = $pluginName;

    return $this;
}

/**
 * @param string $actionName
 * @return $this FrontendUriBuilder
 */
public function setAction($actionName){
    $this->actionName = $actionName;

    return $this;
}

/**
 * @param string $controllerName
 * @return $this FrontendUriBuilder
 */
public function setController($controllerName){
    $this->controllerName = $controllerName;

    return $this;
}

/**
 * @param array $arguments like array('nameOfTheClass' => $instance) 
 * @return $this FrontendUriBuilder
 */
public function setArguments($arguments){
    $this->arguments = $arguments;

    return $this;
}

/**
 * @param string $host
 * @return $this FrontendUriBuilder
 */
public function setHost($host){
    $this->host = $host;

    return $this;
}

/**
 * Build the URL 
 * @return string the url
 * @throws \Exception
 */
public function build(){

    //set base
    $url = 'http://' . is_null($this->host)? $_SERVER['HTTP_HOST'] : $this->host;

    //set pageId
    $url = $url . '/index.php?id=' . $this->pageId;

    //set action
    if(!is_null($this->actionName)){
        $this->checkExtensionName();
        $this->checkPluginName();

        $url = $url . '&tx_' . $this->extensionName . '_' . $this->pluginName . '[action]=' . $this->actionName;
    }

    //set controller
    if(!is_null($this->controllerName)){
        $this->checkExtensionName();
        $this->checkPluginName();

        $url = $url . '&tx_' . $this->extensionName . '_' . $this->pluginName . '[controller]=' . ucfirst($this->controllerName);
    }

    //set arguments
    if(!is_null($this->arguments)) {
        $this->checkExtensionName();
        $this->checkPluginName();

        /**
         * @var $argument AbstractEntity
         */
        foreach ($this->arguments as $key => $argument) {
            $url = $url . '&tx_' . $this->extensionName . '_' . $this->pluginName . '[' . $key . ']=' . $argument->getUid();
        }
    }

    return $url;
}

private function checkExtensionName(){
    if(is_null($this->extensionName)){
        throw new \Exception("Extension name for FrontendUriBuilder not set!");
    }
}

private function checkPluginName(){
    if(is_null($this->pluginName)){
        throw new \Exception("Plugin name for FrontendUriBuilder not set!");
    }
}
}

Вы можете назвать это следующим образом:

$uriBuilder = new FrontendUriBuilder();
$uriBuilder->setPageId($pageUid)->setExtensionName($extensionName)->setPlugin($pluginName)->setAction($action)->setController($controller)->setArguments($arguments)->build();

Минимальный вызов:

$uriBuilder->build();

Это создаст ссылку на вашу главную страницу с uid 1.

Если вы хотите добавить действие, контроллер или аргументы к URL-адресу, вам нужно установить "extensionName" и "pluginName"!

-1

Какая версия typo3?

Попробуйте использовать "build()" вместо "buildFrontendUri()", и пусть typo3 распознает среду. Если вы находитесь внутри контроллера extbase, вам не нужно "создавать" uribuilder

$uri = $this->uriBuilder->reset()->setTargetPageUid($pageUid)->setCreateAbsoluteUri(TRUE)->setArguments($arguments)->build();

Ещё вопросы

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