TYPO3 extbase,从 9 迁移到 10 版本时,基于 php 的视图不起作用

TYPO3 extbase, the php based views do not work when migrating from 9 to 10 version

我开发了一个自定义的 TYPO3 extbase 扩展,它在 TYPO3 的 8 和 9 版本上完美运行。 最近我将我的安装升级到 TYPO3 10 版本,但是我的 TYPO3 extbase 扩展的基于 php 的视图不再工作。 显示的错误是: 抱歉,找不到请求的视图。 技术原因是:没有找到模板。无法解析 class“Luc\Lucevents2\Controller\EventController”

中操作“getIcal”的视图

我已阅读页面中的说明 https://docs.typo3.org/m/typo3/book-extbasefluid/10.4/en-us/8-Fluid/9-using-php-based-views.html,但与我在扩展程序中所做的没有什么不同。

所以,我很困惑,因为没有解释为什么代码停止工作,上面的link不包括任何关于弃用代码或迁移后可能发生的变化的说明!!

你能帮我什么忙吗?

非常感谢! 乔治

静态模板已经包含在内,除了基于 php 的视图外,扩展的所有其他操作都运行良好。 ext_localconf.php 如下所示:

$boot=函数(){

    \TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
        'Luc.Lucevents2',
        'Luceventsdisplay',
        [
            'Event' => 'list, show, delete, edit, monthview, test, ajax, deleteConfirm, showRss, getIcal, addForm, add, editForm, importeventtoforum',
            'Channel' => 'list, show',
            'Tag' => 'filter, show'
        ],
        // non-cacheable actions
        [
            'Event' => 'list, show, delete, edit, monthview, test, ajax, deleteConfirm, showRss, getIcal, addForm, add, editForm, importeventtoforum',
            'Channel' => 'list, show',
            'Tag' => 'filter, show'
        ]
    );
        

};

$boot();

取消设置($boot);

该动作在 EventController.php 中注册,如下所示:

/** * 动作geticalaction * * @param \Luc\Lucevents2\Domain\Model\Event $事件 * @return无效 */

 public function getIcalAction(\Luc\Lucevents2\Domain\Model\Event $event = NULL)
{
    $base_url = $this->request->getBaseUri();
    $channel=$this->settings['channel_for_simple_users'];
    

    if($this->request->hasArgument('duration'))
    {           
        if ($this->request->getArgument('duration')=='6month') {
            $duration=$this->request->getArgument('duration');              
        }
        else 
        {
            $duration='month';
        }           
        
        $events = $this->eventRepository->get_events_for_rss_and_ical($duration,$channel);
        $eventsarray= array();
        
        foreach ($events as $obj){                              
            $this->uriBuilder->setCreateAbsoluteUri(true);  
            $uri = $this->controllerContext->getUriBuilder()
            ->setUseCacheHash(false)
            ->uriFor('show', array("event" => $obj->getUid()));
            
            $eventsarray[] = array($obj->getTitle(), $obj->getDescription(), $obj->getStartdatetime(),$obj->getEnddatetime(), $obj->getBuildingid(), $obj->getRoomid(), $obj->getPlace(), $obj->getCrdate(), $uri, $obj->getUid());
        }       
                        
        $this->view->assign('events', $eventsarray);
        $this->view->assign('baseurl', $base_url);
                
    }
    else
    {       
        $this->uriBuilder->setCreateAbsoluteUri(true);
        $uri = $this->controllerContext->getUriBuilder()
        ->setUseCacheHash(false)
        ->uriFor('show', array("event" => $event->getUid()));
        
        $this->view->assign('event', $event);
        $this->view->assign('baseurl', $base_url);
        $this->view->assign('uri', $uri);
        
    }           
}

非常感谢!

我今天遇到了这个问题。 “php 基于视图”的文档似乎是 outdated.Below 是对我的设置的描述和 TYPO3 10

的解决方案

我有: 我的情况是我有一个带有 showAction() 操作方法的控制器。 在打字稿中,我通过类型参数设置了一种新格式。像

rss = PAGE
rss {
   typeNum = 58978
   10 =< tt_content.list.20.skevents_eventfeeds
}

对于这种类型(参数类型=58978),我设置了一个名为 View\EventFeeds\ShowRss 的 class 和一个 render() 方法。

TYPO3 根据类型 (rss) 和动作名称 (show) 自动解析此 class。这不再有效。

解决此问题的方法: 为了让 TYPO3 使用 render 方法找到正确的 class,将控制器的 defaultViewObjectName 变量设置为特定操作的正确 class 名称就足够了。这可以在控制器中使用以下新方法完成

public function initializeShowAction() 
{
   $this->defaultViewObjectName = \Skar\Skevents\View\EventFeeds\ShowRss::class;
}

现在,在调用 showAction 方法之前,将 defaultViewObjectName 设置为我的 ShowRss class,它会生成输出。

请注意我的 ShowRss class 扩展了 \TYPO3\CMS\Extbase\Mvc\View\AbstractView 。根据https://docs.typo3.org/m/typo3/book-extbasefluid/master/en-us/8-Fluid/9-using-php-based-views.html,这在 TYPO3 11 中已弃用,必须针对 TYPO3 12

进行更改