TYPO3 在同一个容器中打开动作链接

TYPO3 open actionlink in same container

我 运行 使用扩展生成器创建的 TYPO3 扩展遇到了一个小问题。 该扩展程序生成日历并显示即将发生的事件列表。 Calendar with listed events

代码list.html

<div id="dncalendar-container"></div>

        <f:flashMessages />

        <div  class="tx_tbpartnereventcal">

            <f:for each="{events}" as="event">
                <f:link.action class="event-cont" action="show" controller="Events" arguments="{events : event}" target="popup">
                    <span class="event-title">{event.title}</span> <span class="event-date"><f:format.date format="Y-m-d">{event.date}</f:format.date></span><br>
                </f:link.action>
            </f:for>
        </div>

        <!--<f:debug>{_all}</f:debug>-->

        <f:format.raw>{scriptDates}</f:format.raw>
        <script type="text/javascript">
         //script to generate calendar
        </script>

列表是通过控制器中的标准 listAction 创建的,可以单击元素以显示有关每个事件的详细信息。

但是,当单击链接的列表项时,它会重新加载带有详细信息的插件区域作为新页面。如果 div.tx_tbpartnereventcal 只是将其自身的内容更改为详细信息,我会更喜欢它。

但是我不知道如何在 TYPO3 中使用 ajax 或者是否有其他方法。

编码控制器动作列表并显示:

/**
 * action list
 *
 * @return void
 */
public function listAction()
{
    $events = $this->eventsRepository->findAll();
    $this->view->assign('events', $events);


    /* get all events and turn into json for js calendar */
    $allNotes ='';
    /** @var Event $event */
    foreach ($events as $event) {
        $tempArr=array("date"=>$event->getDate()->format("Y-m-d"), "note" =>$event->getTitle(), "description" => $event->getLink(), "optional"=> "stuff");
        $allNotes .= json_encode($tempArr).",";
    }

    /* create script to use data in js in .html */
    $script = "
    <script>
        var jsondate = [".$allNotes."];
    </script>
    ";

    /* send js script to list.html to insert into js calendar */
    $this->view->assign('scriptDates', $script);
}


/**
* action show
* 
* @param \TBPartnerNet\TbPartnerTerminkalender\Domain\Model\Events $events
* @return void
*/
 public function showAction(\TBPartnerNet\TbPartnerTerminkalender\Domain\Model\Events $events)
{
   $this->view->assign('events', $events);
}

非常感谢您的帮助!

基本上有 3 种方法可以在该元素上实现客户端动态:

1) 引入一种web服务产生数据显示(如JSON):

  • 需要 TYPO3 中的 AJAX 端点和客户端 (JavaScript) 构建模板(普通 JavaScript 或简单 [例如 mustache] 或其他 [例如 angular, vue] 模板库).

2) 介绍一种产生插件HTML的web服务:

  • 需要 TYPO3 中的 AJAX 端点和一些 JavaScript

3) 通过 AJAX 获取整个页面 (HTML) 并且只替换 DOM 中的日历部分:

  • 不需要对 TYPO3 进行任何更改,但 JavaScript

    代码示例:

# register click handler for the date links on parent element (which will
# not change, thus you do not have to reregister the events after replacing the links)
$('.tx_tbpartnereventcal').on(
  'click',
  '.event-cont',
  function(ev) {
    ev.preventDefault()
    # https://api.jquery.com/jQuery.ajax/
    $.ajax(
      [
         url: ev.target.href
      ]
    ).done(
      function(data) {
        var $newPage = $(data),
            newPluginHtml = $newPage.find(.tx_tbpartnereventcal).html()

        $('.tx_tbpartnereventcal').html(newPluginHtml)
        # you notice a JavaScript to generate the calendar - 
        # maybe you could call it here
      }
    )
  }
)

3) 从您当前的观点来看是最容易实施的,但当然不是最高效的方法。

对于 1) 和 2),您需要一个 AJAX 端点。对于 v8 及以下版本,这是不雅的:要么是所谓的 pageType 方法,要么是像 helhum/typoscript-rendering 这样的辅助扩展,要么是所谓的 eID 方法(不推荐!)。对于 v9,我们有中间件,这使得提供 Web 服务更加简洁。