• Toll-free  888-665-8637
  • International  +1 717-220-0012
Welcome Guest! To enable all features please Login or Register.

Notification

Icon
Error

ppostma1
#1 Posted : Friday, May 30, 2008 1:49:00 PM(UTC)
ppostma1

Rank: Member

Joined: 5/30/2008(UTC)
Posts: 2

We developed this to link products between sites. Place it in the BVModules folder under a directory and call the files xmlsearch.aspx and xmlsearch.aspx.cs
It generates an RSS feed that can be rendered to HTML and placed as an ad based off the keywords on the page. The link works as .../xmlsearch.aspx?keywords=word1+word2+word3
Modify it to fit your site.


Code:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="XmlSearch.aspx.vb" Inherits="XmlSearch" ContentType="application/rss+xml" ResponseEncoding="UTF-8"%><%@ Import Namespace="BVSoftware.Bvc5.Core" %><?xml version="1.0" encoding="utf-8"?>

<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>__YOUR STORE__</title>
<link>__YOUR URL__</link>
<description>
__YOUR DESCRIPTION__
</description>
<ttl>720</ttl><!-- 12 hours -->
<language>en-us</language>
<generator>P3:ASP-VB</generator>
<pubDate><asp:Literal runat="server" id="datesstring"></asp:Literal></pubDate>
<copyright><asp:Literal runat="server" id="yearstring"></asp:Literal> __YOUR COMPANY__</copyright>
<atom:link href="http://__YOUR_URL__/BVModules/__LOCATION_DIRECTORY__/xmlsearch.aspx?keywords=special" rel="self" type="application/rss+xml" /> <!-- default to anything 'special' -->
<textInput>http://_YOUR_URL_/search.aspx</textInput>
<image>http://www.dhp.org/BVModules/Themes/__DIRECTORY_TO_YOUR_LOGO__/images/Banner.jpg</image>
<asp:repeater ID="DataList1" runat="server" ><ItemTemplate><asp:Literal runat="server" id="itemparams"></asp:Literal></ItemTemplate>
</asp:repeater>
<asp:Literal runat="server" id="backupI"></asp:Literal>
</channel>
</rss>




Code:

Imports BVSoftware.Bvc5.Core
Imports System.Collections.ObjectModel
Imports System.Array
Imports System.Collections
Imports System.Web
'include more so the auto complete features are available
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.HtmlControls
Imports System.Web.UI.Design



Partial Class XmlSearch
Inherits System.Web.UI.Page 'BaseSearchPage

Protected randx As Random 'for random product selection
Protected backupItem As String 'to guarantee a returned item if short


