Форум больше не используется. Присоединяйтесь к каналу #community-ru в Slack for TYPO3 community |
19.06.2009, 19:09 | #1 |
Новенький
Регистрация: 19.06.2009
Сообщений: 15
|
Строка картинок, перемешанных в случайном порядке?
Изучаю Typo3, делаю тестовый сайт. Стоит задача: на всех страницах выдать в строку (или однострочную таблицу) 5 маленьких картинок в случайном порядке из десятка имеющихся, при нажатии стандартно показать большую картинку в окне.
После долгих разбирательств сумел заставить Typo3 (4.2.0) выдавать все картинки, указанные как контент типа image на отдельной (вне меню) странице. Но - как заставить выдать не всё, а только 5 из всех 10-15 имеющихся в случайном порядке? Полный затык! Уже 3 дня топчусь на месте. Помогите, плиз! Хотел туда присобачить свой скрипт на PHP (взятый из другого, не-typo3 проекта), чтобы уже готовую таблицу с линками расщепить на элементы и выдать 5 случайных из них обратно... так не смог понять куда его воткнуть чтобы получить уже построенную таблицу в $this->getCurrentVal() из примера. Закомментированный вариант не работает. Может я вообще чешу правое ухо левой рукой, и где-то есть готовое решение или похожий пример? Как вообще влезть внутрь tt_content.image.20, и надо ли туда влезать? Может PHP_SCRIPT_EXT поможет? Вот часть Setup: PHP код:
PHP код:
Последний раз редактировалось dimal; 19.06.2009 в 19:22 |
19.06.2009, 19:42 | #2 |
Senior Member
|
По-моему будет достаточно средств TYPO3 и MySQL.
В свою выборку картинок добавте: Код:
select { // id of page with images = 17 pidInList = 17 // Добавить: orderBy = RAND() max = 5 } |
19.06.2009, 20:10 | #3 |
Новенький
Регистрация: 19.06.2009
Сообщений: 15
|
Спасибо, попробую... но разве 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 [STRIKE]со вроде правильными 5 элементами...[/STRIKE] а следом ...-cached objects/Include /10/renderObj USER 928 79 в котором и лежит прежняя десятка. И чистка кеша Clear All Cache не помогает. Фтопку этот Typo3 вместе с сервером!!! Последний раз редактировалось dimal; 20.06.2009 в 02:39 Причина: ошибка |
19.06.2009, 20:47 | #4 | |
Senior Member
|
Цитата:
|
|
20.06.2009, 02:24 | #5 |
Новенький
Регистрация: 19.06.2009
Сообщений: 15
|
Чё-то я перенервничал, даже не выдержал и из дома посмотрел...
да, похоже 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()" не помогло. В общем, отдохну до понедельника, может что придёт в голову новое... Последний раз редактировалось dimal; 20.06.2009 в 03:00 |
20.06.2009, 11:35 | #6 |
Senior Member
Регистрация: 01.07.2008
Сообщений: 392
|
orderBy ставится в select. как понятно из названия, select - это sql запрос.
смотреть где то в районе CONTENT надо, а не IMGTEXT. |
20.06.2009, 15:51 | #7 |
Senior Member
|
Я же вроде дал четко кусок ВАШЕГО кода, куда поставить 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 |
20.06.2009, 17:24 | #8 | |
Новенький
Регистрация: 19.06.2009
Сообщений: 15
|
Цитата:
Правда вначале думал что из-за проблем с кешированием, а затем допетрил, что у меня стоит 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. Последний раз редактировалось dimal; 20.06.2009 в 17:52 |
|
23.06.2009, 02:10 | #10 | |
Новенький
Регистрация: 19.06.2009
Сообщений: 15
|
Цитата:
А вариант с 10 элементами по 1 картинке и orderBy=RAND() проверил сегодня - да, в принципе это работает! Спасибо Pavel Antonov! Но уж очень много минусов... главный - вокруг каждого элемента стоит лишний 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> } } ... Последний раз редактировалось dimal; 23.06.2009 в 02:27 |
|