And Now, the Rest of the Story
Enough digression. Now that we have our recordset, we make sure that it contains data, then read what's there.
26 'Populate the Product information array 27 prodInfo.MoveFirst() 28 if not prodInfo.EOF then 29 prodset(1) = prodInfo.Fields("product_name") 30 elname = prodset(1) 31 prodset(2) = prodInfo.Fields("isbn") 32 prodset(3) = prodInfo.Fields("published_date") 33 end if
We determine the product name, ISBN of the product, and its published date.
34 if Request.QueryString("element_id") <> "" then 35 'Content is at the element level 36 elID = Request.QueryString("element_id") 37 'Get element info 38 elobj.getElementDesc(prodID) 39 set elDesc = elobj.items 40 elDesc.MoveFirst() 41 while not elDesc.EOF 42 if elDesc.Fields("element_id") = elID then 43 elname = elDesc.Fields("element_name") 44 end if 45 elDesc.MoveNext() 46 wend 47 else 48 'Content is only at product level 49 elID = "NULL" 50 end if
What's this? An element_id? I've been caught again! While it's true that the product_id is all we need to uniquely specify a product, certain products go deeper than that. An article will generally have many pages. Each page has its own chunk of content, the text of that page. This is stored in a separate database table, content_elements, and is linked back to the base product information in the products table. An intermediate table, product_content, stores the product_id, and has rows for each associated element_id. Thus, when an article is selected, a join occurs to link the product_id to the element_ids that come with it. That is how we display a particular article page.
If there's an element_id on the query string, that means we're on a given page of an article. If you want to save just page three to MyInformIT, we give you that capability here. (Aren't we just the nicest bunch of folks?) We scroll through the returned recordset and match the given element_id, storing the element_name (the section title) for later.
51 'Get the user ID 52 if Request.QueryString("session_id") <> "" then 53 'Grab the session ID to get the user ID
Here is where we tie the session_id passed on the query string to the user_id (at least according to the comment above).
54 sessID = Request.QueryString("session_id") 55 set addobj = Server.CreateObject("informit.addto") 56 addobj.getUserID(sessID) 57 set userRS = addobj.items 58 userID = userRS.Fields("user_id") 59 60 if Len(userID) <= 0 _ 61 or isnull(userid) then 62 addContent = -2
We retrieved a recordset from a call to the informit.addto.getUserID method. If the session_id doesn't match a user_id for some reason, we drop out of addContent() with a 2 return value.
63 else 64 ' Make sure that the user does not already have 65 ' this piece 66 ' of content in his collection. If so, give them 67 ' a choice 68 ' of whether or not to add it again 69 ret = addobj.checkContent(userID,prodID,elID)
As promised, here is where we check to see whether the content already exists in the user's MyInformIT list. The Java procedure returns 0 if the product_id (and element_id, if there) is not matched within that user_id's saved content, and 1 if the content already exists.
70 if ret = 0 then 71 'Add the content 72 ret = addobj.addContent(userID,prodID,elID) 73 if ret = 1 then 74 resp = resp & "<p> <font size=""-1"" color=""#FF0000"">" & elname & " - </font><font size=""-1""> has been successfully added to your MyInformIT bookshelf</font></p>" & chr(13) 75 resp = resp & "<p align=center> <form id=form1 name=form1> <input type='button' name='close' value='Close' onClick='window.close()'></form></p>" & chr(13) 76 addContent = resp
The method informit.addTo.addContent is called on line 72, passing in the user_id, product_id, and element_id. If everything worked, we return from the function, passing back the screen that you see in Figure 4.
Figure 4 You've been saved!
77 else 78 addContent = -1 79 end if
Otherwise, we return an error condition.
80 elseif ret = 1 then 81 ' Content is already there, give the user a 82 ' choice whether to 83 ' add it again 84 resp = resp & "<p align=""center""> <font size=""-1"" color=""#FF0000"">" & elname & " - </font><font size=""-1""> is already saved on your MyInformIT bookshelf</font>" & chr(13) 85 resp = resp & "<br><font size=""-1""> Do you wish to save it again?</font></p>" & chr(13) 86 resp = resp & "<p align=center> <form id=form1 name=form1> <input type='button' name='yep' value=' Yes' onClick='reAdd()'> <input type='button' name='nope' value=' No ' onClick='window.close()'></form></p>" & chr(13) 87 addContent = resp
Figure 5 What? You want to save it again?
The reAdd() function takes the input URL, derived from the window.location.href call, and tacks the text "&readd=yes" onto the query string. It closes the current pop-up window and opens another of the same size, in the same location. This takes us back to the addTo/index.asp function, but this time readd='yes' is true. Instead of calling addContent(), we call readdContent(). readdContent() does exactly the same things as addContent(), except it doesn't check for the readd flag, naturally.
88 else 89 ' Oops 90 addContent = -1 91 end if 92 end if 93 end if 94 end if 95 96 end function
The last few lines just tidy up. We now have added a piece of content to our MyInformIT selections. If you go back to the MyInformIT page, you'll see it there as big as life.
I'm guilty of being selfish by taking up so much of your time writing about adding content to MyInformIT. In the next installment, we'll take a closer look at how the lists of products are retrieved and built for a given user. Until then, stop at stop signs! Take a little extra time and enjoy life! I know that I will.