Protected Sub Page_Load1(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim kw As String

'catch anything passed as keyword or keywords
If Request.QueryString("keyword") IsNot Nothing Then
kw = Request.QueryString("keyword")
End If
If Request.QueryString("keywords") IsNot Nothing Then
kw = Request.QueryString("keywords")

End If

If kw IsNot Nothing Then

randx = New Random(System.DateTime.Now.Millisecond)

datesstring.Text = DateTime.Now.ToString("r")
yearstring.Text = DateTime.Now.ToString("yyyy")

' A complete RSS item to default to if max items is not set
backupItem = "<item><title>YOUR WEBSITE</title><description>Product Search</description><link>http://YOUR_URL/search.aspx</link><guid>YOUR_URL/#1</guid></item>"
DoSearch(kw)
Else
' Hard abort page, basic return, no RSS to cause error
' for custom programming I would recommend changing this to permit the
' RSS feed and return only the default/backup item
Response.ClearContent()
Response.StatusCode = 400
Response.Write("<html><head><title>Entry Error</title></head>")
Response.Write(vbCrLf)
Response.Write("<body><h1>Keywords was empty</h1></body></html>")
Response.Write(vbCrLf)
Response.Flush()
Response.Close()

End If

End Sub

' need a way to search categories for RSS and catch its BVIN
' cache the results of the BVIN to prevent re-running this function every call
Private Function GetRssId() As String

If System.Web.HttpRuntime.Cache.Get("RSSBVIN") IsNot Nothing Then
Return DirectCast(System.Web.HttpRuntime.Cache.Get("RSSBVIN"), String)
Else

Dim cats As Collection(Of ListItem) = Catalog.Category.ListFullTreeWithIndents
For Each li As ListItem In cats
If li.Text.Equals("RSS") Then
System.Web.HttpRuntime.Cache.Add("RSSBVIN", li.Value, Nothing, DateTime.Now.AddHours(12), TimeSpan.Zero, CacheItemPriority.NotRemovable, Nothing)
Return li.Value
End If
Next
End If

' fail and forget it if we cant find the RSS category for now
System.Web.HttpRuntime.Cache.Add("RSSBVIN", "1", Nothing, DateTime.Now.AddHours(12), TimeSpan.Zero, CacheItemPriority.NotRemovable, Nothing)
Return String.Empty
End Function


Private Sub DoSearch(ByVal keyword As String)
' define max (and min) results to return for the feed.
Dim maxresults As Integer = 2
' This function, as is, currently uses 'x' to check that it does not return
' the same item (randomly) twice. This works great when only returning 2 items
' if more are returned, x should be a collection and cross checked for each item grabbed

Dim results As Collection(Of Catalog.Product)
Dim totalRowCount As Integer = 0
Dim criteria As Catalog.ProductStoreSearchCriteria = New Catalog.ProductStoreSearchCriteria
criteria.Keyword = keyword ' use the provided keywords

' if we can get the category ID for 'RSS' use it, otherwise search the site
' this way the results can be restricted to only what is permitted in the RSS feed
Dim id As String = GetRssId()
If Not id.Equals("1") Then
criteria.CategoryId = id
End If

' run the search
results = Catalog.InternalProduct.StoreSearch(criteria, SessionManager.GetCurrentUserId, False, 0, 100, totalRowCount)

' declare the collection we are actually going to return
Dim passed As Collection(Of Catalog.Product)
' create a check to make sure we don't grab the same item twice
Dim check As Integer = -1

If totalRowCount <= maxresults Then
' if its short, just pass the entire results back
' if its really short, activate the backup/default item
passed = results
If totalRowCount < maxresults Then
backupI.Text = backupItem
Else
backupI.Text = String.Empty
End If
Else
backupI.Text = String.Empty ' no default/backup needed
passed = New Collection(Of Catalog.Product) ' initialize returned var

' now grab MAXRESULTS items from that collection randomly
For d As Integer = 1 To maxresults
Dim x As Integer = check
Do Until x <> check
x = RandomNumber(0, totalRowCount)
Loop
check = x 'don't repeat items! As collection, do until not x.contains(check)

passed.Add(results.Item(x)) ' add the pulled item to returned var
Next d
End If
DataList1.DataSource = passed 'set the repeater
DataList1.DataBind()


End Sub
Private Function RandomNumber(ByVal MaxNumber As Integer, _
Optional ByVal MinNumber As Integer = 0) As Integer

Return randx.Next(MinNumber, MaxNumber)

End Function


Protected Sub DataList1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles DataList1.ItemDataBound
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then

' grab the product
Dim p As Catalog.Product = CType(e.Item.DataItem, Catalog.Product)
If p IsNot Nothing Then

' grab the link
Dim destinationLink As String = Utilities.UrlRewriter.BuildUrlForProduct(p, Me.Page.Request)
If destinationLink.StartsWith("/") Then
destinationLink = "http://" & Request.ServerVariables("SERVER_NAME") & destinationLink
End If

' grab the image url
Dim imageUrl As String
imageUrl = Page.ResolveUrl(Utilities.ImageHelper.GetValidImage(p.ImageFileSmall, True))
If imageUrl.StartsWith("/") Then
imageUrl = "http://" & Request.ServerVariables("SERVER_NAME") & imageUrl
End If


' now build the item as an RSS item
Dim sb As StringBuilder = New StringBuilder()

sb.Append(" <item>" & vbCrLf)
sb.Append(" <title>" & HttpUtility.HtmlEncode(p.ProductName) & "</title>" & vbCrLf)
sb.Append(" <description>" & HttpUtility.HtmlEncode(p.ShortDescription) & "</description>" & vbCrLf)
sb.Append(" <link>" & destinationLink & "</link>" & vbCrLf)
sb.Append(" <guid>" & destinationLink & "</guid>" & vbCrLf)
sb.Append(" <image>" & imageUrl & "</image>" & vbCrLf)
sb.Append(" </item>" & vbCrLf)


DirectCast(e.Item.FindControl("itemparams"), Literal).Text = sb.ToString()

Else

DirectCast(e.Item.FindControl("itemparams"), Literal).Text = String.Empty
End If
End If
End Sub


End Class
Matt@9BallDesign
#2 Posted : Friday, May 30, 2008 2:16:47 PM(UTC)
Matt@9BallDesign

Rank: Member

Joined: 12/23/2003(UTC)
Posts: 909

Going to test this on a site. Thanks for sharing!
Matt Martell


http://www.9balldesign.com - Web, Print, Graphic


http://www.martellhardware.com/ - Decorative &amp; Builder's Hardware

------------------------------------------------
ppostma1
#3 Posted : Friday, May 30, 2008 3:24:39 PM(UTC)
ppostma1

Rank: Member

Joined: 5/30/2008(UTC)
Posts: 2

oh yes, a few things to document.

It searches through the categories for RSS and grabs only items set for RSS. If the category RSS does not exist, it searches the entire inventory. Create the category RSS before you test it if you want to force that because it will cache that setting for 12 hours
You have to replace the URLs and names specific to the website/company.
It is set to pull 2 items max randomly from the results of the keyword search
We are only feeding one keyword at a time to it so I have not tested the multiple keyword functionality and if I have to HTMLdecode the input.
There is a default item called backupItem that displays if it does not fetch the maximum results, configure it to your needs
If no keywords are passed to it, it currently returns an HTML page stating that keywords are required.
Surfscience
#4 Posted : Friday, June 20, 2008 5:14:38 AM(UTC)
Surfscience

Rank: Member

Joined: 2/7/2006(UTC)
Posts: 66

Hi ppostma1,

This looks like an interesting module, like Matt says, thanks for sharing!

I'm trying to give it a test. First thing to point out to others is that you need to name code page xmlsearch.aspx.vb (not cs) but I guess even none programmers like me will spot that.

When I try to run it I'm getting:

Code:


Compiler Error Message: BC30002: Type 'Catalog.ProductStoreSearchCriteria' is not defined.

Line 90: Dim results As Collection(Of Catalog.Product)
Line 91: Dim totalRowCount As Integer = 0
Line 92: Dim criteria As Catalog.ProductStoreSearchCriteria = New Catalog.ProductStoreSearchCriteria
Line 93: criteria.Keyword = keyword ' use the provided keywords
Line 94:
Forum Jump  
You cannot post new topics in this forum.
You cannot reply to topics in this forum.
You cannot delete your posts in this forum.
You cannot edit your posts in this forum.
You cannot create polls in this forum.
You cannot vote in polls in this forum.

©2024 Develisys. All rights reserved.
  • Toll-free  888-665-8637
  • International  +1 717-220-0012