You are on page 1of 10

Ring Documentation, Release 1.

41.21 Users registration and Login

We have the users classes (Model, View & Controller) to deal with the users data like username & email.
The next code is stored in ex25_users.ring
Class UsersModel from ModelBase
cSearchColumn = "username"

Class UsersController From ControllerBase

41.21. Users registration and Login 290


Ring Documentation, Release 1.2

aColumnsNames = ["id","username","email"]

Func UpdateRecord
oModel.id = aPageVars[cRecID]
oModel.updatecolumn("username", aPageVars[:username] )
oModel.updatecolumn("email", aPageVars[:email] )
oView.UpdateView(self)

Class UsersView from ViewBase

oLanguage = new UsersLanguageEnglish

Func AddFuncScript oPage,oController


return oPage.scriptfunc("myadd",oPage.scriptredirection("ex26.ring"))

Func FormViewContent oController,oTranslation,oPage


return [
[oTranslation.aColumnsTitles[2],"textbox","username",
oController.oModel.UserName,oPage.stylewidth("100%")],
[oTranslation.aColumnsTitles[3],"textbox","email",
oController.oModel.Email,oPage.stylewidth("50%")]
]

Class UsersLanguageEnglish
cTitle = "Users Table"
cBack = "back"
aColumnsTitles = ["ID","User Name","Email"]
cOptions = "Options"
cSearch = "Search"
comboitems = ["Select Option...","Edit","Delete"]
cAddRecord = "Add Record"
cEditRecord = "Edit Record"
cRecordDeleted = "Record Deleted!"
aMovePages = ["First","Prev","Next","Last"]
cPage = "Page"
cOf = "of"
cRecordsCount = "Records Count"
cSave = "Save"
temp = new page
cTextAlign = temp.StyleTextRight()
cNoRecords = "No records!"

In the file ex25.ring we load ex25_users.ring then create an object from UsersController class.
Using the created object, we call the routing method.
#!c:\ring\bin\ring.exe -cgi
Load "weblib.ring"
Load "datalib.ring"
Load "ex25_users.ring"

Import System.Web
website = "ex25.ring"
New UsersController { Routing() }

Screen Shot:

41.21. Users registration and Login 291


Ring Documentation, Release 1.2

See the next code for the registration page


#!c:\ring\bin\ring.exe -cgi
Load "weblib.ring"
Load "datalib.ring"
Import System.Web

website = "ex26.ring"

new page {
boxstart()
text( "Register")
newline()
boxend()
divstart([:style = stylegradient(6) + stylesize("100%","95%") ])
link([ :url = website, :title = "back" , :style = stylecolor("white")])
newline()
divstart([ :style= styledivcenter("500","160") + stylegradient(52) ])
formpost("ex27.ring")
tablestart([ :Style = stylemarginleft("2%") + stylemargintop("2%") +
stylewidth("90%") ])
rowstart([])
cellstart([:style = stylewidth("20%") + styleheight(30)])
text("User Name")
cellend()
cellstart([ :style = stylewidth("80%") ])
textbox([:name = "username", :style = stylewidth("100%")])
cellend()
rowend()
rowstart([])
cellstart([ :Style = styleheight(30)])
text("Password")
cellend()
cellstart([])
textbox([:name = "password" , :type = "password"])

41.21. Users registration and Login 292


Ring Documentation, Release 1.2

cellend()
rowend()
rowstart([])
cellstart([ :style = styleheight(30)])
text("Email")
cellend()
cellstart([])
textbox([:name = "email" , :style = stylewidth("100%")])
cellend()
rowend()
rowstart([])
cellstart([ :style = styleheight(30)])
cellend()
cellstart([ :style = styleheight(30)])
submit([:value = "Register" ])
cellend()
rowend()
tableend()
formend()
divend()
divend()
}

Screen Shot:

The Registration response


#!c:\ring\bin\ring.exe -cgi
Load "weblib.ring"
Load "datalib.ring"
Load "ex25_users.ring"

41.21. Users registration and Login 293


Ring Documentation, Release 1.2

Import System.Web

