Manage Learn to apply best practices and optimize your operations.

How To Implement a Voting System 0n Your Website

How to implement a voting system on your website.

This solution uses two almost identical LotusScript agents. One to vote "Yes" and one to vote "No".
In this case, the voting is on an Intranet, where people are required to login. The system will know if the (authorized) user already voted, and will not allow more than one vote per question. This solution assumes that each user is logged in. If the voting should be deployed on a public website, cookies could be used, or the IP address could be used instead of the username.

The result will look like this:

1. Create a form in the database, and call it "VoteRecord". It should look like this:

User: [UserName]
Vote: [Vote]
Question ID#: [QuestionID]
Created: [Created]

All fields are plain text, editable. The field Created has Default Value set to @Created.


2. Create a view called "Questions". It contain two columns and is used to display the question on the homepage (or wherever you like to have it).
The selection formula looks like this: SELECT Form="Question" & Date >@Today
This will display all questions with a end-date after today's date. This way you can enter a number of questions and have the old questions go away at certain dates.
In the view, column 1 display the field Date (make this one Categorized and sort it in ascending order to get the oldest at the top), column 2 display the field Question and column 3 has the formula @Text(@DocumentUniqueID) to display the DocID of the question.

3. Now it is time to display the question on a webpage together with two buttons.
Create a computed text with the following formula:
@Subset(@DbColumn("";"";"Questions";2);1)
This will get the text of the oldest, still valid question from the view and display it.
To create the buttons, I use pass-through HTML:
<A HREF=/database.nsf/VoteYes?OpenAgent&ID=<Computed Text>><IMG SRC=yes.gif BORDER=0></A>
The computed text has the formula @Subset(@DbColumn("";"";"Questions";3);1)
This will get the DocID for the question and pass it to the agent.
Do the same thing for the "No" button, just change the GIF and call the agent VoteNo instead of VoteYes.

4. Finally it is time to create the agent(s).
To support the agent, you need four GIF images:
* red.gif is a 1x1 pixel big red GIF used to create the red "No" bar
* blue.gif is a similar sized blue GIF for the "Yes" bar
* chart_left.gif is the vertical bar for the chart (simply a black vertical line a few pixels wide).
* chart_bottom is the bottom scale for the chart, a line about 150 pixels wide with the numbers 50% and 100% below the line.
You can find the images at http://www.martinsson.net/khm/homepage.nsf/pages/chart.htm together with a partial screenshot that show what the end result looks like.
Put the images as image resources in the database.


Create the agent VoteYes with the following code:

Sub Initialize
Dim session As New NotesSession
Dim collection As NotesDocumentCollection
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim doc2 As NotesDocument
Dim SearchString As String
Dim UNID As String
Dim UserName As String
Dim yesvotes As Integer
Dim novotes As Integer
Dim yespercent As Integer
Dim nopercent As Integer
Dim namesfound As Integer

Set session = New NotesSession
Set doc2 = session.DocumentContext
UserName = doc2.Remote_User(0)
UNID = doc2.Query_String(0)
UNID = Right(UNID,32)

Print |<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://www.domain.com/">|


SearchString = |@Contains(QuestionID;"|+UNID+|") & @Contains(UserName;"| + Username + |")|
Set db=session.CurrentDatabase
Set collection = db.Search(SearchString,Nothing,0)
namesfound = collection.Count
If namesfound=0 Then
Set doc = New NotesDocument(db)
doc.Form="VoteRecord"
doc.UserName=UserName
doc.vote="Yes"
doc.QuestionID=UNID
Call doc.Save(True,True)
Print "<CENTER><FONT SIZE=2 FACE=Arial><B>Current votes:</B></FONT></CENTER>"
SearchString = |@Contains(QuestionID;"|+UNID+|") & @Contains(Vote;"Yes")|
Set collection = db.Search(SearchString,Nothing,0)
yesvotes = collection.Count
SearchString = |@Contains(QuestionID;"|+UNID+|") & @Contains(Vote;"No")|
Set collection = db.Search(SearchString,Nothing,0)
novotes = collection.Count

yesvotes = yesvotes
novotes = novotes
If yesvotes = 0 Then
yespercent=0
Else
yespercent=yesvotes/(yesvotes+novotes) * 100
End If
If novotes = 0 Then
nopercent=0
Else
nopercent=novotes/(yesvotes+novotes) * 100
End If

Print |
<TABLE CELLPADDING=0 CELLSPACING=0 BORDER=0>
<TR>
<TD WIDTH=140>
<FONT FACE=Arial SIZE=-1><B>Yes: | & yesvotes & | (| & yespercent & |%)</B></FONT><br>
</TD>
<TD WIDTH=9 ROWSPAN=2 VALIGN=bottom>
<IMG SRC=chart_left.gif><BR>
</TD>
<TD WIDTH=190>
<IMG SRC=blue.gif HEIGHT=15 WIDTH=| & Abs(yespercent * 1.5) & |>
</TD>
</TR>
<TR>
<TD WIDTH=140>
<FONT FACE=Arial SIZE=-1><B>No: | & novotes & | (| & nopercent & |%)</B></FONT><br>
</TD>
<TD WIDTH=190>
<IMG SRC=red.gif HEIGHT=15 WIDTH=| & Abs(nopercent * 1.5) & |>
</TD>
</TR>
<TR>
<TD WIDTH=140>
</TD>
<TD COLSPAN=2 VALIGN=top>
<IMG SRC=chart_bottom.gif>
</TD>
</TR>
</TABLE>
|

End If
If namesfound>0 Then
Print "<CENTER><FONT SIZE=2 FACE=Arial><B>You, or someone else using the name " + Username + ", has already voted.<BR>You can only vote once, you cheater!</B></FONT></CENTER>"
Print |<BR><CENTER><FONT SIZE=-2 FACE="Arial, Helvetica" STYLE="font-size: 8pt; font-weight: bold; font-family: Arial, Helvetica; text-decoration: none;">|
Print "<A HREF=http://www.domain.com/database.nsf/VoteResult?OpenAgent&ID=" + UNID +">Current Results</A></FONT></CENTER><BR>"
End If
End Sub


Create a copy of this agent, called VoteNo and replace the line doc.vote="Yes" with doc.vote="No".
In the end of the agent, there is a piece of HTML code that call a third agent, which I have not described here yet. That agent is a subset of the agent above, it only display the result withouth voting or checking if the user already voted.
The agent uses the CGI variable Remote_User to identify the name of the authorized user.

Good luck!

Dig Deeper on Domino Resources - Part 6

Start the conversation

Send me notifications when other members comment.

Please create a username to comment.

-ADS BY GOOGLE

SearchWindowsServer

Search400

  • iSeries tutorials

    Search400.com's tutorials provide in-depth information on the iSeries. Our iSeries tutorials address areas you need to know about...

  • V6R1 upgrade planning checklist

    When upgrading to V6R1, make sure your software will be supported, your programs will function and the correct PTFs have been ...

  • Connecting multiple iSeries systems through DDM

    Working with databases over multiple iSeries systems can be simple when remotely connecting logical partitions with distributed ...

SearchDataCenter

SearchContentManagement

Close