How can I use the same random Image several times?
With the following Typoscript I've got different Images in different sizes.
lib.headerimage = COA_INT
lib.headerimage {
1 = IMG_RESOURCE
1 {
file {
import.data = levelmedia:-1, slide
treatIdAsReference = 1
import.listNum = rand
}
}
}
lib.headerimageSmall =< lib.headerimage
lib.headerimageSmall.1.file.width = 768
lib.headerimageTab =< lib.headerimageSmall
lib.headerimageTab.1.file.width = 1280
lib.headerimageDesktop =< lib.headerimageTab
lib.headerimageDesktop.1.file.width = 1920
lib.headerimageHigh =< lib.headerimageDesktop
lib.headerimageHigh.1.file.width = 2880
You might use a register for your image.
This might only work if you use fluidvariables instead of lib-TS
as idea (not tested):
page {
1 = STORE_REGISTER
1 {
randomImage.cObject = IMG_RESOURCE
randomImage.cObject {
file {
import.data = levelmedia:-1, slide
treatIdAsReference = 1
import.listNum = rand
}
10 = FLUID_TEMPLATE
10 {
name = ...
:
variables {
headerimageSmall = IMG_RESOURCE
headerimageSmall {
file.cObject = TEXT
file.cobject.data = register:randomImage
file.width = 768
}
headerimageTab < .headerimageSmall
headerimageTab.file.width = 1280
headerimageDesktop < lib.headerimageSmall
headerimageDesktop.file.width = 1920
headerimageHigh < lib.headerimageSmall
headerimageHigh.file.width = 2880
}
}
}
maybe you could use the file-id as register, maybe the rendering for the fluid-variabels needs some adjustements.
You just need to generate one random image and then resize it with fluid. Something like that:
<f:image src="{headerimageHigh}" width="2880" alt="high" />
<f:image src="{headerimageHigh}" width="1920" alt="desktop" />
<f:image src="{headerimageHigh}" width="1280" alt="tab" />
<f:image src="{headerimageHigh}" width="768" alt="small" />
Related
I use fcObject to output a header image, the image is configured in page/resources/media:
<f:cObject typoscriptObjectPath="lib.headerimage" />
lib.headerimage = IMAGE
lib.headerimage {
file {
# width = 550
# height = 126
import {
data = levelmedia: -1, slide
# wrap = uploads/media/|
# listNum = 0
listNum = rand
}
treatIdAsReference = 1
required = 1
}
altText.data = page: title
# wrap = <div id="keyvisual">|</div>
}
The above code doesn't output the alternative text of the image unfortunately, at the moment it takes the page title as alt text, and I can't figure out how to access the field "alternative".
I could use a viewhelper to output the image, like here:
<f:for each="{data.media}" as="file">
<f:image image="{file}"/>
</f:for>
The benefit of using the image viewhelper is that it gives me the alt text of the image.
I prefer to use the lib though. I just can't figure out how to access the data of the image field "alternative" in typoscript.
You can use FILES to get the expected result:
lib.headerimage = FILES
lib.headerimage {
references {
data = levelmedia: -1, slide
listNum = rand
}
renderObj = IMAGE
renderObj {
file.import.dataWrap = {file:current:storage}:{file:current:identifier}
altText.data = file:current:alternative
}
}
Source: This example was taken from the TypoScript Reference.
You used the wrong field page:title. Use file:current:alternative instead.
lib.headerimage = IMAGE
lib.headerimage {
file {
import {
data = levelmedia: -1, slide
listNum = rand
}
treatIdAsReference = 1
required = 1
}
altText.data = file:current:alternative
}
In my menu I am using a script to retrieve the image loaded in the page's resources.
Now I need to make it so the image is resized/cropped to exactly the right size. Where can I add the width and height to make it work?
NO {
wrapItemAndSub = <li>|</li>
stdWrap.cObject = COA
stdWrap.cObject {
10 = TEXT
10.field = title
10.wrap = <span>|</span>
20 = FILES
20 {
# Get the images related to the current page
references {
table = pages
fieldName = media
}
# Render each image and wrap it as appropriate
renderObj = TEXT
renderObj {
typolink {
parameter.data = file:current:publicUrl
forceAbsoluteUrl = 1
returnLast = url
}
wrap = |,
}
stdWrap {
# Take only the first image if several are defined
listNum = 0
# Use default image if none is available
ifEmpty.cObject = TEXT
ifEmpty.cObject.typolink {
parameter = fileadmin/templates/example/images/placeholder.png
forceAbsoluteUrl = 1
returnLast = url
}
wrap = <div><img src="|" /></div>
}
}
}
}
If you want to resize the image replace the renderObj = TEXT through renderObj = IMG_RESOURCE
Example:
NO {
wrapItemAndSub = <li>|</li>
stdWrap.cObject = COA
stdWrap.cObject {
10 = TEXT
10.field = title
10.wrap = <span>|</span>
20 = FILES
20 {
# Get the images related to the current page
references {
table = pages
fieldName = media
}
# Render each image and wrap it as appropriate
renderObj = IMG_RESOURCE
renderObj {
file.import.data = file:current:uid
file.treatIdAsReference = 1
file.width = 250c
file.height = 250c
wrap = |,
}
stdWrap {
# Take only the first image if several are defined
listNum = 0
# Use default image if none is available
ifEmpty.cObject = TEXT
ifEmpty.cObject.typolink {
parameter = fileadmin/templates/example/images/placeholder.png
forceAbsoluteUrl = 1
returnLast = url
}
wrap = <div><img src="|" /></div>
}
}
}
To render only one image, you shouldn't make first an list of all images. Use the maxItems setting of FILES and remove the listNum from stdWrap.
20 = FILES
20 {
...
maxItems = 1
...
}
I think you need to use GIFBUILDER.
The GIFBUILDER will pass the Image to for example ImageMagick and will help you to cut/scrop/scale the image to your needs.
Something like
lib.image = IMAGE
lib.image {
file = GIFBUILDER
file {
#use the c in XY to crop
XY = 1024c,768c
format = jpg
10 = IMAGE
10.file = fileadmin/image.jpg
}
}
You can read more about Gifbuilder here:
https://docs.typo3.org/typo3cms/TyposcriptReference/Gifbuilder/Index.html
I'm using TYPO3 7 and want to apply the crop settings of the media field in this TypoScript snippet:
lib.backgroundimage = FILES
lib.backgroundimage {
references.data = levelmedia:-1, slide
references.listNum = 0
renderObj = IMG_RESOURCE
renderObj.altText.data = file:current:description
renderObj.file {
import.data = file:current:publicUrl
width = 1920
height = 600c
}
}
How can I do this?
crop.data = file:current:crop is the key
your complete code:
lib.backgroundimage = FILES
lib.backgroundimage {
references.data = levelmedia:-1, slide
references.listNum = 0
renderObj = IMG_RESOURCE
renderObj.altText.data = file:current:description
renderObj.file {
import.data = file:current:publicUrl
crop.data = file:current:crop
width = 1920
height = 600c
}
}
try file.import.data = file:current:uid as used in CSS Styled content.
Also see the documentation about this which states that the crop setting is automatically imported: https://docs.typo3.org/typo3cms/extensions/core/latest/Changelog/7.2/Feature-65584-AddImageCropping.html
I have a menu and want to access on media files from the page configurations. This works quite well, but it gives all the images of the media files. ListNum it does not work. Do you have an idea or an alternative solution? Important I want to use file:current:description and file:current:title
after.cObject = FILES
after.cObject {
references {
table = pages
fieldName = media
# listNum = 1 not working
}
renderObj = IMAGE
renderObj {
file.import.data = file:current:originalUid
file.width = 250
file.import.listNum = 1
altText.data = file:current:description
}
}
The code of the OP and of maholtz's answer does not work in current TYPO3 versions any more. Here is the correct TypoScript for 6.2 and beyond:
1 = TMENU
1 {
wrap = <ul>|</ul>
NO = 1
NO {
wrapItemAndSub = <li>|</li>
stdWrap.override.cObject = FILES
stdWrap.override.cObject {
references {
table = pages
fieldName = media
}
renderObj = IMAGE
renderObj {
file.import.data = file:current:uid
file.treatIdAsReference = 1
titleText.data = file:current:title // field:nav_title // field:title
altText.data = file:current:alternative // field:nav_title // field:title
}
# start with second image
begin = 1
# show only one image
maxItems = 1
}
}
}
The parameter begin defines which of multiple images should be used (e.g. if you need one image as a headline background for the page and another one as an icon in the menus).
If you increase the maxItems parameter, multiple images will be returned (if multiple images are defined in the resources tab).
If you want to append/prepend the image to the menu text instead of replacing it, you have to change stdWrap.override.cObject to after.cObject or before.cObject in the above code.
after.cObject = FILES
after.cObject {
references {
table = pages
fieldName = media
# listNum = 1 not working
}
renderObj = IMAGE
renderObj {
file.import.data = file:current:originalUid
file.width = 250
file.import.listNum = 1
altText.data = file:current:description
}
# start with first image
begin = 0
# show only two images
maxItems = 2
}
There are two registered filled:
REGISTER:FILES_COUNT
and
REGISTER:FILE_NUM_CURRENT
Implemented in typo3/sysext/frontend/Classes/ContentObject/FilesContentObject.php
Here comes another example with stacked image references. This code can be used with jquerypicture.
lib.headerImg = COA
lib.headerImg.wrap = <picture alt="some alttext">|</picture>
lib.headerImg {
// <source>
10 = FILES
10 {
references {
table = pages
uid.data = tsfe:id
fieldName = media
}
renderObj = IMG_RESOURCE
renderObj {
file.import.data = file:current:uid
file.treatIdAsReference = 1
stdWrap.dataWrap = <source src="|">
# the 2nd pic gets another attribute
stdWrap.dataWrap.override = <source src="|" media="(min-width:600px)">
stdWrap.dataWrap.override.if.value = 1
stdWrap.dataWrap.override.if.equals.data = register:FILE_NUM_CURRENT
# altText.data = file:current:title
}
begin = 0
maxItems = 2
}
// <noscript>
20 < .10
20.begin = 1
20.maxItems = 1
20.renderObj.stdWrap.dataWrap = <noscript><img src="|" alt="{file:current:title}"></noscript>
}
Is there any way to prevent typo3/typoscript IMAGE object from adding the dimension attributes (height and width) to the generated image tag?
UPDATE (Thanks to cascaval)!
The solution is to use IMG_RESOURCE instead of IMAGE. It apparently has less bells an whistles but gives you complete control of the the generated image tag.
10 = IMG_RESOURCE
10.file.import = uploads/tx_templavoila/
10.file.import.current = 1
10.file.import.listNum = 0
10.stdWrap.required = 1
10.stdWrap.wrap (
<img src="|" />
)
Note: This is for use with Templavoila.
No but you can use IMG_RESOURCE object instead and wrap the resulting image path so that you get a HTML tag you want. Example:
temp.image_test = IMG_RESOURCE
temp.image_test {
stdWrap.wrap = <img src="|" />
file = GIFBUILDER
file {
format = jpg
quality = 90
maxWidth = 9999
maxHeight = 9999
XY = [10.w],[10.h]
10 = IMAGE
10.file {
import = uploads/pics/
import.field = image
import.listNum = 0
}
20 = SCALE
20 {
width = 200
}
}
}
Wrong! It also works with IMAGE:
10 = IMAGE
10 {
file = path/to/image.file
stdWrap.replacement {
10 {
search = # width="[0-9]*?"#i
replace =
useRegExp = 1
}
20 {
search = # height="[0-9]*?"#i
replace =
useRegExp = 1
}
}
}