oUser = new UsersModel


oUser.Connect()
if oUser.findwith("username",aPageVars["username"])
new page {
text("The user name is already registered")
}
return
ok
if oUser.findwith("email",aPageVars["email"])
new page {
text("This email is already registered")
}
return
ok

aPageVars["salt"] = str2hex(RandBytes(32))
aPageVars["pwhash"] = sha256(aPagevars["password"]+aPageVars["salt"])
aPageVars["sessionid"] = str2hex(randbytes(32))
oUser.Insert()
new page {
cookie("sessionid",aPageVars["sessionid"])
text("New User Created!")
newline()
text("User Name : " + aPageVars["username"])
newline()
}
oUser.Disconnect()

See the next code for the Login page


#!c:\ring\bin\ring.exe -cgi
Load "weblib.ring"
Load "datalib.ring"

Import System.Web

website = "ex28.ring"

new page {
boxstart()
text( "Login")
newline()
boxend()
divstart([:style = stylegradient(6) + stylesize("100%","95%") ])
link([ :url = website, :title = "back" , :style = stylecolor("white")])
newline()
divstart([ :style= styledivcenter("500","130") + stylegradient(52) ])
formpost("ex29.ring")
tablestart([ :Style = stylemarginleft("2%") + stylemargintop("2%") +
stylewidth("90%") ])
rowstart([])
cellstart([:style = stylewidth("20%") + styleheight(30)])
text("User Name")
cellend()
cellstart([ :style = stylewidth("80%") ])
textbox([:name = "username", :style = stylewidth("100%")])
cellend()

41.21. Users registration and Login 294


Ring Documentation, Release 1.2

rowend()
rowstart([])
cellstart([ :style = styleheight(30)])
text("Password")
cellend()
cellstart([])
textbox([:name = "password" , :type = "password"])
cellend()
rowend()
rowstart([])
cellstart([ :style = styleheight(30) ])
cellend()
cellstart([])
submit([:value = "Login" ])
cellend()
rowend()
tableend()
formend()
divend()
divend()
}

Screen Shot:

The response page


#!c:\ring\bin\ring.exe -cgi
Load "weblib.ring"
Load "datalib.ring"
Load "ex25_users.ring"

Import System.Web

41.21. Users registration and Login 295


Ring Documentation, Release 1.2

oUser = new UsersModel


oUser.Connect()
lResult = oUser.FindWith("username",aPageVars["username"])
new page {
if lResult
if sha256(aPagevars["password"]+oUser.Salt) = oUser.pwhash
text ("Correct Password!")
aPageVars["sessionid"] = str2hex(randbytes(32))
oUser.UpdateColumn("sessionid",aPageVars["sessionid"])
cookie("sessionid",aPageVars["sessionid"])
else
text ("Bad password!")
ok
else
text("Bad User Name!")
ok
}
oUser.Disconnect()

The next code for checking if the user needs to login or not
#!c:\ring\bin\ring.exe -cgi
Load "weblib.ring"
Load "datalib.ring"
Load "ex25_users.ring"

Import System.Web

oUser = new UsersModel


oUser.Connect()
lResult = oUser.FindWith("sessionid",aPageVars["sessionid"])
new page {
if lResult
text("User Name : " + oUser.username )
else
text("Please Login First!")
ok
}
oUser.Disconnect()

41.22 Database, ModelBase & ControllerBase classes

In this section we will see some code from datalib.ring


The next code presents the Database, ModelBase & ControllerBase classes
Import System.Web

Class Database

cServer = "localhost"
cUserName = "root"
cPassword = "root"
cDatabase = "mahdb"

Func Connect

41.22. Database, ModelBase & ControllerBase classes 296


Ring Documentation, Release 1.2

con = mysql_init()
mysql_connect(con, cServer, cUserName, cPassWord,cDatabase)

Func Disconnect

mysql_close(con)

Func Query cQuery

mysql_query(con,cQuery)

Func QueryResult

return mysql_result(con)

Func QueryResultWithColumns
# return columns names + query result
return mysql_result2(con)

