TYPO3中便捷操作

weixin_34214500發表於2018-10-15

原文連結:https://www.whongbin.cn/index/article/detail/id/35.html

分享下TYPO3中的一些便捷操作

以下分享的一些便捷操作可以說都是乾貨了,有二次開發typo3的小夥伴可以省去不少google的時間 [aru_36],這篇文章會持續更新,這段時間工作比較忙,有時間再寫 [aru_147]

最方便的debug

  • php中輸出到頁面:\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($nowDate);
//輸出物件查詢的SQL語句
$queryParser = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Storage\Typo3DbQueryParser::class);
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($queryParser->convertQueryToDoctrineQueryBuilder($query)->getSQL());
  • 頁面中輸出PHP傳遞的變數:<f:debug>{_all}</f:debug>
<!-- 輸出變數{_all}代表所有變數 -->
<f:debug>{data}</f:debug>
<f:debug>{_all}</f:debug>

在PHP中拼接符合typo3規則的URL連結

  • 引數說明:
$uParams = array(
    array(
    'tx_areas_area' = array(
        'action' = 'yourActionName',
        'controller' = 'yourControllerName',
        'plugin' = 'yourPluginName',
        'moreParams' = 其他引數
        )
    )

-引數說明:

 $uConfs = array(
     'useCacheHash' = 1,(0或1)
     'no_cache' = 0,(0或1)
     'parameter' = 168,(pageUID)
     'moreParams' = ''(其他引數)
 );
  • 呼叫
 $objUrl = $this-createTypo3LinkUrl($uParams,$uConfs);
  • 返回值
 string 'areas/?tx_areas_area%5Baction%5D=action&tx_areas_area%5Bcontroller%5D=controller&tx_areas_area%5Bplugin%5D=plugin&tx_areas_area%5BmoreParams%5D=252&cHash=8aa773ad881f38fc0a78d7dc80bb1be4'
  • 程式碼
 /**
  * 構成typo3的連結
  * createTypo3LinkUrl
  */
 private function createTypo3LinkUrl($uParams,$uConfs){
    $conf=array();
    $conf['useCacheHash'] = $uConfs['useCacheHash'];
    $conf['no_cache'] = $uConfs['no_cache'];
    $conf['parameter'] = $uConfs['parameter'];
     $conf['additionalParams'] = GeneralUtility::implodeArrayForUrl('', $uParams, '', TRUE).$uConfs['moreParams'];
     
     $cObj = GeneralUtility::makeInstance('TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer');
     $cObj-typoLink('|', $conf);
     $url = $cObj-lastTypoLinkUrl;
    return $url;
 }

typo3 頁面跳轉

  • 請求內部重定向到另一控制器
$this->forward($actionName, $controllerName, $extensionName, array $arguments);
  • 外部HTTP重定向到另一控制器
$this->redirect($actionName, $controllerName, $extensionName, array $arguments, $pageUid, $delay = 0, $statusCode = 303);
  • 重定向至指定url
$this->redirectToURI($uri, $delay=0, $statusCode=303);
  • 傳送HTTP狀態碼
$this->throwStatus($statusCode, $statusMessage, $content);

修改typo3中通知樣式

\var\www\html\domain\typo3\sysext\core\Classes\Messaging\Renderer\ListRenderer.php
  • 找到檔案後,修改以下函式 getMessageAsMarkup()
  /*將函式內容全部註釋,方便以後修改*/
  /**
  * Gets the message rendered as clean and secure markup
  *
  * @param FlashMessage[] $flashMessages
  * @return string
  */
  protected function getMessageAsMarkup(array $flashMessages) : string
  {
      //原始碼註釋掉
      /*$markup = [];
          $script = [];
          $markup[] = '<ul class="typo3-messages whbedit">';
          foreach ($flashMessages as $flashMessage) {
              $messageTitle = $flashMessage->getTitle();
              $markup[] = '<li class="alert ' . htmlspecialchars($this->getClass($flashMessage)) . '">';
              if ($messageTitle !== '') {
                  $markup[] = '<h4 class="alert-title">' . htmlspecialchars($messageTitle) . '</h4>';
              }
              $markup[] = '<p class="alert-message">' . htmlspecialchars($flashMessage->getMessage()) . '</p>';
              $markup[] = '</li>';
          }
          $markup[] = '</ul>';
          return implode('', $markup);*/

      /*王巨集彬於 2018-04-11 15:43修改*/
      //重新寫執行邏輯
      $markup = [];
      $markup[] = '<script>';
      $markup[] = '$(function(){';
      foreach ($flashMessages as $flashMessage) {
          $messageTitle = $flashMessage->getTitle();
          if ($messageTitle !== '') {
              # your code
          }
          $markup[] = "UIkit.notify({message:'" . htmlspecialchars($flashMessage->getMessage()) . "', status:'".htmlspecialchars($this->getClass($flashMessage))."', timeout:500, pos:'top-center'});";
      }
      $markup[] = '});';
      $markup[] = '</script>';
      return implode('', $markup);
  }
  • 修改完上述函式後,測試通知,通知顯示證明修改成功,若通知正常顯示,但是樣式錯亂,如下圖:

    10311999-85f128cd2823ad4c.jpg
    Alt text

可檢查上述檔案中函式 getClass() 該函式中修改你的css樣式class

  /**
  * Gets the message severity class name
  *
  * @param FlashMessage $flashMessage
  *
  * @return string The message severity class name
  */
  protected function getClass(FlashMessage $flashMessage) : string
  {
      /*王巨集彬於 2018-04-11 15:43修改*/
      // return 'alert-' . self::$classes[$flashMessage->getSeverity()];
      return self::$classes[$flashMessage->getSeverity()];
  }
  • 修改後效果如下圖:

    10311999-364aa89c9f3f5d62.jpg
    Alt text

再次執行檢查,效果正常的話替換成功 [aru_51]

2018-10-09 更新

typo3中ViewHelper的書寫示例

#InListViewHelper.php
<?php
namespace GeorgRinger\Theme\ViewHelpers;

use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractConditionViewHelper;

/**
 * typo3的輔助方法,判斷目標元素存在於集合
 *
 * = Examples =
 *
 * <code title="Basic usage">
 * {theme:inList(list: '1,2', item:data.layout, then: 'someClass', else: '')}"
 * </code>
 * <output>
 * 如果當前頁的欄位'佈局'包含在1或2,則顯示字串'someClass'。
 * </output>
 */
class InListViewHelper extends AbstractConditionViewHelper {

    /**
     * 判斷,如果目標元素存在於集合,返回 thenChild
     * 不存在,返回 elseChild
     *
     * @param string $list 集合
     * @param string $item 目標元素
     * @return string
     */
    public function render($list, $item) {
        if (GeneralUtility::inList($list, $item)) {
            return $this->renderThenChild();
        } else {
            return $this->renderElseChild();
        }
    }
}

2018-10-15 更新

相關文章