Просмотр полной версии : Строка картинок, перемешанных в случайном порядке?
Изучаю Typo3, делаю тестовый сайт. Стоит задача: на всех страницах выдать в строку (или однострочную таблицу) 5 маленьких картинок в случайном порядке из десятка имеющихся, при нажатии стандартно показать большую картинку в окне.
После долгих разбирательств сумел заставить Typo3 (4.2.0) выдавать все картинки, указанные как контент типа image на отдельной (вне меню) странице. Но - как заставить выдать не всё, а только 5 из всех 10-15 имеющихся в случайном порядке?
Полный затык! Уже 3 дня топчусь на месте. Помогите, плиз!
Хотел туда присобачить свой скрипт на PHP (взятый из другого, не-typo3 проекта), чтобы уже готовую таблицу с линками расщепить на элементы и выдать 5 случайных из них обратно... так не смог понять куда его воткнуть чтобы получить уже построенную таблицу в $this->getCurrentVal() из примера. Закомментированный вариант не работает.
Может я вообще чешу правое ухо левой рукой, и где-то есть готовое решение или похожий пример? Как вообще влезть внутрь tt_content.image.20, и надо ли туда влезать? Может PHP_SCRIPT_EXT поможет?
Вот часть Setup:
workOnSubpart = DOCUMENT
marks {
IMAGES = COA_INT
IMAGES {
// 10=PHP_SCRIPT_INT
// 10 {
// files = fileadmin/script.inc
10 = CONTENT
10 {
table = tt_content
select {
// id of page with images = 17
pidInList = 17
}
renderObj < tt_content.image.20
renderObj.maxW = 900
renderObj.maxWInText = 900
renderObj.spaceBelowAbove = 0
renderObj.colSpace = 0
renderObj.rowSpace = 0
renderObj.borderThick = 0
renderObj.textMargin = 0
renderObj.renderMethod = table
// renderObj.noStyle = 1
}
// end of CONTENT
// }
}
// end of IMAGES
// ...
}
// end of marks
Скрипт берущий 3 случайные картинки (не доработан; но даже не получал getCurrentVal() !):
<?
$mycontent = $this->getCurrentVal();
debug($mycontent);
echo $mycontent;
////$list=explode('td',$mycontent);
$list = array("x","y","z","a","b");
$maxpic = 3;
$listcount = count($list);
$i = 0;
$pic = array();
// srand((double)microtime()*1000000);
while ($i < $maxpic) {
$random = rand(1,$listcount);
echo $random;
// test all prev:
$j = 0;
while ($j < $i) {
if ($random == $pic[$j]) {
// found the same - change and repeat!
$random = rand(1,$listcount);
echo $random;
$j = 0;
}
else {
$j++;
}
}
$pic[$i] = $random;
// echo '<TD><img src="images/'.$list[$random-1].'.jpg"></td>';
$content .= $list[$i];
$i++;
}
$content = '<!--'.$content.'-->';
?>
P.S. Теоретически можно ещё написать свой скрипт с нуля, то есть самому обратиться в базу на SQL, получить список имён картинок, взять 5 случайных и самому сформировать вокруг них требуемые линки с JavaScript и таблицу. Но ведь это уже в Typo3 уже где-то есть; мне достаточно добавить мой скрипт между получением массива картинок и их обёртыванием; можно ли это сделать и как именно? Что именно, какие структуры должен сформировать отдельный скрипт, чтобы указанный мной renderObj обработал их так же, как исходный список картинок?
Pavel Antonov
19.06.2009, 19:42
По-моему будет достаточно средств TYPO3 и MySQL.
В свою выборку картинок добавте:
select {
// id of page with images = 17
pidInList = 17
// Добавить:
orderBy = RAND()
max = 5
}
Спасибо, попробую... но разве orderBy - это не название поля? Туда можно всё что угодно писать?
И потом, со своим скриптом тоже хочется разобраться - почему он ничего не получает на вход? Или входом является не getCurrentVal() а что-то другое?
P.S. Влепил, попробовал... ноль внимамания, фунт презрения. Даже на max не прореагировало. Может закешировалось? Но я почистил кеш, да и стоит COA_INT. Сменил pidInList на фальшивый - картинки пропали, вернул - снова вижу десяток в стандартном порядке... Как можно отдебаггить сам запрос в базу, чтобы проверить SQL?
На сегоня хватит, уже голова не варит; завтра для разнообразия почитаю доки не по Typo3, а по SQL. :) В любом случае спасибо за наводку.
P.P.S. Идиотизм. Включил админ-панель, там стоит правильный SQL и
Non-cached objects/Include /10 CONTENT 705 5 +79 =84 NUMROWS: 1
со вроде правильными 5 элементами... а следом
...-cached objects/Include /10/renderObj USER 928 79
в котором и лежит прежняя десятка. И чистка кеша Clear All Cache не помогает.
Фтопку этот Typo3 вместе с сервером!!!
Pavel Antonov
19.06.2009, 20:47
Спасибо, попробую... но разве orderBy - это не название поля? Туда можно всё что угодно писать?
И потом, со своим скриптом тоже хочется разобраться - почему он ничего не получает на вход? Или входом является не getCurrentVal() а что-то другое?
P.S. Влепил, попробовал... ноль внимамания, фунт презрения. Даже на max не прореагировало. Может закешировалось? Но я почистил кеш, да и стоит COA_INT. Сменил pidInList на фальшивый - картинки пропали, вернул - снова вижу десяток в стандартном порядке... Как можно отдебаггить сам запрос в базу, чтобы проверить SQL?
На сегоня хватит, уже голова не варит; завтра для разнообразия почитаю доки не по Typo3, а по SQL. :) В любом случае спасибо за наводку.
Должно работать, TYPO3 вроде подставляет в запрос как есть... Почему не работает max - совсем не понятно. Может не туда поставили код?
Чё-то я перенервничал, даже не выдержал и из дома посмотрел...
да, похоже RAND() не туда надо ставить, поскольку у меня на 17й странице не 10 элементов контента, а один с 10 рисунками.
Но тогда куда же RAND() вставлять?! В "renderObj < tt_content.image.20" ? Но я и так там 2 дня из 3х возился... где в "tt_content.image.20" находится select?!
Попробовать самому собрать "renderObj = IMGTEXT" с параметрами? Но в описании TSref для IMGTEXT тоже нет select! Единственно похожее поле "imgList.field = image", но где там место для "orderBy = RAND()"?
Между прочим, предусмотренный для IMGTEXT "renderObj.imgMax=5" сработал, а вот наобум вставленное "renderObj.imgList.orderBy = RAND()" не помогло.
В общем, отдохну до понедельника, может что придёт в голову новое...
orderBy ставится в select. как понятно из названия, select - это sql запрос.
смотреть где то в районе CONTENT надо, а не IMGTEXT.
Pavel Antonov
20.06.2009, 15:51
Я же вроде дал четко кусок ВАШЕГО кода, куда поставить orderBy...
Вот целиком, тогда:
workOnSubpart = DOCUMENT
marks {
IMAGES = COA_INT
IMAGES {
10 = CONTENT
10 {
table = tt_content
select {
pidInList = 17
// Добавить:
orderBy = RAND()
max = 5
}
renderObj < tt_content.image.20
renderObj.maxW = 900
renderObj.maxWInText = 900
renderObj.spaceBelowAbove = 0
renderObj.colSpace = 0
renderObj.rowSpace = 0
renderObj.borderThick = 0
renderObj.textMargin = 0
renderObj.renderMethod = table
// renderObj.noStyle = 1
}
// end of CONTENT
// }
}
// end of IMAGES
// ...
}
// end of marks
А renderObj отвечает только за вывод одной строки результата, полученного из базы.
Я же вроде дал четко кусок ВАШЕГО кода, куда поставить orderBy...
А я чётко следом написал, что поставил, проверил, и убедился что так не работает! :(
Правда вначале думал что из-за проблем с кешированием, а затем допетрил, что у меня стоит 1 (прописью: один!) элемент контента, и соответственно он и выводится в единственном числе, независимо от rand и max. А вот внутри этого элемента сидят не одна, а 10 картинок, поскольку они никакими параметрами, кроме имени файла и соответственно изображения, не различаются. У них ни заголовков, ни других тегов вообще никаких нет, и размеры в малом виде должны быть одинаковые, поэтому они спокойно все впихнулись в один-единственный элемент контента! Типа image. Там при вводе картинки BE спокойно допускает мультиввод имён файлов. И они спокойно отображаются все вместе. Но мне же надо только часть и в случайном порядке!
Вот параметр imgMax в renderObj подействовал, ограничил выходную таблицу картинок 5ю первыми в списке. А где этот список строится (где-то внутри tt_content.image.20 ?) и что соответственно надо добавить в renderObj, я пока так и не понял.
Но соль именно в том, что этот renderObj отрабатывает 1 раз, строя при этом все картинки как часть одного элемента, с единственным пустым заголовком и так далее...
Вы сами можете проверить, добавив в любую страницу элемент image и указав в нём не одну картинку, а несколько штук!
В понедельник попробую разбосать вместо 1 элемента с 10 картинками - 10 элементов по 1 картинке, тогда rand и max заработают. Правда редактору менее удобно, вместо простого перечисления файлов (а их может быть до сотни!) каждый раз новый контент-элемент заводить, ну и мне надо будет наверняка и renderObj переделать и с css заново возиться, переставлять стили... да и вообще хотелось бы до конца разобраться, а не просто обойти проблему.
P.S. Забыл уточнить, что на этом сайте у меня стандартный Typo3, без TV.
В этом случае вам надо копаться действительно в tt_content.image.20, а точнее, в class.tx_cssstyledcontent_pi1.php
Если я правильно понял код, то вам нужна userFunc в stdWrap-е параметра imgList.
В этом случае вам надо копаться действительно в tt_content.image.20, а точнее, в class.tx_cssstyledcontent_pi1.php
Если я правильно понял код, то вам нужна userFunc в stdWrap-е параметра imgList.
Спасибо за наводку, посмотрел но пока ничего там не понял. :o Покопаюсь потом, сейчас силов уж нетути... ;)
А вариант с 10 элементами по 1 картинке и orderBy=RAND() проверил сегодня - да, в принципе это работает! :) Спасибо Pavel Antonov (http://forum.typo3.biz/member.php?u=22)!
Но уж очень много минусов... главный - вокруг каждого элемента стоит лишний DIV и лишняя таблица. Как их убрать, опять непонятно, а времени снова копать нет да и желания честно говоря поубавилось.
Другой минус - при вводе на каждую картинку надо минимум 7 кликов вместо одного. А при необходимости заменить один из файлов я вообще не нашёл пока другой возможности найти элемент с заменяемым файлом, как искать всё подряд... или тратить при вводе каждого ещё 2 клавиши копи-паст и пару кликов, называя элемент контента так же как файл.
Так что советы по улучшению по-прежнему охотно принимаются.
Вот собственно работающий вариант:
temp.render_1 < tt_content.image.20
temp.render_1 {
spaceBelowAbove = 0
colSpace = 0
rowSpace = 0
noRows = 1
textMargin = 0
borderThick = 0
textMargin = 0
renderMethod = table
noStretchAndMarginCells = 1
noStyle = 1
stdWrap.wrap = <td>|</td>
}
...
IMAGES = COA_INT
IMAGES {
10 = CONTENT
10 {
table = tt_content
select {
pidInList = 19
orderBy = RAND()
max = 5
}
renderObj < temp.render_1
wrap = <table id="imagestring"><tr>|</tr></table>
}
}
...
Pavel Antonov
23.06.2009, 16:15
Но уж очень много минусов... главный - вокруг каждого элемента стоит лишний DIV и лишняя таблица. Как их убрать, опять непонятно, а времени снова копать нет да и желания честно говоря поубавилось.
Другой минус - при вводе на каждую картинку надо минимум 7 кликов вместо одного. А при необходимости заменить один из файлов я вообще не нашёл пока другой возможности найти элемент с заменяемым файлом, как искать всё подряд... или тратить при вводе каждого ещё 2 клавиши копи-паст и пару кликов, называя элемент контента так же как файл.
Тогда не надо тянуть отображение картинки из css_styled_content. Написать все руками как надо:
...
renderObj = IMAGE
renderObj {
file.import = uploads/pics/
file.import.field = image
file.import.listNum = 0
...
}
Последнее ИМХО не проблема.. это не часто делается.
Еще у меня такое ощущение, что вы нам "не все о себе рассказали". Если Вам надо что то вроде баннеров, почему не взять именно баннерный плагин. Например machina_banners. Все ж придумали до нас.
Еще у меня такое ощущение, что вы нам "не все о себе рассказали".
;) Угу... я Агент 008, с правом на убийство компьютеров, вот и секречусь даже от самого себя! :D
По примеру документации к Типу3, которая наполовину устарела а наполовину вообще отсутствует. Скажем, какой скрипт и в какой момент кладёт малые и большие копии моих картинок в uploads/pics и почему именно туда? И где в базе хранятся связи между моим именем картинки и именем генерированной из неё мелкой? Я предполагаю, что это делает какой-то скрипт BE в момент сохранения вставленного элемента контента... но это ведь нигде не описано!
Если Вам надо что то вроде баннеров, почему не взять именно баннерный плагин. Например machina_banners. Все ж придумали до нас.
Может быть, но как мне было об этом догадаться? Логически это не баннеры (т.е. не иконки со ссылками куда-то вовне сайта), а больше похоже на кусочек галереи картинок на самом сайте.
И потом, если отключить флажок безопасности, появляется более трёх тысяч всяких плагинов, их даже просмотреть всех тяжко :(
Далее, загрузив этот плагин, надо будет в нём ещё разобраться - как использовать в нужном мне режиме... а доки там наверняка или вообще нет, или неполная.
В вашем написании вообще ничего не нашлось, по banners нашёлся "Macina Banners Extension ww_macinabanners", который оказался дополнением к "Advanced Banner Management macina_banners". По краткому описанию мне скорее нужно именно дополнение... а скорее всего не нужно ни то ни другое, а только стянуть с него метод перемешивания и вставить себе (в одно место). :mad: Причём для этого наверняка надо будет лезть в коды плагина. А дел ещё других полно... но все-таки потом полезу, посмотрю, а пока попробую ваш совет с "renderObj = IMAGE".
Кстати, я брал tt_content.image.20 (IMGTEXT) потому, что мне нужна именно готовая обвязка JavaScript-ом, а здесь наверняка придётся ее самому вставлять. Сейчас проверим...
Таки да, объект IMAGE с ручной обвязкой даёт требуемый результат. Пример ниже. Всем спасибо! :)
Впрочем, как немного освобожусь, вернусь к разбору тонкостей, плагинов-баннеров, собственных функций и прочего. Если обнаружу что-нибудь полезное для данного случая, отпишусь в этой теме. Но это будет наверно уже нескоро. :cool:
temp.render_2 = IMAGE
temp.render_2 {
file.import = uploads/pics/
file.import {
field = image
listNum = 0
}
file.height = 77
imageLinkWrap = 1
imageLinkWrap {
enable = 1
JSwindow = 1
bodyTag = <BODY bgColor=black>
wrap = <A href="javascript:close();"> | </A>
width = 400m
height = 300m
JSwindow = 1
JSwindow.expand = 20,30
}
wrap = <td>|</td>
}
...
10 = CONTENT
10 {
table = tt_content
select {
pidInList = 19
orderBy = RAND()
max = 5
}
renderObj < temp.render_2
wrap = <table class="imagetbl"><tr>|</tr></table>
}
}
...
Работает на vBulletin® версия 3.8.1. Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot