Статьи

Синдикация контента с ColdFusion MX

Синдикация контента стала чрезвычайно популярным подходом к предоставлению контента посетителям веб-сайта, а также к тому, что многие люди могут собирать информацию в одном месте для быстрого и удобного просмотра.

Например, если вы получаете новости ColdFusion от Macromedia, ваши технические статьи . из SitePoint и ваших новостей о цифровой безопасности из CNET, вы можете создать единую веб-страницу, которая позволит вам видеть все новости одновременно. В этой статье мы поговорим о том, как вы можете сделать это очень быстро (и я имею в виду очень быстро!) И легко в ColdFusion MX.

Важно отметить, что, поскольку RSS — это технология на основе XML, необходимо использовать ColdFusion MX, чтобы следовать примерам, приведенным в этой статье. Существуют способы использования XML с более старыми версиями, но они слишком сложны и не всегда столь же стабильны, как встроенные функциональные возможности MX.

Что такое RSS?

Сначала поговорим о том, что такое RSS. Я не собираюсь давать вам всю историю здесь, но я предоставлю ссылки на очень важную информацию, которая поможет вам начать работу с концепцией RSS. Подводя итог, очень просто, RSS (Real Simple Syndication или RDF Site Summary) — это простой и понятный метод обмена контентом между веб-сайтами. RSS может работать для вас несколькими способами:

  1. RSS позволяет обновлять новости на вашем сайте без необходимости вручную изменять или обновлять новости. Если вы пользуетесь веб-сайтом, связанным со здоровьем, вы можете разместить на нем новости, связанные со здоровьем. В этом случае вы можете использовать RSS-канал MedicineNet для обновления новостей.
  2. Вы можете создать свой собственный канал RSS, который позволит посетителям вашего веб-сайта синдицировать ваш контент. Это может повысить вашу видимость среди сайтов аналогичного жанра, увеличить трафик на ваш сайт и помочь вам создать узнаваемое имя.
  3. Вы можете использовать RSS, чтобы создать свою личную домашнюю страницу для отслеживания новостей, которые вам обычно приходится посещать на нескольких сайтах. Это также дает вам возможность манипулировать способом представления информации и частотой ее обновления.

Возможности для RSS-каналов безграничны. Прежде чем мы продвинемся слишком далеко, я перечислю некоторые ресурсы, которые вы, возможно, захотите прочитать, прежде чем углубляться в остальную часть статьи.

Получение и кэширование RSS-каналов

В моей статье по HTTP я обсуждал, как получить RSS-канал с использованием HTTP. Напомним, что мы пойдем дальше и поговорим о том, как извлечь RSS-канал и кэшировать его для дальнейшего использования. Во-первых, мы собираемся использовать очень простой HTTP-вызов для получения канала. В качестве примера мы будем работать с RSS-каналом для моего блога здесь, на SitePoint. Чтобы получить канал блога, мы будем использовать HTTP-вызов, который выглядит следующим образом:

<cfhttp url="http://www.sitepoint.com/blog.rdf?blogid=7" method="get" timeout="5" path="C:temp" file="dave_blog.rdf" /> 

Этот тег извлекает канал RSS из SitePoint и сохраняет его в файле с именем "dave_blog.rdf" . Важно помнить, что, поскольку мы указываем путь и файл, в структуре cfhttp не FileContent переменной cfhttp . Это означает, что нам нужно будет прочитать файл в переменную:

 <cffile action="read" file="C:tempdave_blog.rdf" variable="FileContent"> 

Теперь у нас есть переменная с именем FileContent которая содержит документ RDF для канала. В конечном итоге мы собираемся проанализировать этот XML-документ и вывести информацию. Но прежде чем мы это сделаем, давайте обсудим кеширование.

Если вы собираетесь разместить мой блог на своем сайте, и у вас 1000 посетителей в день, то, скорее всего, вам придется совершать HTTP-вызов SitePoint 1000 раз в день. Чтобы предотвратить перегрузку своего сервера и ускорить отображение этого канала на вашем собственном сайте, вы обязательно должны кэшировать файл на своем сервере. Вот почему мы указали путь и имя файла, в который мы собираемся сохранить канал. Я думаю, что хочу обновлять канал каждые 24 часа, чтобы быть уверенным в получении свежего контента, но я не буду часто посещать SitePoint. Вот полный код ( cache.cfm ), который я буду использовать для получения нужного канала и кеширования его в файл:

 <cfset SavePath = ExpandPath("./cache.cfm")>  <cfset SavePath = Replace(SavePath, "cache.cfm", "blog.rdf")>   <cfdirectory action="list" directory="#GetDirectoryFromPath(SavePath)#" name="blogRdf" filter="blog.rdf">  <cfif not blogRdf.RecordCount eq 0 and DateCompare(blogRdf.DateLastModified, DateAdd("h", -24, Now())) eq -1>  <cffile action="delete" file="#SavePath#">  </cfif>  <cfif FileExists(SavePath) eq 0>  <cfhttp url="http://www.sitepoint.com/blog.rdf?blogid=7" method="get" timeout="10" path="#GetDirectoryFromPath(SavePath)#" file="#GetFileFromPath(SavePath)#"></cfhttp>  </cfif>   <cffile action="read" file="#SavePath#" variable="FileContent"> 

Это довольно большой кусок кода, поэтому я постараюсь разбить его на строку за строкой. Это действительно очень просто.

  1. Я создаю переменную SavePath , которая является просто путем к текущему файлу шаблона.
  2. Я заменяю имя моего текущего шаблона на имя файла, в котором я хочу сохранить ленту, "blog.rdf" .
  3. Я получаю список каталогов, в которых я хранил канал.
  4. Если файл существует в каталоге и он старше 24 часов, я его удаляю.
  5. Если файл не существует (помните, он удаляется каждые 24 часа), я делаю HTTP-вызов для его извлечения и сохраняю в файле.
  6. Я читаю в файле и сохраняю его как "FileContent" для последующего анализа.

И это почти все, что нужно сделать для нашего механизма поиска и кэширования. Это было легко, не так ли? Остальное тоже легко.

Разбор и отображение RSS-канала

Если вы посмотрите на необработанный XML-вывод RSS-канала, вы увидите, что его структура содержит корневой узел с именем «rdf: RDF». Затем у нас есть узел «канал» с заголовком, ссылкой, описанием и изображением. Затем у нас есть узел «items», который содержит массив узлов «li» («rdf: li»). У нас есть узел «image», который содержит информацию о логотипе SitePoint, в том числе заголовок изображения, ссылку на блог (чтобы перейти к содержанию вашего тега привязки) и URL-адрес самого изображения. Затем у нас есть массив узлов «item», каждый из которых содержит заголовок, прямую ссылку на сообщение в блоге, описание и дату. Обратите внимание, что дата находится в пространстве имен «dc», и это не тот формат, с которым ColdFusion очень дружелюбен. Я покажу вам метод грубого отображения даты.

Первое, что вам нужно сделать, это решить, что вы хотите отобразить и как вы хотите отобразить это. У меня будет одна страница, которая отображает название и описание блога, а также ссылку на него и логотип SitePoint. Затем я покажу каждую запись в блоге — заголовок будет связан с записью на веб-сайте SitePoint, а под ним появятся описание и дата. Вот код, который я использую для этого:

 <cfset xmlDoc = XMLParse(filecontent)>   <cfoutput>  <img src="#xmlDoc.rdf.image.url.xmlText#" align="left">  Source Title: #xmlDoc.rdf.channel.title.xmlText#<br>  Link: <a href="#xmlDoc.rdf.channel.link.xmlText#">#xmlDoc.rdf.channel.link.xmlText#</a><br />  Description: #xmlDoc.rdf.channel.description.xmlText#  <hr />  <cfloop from="1" to="#ArrayLen(xmlDoc.rdf.item)#" index="i">    <cfset dt = Replace(xmlDoc.rdf.item[i].date.xmlText, "T", " ")>    <cfset dt = Replace(dt, "Z", " ")>    <p>    <a href="#xmlDoc.rdf.item[i].link.xmlText#">#xmlDoc.rdf.item[i].title.xmlText#</a><br />    #xmlDoc.rdf.item[i].description.xmlText#<br />    <em>(Posted on #DateFormat(dt, "mm/dd/yyyy")#)</em>    </p>  </cfloop>  </cfoutput> 

Я расскажу вам код, который мы используем для анализа и отображения канала. Сначала мы используем XMLParse(string) для разбора документа. Обратите внимание, что это также проверяющий парсер, поэтому он будет подавлен, если вы передадите ему неверный XML. Когда вы используете эту функцию, она создает объект XML-документа. По сути, это ряд структур и массивов, все вложенные друг в друга.

Далее мы откроем наш cfoutput и начнем отображать информацию. Мой источник изображения будет значением, содержащимся в xmlDoc.rdf.image.url.xmlText . Если вы посмотрите внимательно, вы увидите, что вы можете получить доступ к значениям, просто «пройдя» вниз по дереву документа до нужного значения. Мы начнем с переменной xmlDoc , затем перейдем к корневому узлу rdf . Наша информация об изображении находится в узле image , под узлом url . Значение содержится в элементе xmlText узла url .

В качестве побочного пункта я должен объяснить, как получить доступ к атрибутам в документе XML. Давайте перейдем к атрибуту «about» узла изображения. Вот путь к нему: xmlDoc.rdf.image.xmlAttributes.about . Чтобы получить доступ к атрибуту, обратитесь к структуре xmlAttributes которая присоединена к узлу, в котором хранится атрибут; затем просто получите доступ к имени атрибута.

Вы можете применить вышеуказанную логику для отображения заголовка, описания и ссылки на блог. Затем мы хотим отобразить элементы. Чтобы сделать это, я просто собираюсь выполнить цикл от 1 до длины массива, найденного в xmlDoc.rdf.item . Зацикливаясь на нем, я получу доступ к переменной item[i].variableName для отображения нужной информации. Обратите внимание, что вы должны полностью указать путь к значению, иначе ColdFusion не будет знать, где искать переменную.

Это тоже было довольно легко, верно? Теперь у нас есть около 37 строк кода, которые мы используем для отображения самого канала блога. Ваше задание состоит в том, чтобы изменить код, сделав его красивее, отобразить только x строк на одной странице и разрешить преждевременное обновление кэша (до истечения 24 часов).

Прежде чем я продолжу, позвольте мне поговорить о дате. Эта дата не представлена ​​в формате, понятном ColdFusion. Поэтому наш скрипт довольно сильно падает, когда пытается отформатировать его с помощью функции DateFormat(date, mask) . Чтобы это исправить, вам просто нужно заменить буквы «T» и «Z» пробелами, как вы видели выше. Затем вы можете отобразить его так, как вам нравится.

Создание RSS-ленты для вашего сайта

Если вы запускаете сайт с контентом и хотите синдицировать ваш контент с другими сайтами, самый простой способ сделать это — создать канал RSS. Я собираюсь использовать версию RSS 0.91 для создания собственного фида контента. Вы можете использовать RSS 1.0, как SitePoint, если вы предпочитаете. Просто внесите несколько небольших изменений, чтобы документ соответствовал стандарту .

