Ich arbeite mit Extbase & Fluid.
Im Datenbankfeld werden Bilder als kommaseparierte Liste gespeichert (bild1.jpg,bild2.jpg,bild3.jpg).
Wie kann ich alle Bilder mit Fluid ausgeben?
Der folgende Befehl geht nur für 1 Bild:
<f:image src=".." alt="..." />
Welchen ViewHelper brauche ich?
Danke und Gruss Martin
Mach doch in deinem Controller einen "explode" auf die Bilder:
$this->view->assign('bilder', explode(",", $this->modelRepository->getImages()));
Dann kannst du in Fluid durch das Array interieren mit einer Schlaufe:
<f:for each="{bilder}" as="bild">
<f:image src="{bild}" alt="..." />
</f:for>
Achtung... Habe das jetzt nicht getestet... Nur so aus dem Kopf kurz hin geschrieben. Sollte aber funktionieren.
greenbanana schrieb
Mach doch in deinem Controller einen "explode" auf die Bilder:
$this->view->assign('bilder', explode(",", $this->modelRepository->getImages()));
Dann kannst du in Fluid durch das Array interieren mit einer Schlaufe:
<f:for each="{bilder}" as="bild">
<f:image src="{bild}" alt="..." />
</f:for>
Achtung... Habe das jetzt nicht getestet... Nur so aus dem Kopf kurz hin geschrieben. Sollte aber funktionieren.
Also ich bin auch gerade dabei eien Bildergallerie zu schreiben und habe es auf dem hier beschriebenen Weg probiert. hat leider nicht geklappt.
Habe das ganze jetzt mit Flexforms gelöst ohne eine DB Abfrage.
So funktioniert das ganze.
Hier meine Konfiguration, falls es jmd. interessiert.
Meine indexAction im Controller
$this->settings['headline'];
$this->settings['bilderupload'];
$this->view->assign('bilder', explode(",", $this->settings['bilderupload']));
Und dann noch meine dazugehörige index.html
<f:for each="{bilder}" as="bild" key="number">
<f:image src="uploads/tx_hk_chc_cm030/{bild}" alt="bilder"/><br/>
</f:for>
Hallo!
Ich hatte das selbe Problem, habe es nun aber anders gelöst. Ich habe mir einen ViewHelper geschrieben (in dieser Variante sehr einfach gestrickt, aber er tut zumindest was er soll):
class Tx_Immobilia_ViewHelpers_ImagesViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {
/**
* @param string $data
* @return string The rendered image tag
*/
public function render($data) {
$data = explode(',', $data);
$images = '';
$count = 0;
foreach($data as $d) {
$images.= '<img src="/uploads/tx_immobilia/' . $d . '" width="100" alt="Bilder" />';
$count++;
}
return $images;
}
}
Im Fluid-Template rufe ich diesen wie folgt auf:
{namespace immo=Tx_Immobilia_ViewHelpers}
<immo:images data="{object.images}" />
<!-- in {object.images} steht der String mit den Bildnamen -->
Hoffe das hilft weiter, die das selbe Problem haben oder hatten.
LG Christoph
http://www.keynet.at
Hallo,
theoretisch sollte auch ein cObject funktionieren:
<f:cObject typoscriptObjectPath="plugin.tx_myext.images" data="{entry.images}" />
und im TS:
plugin.tx_myext.images = TEXT
plugin.tx_myext.images {
current = 1
split {
token = ,
cObjNum = 1
1 {
10 = IMAGE
10 {
file {
import = uploads/pics/
import.current = 1
maxW = 120
}
}
}
}
}
(Bei "plugin.tx_myext.images.current = 1" bin ich mir nicht sicher. Das soll folgendes bedeuten: "plugin.tx_myext.images.value = {entry.images}". Also der Value vom TEXT ist das, was fluid im Argument "data" mitteilt.)
Also... nicht getestet - aber es könnte ein Lösungsansatz sein.
LG sun
Zur Vollständigkeit noch mein Lösungsansatz mit einem kleinen Viewhelper:
<?php
/***************************************************************
* Copyright notice
*
* (c) 2010 Sebastian Michaelsen
* 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.
*
* 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!
***************************************************************/
/**
* Explodes a string and returns an array.
*
* E.g. can be used for rendering a comma separated image list:
*
* <f:for each="{m:explode(string:imagelist)}" as="image">
* <f:image ... />
* </f:for>
*
* @version $Id: $
* @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
* @scope prototype
*/
class Tx_MyExt_ViewHelpers_ExplodeViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {
/**
* Explodes a string and returns an array
*
* @param string $string
* @param string $delimiter
* @return array
*/
public function render($string = '', $delimiter = ',') {
$arr = explode($delimiter, $string);
return $arr;
}
}
?>
man kann auch im Model das ganze exploden, sodass man in fluid for each nutzen kann...
/**
* Returns the pics
*
* @return array $covers
*/
public function getPics() {
return explode(',', $this->pics);
}
<f:for each="{pics}" as="pic">
<f:image src="uplaods/tx_foo/{pic}" alt="bar" />
</f:for>
Hallo!
das ist fast perfekt, danke.
Aber wie fange ich den Fall ab, wenn kein Bild in der kommaseparierten Liste enthalten ist.
Das erste Arrayfeld ist leer und damit kommt ein Fehler beim Imageprozess.
Dank für Eure Hilfe
IckeBins schrieb
... Fehler beim Imageprozess.
Vllt. mit Conditions?
<f:if condition="{myImages}">
<f:for each="{myImages -> f:getPics()}" as="pic">
<f:if condition="{pic}">
<f:image src="uplaods/tx_foo/{pic}" alt="bar" />
</f:if>
</f:for>
</f:if>