Func QueryValue
aResult = mysql_result(con)
if islist(aResult) and len(aResult) >= 1
aResult = aResult[1]
if len(aResult) >= 1
return aResult[1]
ok
ok
return 0

Func EscapeString x
if isstring(x)
return MySQL_Escape_String(con,x)
else
return MySQL_Escape_String(con,string(x))
ok

Private
con = NULL

Class ModelBase from Database

cTableName = ""
cSearchColumn = "name"
aColumns = []
aQueryResult = []
ID = 0

# set table name from class name


classname = lower(classname(self))
if right(classname,5) = :model
cTablename = left(classname,len(classname)-5)
ok

Func Insert

cValues = ""
for x in aColumns
cValues += "'" + EscapeString(aPageVars[x]) + "',"

41.22. Database, ModelBase & ControllerBase classes 297


Ring Documentation, Release 1.2

Next
cValues = left(cValues,len(cValues)-1) # remove last comma
cColumns = ""
for x in aColumns
cColumns += x + ","
next
cColumns = left(cColumns,len(cColumns)-1)
query("insert into " + cTableName + "("+cColumns+") values (" +
cValues + ")" )

Func Update nID

cStr = ""
for x in aColumns
cStr += x + " = '" + EscapeString(aPageVars[x]) + "' , "
# the space after comma is necessary
Next
cStr = left(cStr,len(cStr)-2)
query("update " + cTableName + " set " + cStr + " where id = " + nID )

Func UpdateColumn cColumn,cValue


query("update " + cTableName + " set " + cColumn + " = '" +
EscapeString(cValue) + "' where id = " + self.ID )

Func Count cValue

query("SELECT count(*) FROM " + cTableName +


" where "+cSearchColumn+" like '" + EscapeString(cValue) + "%'")
return queryValue()

Func Read nStart,nRecordsPerPage

query("SELECT * FROM "+ cTableName+" limit " + EscapeString(nStart) + "," +


EscapeString(nRecordsPerPage) )
aQueryResult = queryResult()

Func Search cValue,nStart,nRecordsPerPage

query("SELECT * FROM "+ cTableName+" where "+cSearchColumn+" like '" +


EscapeString(cValue) + "%'" +
" limit " + EscapeString(nStart) + "," + EscapeString(nRecordsPerPage) )
aQueryResult = queryResult()

Func Find nID

query("select * from " + cTableName + " where id = " + EscapeString(nID) )


aResult = queryResult()[1]
# move the result from the array to the object attributes
ID = nID
cCode = ""
for x = 2 to len(aResult)
cCode += aColumns[x-1] + " = hex2str('" + str2hex(aResult[x]) + "')" + nl
next
eval(cCode)

Func FindWith cColumn,cValue

41.22. Database, ModelBase & ControllerBase classes 298


Ring Documentation, Release 1.2

query("select * from " + cTableName + " where "+cColumn+" = '" +


EscapeString(cValue) + "'" )
aResult = queryResult()
if len(aResult) > 0
aResult = aResult[1]
else
return 0
ok
# move the result from the array to the object attributes
ID = aResult[1]
cCode = ""
for x = 2 to len(aResult)
cCode += aColumns[x-1] + " = hex2str('" + str2hex(aResult[x]) + "')" + nl
next
eval(cCode)
return 1

Func Delete ID

query("delete from " + cTableName + " where id = " + EscapeString(ID) )

Func Clear

cCode = ""
for x in aColumns
cCode += x + ' = ""' + nl
next
eval(cCode)

Func LoadModel

# create the columns array


query("SELECT * FROM "+ cTableName + " limit 0,1")
aQueryResult = QueryResultWithColumns()[1]
for x = 2 to len(aQueryResult)
aColumns + lower(trim(aQueryResult[x]))
next

# create attribute for each column


for x in aColumns
addattribute(self,x)
next

Func Connect

Super.Connect()
if nLoadModel = 0
nLoadModel = 1
LoadModel()
ok

private

nLoadModel = 0

Class ControllerBase

41.22. Database, ModelBase & ControllerBase classes 299

You might also like