Они пришли, они купили … но они вернулись? Самые важные посетители сайта электронной коммерции — это те, кто на самом деле отказывается от пластика, и как только вы подключитесь к сети, вам нужно, чтобы они вернулись — и привели своих друзей тоже. Как? Ну, покупатели — это люди, и людям нравится чувствовать что-то. Почему бы не сделать своих клиентов частью вашего сайта, создав для них галерею изображений?
Я знаю, о чем вы думаете: подобные галереи имеют тенденцию становиться слишком большими, и когда они это делают, они начинают терять свою привлекательность. У меня недавно был клиент с интересным решением: заставить галерею вращаться.
Сядьте в свою машину и вращайтесь
Мой клиент хотел, чтобы их галерея показывала только двенадцать изображений за раз и вращала один старый элемент и один новый элемент каждый день. Этот клиент продает детали и комплекты уличных удилищ, а его клиенты любят присылать свои фотографии на дросселях своих T-образных ковшей, задирать колеса на парковке компании и пугать бабушек. Вот пример, который показывает это в действии. Этот пример настроен на вращение один раз в секунду, поэтому обновите браузер несколько раз, чтобы увидеть его в действии.
Так что я ехал по извилистым улочкам, где я живу, слушая Эрика Долфи, когда я понял, как я собираюсь заставить это работать. Я собирался использовать таблицу в базе данных, чтобы клиент мог добавлять картинки через раздел администратора. Нам нужен был способ сдвигаться вперед на одну запись каждый день, независимо от количества записей. Я также мог видеть, что между последней записью и первой будет пересечение, которое необходимо сгладить.
Встряхни эту Моди
Мне пришло в голову, что если бы у меня было большое число, которое увеличивалось ежедневно, я мог бы разделить его на количество записей, чтобы вычислить, с какой записи начинать. Например, если мы посчитаем количество дней с 1 января 2000 года (назовем его тикером), а затем разделим тикер на количество записей, остаток всегда будет на 0 — один меньше, чем количество записей. Поскольку наш тикер будет постепенно увеличиваться (если солнце встает), наш остаток также будет увеличиваться с той же скоростью. Если бы мы хотели, мы могли бы заставить галерею вращаться каждый час, минуту или секунду, настраивая способ расчета тикера.
Начиная
В этом примере предполагается, что у вас есть базовое понимание HTML и языка ColdFusion. Если вы только начинаете с ColdFusion, посмотрите отличную серию из трех частей Криса Бизли здесь .
ColdFusion Server 5 теперь доступен бесплатно для разработчиков; пробная версия становится однопользовательской лицензией по истечении 30-дневной пробной версии. Вы можете скачать его здесь .
Вам понадобится этот ZIP-файл .
Это содержит:
- вращающийся шаблон ColdFusion.
- sitepoint_gallery.mdb База данных Microsoft Access
- 26 миниатюр (.gif)
База данных содержит только одну таблицу с именем «галерея». Поля в нем:
- ID (автоинкремент, первичный ключ)
- img_name — имя файла изображения (12.gif)
- img_x — ширина изображения
- img_y — высота изображения
- img_title — текст для отображения с этим изображением
Есть 26 записей, по одной на каждую из 26 миниатюр.
Разархивируйте в папку, сопоставленную с сервером ColdFusion. Нажмите Alt-M в ColdFusion studio, чтобы открыть окно сопоставлений, прочитайте документацию ColdFusion, если вам нужна помощь. Вам также необходимо создать системный DSN с именем sp_gallery
, который указывает на файл доступа .mdb
. Опять же, если вам нужна помощь, попробуйте документацию.
Направьте ваш браузер на rotating_gallery.cfm
‘. Вы должны увидеть небольшую галерею из 12 пронумерованных изображений, аналогичную приведенному выше примеру .
Убери свой пистолет
Давайте посмотрим rotating_gallery.cfm
‘.
<cfprocessingdirective suppresswhitespace="Yes"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Rotating Gallery</title> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1"> </head> <body>
Начните страницу, как и любой другой, тэг cfprocessingdirective
помогает подавить лишние пробелы, создаваемые циклами ниже. Это делает файл меньшего размера, когда шаблон анализируется и отправляется в браузер, что ускоряет работу посетителя.
<cfquery name="qGallery" datasource="sp_gallery" cachedwithin="#CreateTimeSpan(0,0,10,0)#"> SELECT ID,pic_thumb,pic_x,pic_y,pic_title FROM gallery ORDER BY ID; </cfquery>
Мы запускаем простой запрос, чтобы извлечь все записи из таблицы галереи.
<!--- initialize variables ---> <cfset start_day = DateDiff("y","01/01/2000",Now())>
Это наше значение тикера, которое нам нужно увеличивать каждый день. Мы используем функцию DateDiff, чтобы сообщить нам, сколько дней (» y
«) прошло с 01.01.2000 и сегодня, и назначить ее переменной ‘ start_day
‘. Это значение должно быть больше, чем ваша учетная запись, поэтому перенесите дату назад, если у вас есть большое количество элементов для циклического перехода.
<cfset total_items = 12>
Установите для total_items
общее количество элементов, отображаемых на странице. Мы будем использовать эту переменную, чтобы определить точку остановки.
<cfset start_item = (start_day MOD qGallery.recordcount) + 1>
Переменная start_item
будет содержать значение элемента в первой позиции. Мы находим это, добавляя единицу к оставшейся части переменной start_day
деленной на количество записей в нашем запросе. Чтобы найти остаток (или модуль) уравнения деления, мы используем математическую функцию MOD
. В ColdFusion (5 MOD 2) возвращает 1, остаток от 5 / 2. Модуль всегда будет целым числом ниже делителя. Если вы думаете об этом, любое число, разделенное на 4, всегда будет давать остаток (или модуль) 0, 1, 2 или 3.
<cfset end_item = start_item + (total_items - 1)>
Нам также нужно знать, на какой записи остановиться, мы можем легко найти ее, вычтя одну из переменной total_items
и добавив это значение в переменную start_item
. Мы присваиваем этот результат переменной end_item
.
<cfif end_item GT qGallery.recordcount> <cfset end_item = end_item - qGallery.recordcount> </cfif>
Что произойдет, если start_item
— это запись 20, а записей всего 23? Когда мы добавляем 11, мы получаем 31! Нам нужно разобраться с перекрытием с последней записи на первую. Нам все еще нужно знать, на какой записи останавливаться, поэтому, если переменная end_item
больше, чем recordcount, мы вычитаем количество записей из значения end_item
, чтобы найти правильный end_item
.
<cfset columns = 4>
Установите для переменной ‘ columns
‘ желаемое количество столбцов таблицы.
<cfset col_tick = 0>
Мы будем увеличивать переменную ‘ col_tick
‘ по мере вывода ячеек таблицы в каждой строке.
<cfset count = 0>
Счет также будет увеличен, и когда он достигнет значения нашей переменной total_items
, мы в конце.
Теперь наш запрос выполнен и все необходимые переменные инициализированы. Продолжаем с забавной частью: строим галерею!
<div align="center"> <table width="70%" border="0" cellpadding="0" cellspacing="0"> <tr>
Начнем с таблицы и откроем строку.
<cfif start_item LT end_item>
Если наше значение end_item
выше, чем стартовая машина, мы можем выполнить очень простой вывод. Если нет, мы должны иметь дело с перекрытием от последней записи к первой записи.
Я использую CFLOOP
ниже для ясности, которую обеспечивают атрибуты startrow и endrow. Однако это также может быть достигнуто с помощью CFOUTPUT
.
<cfloop query="qGallery" startrow="#start_item#" endrow="#end_item#">
Мы устанавливаем startrow
и endrow
для наших start_item
и end_item
.
<cfset col_tick = IncrementValue(col_tick)> <cfset count = IncrementValue(count)>
Мы будем отслеживать общее количество выводимых элементов с помощью переменной count, когда она соответствует total_items
, мы закончили. Переменная col_tick
используется для подсчета столбцов таблицы, когда col_tick
равен столбцам, нам нужно начать новую строку таблицы и сбросить col_tick
в ноль.
<cfoutput>
Мы открываем тег cfoutput
, так как знаем, что нужно выводить значения наших переменных в браузер.
<td width="40"><img src="#pic_thumb#" height="#pic_y#" width="#pic_x#" alt="#pic_title#"></td>
Наконец, мы записываем наш тег img в браузер.
<cfif count EQ total_items> </tr></table> <cfelseif col_tick EQ columns> </tr><tr><cfset col_tick = 0> </cfif>
Здесь мы сравниваем нашу переменную count с переменной total_items
. Когда они совпадают, мы закончили и должны закрыть наш стол. Если не верно, мы проверяем, соответствует ли наша переменная col_tick
нашей переменной столбцов. Если они совпадают, нам нужно закрыть строку текущей таблицы и начать новую.
</cfoutput>
Закройте наш тег cfoutput
.
</cfloop>
Закройте петлю.
<cfelse><!--- if start_item LT end_item --->
Если наше значение end_item
меньше, чем значение start_item
, нам нужно иметь дело с перекрытием от последней записи к первой. Мы можем сделать это, выводя результаты запроса дважды. Один раз до конца набора записей, а затем от начала набора записей до значения end_item
.
Код ниже идентичен коду выше, за исключением значений startrow
и endrow
в тегах cfloop.
Для первого вывода мы устанавливаем startrow
start_item
значению start_item
как указано выше, но на этот раз мы устанавливаем значение endrow
соответствующее количеству recordcount
из нашего запроса. Кроме того, нам не нужен оператор <cfif count EQ total_items>
, так как мы знаем, что этот цикл не завершит галерею.
<cfloop query="qGallery" startrow="#start_item#" endrow="#qGallery.recordcount#"> <cfset col_tick = IncrementValue(col_tick)> <cfset count = IncrementValue(count)> <cfoutput> <td width="40"><img src="#pic_thumb#" height="#pic_y#" width="#pic_x#" alt="#pic_title#"></td> <cfif col_tick EQ columns> </tr><tr><cfset col_tick = 0> </cfif> </cfoutput> </cfloop>
Второй вывод будет от начала набора записей до значения end_item
.
<cfloop query="qGallery" startrow="1" endrow="#end_item#"> <cfset col_tick = IncrementValue(col_tick)> <cfset count = IncrementValue(count)> <cfoutput> <td width="40"><img src="#pic_thumb#" height="#pic_y#" width="#pic_x#" alt="#pic_title#"></td> <cfif count EQ total_items> </tr></table> <cfelseif col_tick EQ columns> </tr><tr><cfset col_tick = 0> </cfif> </cfoutput> </cfloop> </cfif><!--- close if start_item LT end_item --->
Теперь мы закрываем наше заявление if.
</div> </body> </html> </cfprocessingdirective>
Закройте нашу страницу, и мы закончили!
Соображения
Этот код можно легко применить к блокам текста или баннеров. Если вы хотите, чтобы он вращался с интервалом, отличным от ежедневного, настройте эту строку:
<cfset start_day = DateDiff("y","01/01/2000",Now())>
« y
» возвращает количество дней между 01.01.2000 и настоящим. Чтобы галерея вращалась в час, измените « y
» на « h
». См. Документацию ColdFusion для полного обсуждения функции DateDiff
.
Содержимое наших циклов очень похоже, если мы оставим их в операторах if, которые мы пропустили во втором наборе вывода, мы могли бы поместить этот код во включаемый файл.
Добавьте еще несколько полей в базу данных, и миниатюры могут привести к большим изображениям, сопровождаемым описательными абзацами.
С некоторыми изменениями это может стать отличным пользовательским тегом! Я использовал это, чтобы вращать в продаже предметы для других сайтов. Не стесняйтесь изменять код, дайте мне знать, что вы придумали!
Вывод
Мы порадовали нашего клиента и создали лучшую галерею. Ощущение посетителя от того, что его фотография размещена на Сайте, только усиливается тем фактом, что оно будет там в течение определенного времени, исчезнет для заклинания, а затем вернется позже. Если бы вы только что потратили один год и два миллиарда долларов, создавая шасси космической трубы 1923 года с кричащим силовым агрегатом и стеками Вебера, не хотели бы вы показать друзьям сайт, на котором вы их разместили? Клиенты сейчас проводят целевой маркетинг для владельцев сайта!
Теперь иди и размножайся — или, вернее, разделяй и властвуй.