Мой подход к доставке фида контента заключается в том, что у меня будет запланированное задание, которое будет выполняться каждые 24 часа. (Если у вас есть сайт, который очень динамичен и постоянно меняется, вы можете уменьшить этот интервал.) Это запланированное задание создаст канал RSS и запишет его в файл на сервере, который затем будет легко доступен для всех. Это очень простой процесс, и код выглядит так:

 <cfquery name="GetArticles" datasource="#dsn#">   SELECT TOP 5 Title, Description, ID   FROM Articles   ORDER BY ID DESC  </cfquery>   <cfxml variable="rssFeed">   <rss version="0.91">      <channel>         <title>My Content Site – Recent Articles</title>         <link>http://www.example.com/</link>         <description>The best place to get content.</description>         <image>            <title>Example.com</title>            <url>http://www.example.com/logo.gif</url>            <link>http://www.example.com/</link>         </image>         <cfoutput query="GetArticles">            <cfset Desc = REReplaceNoCase(Description, "<[^>]*>", "", "ALL")>            <cfset Desc = Replace(Desc, "&nbsp;", " ", "ALL")>            <item>               <title>#Title#</title>               <link>http://www.index.com/article/index.cfm?ArticleID=#ID#</link>               <description>#Desc#</description>            </item>         </cfoutput>      </channel>   </rss>  </cfxml>   <cffile action="write" file="#ExpandPath("./myArticles.xml")#" output="#ToString(rssFeed)#"> 

Не беспокойтесь о запросе или структуре базы данных на этом этапе. Просто знайте, что информация, которую я получаю из базы данных — это заголовок, описание и ссылка (в данном случае идентификатор ссылки), которые будут использоваться в ленте RSS.

Следующая заметная и самая важная вещь в этом файле — использование cfxml . Этот тег используется для создания XML-документа, который впоследствии будет преобразован в строку и записан в файл. Обратите внимание, что мы указываем атрибут variable , который будет переменной ColdFusion, содержащей документ XML. Имя переменной не является узлом верхнего уровня! Не позволяй этому обмануть тебя. Затем мы просто вставляем узлы RSS, которые мы хотим предоставить нашим пользователям, включая заголовок, ссылку, URL и информацию об изображении. Затем мы зациклим запрос и добавим каждый узел item с заголовком, ссылкой и описанием.

Наконец, мы используем функцию ToString(string) для преобразования XML-документа, созданного в cfxml в строку, которую можно записать в файл. Запустите шаблон, а затем укажите в браузере файл «./myArticles.xml» в том же каталоге, что и шаблон. (Вы можете переместить это в любое место на вашем сервере, если он доступен через Интернет. В противном случае это не поможет.)

Для другого способа создания RSS-канала вас может заинтересовать это руководство Пабло Варандо. Это другой подход, который работает так же хорошо. Обратите внимание, что он также был протестирован на BlueDragon. В моем примере этого нет, но сервер BlueDragon поддерживает все используемые мной теги и методы, поэтому технически он должен работать нормально.

Заворачивать

Теперь мы увидели, как получить и отобразить RSS / RDF-фид. В качестве примера мы использовали RSS 1.0, но принципы использования RSS 0.91 одинаковы. Мы также узнали, как создать собственный RSS-канал для доступа наших пользователей, чтобы они могли отображать наш контент на своих сайтах.

Теперь я собираюсь представить что-то новое в моих статьях: задания. Вот несколько заданий, которые вы можете выполнить, чтобы улучшить свои навыки в этой области. Если вам нужна помощь с этими заданиями, не стесняйтесь обсуждать их ниже или на форумах SitePoint. Я обычно готов помочь, и на форумах есть много очень опытных разработчиков ColdFusion, которые с готовностью предлагают свои советы и точки зрения.

  1. Измените читатель RSS, чтобы использовать RSS 0.91.
  2. Создайте пользовательский тег, который принимает URL-адрес для канала RSS, а затем извлекает его, кэширует, анализирует и отображает. Настройте его на прием RSS 0.91 или RSS 1.0.
  3. Измените сценарий создания RSS выше, чтобы создать канал RSS 1.0.
  4. Создайте RSS-ленту для своего сайта (если у вас есть контент или новостной сайт).

Существует множество других способов использования RSS в Интернете. На самом деле, чем больше вы думаете об этом, тем больше идей вы найдете, я уверен. Не стесняйтесь поделиться этими идеями с нами, используя поле для обсуждения ниже. Я надеюсь, что многие разработчики ColdFusion будут использовать RSS-каналы в ближайшем будущем. До следующего раза, держи это холодно!