Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typo3 如何使用打字脚本从目录中的文件中选择随机图像?_Typo3_Typoscript - Fatal编程技术网

Typo3 如何使用打字脚本从目录中的文件中选择随机图像?

Typo3 如何使用打字脚本从目录中的文件中选择随机图像?,typo3,typoscript,Typo3,Typoscript,我使用的是Typo3 4.5.3,我在一个目录中有图像文件,我想从中随机选择一个显示在当前页面上,但我似乎无法正确地使用打字脚本使listnum=rand工作。这是我的扩展模板: # Pick a random image to display temp.banner = IMAGE temp.banner { file { height = 165 width = 954 import { filelist = {$templatePathPrefix}

我使用的是Typo3 4.5.3,我在一个目录中有图像文件,我想从中随机选择一个显示在当前页面上,但我似乎无法正确地使用打字脚本使listnum=rand工作。这是我的扩展模板:

# Pick a random image to display
temp.banner = IMAGE
temp.banner {
  file {
    height = 165
    width = 954
    import {
      filelist = {$templatePathPrefix}images/banners | jpg,jpeg,png,gif | name | | 1
      listNum = rand
    }
  }
  params = class="bannerPic"
}
如果我将listnum设置更改为0、1等,它会将相应的img HTML插入页面。将其设置为“last”也可以,但无论我刷新多少次,rand总是插入第一个图像。因为我可以选择特定的图像0,1。。。我知道一般的设置是有效的,但不是随机选择

我见过TS对rand的各种其他用途,它们将外部对象包装在一个COA_INT对象中,但这对我也不起作用。我是否错过了将listNum=rand放在何处的内容?我在Typo3方面是个新手,所以在这一点上,很多方面对我来说仍然是相当不透明的,或者它是否显示了?。感谢您提供的任何见解。

扩展增加了将rand与listNum结合使用的可能性


在4.5上运行良好。

我不建议您通过打字稿进行随机选择。由于每次加载页面时都需要随机图像,因此随机元素必须是USER\u INT或COA\u INT元素,因此不可缓存

一个简单的解决方案是通过JavaScript实现。如果客户端上没有JavaScript,则定义一个默认图像,并定义一个随机选择图像的JavaScript。有了这个解决方案,您每次都会得到一个随机图像,并且您的内容是完全可缓存的

下面的打字稿代码可以给你一些启发。它基本上从边界读取图像元素,并生成JavaScript随机输出它们。此外,图像是可链接的

lib.teaser = COA
lib.teaser.10 = CONTENT
lib.teaser.10 < styles.content.getBorder
lib.teaser.10 {
    slide = -1
    table=tt_content
    select{
        begin = 0
        max = 1
        #language
        languageField=sys_language_uid
        #from wich column
        where=colPos=3
    }
    wrap=<div class="teaserimage">|</div>

    renderObj=COA

    #image with gallery function
    renderObj.10 = COA
    renderObj.10 {
        stdWrap.required=1
        # get image
        10 = IMAGE
        10 {
            #if not empty
            required=1
            file.import=uploads/pics/
            file.import.field=image
            #file.width=266
            #file.height=180
            file.import.listNum = 0 
            stdWrap.insertData=1
            params = id="imgbig_{TSFE:currentRecord}"
            imageLinkWrap < tt_content.image.20.1.imageLinkWrap
            imageLinkWrap.typolink.ATagParams = id="link_imgbig_{TSFE:currentRecord}"
            imageLinkWrap.typolink.ATagParams.stdWrap.insertData=1
        }

        # standard image configuration from tt_content
        10.altText < tt_content.image.20.1.altText
        10.titleText < tt_content.image.20.1.titleText
        10.longdescURL < tt_content.image.20.1.longdescURL

        # random function for gallery images
        30 = COA
        30 {
            stdWrap.required=1
            stdWrap.dataWrap(
            <script type="text/javascript">
            /* <![CDATA[ */
            var imgArray = new Array(|);
            var randnum = Math.round(Math.random()*(imgArray.length-1));
            document.getElementById('imgbig_{TSFE:currentRecord}').src ='uploads/pics/' + imgArray[randnum];
            /* ]]> */
            </script>
            )

            # first gallery image
            10 = TEXT
            10.field = image
            10.listNum.splitChar=,
            10.listNum=0
            10.if.isTrue.field=image
            10.if.isTrue.listNum=1
            10.if.isTrue.listNum.splitChar=,
            10.dataWrap = "|"


            # other gallery images  
            20 = TEXT
            20.field = image
            20.split {
                token = ,
                cObjNum = 1
                1 = COA
                1.if.isPositive.data = TSFE:register|SPLIT_COUNT
                1 {
                    10 = TEXT
                    10.data = current:1
                    10.dataWrap = ,"|"
                }
            }
        }
        # random function for gallery links
        40 = COA
        40 {
            stdWrap.required=1
            stdWrap.dataWrap(
            <script type="text/javascript">
            /* <![CDATA[ */
            //var imgLinkArray = new Array(randnum);
            var imgLinkArray = new Array(|);
            if(document.getElementById('link_imgbig_{TSFE:currentRecord}')) document.getElementById('link_imgbig_{TSFE:currentRecord}').href = imgLinkArray[randnum];
            /* ]]> */
            </script>
            )

            # first gallery link            
            10 = TEXT
            10.field = image_link
            10.listNum.splitChar=,
            10.listNum=0
            10.dataWrap = "|"
            10.typolink.parameter.field = image_link
            10.typolink.returnLast = url

            # other gallery links   
            20 = TEXT
            20.field = image_link
            20.split {
                token = ,
                cObjNum = 1
                1 = COA
                1.if.isPositive.data = TSFE:register|SPLIT_COUNT
                1 {
                    10 = TEXT
                    10.data = current:1
                    10.dataWrap = ,"|"
                    10.typolink.parameter.data = current:1
                    10.typolink.returnLast = url
                }
            }
        }
    }
}

