zoukankan      html  css  js  c++  java
  • TYPO3中便捷操作

    以下分享的一些便捷操作可以说都是干货了,有二次开发typo3的小伙伴可以省去不少google的时间 [aru_36],这篇文章会持续更新,这段时间工作比较忙,有时间再写 [aru_147]

    最方便的debug

    • php中输出到页面:TYPO3CMSExtbaseUtilityDebuggerUtility::var_dump($nowDate);
    //输出对象查询的SQL语句
    $queryParser = $this->objectManager->get(TYPO3CMSExtbasePersistenceGenericStorageTypo3DbQueryParser::class);
    TYPO3CMSExtbaseUtilityDebuggerUtility::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('TYPO3CMSFrontendContentObjectContentObjectRenderer');
         $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中通知样式

    varwwwhtmldomain	ypo3sysextcoreClassesMessagingRendererListRenderer.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);
      }
    
    • 修改完上述函数后,测试通知,通知显示证明修改成功,若通知正常显示,但是样式错乱,如下图:

      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()];
      }
    
    • 修改后效果如下图:

      Alt text

    再次运行检查,效果正常的话替换成功 [aru_51]

    typo3中ViewHelper的书写示例

    #InListViewHelper.php
    <?php
    namespace GeorgRingerThemeViewHelpers;
    
    use TYPO3CMSCoreUtilityGeneralUtility;
    use TYPO3CMSFluidCoreViewHelperAbstractConditionViewHelper;
    
    /**
     * 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();
    		}
    	}
    }
    

    在控制器中获取当前扩展信息

    • 获取当前扩展名称:$this->request->getPluginName()
    • 获取当前控制器名称:$this->request->getControllerName()
    • 获取当前Action名称:$this->request->getControllerActionName()
      如下图,在下图显示的项中,使用get方法即可获得 get后第一个字母大写:
      https://gitee.com/whongbin/FigureBed/raw/master/img/20200507084945.png
  • 相关阅读:
    Windows消息机制
    inherited 为什么可以调用父类的private函数? [问题点数:100分,结帖人:h2plus0]
    C++Buidler6中需要注意的几个问题
    BGA封装芯片拆装全程纪实
    Delphi组件开发教程指南(四)组件生成过程(TWinControl)
    Delphi技巧集六 (等待执行完一个外部程序再执行另一个程序)
    C++ Builder高级应用开发指南
    干掉“Spirale”病毒
    完全看懂新世代x86指令集結構
    Delphi 组件撰写常问问题delphi 在整合环境中如何找出组件所产生的问题
  • 原文地址:https://www.cnblogs.com/sanlilin/p/14153161.html
Copyright © 2011-2022 走看看