只有typo3 V4.6及更高版本的内核中有listNum=rand,请参见

对于typo3 V4.5,您必须扩展tslib/class.tslib_content.php

将此添加到localconf.php:

$TYPO3_CONF_VARS['FE']['XCLASS']['tslib/class.tslib_content.php'] = PATH_site.'fileadmin/template/class.ux_tslib_content.php';
并将以下代码添加到class.ux_tslib_content.php:

<?php
/***************************************************************
*  Copyright notice
*
*  (c) 1999-2008 Kasper Skaarhoj (kasperYYYY@typo3.com)
*  All rights reserved
*
*  This script is part of the TYPO3 project. The TYPO3 project is
*  free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  The GNU General Public License can be found at
*  http://www.gnu.org/copyleft/gpl.html.
*  A copy is found in the textfile GPL.txt and important notices to the license
*  from the author is found in LICENSE.txt distributed with these scripts.
*
*
*  This script is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
/**
 * Contains classes for Content Rendering based on TypoScript Template configuration
 *
 * $Id: class.tslib_content.php 4254 2008-09-27 13:35:44Z dmitry $
 * Revised for TYPO3 3.6 June/2003 by Kasper Skaarhoj
 * XHTML compliant
 *
 * class tslib_cObj         :       All main TypoScript features, rendering of content objects (cObjects). This class is the backbone of TypoScript Template rendering.
 *
 * @author  Kasper Skaarhoj <kasperYYYY@typo3.com>
 */

/**
 * This class contains all main TypoScript features.
 * This includes the rendering of TypoScript content objects (cObjects).
 * Is the backbone of TypoScript Template rendering.
 *
 * There are lots of functions you can use from your include-scripts.
 * The class "tslib_cObj" is normally instantiated and referred to as "cObj".
 * When you call your own PHP-code typically through a USER or USER_INT cObject then it is this class that instantiates the object and calls the main method. Before it does so it will set (if you are using classes) a reference to itself in the internal variable "cObj" of the object. Thus you can access all functions and data from this class by $this->cObj->... from within you classes written to be USER or USER_INT content objects.
 *
 * @author  Kasper Skaarhoj <kasperYYYY@typo3.com>
 * @package TYPO3
 * @subpackage tslib
 * @link http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=270&cHash=4ad9d7acb4
 */
class ux_tslib_cObj extends tslib_cObj{


    /**
     * Exploding a string by the $char value (if integer its an ASCII value) and returning index $listNum
     *
     * @param   string      String to explode
     * @param   string      Index-number. You can place the word "last" in it and it will be substituted with the pointer to the last value. You can use math operators like "+-/*" (passed to calc())
     * @param   string      Either a string used to explode the content string or an integer value which will then be changed into a character, eg. "10" for a linebreak char.
     * @return  string
     */
    function listNum($content,$listNum,$char) {
        $char = $char ? $char : ',';
        if (t3lib_div::testInt($char))  {
            $char = chr($char);
        }
        $temp = explode($char,$content);
        $last = ''.(count($temp)-1);
        if($listNum === 'rand'){ $listNum = rand(0,count($temp)-1);} //taywa added: rand feature!
        $index=$this->calc(str_ireplace('last',$last,$listNum));
        return $temp[$index];
    }

}


?>