Initial commit

This commit is contained in:
2013-08-07 14:41:29 +02:00
commit 66571766b0
333 changed files with 108874 additions and 0 deletions

5
.buildpath Normal file
View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<buildpath>
<buildpathentry kind="src" path=""/>
<buildpathentry kind="con" path="org.eclipse.php.core.LANGUAGE"/>
</buildpath>

View File

@@ -0,0 +1,5 @@
K 25
svn:wc:ra_dav:version-url
V 44
/svn/!svn/ver/43/trunk/.externalToolBuilders
END

View File

@@ -0,0 +1,28 @@
10
dir
204
https://qcmmaker.googlecode.com/svn/trunk/.externalToolBuilders
https://qcmmaker.googlecode.com/svn
2010-02-26T17:33:26.657075Z
43
Francois.Lutran
1abcc3b6-0f78-11df-b47a-af0d17c1a499

3
.htaccess Normal file
View File

@@ -0,0 +1,3 @@
## Jul - deny access to the top-level git repository
RewriteEngine On
RewriteRule \.git - [F,L]

28
.project Normal file
View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>qcmmaker</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.dltk.core.scriptbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
<nature>org.eclipse.php.core.PHPNature</nature>
</natures>
</projectDescription>

95
Archive/.svn/all-wcprops Normal file
View File

@@ -0,0 +1,95 @@
K 25
svn:wc:ra_dav:version-url
V 31
/svn/!svn/ver/190/trunk/Archive
END
New Version TODO List
K 25
svn:wc:ra_dav:version-url
V 59
/svn/!svn/ver/190/trunk/Archive/New%20Version%20TODO%20List
END
qcm_v2.0.zip
K 25
svn:wc:ra_dav:version-url
V 43
/svn/!svn/ver/76/trunk/Archive/qcm_v2.0.zip
END
qcm_v1.2.zip
K 25
svn:wc:ra_dav:version-url
V 42
/svn/!svn/ver/3/trunk/Archive/qcm_v1.2.zip
END
qcm_v2.1.zip
K 25
svn:wc:ra_dav:version-url
V 44
/svn/!svn/ver/190/trunk/Archive/qcm_v2.1.zip
END
qcm_v1.3.zip
K 25
svn:wc:ra_dav:version-url
V 42
/svn/!svn/ver/3/trunk/Archive/qcm_v1.3.zip
END
imageMaker.php
K 25
svn:wc:ra_dav:version-url
V 45
/svn/!svn/ver/70/trunk/Archive/imageMaker.php
END
qcm_v2.2.zip
K 25
svn:wc:ra_dav:version-url
V 44
/svn/!svn/ver/190/trunk/Archive/qcm_v2.2.zip
END
qcm_v2.0.tar.gz
K 25
svn:wc:ra_dav:version-url
V 46
/svn/!svn/ver/76/trunk/Archive/qcm_v2.0.tar.gz
END
qcm_v1.2.tar.gz
K 25
svn:wc:ra_dav:version-url
V 45
/svn/!svn/ver/3/trunk/Archive/qcm_v1.2.tar.gz
END
qcm_v1.5.zip
K 25
svn:wc:ra_dav:version-url
V 43
/svn/!svn/ver/10/trunk/Archive/qcm_v1.5.zip
END
qcm_v2.1.tar.gz
K 25
svn:wc:ra_dav:version-url
V 47
/svn/!svn/ver/190/trunk/Archive/qcm_v2.1.tar.gz
END
qcm_v1.3.tar.gz
K 25
svn:wc:ra_dav:version-url
V 45
/svn/!svn/ver/3/trunk/Archive/qcm_v1.3.tar.gz
END
qcm_v2.2.tar.gz
K 25
svn:wc:ra_dav:version-url
V 47
/svn/!svn/ver/190/trunk/Archive/qcm_v2.2.tar.gz
END
qcm_v1.5.tar.gz
K 25
svn:wc:ra_dav:version-url
V 46
/svn/!svn/ver/10/trunk/Archive/qcm_v1.5.tar.gz
END
corners.svg
K 25
svn:wc:ra_dav:version-url
V 42
/svn/!svn/ver/10/trunk/Archive/corners.svg
END

541
Archive/.svn/entries Normal file
View File

@@ -0,0 +1,541 @@
10
dir
204
https://qcmmaker.googlecode.com/svn/trunk/Archive
https://qcmmaker.googlecode.com/svn
2010-09-11T12:22:57.471260Z
190
francois.lutran
1abcc3b6-0f78-11df-b47a-af0d17c1a499
New Version TODO List
file
2010-09-11T12:23:35.000000Z
933905cc82252b6bf9669df51ec8d400
2010-09-11T12:22:57.471260Z
190
francois.lutran
493
photoshop
dir
qcm_v2.0.zip
file
2010-03-24T17:28:47.000000Z
dc8e23a2e40def6dc6bfd7490dbd49b2
2010-03-22T19:31:07.865763Z
76
Francois.Lutran
has-props
52510
qcm_v1.2.zip
file
2010-02-02T19:33:45.000000Z
d22d94a897010ab5e97b6fdc6d5cf4b8
2010-02-01T21:43:55.771214Z
3
Francois.Lutran
has-props
24546
qcm_v2.1.zip
file
2010-09-11T12:23:35.000000Z
e09b43c61e51060511dae2f8bcc151ee
2010-09-11T12:22:57.471260Z
190
francois.lutran
has-props
56027
qcm_v1.3.zip
file
2010-02-02T19:33:45.000000Z
24384569c5241928dade0f2e111a2240
2010-02-01T21:43:55.771214Z
3
Francois.Lutran
has-props
29073
imageMaker.php
file
2010-03-17T01:00:05.000000Z
c5f9dd152ddf43f9b5085de411caeba8
2010-03-16T19:47:33.943166Z
70
Francois.Lutran
283
qcm_v2.2.zip
file
2010-09-11T12:23:35.000000Z
148aa8548e3e65904956e59a14e6fef5
2010-09-11T12:22:57.471260Z
190
francois.lutran
has-props
390605
qcm_v2.0.tar.gz
file
2010-03-24T17:28:47.000000Z
85870d8a0f27135c5fda108f090938c0
2010-03-22T19:31:07.865763Z
76
Francois.Lutran
has-props
42481
qcm_v1.2.tar.gz
file
2010-02-02T19:33:45.000000Z
511c930038ff79682df433036faff70d
2010-02-01T21:43:55.771214Z
3
Francois.Lutran
has-props
21695
qcm_v1.5.zip
file
2010-02-04T01:00:07.000000Z
b3f4cd1f6973ef379b963dcaefc72dce
2010-02-03T21:13:42.502035Z
10
Francois.Lutran
has-props
39807
qcm_v2.1.tar.gz
file
2010-09-11T12:23:35.000000Z
159abd8deb27644e3b5886f64563d184
2010-09-11T12:22:57.471260Z
190
francois.lutran
has-props
46413
qcm_v2.2.tar.gz
file
2010-09-11T12:23:35.000000Z
2e0e8d97b096abc2553f6128a1658f52
2010-09-11T12:22:57.471260Z
190
francois.lutran
has-props
361038
qcm_v1.3.tar.gz
file
2010-02-02T19:33:45.000000Z
95cb52ff48522706a62f5a1ba1eda598
2010-02-01T21:43:55.771214Z
3
Francois.Lutran
has-props
23538
qcm_v1.5.tar.gz
file
2010-02-04T01:00:07.000000Z
d925550478e7f25aefd45eaa82f3f52b
2010-02-03T21:13:42.502035Z
10
Francois.Lutran
has-props
29378
corners.svg
file
2010-02-04T01:00:07.000000Z
85d9a4dcd0d604e5b8a2a81adbe57078
2010-02-03T21:13:42.502035Z
10
Francois.Lutran
213

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,8 @@
1. Change version number in /current_version/config.php
2. Empty /current_version/Download/ and /current_version/images/qcm/ (except qcm1question1.jpeg)
3. Update changelog : select led, version, type, changelog from changelog where version > 0 and version <= CURRENT_VERSION and progress = 1 order by version ASC
4. Copy Data into new folder (qcm_vx.x) in /archive/
5. delete settings.php, test.php
6. compress into .zip and .tar.gz
7. Copy file into /current_version/download/
8. Update SVN

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg">
<rect fill="white" x="0" y="0" width="100%" height="100%" />
<rect fill="transparent" x="0" y="0" width="100%" height="100%" rx="10px"/>
</svg>

After

Width:  |  Height:  |  Size: 213 B

View File

@@ -0,0 +1,8 @@
<?php
header ('Content-type: image/png');
$oImage = imagecreatetruecolor($_GET['width'], $_GET['height']);
$text_color = imagecolorallocate($oImage, 233, 14, 91);
imagestring($oImage, 1, 5, 5, 'A Simple Text String', $text_color);
imagepng($oImage);
imagedestroy($oImage);
?>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,8 @@
1. Change version number in /current_version/config.php
2. Empty /current_version/Download/ and /current_version/images/qcm/ (except qcm1question1.jpeg)
3. Update changelog : select led, version, type, changelog from changelog where version > 0 and version <= CURRENT_VERSION and progress = 1 order by version ASC
4. Copy Data into new folder (qcm_vx.x) in /archive/
5. delete settings.php, test.php
6. compress into .zip and .tar.gz
7. Copy file into /current_version/download/
8. Update SVN

5
Archive/corners.svg Normal file
View File

@@ -0,0 +1,5 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg">
<rect fill="white" x="0" y="0" width="100%" height="100%" />
<rect fill="transparent" x="0" y="0" width="100%" height="100%" rx="10px"/>
</svg>

After

Width:  |  Height:  |  Size: 213 B

8
Archive/imageMaker.php Normal file
View File

@@ -0,0 +1,8 @@
<?php
header ('Content-type: image/png');
$oImage = imagecreatetruecolor($_GET['width'], $_GET['height']);
$text_color = imagecolorallocate($oImage, 233, 14, 91);
imagestring($oImage, 1, 5, 5, 'A Simple Text String', $text_color);
imagepng($oImage);
imagedestroy($oImage);
?>

View File

@@ -0,0 +1,41 @@
K 25
svn:wc:ra_dav:version-url
V 39
/svn/!svn/ver/3/trunk/Archive/photoshop
END
arrow.psd
K 25
svn:wc:ra_dav:version-url
V 49
/svn/!svn/ver/3/trunk/Archive/photoshop/arrow.psd
END
qcmSelectionHover.psd
K 25
svn:wc:ra_dav:version-url
V 61
/svn/!svn/ver/3/trunk/Archive/photoshop/qcmSelectionHover.psd
END
beta version.psd
K 25
svn:wc:ra_dav:version-url
V 58
/svn/!svn/ver/3/trunk/Archive/photoshop/beta%20version.psd
END
qcmSelectionActive.psd
K 25
svn:wc:ra_dav:version-url
V 62
/svn/!svn/ver/3/trunk/Archive/photoshop/qcmSelectionActive.psd
END
favicon.psd
K 25
svn:wc:ra_dav:version-url
V 51
/svn/!svn/ver/3/trunk/Archive/photoshop/favicon.psd
END
qcmSelection.psd
K 25
svn:wc:ra_dav:version-url
V 56
/svn/!svn/ver/3/trunk/Archive/photoshop/qcmSelection.psd
END

View File

@@ -0,0 +1,232 @@
10
dir
204
https://qcmmaker.googlecode.com/svn/trunk/Archive/photoshop
https://qcmmaker.googlecode.com/svn
2010-02-01T21:43:55.771214Z
3
Francois.Lutran
1abcc3b6-0f78-11df-b47a-af0d17c1a499
arrow.psd
file
2010-02-02T19:33:45.000000Z
7849d3bca5af6776ebbcf9adef21cd8a
2010-02-01T21:43:55.771214Z
3
Francois.Lutran
has-props
26680
qcmSelectionHover.psd
file
2010-02-02T19:33:45.000000Z
c92146f3cd68537f84116904dea8981e
2010-02-01T21:43:55.771214Z
3
Francois.Lutran
has-props
160590
beta version.psd
file
2010-02-02T19:33:45.000000Z
3e83806dc3d984f2e5988ba6c3e514e9
2010-02-01T21:43:55.771214Z
3
Francois.Lutran
has-props
196809
qcmSelectionActive.psd
file
2010-02-02T19:33:45.000000Z
78cbd1667af67529d15aaeab5174714b
2010-02-01T21:43:55.771214Z
3
Francois.Lutran
has-props
161486
favicon.psd
file
2010-02-02T19:33:45.000000Z
d9213ef70e41ec5e01c0d758e201bdf9
2010-02-01T21:43:55.771214Z
3
Francois.Lutran
has-props
157428
qcmSelection.psd
file
2010-02-02T19:33:45.000000Z
16a1f1e21a70535eea9abd936bc08993
2010-02-01T21:43:55.771214Z
3
Francois.Lutran
has-props
159750

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END

Binary file not shown.

Binary file not shown.

BIN
Archive/photoshop/arrow.psd Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
Archive/qcm_v1.2.tar.gz Normal file

Binary file not shown.

BIN
Archive/qcm_v1.2.zip Normal file

Binary file not shown.

BIN
Archive/qcm_v1.3.tar.gz Normal file

Binary file not shown.

BIN
Archive/qcm_v1.3.zip Normal file

Binary file not shown.

BIN
Archive/qcm_v1.5.tar.gz Normal file

Binary file not shown.

BIN
Archive/qcm_v1.5.zip Normal file

Binary file not shown.

BIN
Archive/qcm_v2.0.tar.gz Normal file

Binary file not shown.

BIN
Archive/qcm_v2.0.zip Normal file

Binary file not shown.

BIN
Archive/qcm_v2.1.tar.gz Normal file

Binary file not shown.

BIN
Archive/qcm_v2.1.zip Normal file

Binary file not shown.

BIN
Archive/qcm_v2.2.tar.gz Normal file

Binary file not shown.

BIN
Archive/qcm_v2.2.zip Normal file

Binary file not shown.

View File

@@ -0,0 +1,155 @@
K 25
svn:wc:ra_dav:version-url
V 39
/svn/!svn/ver/204/trunk/current_version
END
log
K 25
svn:wc:ra_dav:version-url
V 43
/svn/!svn/ver/194/trunk/current_version/log
END
account.php
K 25
svn:wc:ra_dav:version-url
V 51
/svn/!svn/ver/174/trunk/current_version/account.php
END
functions.js
K 25
svn:wc:ra_dav:version-url
V 52
/svn/!svn/ver/180/trunk/current_version/functions.js
END
stats.php
K 25
svn:wc:ra_dav:version-url
V 47
/svn/!svn/ver/8/trunk/current_version/stats.php
END
settings.php
K 25
svn:wc:ra_dav:version-url
V 51
/svn/!svn/ver/45/trunk/current_version/settings.php
END
qcmCreator.php
K 25
svn:wc:ra_dav:version-url
V 54
/svn/!svn/ver/187/trunk/current_version/qcmCreator.php
END
style.css
K 25
svn:wc:ra_dav:version-url
V 49
/svn/!svn/ver/202/trunk/current_version/style.css
END
changelog
K 25
svn:wc:ra_dav:version-url
V 49
/svn/!svn/ver/191/trunk/current_version/changelog
END
qcmResults.php
K 25
svn:wc:ra_dav:version-url
V 54
/svn/!svn/ver/191/trunk/current_version/qcmResults.php
END
qcmReader.php
K 25
svn:wc:ra_dav:version-url
V 53
/svn/!svn/ver/132/trunk/current_version/qcmReader.php
END
account_admin.php
K 25
svn:wc:ra_dav:version-url
V 57
/svn/!svn/ver/202/trunk/current_version/account_admin.php
END
search.php
K 25
svn:wc:ra_dav:version-url
V 50
/svn/!svn/ver/174/trunk/current_version/search.php
END
frontal.php
K 25
svn:wc:ra_dav:version-url
V 51
/svn/!svn/ver/202/trunk/current_version/frontal.php
END
config.php
K 25
svn:wc:ra_dav:version-url
V 50
/svn/!svn/ver/202/trunk/current_version/config.php
END
install.php
K 25
svn:wc:ra_dav:version-url
V 51
/svn/!svn/ver/187/trunk/current_version/install.php
END
rss.php
K 25
svn:wc:ra_dav:version-url
V 47
/svn/!svn/ver/142/trunk/current_version/rss.php
END
statsAdmin.php
K 25
svn:wc:ra_dav:version-url
V 54
/svn/!svn/ver/204/trunk/current_version/statsAdmin.php
END
index.php
K 25
svn:wc:ra_dav:version-url
V 49
/svn/!svn/ver/201/trunk/current_version/index.php
END
logon.php
K 25
svn:wc:ra_dav:version-url
V 48
/svn/!svn/ver/62/trunk/current_version/logon.php
END
qcmProcess.php
K 25
svn:wc:ra_dav:version-url
V 54
/svn/!svn/ver/179/trunk/current_version/qcmProcess.php
END
styleIe.css
K 25
svn:wc:ra_dav:version-url
V 49
/svn/!svn/ver/3/trunk/current_version/styleIe.css
END
test.php
K 25
svn:wc:ra_dav:version-url
V 48
/svn/!svn/ver/185/trunk/current_version/test.php
END
register.php
K 25
svn:wc:ra_dav:version-url
V 51
/svn/!svn/ver/91/trunk/current_version/register.php
END
backUpCreator.php
K 25
svn:wc:ra_dav:version-url
V 57
/svn/!svn/ver/192/trunk/current_version/backUpCreator.php
END
version.php
K 25
svn:wc:ra_dav:version-url
V 51
/svn/!svn/ver/193/trunk/current_version/version.php
END

View File

@@ -0,0 +1,6 @@
K 10
svn:ignore
V 13
settings.php
END

View File

@@ -0,0 +1,896 @@
10
dir
204
https://qcmmaker.googlecode.com/svn/trunk/current_version
https://qcmmaker.googlecode.com/svn
2011-02-08T19:22:12.337819Z
204
francois.lutran
has-props
1abcc3b6-0f78-11df-b47a-af0d17c1a499
((conflict settings.php file update deleted edited (version https://qcmmaker.googlecode.com/svn 2 90 trunk/current_version/settings.php file) (version https://qcmmaker.googlecode.com/svn 3 101 trunk/current_version/settings.php none)))
log
file
2010-11-06T16:35:59.299251Z
1cce094ea04fcf8e4adfdee41ab40a86
2010-11-06T16:35:45.574309Z
194
francois.lutran
has-props
192
account.php
file
2010-06-22T10:03:52.000000Z
46c44649a38f295b238c3ace19cf3da4
2010-06-21T21:30:43.058512Z
174
francois.lutran
8472
functions.js
file
2010-06-24T18:14:17.000000Z
d15180502c17f40698bfcd325736b990
2010-06-24T13:42:55.849562Z
180
francois.lutran
has-props
3240
stats.php
file
2010-02-03T16:31:26.000000Z
55364c81629c96272ffe2b148b2099b2
2010-02-02T23:56:56.079998Z
8
Francois.Lutran
2040
settings.php
file
90
add
2010-03-01T01:00:10.000000Z
e35626cf50f16ff4312991f13c81740d
2010-02-28T15:00:52.349625Z
45
Francois.Lutran
copied
https://qcmmaker.googlecode.com/svn/trunk/current_version/settings.php
90
908
qcmCreator.php
file
2010-09-11T11:41:49.000000Z
cbae18788a57cc861ce631772497efc8
2010-09-09T13:24:00.096915Z
187
francois.lutran
9395
style.css
file
2011-02-02T21:26:33.598825Z
052da18b80fd80adbd09e67183a26e03
2011-02-02T21:25:35.154558Z
202
francois.lutran
has-props
9866
changelog
file
2010-11-06T12:54:38.555055Z
3c86289533c86f53a5bc24b8e63eae17
2010-11-06T12:54:00.872919Z
191
francois.lutran
5480
qcmResults.php
file
2010-11-06T12:54:38.555055Z
740f07de2aa4ee86b1ec555da3c56e27
2010-11-06T12:54:00.872919Z
191
francois.lutran
2980
qcmReader.php
file
2010-05-17T13:58:33.000000Z
5b783e6fb522798ebb488e412a9312bb
2010-05-16T21:14:21.358495Z
132
Francois.Lutran
2208
downloads
dir
account_admin.php
file
2011-02-02T21:26:33.608825Z
502b792e32849d5bc243b7750dc4494b
2011-02-02T21:25:35.154558Z
202
francois.lutran
10604
search.php
file
2010-06-22T10:03:52.000000Z
5bdfea908f1e9dfa2362d0a03ee58f59
2010-06-21T21:30:43.058512Z
174
francois.lutran
2296
frontal.php
file
2011-02-02T21:26:33.608825Z
17207ab88483b6a53d38d4c69ab852ce
2011-02-02T21:25:35.154558Z
202
francois.lutran
5375
config.php
file
2011-02-02T21:26:33.608825Z
ae293d9b13d279274230720e79140db3
2011-02-02T21:25:35.154558Z
202
francois.lutran
65700
install.php
file
2010-09-11T11:41:49.000000Z
b0d1bd4d0d104dcac219bc0c47ee12f0
2010-09-09T13:24:00.096915Z
187
francois.lutran
5734
classes
dir
statsAdmin.php
file
2011-02-08T19:23:20.139189Z
4398d511f7ad18b0de287ba25513c6a3
2011-02-08T19:22:12.337819Z
204
francois.lutran
6168
index.php
file
2011-01-31T18:20:20.014061Z
2de83ba3f929c392a8e6878097335e2a
2011-01-31T18:18:47.374394Z
201
francois.lutran
6081
rss.php
file
2010-05-27T12:39:51.000000Z
6c7893982fe245db921986dd61c6434e
2010-05-26T15:19:46.928829Z
142
francois.lutran
8081
logon.php
file
2010-03-11T01:00:06.000000Z
bf839fe48d1d98afceb8fd45baea1714
2010-03-10T21:53:51.228739Z
62
Francois.Lutran
829
images
dir
qcmProcess.php
file
2010-06-24T18:14:18.000000Z
1dbafc64eaf454e018d86d0c7dd962ab
2010-06-23T16:43:59.392251Z
179
francois.lutran
4320
styleIe.css
file
2010-02-02T19:33:46.000000Z
6898c57837d40aa829bb009679faeac7
2010-02-01T21:43:55.771214Z
3
Francois.Lutran
has-props
32
test.php
file
2010-06-27T00:00:06.000000Z
87796986167401f14d80116616047a3e
2010-06-26T17:43:33.519351Z
185
francois.lutran
2673
register.php
file
2010-04-18T19:27:04.000000Z
21c92d501dddfdb72e5078292869b3c3
2010-04-05T16:08:12.568839Z
91
Francois.Lutran
1132
backUpCreator.php
file
2010-11-06T14:46:11.949801Z
751c477b22c6087ca24c02f7d40c3bd3
2010-11-06T14:45:26.623737Z
192
francois.lutran
8214
version.php
file
2010-11-06T16:29:26.119054Z
0438a184159709dec296f99509a8d14d
2010-11-06T16:29:05.080573Z
193
francois.lutran
6380

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 10
text/plain
END

View File

@@ -0,0 +1,5 @@
K 14
svn:executable
V 1
*
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 10
text/plain
END

View File

@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 10
text/plain
END

View File

@@ -0,0 +1,230 @@
<?php
/* displays user's account settings */
//delete user
if(isset($_POST['deleteUserId']))
{
$iDeletedUserId = $_POST['deleteUserId'];
if(isAdmin($iDeletedUserId))
{
echo getError('Il est impossible de supprimer un compte administrateur');
}
else
{
$sDeletedUserName = getTextFromId(USER_TABLE, $iDeletedUserId);
deleteRow(USER_TABLE, $iDeletedUserId);
addFeed('DELETE', $iDeletedUserId , USER_TABLE, $sDeletedUserName, '');
}
}
//modify user account
$iSelectedUserId = isset($_POST['studentId'])?$_POST['studentId']:$_SESSION['user'];
$asSelectedUserInfo = selectRow(USER_TABLE, array($iSelectedUserId));
//modifications submit
$bfailedPassModif = false;
if(isset($_POST['submit']))
{
if($_GET['type']=='pass' && $_POST['pass']!='' && $_POST['oldpass']!='')
{
$sErrorMessage = checkPassword($_POST['oldpass'],$asSelectedUserInfo['pass'])?"":'Mot de passe incorrect';
$sErrorMessage .= ($_POST['pass']==$_POST['pass2'])?"":'Les mots de passe ne sont pas les m&ecirc;mes';
$bfailedPassModif = ($sErrorMessage!='');
if($bfailedPassModif)
{
echo getError($sErrorMessage);
}
else
{
updateRow(USER_TABLE, $iSelectedUserId, array('pass'=>encryptPassword($_POST['pass'])));
echo getSuccess('Mot de passe modifi&eacute;');
}
}
elseif($_GET['type']=='info' && $_POST['login']!='' && $_POST['firstname']!='')
{
$sLastName = strtolower($_POST['login']);
$sFirstName = strtolower($_POST['firstname']);
//Check if someone has already been registered by that name
$asChangedUserInfo = getUserFromLogin($sLastName, $sFirstName);
$bUserAvailable = !$asChangedUserInfo || $iSelectedUserId==$asChangedUserInfo['id_user'];
if($bUserAvailable)
{
$asUserModif = array( 'user_first_name'=>$sFirstName,
'user_last_name'=>$sLastName,
'grade'=>$_POST['grade'],
'class'=>$_POST['class']);
if($bAdmin)
{
$asUserModif['admin'] = isset($_POST['admin'])?'1':'0';
}
$asUserInfo = selectRow(USER_TABLE, array($iSelectedUserId));
updateRow(USER_TABLE, $iSelectedUserId, $asUserModif);
//feed
$sModifiedUserName = $asUserInfo[USER_TABLE.'_first_name'].' '.$asUserInfo[USER_TABLE.'_last_name'];
if($sModifiedUserName != $sFirstName.' '.$sLastName)
{
addFeed('MODIFY', $sModifiedUserName, USER_TABLE.'_name', $sModifiedUserName, $sFirstName.' '.$sLastName);
}
if($asUserInfo['grade']!=$_POST['grade'] || $asUserInfo['class']!=$_POST['class'])
{
addFeed('MODIFY', $sModifiedUserName, USER_TABLE.'_class', $asUserInfo['grade'].GRADE_CLASS_SEPARATOR.$asUserInfo['class'], $_POST['grade'].GRADE_CLASS_SEPARATOR.$_POST['class']);
}
echo getSuccess('Coordonn&eacute;es modifi&eacute;es');
if($iSelectedUserId==$_SESSION['user'])
{
setSession($_SESSION['user']);
if($sLastName!=$asSelectedUserInfo['user_last_name'] || $sFirstName!=$asSelectedUserInfo['user_first_name'])
{
echo getWarning(array('Changement de login pour l\'authentification', 'Votre nouveau login est :', 'Nom : '.$sLastName, 'Pr&eacute;nom : '.$sFirstName));
}
}
}
else
{
echo getError('Ce nom existe d&eacute;j&agrave; dans la base de donn&eacute;es');
}
}
else
{
echo getError('Champs incomplets');
$bfailedPassModif = ($_GET['type']=="pass");
}
}
//student class selection / teacher
$sTeacherClass = 'Professeur<input type="hidden" name="grade" value="0"><input type="hidden" name="class" value="0">';
$sStudentClass = getClasses(array('grade' => isset($_POST['grade'])?$_POST['grade']:$asSelectedUserInfo['grade'], 'class' => isset($_POST['class'])?$_POST['class']:$asSelectedUserInfo['class']));
//Admin menu : student selection
$sPromoteAdmin = '';
$bIsSelectedUserAdmin = isAdmin($iSelectedUserId);
if($bAdmin)
{
$sPromoteAdmin = '<tr>
<td>Admin</td>
<td><input type="checkbox" name="admin" '.($bIsSelectedUserAdmin?'CHECKED ':'').' onclick="switchClassType();" /></td>
</tr>';
?>
<script type="text/javascript">
function switchClassType()
{
if(document.forms['modif'].elements['admin'].checked)
{
replaceInnerText('studentTeacher', '<?php echo $sTeacherClass; ?>');
}
else
{
replaceInnerText('studentTeacher', '<?php echo $sStudentClass; ?>');
}
}
</script>
<form action="?page=account" method="post" name="getEleve">
<table>
<tr>
<td class="top-left-rounded bottom-left-rounded">El&egrave;ve</td>
<td class="top-right-rounded bottom-right-rounded">
<select name="studentId" onchange="document.forms['getEleve'].submit();">
<?php
$asUsers = selectRows(array('from'=>USER_TABLE, 'orderBy'=>array('class'=>'asc', 'user_last_name'=>'asc')));
foreach($asUsers as $asUser)
{
echo '<option value="'.$asUser['id_'.USER_TABLE].'"'.(($iSelectedUserId==$asUser['id_'.USER_TABLE])?' selected="selected"':'').'>
'.$asUser['grade'].GRADE_CLASS_SEPARATOR.$asUser['class'].' - '.ucwords($asUser['user_last_name'].' '.$asUser['user_first_name']).
'</option>'."\n";
}
?>
</select>
</td>
</tr>
<tr>
<td colspan="2" class="blank">
<input type="button" value="Supprimer ce compte" onclick="if(confirm('Etes-vous sur de vouloir supprimer le compte de <?php echo $asSelectedUserInfo['user_last_name']." ".$asSelectedUserInfo['user_first_name']; ?> ?'))document.deleteUser.submit();" />
</td>
</tr>
</table>
</form>
<?php
}
//forms display : info and password modifications
if((isset($_GET['type']) && $_GET['type']=="pass" && !isset($_POST['submit'])) || $bfailedPassModif)
{
?>
<br />
<form action="?page=account&type=pass" method="post" name="updateAccount">
<table>
<tr><th colspan="2" class="top-left-rounded top-right-rounded">Changer de mot de passe</th></tr>
<tr>
<td>Ancien mot de passe</td>
<td><input type="password" name="oldpass" /></td>
</tr>
<tr>
<td>Nouveau mot de passe</td>
<td><input type="password" name="pass" /></td>
</tr>
<tr>
<td class="bottom-left-rounded">Nouveau mot de passe (une nouvelle fois)</td>
<td class="bottom-right-rounded"><input type="password" name="pass2" /></td>
</tr>
<tr>
<td colspan="2" class="blank">
<input type="hidden" value="ok" name="submit" />
<input type="hidden" value="<?php echo $iSelectedUserId; ?>" name="studentId" />
<input type="button" name="annuler" onclick="goTo('?page=account');" value="Annuler"> <input type="submit" value="Changer le mot de passe">
</td>
</tr>
</table>
</form>
<br />
<?php
}
else
{
?>
<br />
<form action="?page=account&type=info" method="post" name="modif">
<table>
<tr><th colspan="2" class="top-left-rounded top-right-rounded">Modification de compte</th></tr>
<tr>
<td>Pr&eacute;nom</td>
<td><input type="text" name="firstname" value="<?php echo ucwords(isset($_POST['firstname'])?$_POST['firstname']:$asSelectedUserInfo['user_first_name']); ?>" /></td>
</tr>
<tr>
<td>Nom de famille</td>
<td><input type="text" name="login" value="<?php echo ucwords(isset($_POST['login'])?$_POST['login']:$asSelectedUserInfo['user_last_name']); ?>" /></td>
</tr>
<tr>
<td>Classe</td>
<td id="studentTeacher">
<?php echo $bIsSelectedUserAdmin?$sTeacherClass:$sStudentClass; ?>
</td>
</tr>
<?php echo $sPromoteAdmin; ?>
<tr>
<td class="bottom-left-rounded">Mot de passe</td>
<td class="bottom-right-rounded"><input type="button" value="Changer le mot de passe" onclick="pass.submit();" /></td>
</tr>
<tr>
<th colspan="2" class="blank">
<input type="hidden" value="ok" name="submit" />
<input type="hidden" value="<?php echo $iSelectedUserId; ?>" name="studentId" />
<input type="button" name="annuler" onclick="goTo('?page=logon');" value="Annuler">&nbsp;&nbsp;<input type="submit" value="Changer les param&egrave;tres" />
</th>
</tr>
</table>
</form>
<form action="?page=account&type=pass" method="post" name="pass">
<input type="hidden" name="studentId" value="<?php echo $iSelectedUserId; ?>" />
</form>
<form action="?page=account" method="post" name="deleteUser">
<input type="hidden" name="deleteUserId" value="<?php echo $iSelectedUserId; ?>" />
</form>
<?php
}
?>

View File

@@ -0,0 +1,280 @@
<?php
/* displays user's account settings */
define('DEL_USER_TAG', 'deluser');
//delete users
//TODO plusieurs eleves <20> la fois
if(isset($_GET['action']) && $_GET['action']=='delusers')
{
$asDeletedUserNames = array();
foreach($_POST as $sKey=>$sValue)
{
list($DelUserTag, $iUserId) = explode('_', $sKey);
//pre($DelUserTag.' '.$iUserId, '',true);
if($DelUserTag==DEL_USER_TAG && is_numeric($iUserId))
{
$sDeletedUserName = ucwords(getTextFromId(USER_TABLE, $iUserId));
if(isAdmin($iUserId))
{
addMessage(getError('Il est impossible de supprimer un compte administrateur ('.$sDeletedUserName.')'));
}
else
{
deleteRow(USER_TABLE, $iUserId);
$asDeletedUserNames[] = $sDeletedUserName;
addFeed('DELETE', $iUserId , USER_TABLE, $sDeletedUserName, '');
}
}
}
if(count($asDeletedUserNames)>0)
{
addMessage(getSuccess('Les comptes suivants ont &eacute;t&eacute; supprim&eacute;s : '.implode(', ', $asDeletedUserNames)));
}
}
//modify user account
$iSelectedUserId = isset($_REQUEST['studentId'])?$_REQUEST['studentId']:$_SESSION['user'];
$asSelectedUserInfo = selectRow(USER_TABLE, array($iSelectedUserId));
//modifications submit
$bfailedPassModif = false;
if(isset($_POST['submit']))
{
if($_GET['type']=='pass' && $_POST['pass']!='' && $_POST['oldpass']!='')
{
$sErrorMessage = checkPassword($_POST['oldpass'],$asSelectedUserInfo['pass'])?"":'Mot de passe incorrect';
$sErrorMessage .= ($_POST['pass']==$_POST['pass2'])?"":'Les mots de passe ne sont pas les m&ecirc;mes';
$bfailedPassModif = ($sErrorMessage!='');
if($bfailedPassModif)
{
echo getError($sErrorMessage);
}
else
{
updateRow(USER_TABLE, $iSelectedUserId, array('pass'=>encryptPassword($_POST['pass'])));
echo getSuccess('Mot de passe modifi&eacute;');
}
}
elseif($_GET['type']=='info' && $_POST['login']!='' && $_POST['firstname']!='')
{
$sLastName = strtolower($_POST['login']);
$sFirstName = strtolower($_POST['firstname']);
//Check if someone has already been registered by that name
$asChangedUserInfo = getUserFromLogin($sLastName, $sFirstName);
$bUserAvailable = !$asChangedUserInfo || $iSelectedUserId==$asChangedUserInfo['id_user'];
if($bUserAvailable)
{
$asUserModif = array( 'user_first_name'=>$sFirstName,
'user_last_name'=>$sLastName,
'grade'=>$_POST['grade'],
'class'=>$_POST['class']);
if($bAdmin)
{
$asUserModif['admin'] = isset($_POST['admin'])?'1':'0';
}
$asUserInfo = selectRow(USER_TABLE, array($iSelectedUserId));
updateRow(USER_TABLE, $iSelectedUserId, $asUserModif);
//feed
$sModifiedUserName = $asUserInfo[USER_TABLE.'_first_name'].' '.$asUserInfo[USER_TABLE.'_last_name'];
if($sModifiedUserName != $sFirstName.' '.$sLastName)
{
addFeed('MODIFY', $sModifiedUserName, USER_TABLE.'_name', $sModifiedUserName, $sFirstName.' '.$sLastName);
}
if($asUserInfo['grade']!=$_POST['grade'] || $asUserInfo['class']!=$_POST['class'])
{
addFeed('MODIFY', $sModifiedUserName, USER_TABLE.'_class', $asUserInfo['grade'].GRADE_CLASS_SEPARATOR.$asUserInfo['class'], $_POST['grade'].GRADE_CLASS_SEPARATOR.$_POST['class']);
}
echo getSuccess('Coordonn&eacute;es modifi&eacute;es');
if($iSelectedUserId==$_SESSION['user'])
{
setSession($_SESSION['user']);
if($sLastName!=$asSelectedUserInfo['user_last_name'] || $sFirstName!=$asSelectedUserInfo['user_first_name'])
{
echo getWarning(array('Changement de login pour l\'authentification', 'Votre nouveau login est :', 'Nom : '.$sLastName, 'Pr&eacute;nom : '.$sFirstName));
}
}
}
else
{
echo getError('Ce nom existe d&eacute;j&agrave; dans la base de donn&eacute;es');
}
}
else
{
echo getError('Champs incomplets');
$bfailedPassModif = ($_GET['type']=="pass");
}
}
//student class selection / teacher
$sTeacherClass = 'Professeur<input type="hidden" name="grade" value="0"><input type="hidden" name="class" value="0">';
$sStudentClass = getClasses(array('grade' => isset($_POST['grade'])?$_POST['grade']:$asSelectedUserInfo['grade'], 'class' => isset($_POST['class'])?$_POST['class']:$asSelectedUserInfo['class']));
//forms display : info and password modifications
if(isset($_GET['type']) && $_GET['type']=="modif" && !isset($_POST['submit']))
{
$sPromoteAdmin = '';
$bIsSelectedUserAdmin = isAdmin($iSelectedUserId);
$asSelectedUserInfo = selectRow(USER_TABLE, array($iSelectedUserId));
$sPromoteAdmin = '<tr>
<td>Admin</td>
<td><input type="checkbox" name="admin" '.($bIsSelectedUserAdmin?'CHECKED ':'').' onclick="switchClassType();" /></td>
</tr>';
?>
<script type="text/javascript">
function switchClassType()
{
if(document.forms['modif'].elements['admin'].checked)
{
replaceInnerText('studentTeacher', '<?php echo $sTeacherClass; ?>');
}
else
{
replaceInnerText('studentTeacher', '<?php echo $sStudentClass; ?>');
}
}
</script>
<br />
<form action="?page=account&type=info" method="post" name="modif">
<table>
<tr><th colspan="2" class="top-left-rounded top-right-rounded">Modification de compte</th></tr>
<tr>
<td>Pr&eacute;nom</td>
<td><input type="text" name="firstname" value="<?php echo $asSelectedUserInfo['user_first_name']; ?>" /></td>
</tr>
<tr>
<td>Nom de famille</td>
<td><input type="text" name="login" value="<?php echo $asSelectedUserInfo['user_last_name']; ?>" /></td>
</tr>
<tr>
<td>Classe</td>
<td id="studentTeacher">
<?php echo $bIsSelectedUserAdmin?$sTeacherClass:$sStudentClass; ?>
</td>
</tr>
<?php echo $sPromoteAdmin; ?>
<tr>
<td class="bottom-left-rounded">Mot de passe</td>
<td class="bottom-right-rounded"><input type="button" value="Changer le mot de passe" onclick="pass.submit();" /></td>
</tr>
<tr>
<th colspan="2" class="blank">
<input type="hidden" value="ok" name="submit" />
<input type="hidden" value="<?php echo $iSelectedUserId; ?>" name="studentId" />
<input type="button" name="annuler" onclick="goTo('?page=account_admin');" value="Annuler">&nbsp;&nbsp;<input type="submit" value="Changer les param&egrave;tres" />
</th>
</tr>
</table>
</form>
<form action="?page=account&type=pass" method="post" name="pass">
<input type="hidden" name="studentId" value="<?php echo $iSelectedUserId; ?>" />
</form>
<form action="?page=account" method="post" name="deleteUser">
<input type="hidden" name="deleteUserId" value="<?php echo $iSelectedUserId; ?>" />
</form>
<?php
}
elseif((isset($_GET['type']) && $_GET['type']=="pass" && !isset($_POST['submit'])) || $bfailedPassModif)
{
?>
<br />
<form action="?page=account&type=pass" method="post" name="updateAccount">
<table>
<tr><th colspan="2" class="top-left-rounded top-right-rounded">Changer de mot de passe</th></tr>
<tr>
<td>Ancien mot de passe</td>
<td><input type="password" name="oldpass" /></td>
</tr>
<tr>
<td>Nouveau mot de passe</td>
<td><input type="password" name="pass" /></td>
</tr>
<tr>
<td class="bottom-left-rounded">Nouveau mot de passe (une nouvelle fois)</td>
<td class="bottom-right-rounded"><input type="password" name="pass2" /></td>
</tr>
<tr>
<td colspan="2" class="blank">
<input type="hidden" value="ok" name="submit" />
<input type="hidden" value="<?php echo $iSelectedUserId; ?>" name="studentId" />
<input type="button" name="annuler" onclick="goTo('?page=account_admin');" value="Annuler"> <input type="submit" value="Changer le mot de passe">
</td>
</tr>
</table>
</form>
<br />
<?php
}
else
{
$asPreviousEntries = array();
$asConstraints = array('admin'=>'0');
$asConstraintsSigns = array('admin'=>'=');
$sGradeClass = 'Toutes les classes';
if(isset($_POST['gradeClass']))
{
$sGradeClass = $_POST['gradeClass'];
list($iGrade, $iClass) = explode(GRADE_CLASS_SEPARATOR, $sGradeClass);
if($iGrade!=0 && $iClass!=0)
{
$asConstraints['grade'] = $iGrade;
$asConstraints['class'] = $iClass;
}
}
$asUsers = selectRows(array(
'from'=>USER_TABLE,
'constraint'=>$asConstraints,
'orderBy'=>array('class'=>'asc', 'user_last_name'=>'asc')));
$asStudents = array();
foreach($asUsers as $asUser)
{
if($asUser['class']==0 || $asUser['grade']==0){continue;}
$asStudents[] = '<tr>
<td style="text-align:left;"><strong>'.ucwords($asUser['user_last_name']).'</strong> '.ucwords($asUser['user_first_name']).'</td>
<td>'.$asUser['grade'].GRADE_CLASS_SEPARATOR.$asUser['class'].'</td>
<td><a href="?page=account_admin&type=modif&studentId='.$asUser['id_'.USER_TABLE].'">Modifier</a></td>
<td><input type="checkbox" name="'.DEL_USER_TAG.'_'.$asUser['id_'.USER_TABLE].'" /></td>
</tr>';
}
$iStudentCount = count($asStudents);
$sStudents = ($iStudentCount>0)?implode("\n", $asStudents):'<tr><td colspan="4">Aucun utilisateur dans cette classe</td></tr>';
//Classes selection
$asClasses = getListe(array('select'=>array( "CONCAT(grade, '".GRADE_CLASS_SEPARATOR."', class) AS gradeClass", 'grade', 'class'),
'from'=>USER_TABLE,
'constraint'=>"admin=0 AND class<>0 AND grade<>0",
'groupBy' => 'gradeClass',
'orderBy'=>array('grade', 'class')));
$sSelectClasses = getSelect($asClasses, 'gradeClass', '', array('0'.GRADE_CLASS_SEPARATOR.'0'=>'Toutes'), isset($_POST['gradeClass'])?$_POST['gradeClass']:'', 'classSelect');
?>
<form name="classSelect" method="post" action="?page=<?php echo $sPage;?>">
<p style="text-align:center;margin-top:30px;">Classe : <?php echo $sSelectClasses; ?></p>
</form>
<form method="post" name="deleteUsers" action="?page=<?php echo $sPage;?>&action=delusers">
<table>
<tr>
<th class="top-left-rounded" style="padding:2px 10px;">El&egrave;ve</th>
<th style="padding:2px 10px;">Classe</th>
<th style="padding:2px 10px;">Modifier</th>
<th class="top-right-rounded" style="padding:2px 10px;">Supprimer</th>
</tr>
<?php echo $sStudents; ?>
<tr><th colspan="4" class="bottom-rounded"><?php echo $iStudentCount; ?> &eacute;l&egrave;ve(s) (<?php echo $sGradeClass; ?>)</th></tr>
</table>
<div style="text-align:center;margin-top:10px;"><input type="submit" value="Supprimer" /></div>
</form>
<?php
}
?>

View File

@@ -0,0 +1,178 @@
<?php
/* Create a backup file in /backup/ folder and download a copy to the user hard drive. */
if(!function_exists('checkOrigin') || !$bAdmin)
{
require_once 'config.php';
relocate(getError('Acc&egrave;s interdit'));
}
//check external link
if(isset($_GET['action']) && $_GET['action']!='')
{
if(!checkOrigin('backUpCreator'))
{
relocate(getError('Aucun lien externe autoris&eacute;'));
}
//Set designed actions
switch ($_GET['action'])
{
case 'download':
createBackUp(isset($_POST['dropDb']));
break;
case 'restore':
$sBackFilePath = BACKUP_FOLDER.decodeUrl($_POST['backUpId']);
restoreBackUp($sBackFilePath, $oConnection);
break;
case 'upload' :
uploadBackUp($_FILES['backUpFile'], isset($_POST['restoreDb']), $oConnection);
break;
case 'sync':
$bInternalLink = ($_POST['version']!='');
$sUrl = $_POST['backUpUrl'].($bInternalLink?'/index.php?page=remote&action='.$_POST['version']:'');
$sAuth = isset($_POST['useKeyRing'])?getKeyRing():$_POST['key_ring'];
syncBackUp($sUrl, $bInternalLink, $sAuth, isset($_POST['restoreDb']), $oConnection);
break;
case 'reset' :
resetDatabase($oConnection);
break;
default:
break;
}
}
//set Input Box for restoration
$oRestoreInputBox = new InputBox('Restauration d\'une sauvegarde', 'Etes-vous sur de vouloir charger la sauvegarde du #backUpDate# ?', array('Oui'=>'validateBackUp(\'#backUpId#\')', 'Non'=>''));
$oResetInputBox = new InputBox('Reset complet', 'Etes vous s&ucirc;r de vouloir proc&eacute;der &agrave; une r&eacute;intallation compl&egrave;te ? (vous allez perdre toutes vos donn&eacute;es)', array('Oui'=>'document.forms[\'reset\'].submit()', 'Non'=>''));
$sTitle = 'Suppression de la base de donn&eacute;es courante';
$sWarningMessage = 'Etes-vous sur de vouloir remplacer la base de donn&eacute;es par celle-ci ? Il est fortement conseill&eacute; de cr&eacute;er une sauvegarde avant une telle op&eacute;ration.';
$oUploadInputBox = new InputBox($sTitle, $sWarningMessage, array('Oui'=>'', 'Non'=>'document.forms[\'upload\'].restoreDb.checked = false;'));
$oSyncInputBox = new InputBox($sTitle, $sWarningMessage, array('Oui'=>'', 'Non'=>'document.forms[\'sync\'].restoreDb.checked = false;'));
//display available backups
$asFileList = glob(BACKUP_FOLDER.'*.'.DB_EXT_FILE);
$iFileNb = count($asFileList);
$iFilePerPage = 10;
//page switcher load
$oPageSwitcher = new PageSwitch('pageNb', $iFileNb, $iFilePerPage);
foreach($asFileList as $sFileName)
{
//set input box variables
$sBackUpId = encodeUrl(basename($sFileName));
$sTimeStamp = getTimeStampFromFile($sFileName);
$sBackUpName = date(LAYOUT_DATE_FORMAT, $sTimeStamp);
$oRestoreInputBox->setTags(array('backUpId'=>$sBackUpId, 'backUpDate'=>$sBackUpName));
$sLinkBackUp[$sTimeStamp] = ' <tr>
<td>Le '.$sBackUpName.'</td>
<td><input type="button" value="T&eacute;l&eacute;charger" onClick="goTo(\'?page=download&file='.$sBackUpId.'\');" /></td>
<td><input type="button" value="Restorer cette sauvegarde" onClick="'.$oRestoreInputBox->getAction().'" /></td>
</tr>';
}
if(isset($sLinkBackUp))
{
krsort($sLinkBackUp);
$iFirstItem = $oPageSwitcher->getItemStartPointer();
$aiFileRange = $oPageSwitcher->getItemRange();
$sLinkBackUp = array_slice($sLinkBackUp, $iFirstItem, $iFilePerPage, true);
$sPageSwitchInfo = $aiFileRange['start'].' - '.$aiFileRange['end'].' sur ';
}
else
{
$sLinkBackUp = array('<tr><td colspan="3"><p>Aucune sauvegarde disponible</p><p><input type="button" value="Cr&eacute;er une sauvegarde maintenant" onClick="document.download.submit();" /></p></td></tr>');
$sPageSwitchInfo = '';
}
//KeyRing
$sKeyRing = getKeyRing();
?>
<fieldset class="rounded">
<legend class="rounded">Sauvegardes disponibles</legend>
<br />
<form name="restore" action="?page=backUpCreator&action=restore" method="post">
<table class="maxWidth">
<tr>
<th class="top-left-rounded">Date</th>
<th>T&eacute;l&eacute;chargement</th>
<th class="top-right-rounded">Restoration</th>
</tr>
<?php echo implode("\n", $sLinkBackUp); ?>
<tr>
<th colspan="3" class="bottom-left-rounded bottom-right-rounded"><?php echo $oPageSwitcher->getPrevLink().'&nbsp;'.$sPageSwitchInfo.$iFileNb; ?> sauvegardes <?php echo $oPageSwitcher->getNextLink(); ?></th>
</tr>
</table>
<input type="hidden" name="backUpId" value="" />
</form>
</fieldset>
<fieldset class="rounded">
<legend class="rounded">Cr&eacute;er une sauvegarde</legend>
<form name="download" action="?page=backUpCreator&action=download" method="post">
<p>Sauvegarde de la base de donn&eacute;es <strong><?php echo DB_NAME; ?></strong> incluant les tables <?php echo implode(', ', getTables()); ?>.</p>
<p>Inclure les requ&ecirc;te de suppression de la base avant r&eacute;&eacute;criture : <input type="checkbox" name="dropDb" checked="checked" /></p>
<input type="submit" value="Lancer la sauvegarde" />
</form>
</fieldset>
<fieldset class="rounded">
<legend class="rounded">Ajouter une de vos sauvegardes</legend>
<form name="upload" action="?page=backUpCreator&action=upload" method="post" enctype="multipart/form-data">
<p>Ins&eacute;rer ici le fichier de sauvegarde (.sql) : <input type="file" name="backUpFile" /></p>
<p>remplacer la base de donn&eacute;es actuelle par celle-ci :
<input type="checkbox" name="restoreDb" onchange="if(document.forms['upload'].restoreDb.checked)<?php echo $oUploadInputBox->getAction(); ?>" />
</p>
<input type="submit" value="Ajouter la sauvegarde" />
</form>
</fieldset>
<fieldset class="rounded">
<legend class="rounded">Synchroniser la base avec un point d'acc&egrave;s</legend>
<form name="sync" action="?page=backUpCreator&action=sync" method="post">
<p>
Ins&eacute;rer ici l'url de sauvegarde : <input type="text" name="backUpUrl" style="width:250px;" value="<?php echo isset($_POST['backUpUrl'])?$_POST['backUpUrl']:''; ?>" />
<select name="version">
<option value="<?php echo ACCESS_POINT_LAST_VERSION; ?>">Derni&egrave;re version disponible</option>
<option value="<?php echo ACCESS_POINT_NEW_VERSION; ?>">Nouvelle version</option>
<option value="">aucune version (lien directe)</option>
</select>
</p>
<p>remplacer la base de donn&eacute;es actuelle celle du point d'acc&egrave;s : <input type="checkbox" name="restoreDb" onchange="if(document.forms['sync'].restoreDb.checked)<?php echo $oSyncInputBox->getAction(); ?>" /></p>
<p>
Utiliser le KeyRing de cette session pour l'authentification : <input type="checkbox" name="useKeyRing" checked="checked" onclick="setKeyRingInput();" />
<span id="authentification" style="display:none;">
utiliser celui-ci : <input type="text" name="key_ring" style="width:300px;" />
</span>
</p>
<script type="text/javascript">
function setKeyRingInput()
{
var bUseKeyRing = document.forms['sync'].elements['useKeyRing'].checked;
setBoxDisplay('authentification', bUseKeyRing?'n':'y');
}
</script>
<input type="submit" value="Synchroniser" />
</form>
</fieldset>
<fieldset class="rounded">
<legend class="rounded">KeyRing</legend>
<form name="keyring">
<p class="keyring">
<a href="#" onclick="setSelection('keyring', 'keyring');return false;"><img src="images/keyring.png" title="click pour s&eacute;lectionner la cl&eacute;" /></a>
<textarea name="keyring" class="disabled" rows="1" onclick="setSelection('keyring', 'keyring');"><?php echo $sKeyRing; ?></textarea>
</p>
</form>
</fieldset>
<fieldset class="rounded">
<legend class="rounded">R&eacute;-initialisation compl&egrave;te</legend>
<form name="reset" action="?page=backUpCreator&action=reset" method="post">
<p>Tout supprimer et r&eacute;initialiser l'application (aka la m&eacute;thode du bourinos) : <input type="button" value="Lancer" onclick="<?php echo $oResetInputBox->getAction(); ?>" /></p>
</form>
</fieldset>
<?php
echo $oRestoreInputBox->getHtml();
echo $oResetInputBox->getHtml();
echo $oUploadInputBox->getHtml();
echo $oSyncInputBox->getHtml();
?>

View File

@@ -0,0 +1,68 @@
0000-00-00 00:00:00 0.1 new feature Cr&eacute;ation de QCM
0000-00-00 00:00:00 1.0 new feature affichage des notes en direct
0000-00-00 00:00:00 1.0 new feature compte utilisateur
0000-00-00 00:00:00 1.0 new feature lecture de QCM
0000-00-00 00:00:00 1.1 new feature visionnage des notes obtenues
0000-00-00 00:00:00 1.1 new feature modification de compte
0000-00-00 00:00:00 1.1 new feature menus
0000-00-00 00:00:00 1.2 new feature calcul de moyenne par classe
0000-00-00 00:00:00 1.2 new feature modification des comptes par l admin
0000-00-00 00:00:00 1.2 new feature visionnage des notes par classe
0000-00-00 00:00:00 1.2 new feature onglet admin
0000-00-00 00:00:00 1.2 bug fix temps limite pour la cr&eacute;ation des QCM supprim&eacute;e
0000-00-00 00:00:00 1.2 bug fix caract&egrave;res sp&eacute;ciaux lors de cr&eacute;ations de qcm
0000-00-00 00:00:00 1.3 design Beta tag
0000-00-00 00:00:00 1.3 design positionnement des paragraphes sur la page de versions
0000-00-00 00:00:00 1.3 design couleurs des boutons
0000-00-00 00:00:00 1.3 design Ajout bouton D&eacute;connexion
0000-00-00 00:00:00 1.3 design Bords arrondis
0000-00-00 00:00:00 1.3 new feature T&eacute;l&eacute;chargement
0000-00-00 00:00:00 1.3 new feature Les r&eacute;ponses de l'&eacute;l&egrave;ve apparaissent sur les r&eacute;sultats des QCM
0000-00-00 00:00:00 1.3 new feature Suppression de compte
0000-00-00 00:00:00 1.3 bug fix auto logout &agrave; la fin de l'&eacute;dition de QCM
0000-00-00 00:00:00 1.3 bug fix couleurs des moyennes
0000-00-00 00:00:00 1.5 design Logo qcm
0000-00-00 00:00:00 1.5 design Notification du compte connect&eacute;
0000-00-00 00:00:00 1.5 new feature Export de la base de donn&eacute;es
0000-00-00 00:00:00 1.5 new feature remont&eacute;e vers le haut du document
0000-00-00 00:00:00 1.5 new feature Bouton export en csv (Excel)
0000-00-00 00:00:00 1.5 new feature Option de finalisation des qcm
0000-00-00 00:00:00 1.5 new feature T&eacute;l&eacute;chargements silencieux
0000-00-00 00:00:00 1.5 bug fix encodage du mot de passe
0000-00-00 00:00:00 1.5 bug fix doublon de login &agrave; la cr&eacute;ation et &agrave; la modification de login
0000-00-00 00:00:00 1.5 bug fix onglet param&egrave;tre : possibilit&eacute; de changements sans v&eacute;rification du mot de passe
0000-00-00 00:00:00 1.5 bug fix restructuration de l installation
0000-00-00 00:00:00 1.5 bug fix saut de lignes dans le libell&eacute; des questions
0000-00-00 00:00:00 2.0 new feature T&eacute;l&eacute;chargement en csv avec coma separator embedded
0000-00-00 00:00:00 2.0 new feature Upload et restoration de backup
0000-00-00 00:00:00 2.0 new feature retour &agrave; la page en cours apr&egrave;s d&eacute;connexion
0000-00-00 00:00:00 2.0 bug fix suppression compl&egrave;te des qcm : QCM + notes
0000-00-00 00:00:00 2.0 bug fix Restructuration complete des questions et des resultats (SQL)
0000-00-00 00:00:00 2.1 new feature M&eacute;lange des questions des QCM en lecture (mode anti-triche)
0000-00-00 00:00:00 2.1 design remplacement des fenetres javascript par des layers en html
0000-00-00 00:00:00 2.1 new feature Ajout d'une table pour le changelog
0000-00-00 00:00:00 2.1 bug fix modifier l'appel des fichiers de back up pour respecter l'ordre des dates
2010-02-28 15:52:23 2.1 bug fix ajouter les dates de modifications dans lhistorique des versions
2010-02-28 20:55:08 2.1 bug fix log in par nom de famille et pr&eacute;nom (siblings)
2010-03-04 13:54:26 2.1 new feature Cr&eacute;ation dynamique de base de donn&eacute;es
2010-03-04 13:36:51 2.1 bug fix Couper la liste des backups &agrave; 10 (et afficher un bouton)
2010-03-04 13:55:04 2.1 new feature Point d'acc&egrave;s pour back up : export et import de base de donn&eacute;es vers ou depuis un url
2010-03-10 09:27:12 2.1 bug fix Renforcement des s&eacute;curit&eacute;s d'acc&egrave;s (qcmResults & qcmProcess)
2010-03-09 09:48:01 2.1 bug fix qcmProcess.php : redirection en fin de traitement
2010-03-08 21:43:54 2.1 bug fix Fix : ajout de r&eacute;ponses sans question li&eacute;e (NULL)
2010-05-17 16:07:06 2.2 new feature Log des changements utilisateur + flux rss
2010-04-21 16:23:32 2.2 bug fix Interface dynamique admin <-> eleve (grade + class) dans la gestion des comptes
2010-04-21 16:21:38 2.2 new feature Report Admin sur les erreurs SQL et relocate()
2010-05-17 16:08:15 2.2 bug fix Download en fonction (tout passe par index.php !)
2010-03-29 00:52:20 2.2 bug fix Check usage of insertUpdateRow() and optimize function
2010-06-08 20:12:53 2.2 bug fix Bug des apostrophes dans le cas d'un server configur&eacute; avec des magic quotes
2010-04-21 10:21:42 2.2 bug fix ajouter changelog au moment de l'installation initiale
2010-04-01 18:27:06 2.2 new feature moteur de recherche
2010-04-05 19:17:55 2.2 new feature Kit d'installation facile
2010-04-21 10:21:15 2.2 new feature t&eacute;l&eacute;chargement en zip ou gz en fonction du HTTP_USER_AGENT
2010-03-12 14:17:47 2.2 bug fix secure access point (v2 : shuffle firstname / name / pass)
2010-03-17 22:42:46 2.2 bug fix Secure le logon : isset($_SESSION['user']) avec une deuxieme validation sur HTTP_USER_AGENT + IP
2010-05-17 16:08:40 2.2 new feature image dans les questions
2010-06-25 13:40:14 2.2 bug fix Gerer le mode message
2010-06-21 19:21:42 2.2 bug fix modification du fonctionnement des dates des fichiers de back up
2010-06-25 15:59:12 2.2 new feature remote control

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,140 @@
<?php
/* Displays all QCM in the database : finished QCM (and unfinished ones made by the connected user) */
//delete / desactivate a qcm
if(isset($_POST['deleteQcm']))
{
$sDeletedQcmName = getTextFromId(QCM_TABLE, $_POST['deleteQcm']);
deleteRow(QCM_TABLE, $_POST['deleteQcm']);
addFeed('DELETE', $_POST['deleteQcm'], QCM_TABLE, $sDeletedQcmName);
}
elseif(isset($_POST['desactivateQcm']))
{
setQcmValidity($_POST['desactivateQcm'], false);
}
elseif(isset($_POST['activateQcm']))
{
if(checkQcm($_POST['activateQcm']))
{
setQcmValidity($_POST['activateQcm'], true);
}
else
{
echo getError(array('Il reste des erreurs dans ce Qcm.', 'Il est n&eacute;cessaire de les corriger avant d\'activer ce Qcm'));
}
}
//set Input Box
$oDeleteInputBox = new InputBox('Suppression du QCM : <strong>#qcmName#</strong>', 'Voulez-vous vraiment #qcmAction# le QCM : <em>"#qcmName#"</em> ?');
$oEditInputBox = new InputBox( 'Modification du QCM : <strong>#qcmName#</strong>',
'Voulez-vous faire une copie du QCM : <em>"#qcmName#"</em> avant de le modifier ?',
array('Oui'=>'goTo(\'?page=qcmCreator&qcm=#idQcm#&copyQcm=1\')', 'Non'=>'goTo(\'?page=qcmCreator&qcm=#idQcm#&copyQcm=0\')'));
//display valid and not valid (unfinished) QCM
$asParams = array
(
'notValid' => array
(
'title' => 'QCM non finalis&eacute;s',
'valid' => '0',
'displayConstraint' => $bAdmin?array():array('id_'.USER_TABLE=>$_SESSION['user']),
'goTo' => 'Creator',
'copyQcm' => false,
'deleteAction' => 'deleteQcm',
'deleteTitle' => 'Supprimer',
'editTitle' => 'Activer'
),
'valid' => array
(
'title' => 'QCM disponibles',
'valid' => '1',
'displayConstraint' => array(),
'goTo' => 'Reader',
'copyQcm' => true,
'deleteAction' => 'desactivateQcm',
'deleteTitle' => 'D&eacute;sactiver',
'editTitle' => 'Editer'
)
);
foreach($asParams as $sParamName => $asParamValues)
{
$asConstraints = array_merge(array('valid'=>$asParamValues['valid']), $asParamValues['displayConstraint']);
$asQcms = selectRows(array('from'=>QCM_TABLE, 'constraint'=>$asConstraints));
$iTotal = 0;
if(count($asQcms) > 0)
{
$asDisplay[$sParamName] = '<p>'.$asParamValues['title'].' :</p>
<table>
<tr>
<th width="35%" class="top-left-rounded">nom du QCM</th>
<th width="20%">Auteur</th>
<th width="15%">Derni&egrave;re modification</th>
<th width="15%">'.$asParamValues['editTitle'].' le QCM</th>
<th width="15%" class="top-right-rounded">'.$asParamValues['deleteTitle'].' le QCM</th>
</tr>';
foreach($asQcms as $asQcmRow)
{
$iQcmId = $asQcmRow['id_'.QCM_TABLE];
//link to the QCM
$asDisplay[$sParamName] .= '<tr><td class="qcmSelection" onclick="goTo(\'?page=qcm'.$asParamValues['goTo'].'&qcm='.$iQcmId.'\')"><p>'.$asQcmRow[QCM_TABLE].'</p></td>';
//get author info
$asAuthorInfo = selectRow(USER_TABLE, array($asQcmRow['id_'.USER_TABLE]), array(USER_TABLE.'_first_name', USER_TABLE.'_last_name'));
$asDisplay[$sParamName] .= '<td><p>'.ucwords($asAuthorInfo[USER_TABLE.'_first_name']).' '.ucwords($asAuthorInfo[USER_TABLE.'_last_name']).'</p></td><td><p>'.date('d/m/Y H:i:s', strtotime($asQcmRow['led'])).'</p></td>';
if($asQcmRow['id_user']==$_SESSION['user'] || $bAdmin)
{
$sFormName = 'form'.$iQcmId;
//set input box properties
$oDeleteInputBox->setTags(array('formName'=>$sFormName, 'qcmName'=>$asQcmRow[QCM_TABLE], 'qcmAction'=>$asParamValues['deleteTitle']));
$oEditInputBox->setTags(array('idQcm'=>$iQcmId, 'qcmName'=>$asQcmRow[QCM_TABLE]));
if($sParamName=='valid')
{
$sEdition = '<input type="button" onClick="'.($asParamValues['copyQcm']?$oEditInputBox->getAction():'goTo(\'?page=qcmCreator&qcm='.$iQcmId.'\')').'" value="Editer">';
}
else
{
$sEdition = '<form method="POST" action="?page=frontal">
<input type="hidden" value="'.$iQcmId.'" name="activateQcm" />
<input type="submit" value="Activer">
</form>';
}
$asDisplay[$sParamName] .= '<td>'.$sEdition.'</td>
<td>
<form class="no-margin" name="'.$sFormName.'" method="POST" action="?page=frontal">
<input type="hidden" value="'.$iQcmId.'" name="'.$asParamValues['deleteAction'].'" />
<input type="button" value="'.$asParamValues['deleteTitle'].'" onclick="'.$oDeleteInputBox->getAction().'" />
</form>
</td></tr>';
}
else
{
$asDisplay[$sParamName] .= '<td class="divDisabled"></td><td class="divDisabled"></td></tr>';
}
$iTotal++;
}
$asDisplay[$sParamName] .= '<tr><th colspan="5" class="bottom-left-rounded bottom-right-rounded">Un total de '.$iTotal.' QCM</th></tr></table>';
if($iTotal==0)
{
unset($asDisplay[$sParamName]);
}
next($asParams);
}
elseif($sParamName == 'valid')
{
$asDisplay[$sParamName] = getNotice('Aucun Qcm n\'est disponible');
}
}
echo implode("\n",$asDisplay);
echo $oDeleteInputBox->getHtml();
echo $oEditInputBox->getHtml();
?>

View File

@@ -0,0 +1,143 @@
/* JavaScript Document. summoned by index.php */
function emptyBox(id)
{
if(document.forms['qcmCreator'].elements[id].value == "Tapez ici la question..." || document.forms['qcmCreator'].elements[id].value == "Tapez ici une reponse...")
{
document.forms['qcmCreator'].elements[id].value = "";
}
}
function goTo(url)
{
window.location.href = url;
}
function setFocus(id, element)
{
if(!element)
{
document.getElementById(id).focus();
}
else
{
document.forms[id].elements[element].focus();
}
}
function setSelection(form, element)
{
document.forms[form].elements[element].select();
}
function submitForm(formName)
{
document.forms[formName].submit();
}
function validateBackUp(id)
{
document.forms['restore'].backUpId.value = id;
submitForm('restore');
}
document.onmousemove = setXY;
function mouseX(evt)
{
if (evt.pageX)
{
return evt.pageX;
}
else if (evt.clientX)
{
return evt.clientX + (document.documentElement.scrollLeft?document.documentElement.scrollLeft:document.body.scrollLeft);
}
else return null;
}
function mouseY(evt)
{
if (evt.pageY)
{
return evt.pageY;
}
else if (evt.clientY)
{
return evt.clientY + (document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop);
}
else return null;
}
function setXY(evt)
{
X = mouseX(evt);
Y = mouseY(evt);
}
function hover(id, forceSet)
{
var className = document.getElementById(id).className;
var index = className.indexOf('Hover');
if(index === -1 && (!forceSet || forceSet=='y'))
{
document.getElementById(id).className = className+" "+className+"Hover";
}
else if(index !== -1 && (!forceSet || forceSet=='n'))
{
var spacePos = className.indexOf(' ');
document.getElementById(id).className = className.substring(0, spacePos);
}
}
function disableBox(form, element, forceSet)
{
if(!forceSet)
{
document.forms[form].elements[element].disabled = !document.forms[form].elements[element].disabled;
}
else
{
document.forms[form].elements[element].disabled = (forceSet=='y')?true:false;
}
if(document.getElementById(element+'Delete'))
{
hover(element+'Delete', forceSet);
}
return document.forms[form].elements[element].disabled?'y':'n';
}
function disableDiv(id, forceSet)
{
var className = document.getElementById(id).className;
var index = className.indexOf('Disabled');
if(index === -1 && (!forceSet || forceSet=='y'))
{
document.getElementById(id).className = className+"Disabled";
}
else if(!forceSet || forceSet=='n')
{
document.getElementById(id).className = className.replace(/Disabled/g, "");
}
return (document.getElementById(id).className.indexOf('Disabled')===-1)?'n':'y';
}
function setBoxDisplay(id, forceSet)
{
if(!forceSet)
{
document.getElementById(id).style.display = (document.getElementById(id).style.display=='none')?'':'none';
}
else
{
document.getElementById(id).style.display = (forceSet=='y')?'':'none';
}
}
function concatenateKeyWords(keywords)
{
return keywords.replace(/ /g, '+');
}
function replaceInnerText(id, newText)
{
document.getElementById(id).innerHTML = newText;
}

View File

@@ -0,0 +1,156 @@
<?php
/*
* Copyright (C) 2010 Francois Lutran.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/gpl.html.
*/
/* First page on load */
//connection
session_start();
$sScriptStartTime = microtime();
require_once('config.php');
$oConnection = connection();
//clean data
cleanPost($_POST);
cleanPost($_GET);
cleanPost($_REQUEST);
//Page Management
$sRequestedPage = isset($_GET['page'])?$_GET['page']:DEFAULT_LOGGED_PAGE;
$sPage = pageAccessManagement($sRequestedPage);
$sPagePath = $sPage.'.php';
//Admin
$bConnected = checkSession();
$iUserId = $bConnected?$_SESSION['user']:false;
$bAdmin = isAdmin();
//display header
$asGeneralDisplay['beta'] = ($bAdmin && IS_BETA)?getA('?page=version', '&beta;', 'Envoyer un feedback', 'beta rounded'):'';
//display info
$sPageDesc = getPageDescription($sPage);
$asInfoDisplay['title'] = getHtml($sPageDesc, 'p', 'pageTitle rounded');
$asInfoDisplay['search'] = '';
if($bAdmin)
{
$asInfoDisplay['search'] = '<form name="search" method="post" action="?page=search" onSubmit="this.elements[\'keywords\'].value = concatenateKeyWords(this.elements[\'keywords\'].value);">
Recherche <input type="text" name="keywords" style="border-color:black;" value="'.(isset($_REQUEST['keywords'])?str_replace('+', ' ', $_REQUEST['keywords']):'').'" />
</form>';
}
$sConnectedUser = $bConnected?'Connect&eacute; : '.getHtml(ucwords($_SESSION['firstName'].' '.$_SESSION['lastName']), 'strong'):'Non connect&eacute;';
$asInfoDisplay['connectedUser'] = getHtml($sConnectedUser, 'p', 'connectedUser rounded');
$asGeneralDisplay['info'] = getHtml(getHtml(getHtml($asInfoDisplay, 'td', 'blank', 'padding:0;width:33%;'), 'tr'), 'table', 'maxWidth', 'border-spacing:0;');
//display browser warning
if(getBrowser() == 'msie')
{
$asGeneralDisplay['main']['browser'] = getWarning(array('Le navigateur Internet Explorer est d&eacute;conseill&eacute; pour cette application',
'Nous vous conseillons un navigateur optimis&eacute; (et gratuit) tel que
<a href="http://www.mozilla-europe.org/fr/firefox/" title="T&eacute;l&eacute;charger Firefox">Firefox</a>'));
}
/**
* Get included file
* Available variables within file:
* $bNoTemplate Boolean Display the application template
* $oConnection Object Database connection handle
* $iUserId Integer User Id (===false is not connected)
* $bAdmin Boolean Is the current user an admin
* $sPage String Page displayed
* $sScriptStartTime String  Time at which the script started to be executed
*/
$bNoTemplate = false;
ob_start();
require_once($sPagePath);
$asGeneralDisplay['main']['file'] = ob_get_clean();
//display message
$asGeneralDisplay['message'] = getCleanMessage();
if($bAdmin && $sPage==DEFAULT_LOGGED_PAGE)
{
$asGeneralDisplay['message'] .= getCleanPublication($iUserId);
}
//display included file
if($bNoTemplate)
{
echo $asGeneralDisplay['main']['file'];
die();
}
//display Menu
$asGeneralDisplay['menu'] = getMenu($sPage, $bAdmin);
//display footer
$sLogLink = 'Version '.CURRENT_VERSION;
$asGeneralDisplay['rss'] = '';
if($bAdmin)
{
$sLogLink = getA('?page=version', $sLogLink, 'changelog et t&eacute;l&eacute;chargement');
$asGeneralDisplay['rss'] = getHtml(getA('?page=rss', getImage('images/feedIcon.png', 'flux rss'), 'flux rss'), 'p');
}
$asGeneralDisplay['version'] = $sLogLink;
//close SQL connection
if($oConnection)
{
mysql_close($oConnection);
}
//combine main part
$asGeneralDisplay['main'] = $asGeneralDisplay['message']."\n".implode("\n", $asGeneralDisplay['main']);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<meta name="author" content="Franzz" />
<link href="style.css" rel="stylesheet" type="text/css" />
<!--[if IE]>
<link href="styleIe.css" rel="stylesheet" type="text/css" />
<![endif]-->
<script type="text/javascript" src="functions.js"></script>
<link rel="shortcut icon" href="images/favicon.ico" />
<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="?page=rss"/>
<title>QCM - <?php echo $sPageDesc; ?></title>
</head>
<body id="top">
<img src="images/button_gradient_hover.gif" class="preload" alt="preloaded image" />
<img src="images/qcm_selection_hover.gif" class="preload" alt="preloaded image" />
<div id="layer" class="layer" style="display:none;"></div>
<?php echo $asGeneralDisplay['beta']; ?>
<div id="header" class="rounded">
<h1>&Eacute;valuation par <span class="logo">Q</span>CM</h1>
<h3>Coll&egrave;ge International</h3>
</div>
<div id="topMenu"><?php echo $asGeneralDisplay['menu']; ?></div>
<div id="main" class="rounded">
<div id="info"><?php echo $asGeneralDisplay['info']; ?></div>
<?php echo $asGeneralDisplay['main']; ?>
</div>
<div id="footer">
<p>
Page charg&eacute;e en <?php echo getElapsedTime($sScriptStartTime); ?> seconde(s). Application r&eacute;alis&eacute;e par M. Lutran pour le coll&egrave;ge International de Fontainebleau.
<br />Projet sous licence <a href="http://www.gnu.org/licenses/gpl.html" target="_blank">GPLv3</a>. <?php echo $asGeneralDisplay['version']; ?>
</p>
<?php echo $asGeneralDisplay['rss']; ?>
</div>
</body>
</html>

View File

@@ -0,0 +1,154 @@
<?php
/* Setting up settings.php for constants storage */
//common variables
$sDbServer = isset($_POST['DB_SERVER'])?$_POST['DB_SERVER']:'localhost';
$sDbLogin = isset($_POST['DB_LOGIN'])?$_POST['DB_LOGIN']:'root';
$sDbName = isset($_POST['DB_NAME'])?$_POST['DB_NAME']:'dbqcm';
$sFirstName = isset($_POST['firstname'])?$_POST['firstname']:'';
$sLastName = isset($_POST['lastname'])?$_POST['lastname']:'';
$sFeedBackMail = isset($_POST['FEEDBACK_MAIL'])?$_POST['FEEDBACK_MAIL']:'';
$iMaxClass = isset($_POST['MAX_CLASS'])?$_POST['MAX_CLASS']:8;
$iMinGrade = isset($_POST['MIN_GRADE'])?$_POST['MIN_GRADE']:6;
$iMaxGrade = isset($_POST['MAX_GRADE'])?$_POST['MAX_GRADE']:3;
//process
if(isset($_POST['READY_TO_USE']))
{
if(file_exists(SETTINGS_FILE))
{
unlink(SETTINGS_FILE);
}
$oConnection = @mysql_connect($sDbServer, $sDbLogin, $_POST['DB_PASS']);
if(!$oConnection)
{
addMessage(getError(array('Connexion impossible', 'V&eacute;rifier les identifiants')));
}
elseif($sFirstName=='' || $sLastName=='')
{
addMessage(getError('Informations incompl&egrave;tes'));
}
elseif($_POST['pass']!=$_POST['pass2'])
{
addMessage(getError('Les mots de passes ne sont pas les m&ecirc;mes'));
}
else
{
$asAdminInfo = array(array($sFirstName, $sLastName, '0', '0', encryptPassword($_POST['pass']), 1));
if(install($oConnection, $sDbName, $asAdminInfo, isset($_POST['delete_db'])))
{
//setting Constants into file
$asConstants = array( 'DB_SERVER' => $_POST['DB_SERVER'],
'DB_LOGIN' => $_POST['DB_LOGIN'],
'DB_PASS' => $_POST['DB_PASS'],
'DB_NAME' => $_POST['DB_NAME'],
'FEEDBACK_MAIL' => $_POST['FEEDBACK_MAIL'],
'MAX_CLASS' => $_POST['MAX_CLASS'],
'MIN_GRADE' => $_POST['MIN_GRADE'],
'MAX_GRADE' => $_POST['MAX_GRADE'],
'READY_TO_USE' => $_POST['READY_TO_USE']);
$sSettingsFile = '<?php '."\n".implodeAll($asConstants, '\', \'', "\n", 'define(\'', '\');')."\n".' ?>';
if(file_put_contents(SETTINGS_FILE, $sSettingsFile, FILE_APPEND))
{
relocate(getSuccess('Installation termin&eacute;e'));
}
else
{
addMessage(getError(array('Cr&eacute;ation de fichier impossible', 'V&eacute;rifier les droits sur le dossier principal')));
}
}
}
}
else
{
logMeOut(false);
}
if(file_exists(SETTINGS_FILE))
{
$sDbServer = DB_SERVER;
$sDbLogin = DB_LOGIN;
$sDbName = DB_NAME;
$sFeedBackMail = FEEDBACK_MAIL;
$iMaxClass = MAX_CLASS;
$iMinGrade = MIN_GRADE;
$iMaxGrade = MAX_GRADE;
}
//TODO getHtmlTable()
?>
<p>Bienvenue dans QcmMaker v<?php echo STABLE_VERSION; ?> !</p>
<p>Veuillez entrer les informations suivantes : </p>
<form method="post" action="?page=install">
<fieldset class="rounded">
<legend class="rounded">Informations server</legend>
<table class="rounded">
<tr>
<td class="top-left-rounded">Adresse de votre server</td>
<td class="top-right-rounded"><input type="text" name="DB_SERVER" value="<?php echo $sDbServer; ?>" /></td>
</tr>
<tr>
<td>login MySql</td>
<td><input type="text" name="DB_LOGIN" value="<?php echo $sDbLogin; ?>" /></td>
</tr>
<tr>
<td>Mot-de-passe MySql</td>
<td><input type="password" name="DB_PASS" /></td>
</tr>
<tr>
<td>Nom de la base de donn&eacute;es</td>
<td><input type="text" name="DB_NAME" value="<?php echo $sDbName; ?>" onchange="replaceInnerText('db_name', this.value);" /></td>
</tr>
<tr>
<td class="bottom-left-rounded">Supprimer la base de donn&eacute;es '<span id="db_name"><?php echo $sDbName; ?></span>' (si existante)</td>
<td class="bottom-right-rounded"><input type="checkbox" name="delete_db" /></td>
</tr>
</table>
</fieldset>
<fieldset class="rounded">
<legend class="rounded">Informations administrateur</legend>
<table class="rounded">
<tr><th colspan="2" class="top-left-rounded top-right-rounded">Cr&eacute;ation du compte administrateur</th></tr>
<tr>
<td>Pr&eacute;nom</td>
<td><input type="text" name="firstname" value="<?php echo $sFirstName; ?>" /></td>
</tr>
<tr>
<td>Nom de famille</td>
<td><input type="text" name="lastname" value="<?php echo $sLastName; ?>" /></td>
</tr>
<tr>
<td>Mot de passe</td>
<td><input type="password" name="pass" /></td>
</tr>
<tr>
<td>Mot de passe (une nouvelle fois)</td>
<td><input type="password" name="pass2" /></td>
</tr>
<tr>
<td class="bottom-left-rounded">Adresse email de votre administrateur (optionel)</td>
<td class="bottom-right-rounded"><input type="text" name="FEEDBACK_MAIL" value="<?php echo $sFeedBackMail; ?>" /></td>
</tr>
</table>
</fieldset>
<fieldset class="rounded">
<legend class="rounded">Param&egrave;tres suppl&eacute;mentaires</legend>
<input type="hidden" name="READY_TO_USE" value="1" />
<table class="rounded">
<tr>
<td class="top-left-rounded">Nombre de classes maximum par section</td>
<td class="top-right-rounded left"><input type="text" name="MAX_CLASS" value="<?php echo $iMaxClass; ?>" /></td>
</tr>
<tr>
<td>Premi&egrave;re section concern&eacute;e</td>
<td class="left"><input type="text" name="MIN_GRADE" value="<?php echo $iMinGrade; ?>" />&egrave;me</td>
</tr>
<tr>
<td class="bottom-left-rounded">Derni&egrave;re section concern&eacute;e</td>
<td class="bottom-right-rounded left"><input type="text" name="MAX_GRADE" value="<?php echo $iMaxGrade; ?>" />&egrave;me</td>
</tr>
</table>
</fieldset>
<p style="text-align:center;"><input style="margin-top:10px;" type="submit" value ="Valider" /></p>
</form>

View File

@@ -0,0 +1,5 @@
data :
INSERT /* config.php 830 */
INTO changelog (`led`, `version`, `type`, `changelog`, `progress`)
VALUES ('0000-00-00 00:00:00', 0.1, 'new feature', 'Cr&eacute;ation de QCM', 1)

View File

@@ -0,0 +1,19 @@
<form action="?page=logon&amp;register=0" method="post">
<table>
<tr><th colspan="2" class="top-left-rounded top-right-rounded">Connexion</th></tr>
<tr>
<td>Pr&eacute;nom</td>
<td><input type="text" name="firstName" value="<?php echo isset($_POST['firstName'])?$_POST['firstName']:''; ?>" /></td>
</tr>
<tr>
<td>Nom</td>
<td><input type="text" name="login" value="<?php echo isset($_POST['login'])?$_POST['login']:''; ?>" /></td>
</tr>
<tr>
<td class="bottom-left-rounded">Mot de passe</td>
<td class="bottom-right-rounded"><input type="password" name="pass" /></td>
</tr>
<tr><th colspan="2" class="blank"><input type="submit" value="Connexion" /></th></tr>
<tr><td colspan="2" class="rounded"><a href="?page=register">Cr&eacute;er un compte</a></td></tr>
</table>
</form>

View File

@@ -0,0 +1,278 @@
<?php
/* Displays the qcm form */
//Edition or creation selector
$bEdition = false;
$iNbQuestions = 0;
$asDisplayQuestions = $asAnswersCurrentState = array();
$sAdditionalBoxesScript = 'addQuestion();';
//get The Qcm in the database
if(isset($_GET['qcm']))
{
$iQcmId = $_GET['qcm'];
/*
if($_GET['copyQcm'])
{
$oQcm = new qcm($iQcmId);
$iQcmId = $oQcm->cloneQcm()->iQcmId;
}
*/
$bEdition=true;
$asQcm = getQcm($iQcmId);
$sQcmName = isset($asQcm[QCM_TABLE])?$asQcm[QCM_TABLE]:'';
$sQcmAuthorId = isset($asQcm['id_'.USER_TABLE])?$asQcm['id_'.USER_TABLE]:'';
$asQuestions = isset($asQcm[QUESTION_TABLE])?$asQcm[QUESTION_TABLE]:array();
foreach($asQuestions as $iQuestionId => $asAnswers)
{
$asDisplayAnswers = $asDisplayRightAnswers = array();
$iNbAnswers = 0;
$iNbQuestions++;
$sQuestion = $asAnswers[QUESTION_TABLE];
//image
$sImageName = $asAnswers['image'];
if($sImageName!='')
{
$sImage = getImage(IMAGE_FOLDER.$sImageName, '', '', '', array('id'=>'question'.$iQuestionId.'imageSrc'));
$sXButton = '<a href="#" id="question'.$iQuestionId.'ImageDelete" class="deleteImage" title="Supprimer cette image" onclick="deleteImage(\'question'.$iQuestionId.'\');return false;">X</a>';
$sImage = $sXButton.getHtml($sImage, 'div', 'qcmReader', '', array('id'=>'question'.$iQuestionId.'imageDiv'));
$sImageDiv = getInputHtml('Image', array($sImage, 'Remplacer par une nouvelle image', '', $iQuestionId));
}
else
{
$sImageDiv = getInputHtml('Image', array('', ADD_IMAGE_TEXT, '', $iQuestionId));
}
if(array_key_exists(ANSWER_TABLE, $asAnswers) && count($asAnswers[ANSWER_TABLE])>0)
{
foreach($asAnswers[ANSWER_TABLE] as $iAnswerId => $asAnswer)
{
$iNbAnswers++;
$asDisplayAnswers[$iAnswerId] = getInputHtml('Answer', array($iQuestionId, $iAnswerId, '', $asAnswer[ANSWER_TABLE]));
$asDisplayRightAnswers[$iAnswerId] = getInputHtml('RightAnswer', array($iQuestionId, $iAnswerId, '', $asAnswer[RIGHT_ANSWER]?' CHECKED':''));
}
}
$asAnswersCurrentState[] = getInputHtml('CurrentAnswer', array($iQuestionId, $iNbAnswers));
$asDisplayQuestions[] = getInputHtml('Question', array($iNbQuestions, '', $iQuestionId, $sQuestion, implode($asDisplayAnswers), implode($asDisplayRightAnswers), $sImageDiv));
$sAdditionalBoxesScript .= 'addAnswer('.$iQuestionId.');';
}
//check Qcm
if(!checkOrigin('qcmCreator'))
{
checkQcm($iQcmId);
}
}
?>
<script type="text/javascript">
temp = new Array();
function save(formId)
{
for(var i in document.forms[formId].elements)
{
var elem = document.forms[formId].elements[i];
if(elem.type == 'text' || elem.type == 'textarea')
{
temp[elem.name] = elem.value;
}
else if(elem.type == 'checkbox')
{
temp[elem.name] = elem.checked;
}
}
}
function load(formId)
{
for(var i in document.forms[formId].elements)
{
var elem = document.forms[formId].elements[i];
if(temp[elem.name])
{
if(elem.type == 'checkbox')
{
document.forms[formId].elements[elem.name].checked = temp[elem.name];
}
else
{
document.forms[formId].elements[elem.name].value = temp[elem.name];
}
}
}
}
function addQuestion(idRequestingQuestion)
{
var questionId = parseInt(document.forms['temp'].elements['currentquestion'].value);
if(!idRequestingQuestion || idRequestingQuestion==questionId)
{
save('qcmCreator');
questionId++;
newQuestion = '<?php echo getInputHtml('Question'); ?>';
newQuestion = newQuestion.replace(/\#questionId\#/g, questionId);
newQuestion = newQuestion.replace(/\#answerId\#/g, 1);
document.getElementById("questionpanel").innerHTML += newQuestion;
document.getElementById("temp").innerHTML += '<?php echo getInputHtml('CurrentAnswer'); ?>';
document.forms['temp'].elements['currentquestion'].value = questionId;
load('qcmCreator');
if(idRequestingQuestion)
{
document.forms['qcmCreator'].elements['newquestion'+(questionId-1)].focus();
}
}
}
function addAnswer(questionId, idRequestingAnswer)
{
var answerId = parseInt(document.forms['temp'].elements["question"+questionId+"currentanswer"].value);
if(!idRequestingAnswer || idRequestingAnswer==answerId)
{
save('qcmCreator');
answerId++;
newAnswer = '<?php echo getInputHtml('Answer'); ?>';
newAnswer = newAnswer.replace(/\#answerId\#/g, answerId);
newAnswer = newAnswer.replace(/\#questionId\#/g, questionId);
newRightAnswer = '<?php echo getInputHtml('RightAnswer'); ?>';
newRightAnswer = newRightAnswer.replace(/\#answerId\#/g, answerId);
newRightAnswer = newRightAnswer.replace(/\#questionId\#/g, questionId);
document.getElementById("question"+questionId+"answerpanel").innerHTML += newAnswer;
document.getElementById("question"+questionId+"rightanswerpanel").innerHTML += newRightAnswer;
document.forms['temp'].elements["question"+questionId+"currentanswer"].value = answerId;
load('qcmCreator');
if(idRequestingAnswer)
{
document.forms['qcmCreator'].elements['newquestion'+questionId+'answer'+(answerId-1)].focus();
}
}
}
function setDeletedData(id, forceSet)
{
var deletedData = document.forms['qcmCreator'].elements['deletedData'].value;
var index = deletedData.indexOf(id);
if(index === -1 && (!forceSet || forceSet=='y'))
{
deletedData += id+',';
}
else if(index !== -1 && (!forceSet || forceSet=='n'))
{
deletedData = deletedData.replace(new RegExp(id+',', 'i'), '');
}
document.forms['qcmCreator'].elements['deletedData'].value = deletedData;
}
function deleteQuestion(id)
{
var action = disableBox('qcmCreator', id);
disableBox('qcmCreator', id+'image', action);
disableImage(id, action);
setDeletedData(id);
for(var i in document.forms['qcmCreator'].elements)
{
var elem = document.forms['qcmCreator'].elements[i];
if((elem.type == 'text') && elem.id.indexOf(id) !== -1)
{
deleteAnswer(elem.id, action);
}
}
}
function deleteAnswer(id, forceSet)
{
var action = disableBox('qcmCreator', id, forceSet);
setDeletedData(id, forceSet);
var index = id.length-1;
var rightAnswerId = '';
while(id.charAt(index).toString().search(/^[0-9]+$/) == 0)
{
rightAnswerId += id.charAt(index);
index--;
}
disableBox('qcmCreator', id+'<?php echo RIGHT_ANSWER; ?>'+rightAnswerId, forceSet);
//enable related question
var relatedQuestion = id.substring(0, id.indexOf('<?php echo ANSWER_TABLE; ?>'));
if(!document.forms['qcmCreator'].elements[relatedQuestion])
{
relatedQuestion = relatedQuestion.substring(3);
}
if(action == 'n' && document.forms['qcmCreator'].elements[relatedQuestion].disabled)
{
deleteQuestion(relatedQuestion);
}
}
function deleteImage(id, forceSet)
{
action = disableImage(id, forceSet);
setDeletedData(id+'image');
if(action == 'n' && document.forms['qcmCreator'].elements[id].disabled)
{
deleteQuestion(id);
}
}
function disableImage(id, forceSet)
{
//image
var action = disableDiv(id+"imageDiv", forceSet);
document.getElementById(id+"imageSrc").style.opacity = (action=='y')?0.5:1;
hover(id+'ImageDelete', action);
//input
disableBox("qcmCreator", id+"image", action);
disableDiv(id+"imageText", forceSet);
return action;
}
</script>
<form action="?page=qcmProcess" method="post" name="qcmCreator" enctype="multipart/form-data">
<table class="maxWidth" id="questionpanel">
<tr>
<td colspan="3" class="rounded"><p class="important">Nom du QCM : <input type="text" name="qcm" value="<?php echo $bEdition?$sQcmName:''; ?>" /></p></td>
</tr>
<tr><td colspan="3" class="blank">&nbsp;</td></tr>
<tr>
<th width="50%" class="top-left-rounded">Libell&eacute; de la question</th>
<th width="30%">R&eacute;ponses possibles</th>
<th width="10%" class="top-right-rounded">Bonne(s) r&eacute;ponse(s)</th>
</tr>
<?php echo implode($asDisplayQuestions); ?>
</table>
<table class="maxWidth joinedTable">
<tr>
<th colspan="3" class="bottom-left-rounded bottom-right-rounded">une fois les questions compl&eacute;t&eacute;es, cliquez sur le bouton 'Cr&eacute;er le QCM'</th>
</tr>
<tr>
<td class="blank" colspan="4">
<input type="hidden" name="user" value="<?php echo $_SESSION['user']; ?>" />
<input type="hidden" name="author" value="<?php echo $bEdition?$sQcmAuthorId:$_SESSION['user']; ?>" />
<input type="hidden" name="id_<?php echo QCM_TABLE; ?>" value="<?php echo $bEdition?$iQcmId:'new'; ?>" />
<input type="hidden" name="deletedData" id="deletedData" value="">
<input type="button" name="annuler" onclick="goTo('?page=frontal');" value="Annuler">
&nbsp;
<input type="submit" value="<?php echo $bEdition?"Modifier le QCM":"Cr&eacute;er le QCM"; ?>" />
</td>
</tr>
</table>
</form>
<form id="temp" name="temp" style="display:none;">
<input type="hidden" name="currentquestion" id="currentquestion" value="<?php echo getMaxIncrementedValue(QUESTION_TABLE); ?>">
<?php echo implode($asAnswersCurrentState); ?>
</form>
<script type="text/javascript">
<?php echo $sAdditionalBoxesScript; ?>
</script>

View File

@@ -0,0 +1,121 @@
<?php
/* Check the questions and answers, and add the QCM into database */
if(!checkOrigin('qcmCreator') || !isset($_POST['user']))
{
relocate(getError(array('Processus incorrect', 'Retour forc&eacute; &agrave; l\'accueil')));
}
else
{
//reconnection in case of session time out
setSession($_POST['user']);
$sQcmName = ($_POST[QCM_TABLE] != '')?$_POST[QCM_TABLE]:DEFAULT_QCM_NAME;
//Add / update the Qcm and unvalidate the qcm
$bNewQcm = ($_POST['id_'.QCM_TABLE]=='new');
$asData = array('id_user'=>$_POST['author'], QCM_TABLE=>$sQcmName);
$iQcmId = $bNewQcm?insertRow(QCM_TABLE, $asData):updateRow(QCM_TABLE, $_POST['id_'.QCM_TABLE], $asData);
setQcmValidity($iQcmId, false);
//feed
$iRefFeedId = addFeed($bNewQcm?'CREATE':'MODIFY', $iQcmId, QCM_TABLE, $sQcmName);
//Add the QCM questions, images & answers to the database
$asQuestionIds = $asFeedIds = array();
foreach($_POST as $sKey => $sValue)
{
$asDataKeys = parseQuestion($sKey);
if($asDataKeys && $sValue!=DEFAULT_QUESTION_INPUT && $sValue!=DEFAULT_ANSWER_INPUT)
{
$bNew = (strpos($sKey, 'new') !== false);
$iQuestionId = $asDataKeys[QUESTION_TABLE];
switch(count($asDataKeys))
{
case 1: //Add a question + image
$asData = array($iQcmId, $sValue);
if($bNew)
{
$asQuestionIds[$iQuestionId] = insertRow(QUESTION_TABLE, $asData);
}
else
{
$asQuestionIds[$iQuestionId] = updateRow(QUESTION_TABLE, $iQuestionId, $asData);
}
$asFeedIds[$iQuestionId] = addFeed($bNew?'CREATE':'MODIFY', $iRefFeedId, QUESTION_TABLE, $sValue, '', $iRefFeedId);
//image
$sImageName = $_FILES[$sKey.'image']['name'];
if($sImageName!='')
{
$oError = uploadFile($_FILES[$sKey.'image'], IMAGE_FOLDER, array('jpg', 'jpeg', 'bmp', 'png'));
if(is_string($oError))
{
addMessage($oError);
}
else
{
$sImageNewName = 'qcm'.$iQcmId.'question'.$asQuestionIds[$iQuestionId].'v'.date('dmYHis');
resizeRenameImage(IMAGE_FOLDER.$sImageName, $sImageNewName);
$bNewImage = (selectValue(QUESTION_TABLE, 'image', $asQuestionIds[$iQuestionId])=='');
updateRow(QUESTION_TABLE, $asQuestionIds[$iQuestionId], array('image'=>$sImageNewName.'.'.getExtension($sImageName)));
addFeed($bNewImage?'CREATE':'MODIFY', $asFeedIds[$iQuestionId], 'image', $sImageNewName, '', $iRefFeedId);
}
}
break;
case 2: //Add an answer
//Add a question (empty) in the case of an answer without linked questions
if(!array_key_exists($iQuestionId, $asQuestionIds))
{
$asQuestionIds[$iQuestionId] = insertRow(QUESTION_TABLE, array($iQcmId, ''));
}
$bRightAnswer = isset($_POST[$sKey.RIGHT_ANSWER.$asDataKeys[ANSWER_TABLE]])?'1':'0';
$asData = array($asQuestionIds[$iQuestionId], $iQcmId, $sValue, $bRightAnswer);
if($bNew)
{
insertRow(ANSWER_TABLE, $asData);
}
else
{
updateRow(ANSWER_TABLE, $asDataKeys[ANSWER_TABLE], $asData);
}
addFeed($bNew?'CREATE':'MODIFY', $asFeedIds[$iQuestionId], ANSWER_TABLE, $sValue, '', $iRefFeedId);
break;
}
}
}
//delete questions / images / answers
foreach(array_filter(explode(',', $_POST['deletedData'])) as $sDeletedItem)
{
$asDataKeys = parseQuestion($sDeletedItem);
if(strpos($sDeletedItem, 'new') === false && $asDataKeys!=false && count($asDataKeys)>0)
{
if(strpos($sDeletedItem, 'image')!==false)
{
$sImagePath = IMAGE_FOLDER.selectValue(QUESTION_TABLE, 'image', $asDataKeys[QUESTION_TABLE]);
updateRow(QUESTION_TABLE, $asDataKeys[QUESTION_TABLE], array('image'=>''));
addFeed('DELETE', $asDataKeys[QUESTION_TABLE], 'image', $sImagePath, '', $iRefFeedId);
}
else
{
$sTable = (count($asDataKeys)==1)?QUESTION_TABLE:ANSWER_TABLE;
deleteRow($sTable, $asDataKeys[$sTable]);
addFeed('DELETE', $asDataKeys[$sTable], $sTable, $sImagePath, '', $iRefFeedId);
}
}
}
//Check Qcm
if(checkQcm($iQcmId))
{
setQcmValidity($iQcmId, true);
relocate(getSuccess('Modifications enregistr&eacute;es'), 'qcmReader', array('qcm'=>$iQcmId));
}
else
{
relocate('', 'qcmCreator', array('qcm'=>$iQcmId));
}
}
?>

View File

@@ -0,0 +1,60 @@
<?php
/* Displays the selected QCM and check for previous results */
if(!isset($_GET['qcm']) || !is_numeric($_GET['qcm']) || $_GET['qcm']<=0)
{
echo getError(array('Qcm inconnu', 'Qcm n&deg;'.$_GET['qcm']));
}
else
{
$iQcmId = $_GET['qcm'];
$asQcm = getQcm($iQcmId);
$sQcmName = $asQcm[QCM_TABLE];
//check if the user had already played this QCM
$bplayed = checkPreviousResults($_SESSION['user'], $iQcmId);
echo $bplayed?getWarning('Vous avez d&eacute;j&agrave; r&eacute;pondu &agrave; ce QCM. Les r&eacute;sultats ne seront pas compt&eacute;s'):'';
//display the questions
$iNbQuestions = 0;
foreach(shuffle_assoc($asQcm[QUESTION_TABLE]) as $iQuestionId => $asAnswers)
{
$asDisplayAnswers = $asDisplayRightAnswers = array();
$iNbAnswers = 0;
$iNbQuestions++;
foreach($asAnswers[ANSWER_TABLE] as $iAnswerId => $asAnswer)
{
$iNbAnswers++;
$asDisplayAnswers[$iAnswerId] = '<p class="question">'.$iNbAnswers.'. '.$asAnswer[ANSWER_TABLE].'</p>';
$asDisplayRightAnswers[$iAnswerId] = getInputHtml('RightAnswer', array($iQuestionId, $iAnswerId, '', ''));
}
$sImage = ($asAnswers['image']!='')?getHtml(getImage(IMAGE_FOLDER.$asAnswers['image']), 'div', 'qcmReader'):'';
$asDisplayQuestions[$iQuestionId] = '<tr>
<td width="10%">'.$iNbQuestions.'.</td>
<td width="60%">'.$asAnswers[QUESTION_TABLE].'<br />'.$sImage.'</td>
<td>'.implode("\n", $asDisplayAnswers).'</td>
<td>'.implode("\n", $asDisplayRightAnswers).'</td>
</tr>';
}
}
?>
<form action="?page=qcmResults" method="post">
<table class="maxWidth">
<tr>
<th colspan="4" class="top-left-rounded top-right-rounded"><p class="tresimportant"><?php echo $sQcmName; ?></p></th>
</tr>
<?php
echo implode("\n", $asDisplayQuestions);
?>
<tr>
<td colspan="4" class="bottom-left-rounded bottom-right-rounded">
<input type="hidden" name="qcm" value="<?php echo $iQcmId; ?>" />
<input type="hidden" name="user" value="<?php echo $_SESSION['user']; ?>" />
<input style="margin:10px;font-size:large;" type="submit" value="R&eacute;sultats" />
</td>
</tr>
</table>
</form>

View File

@@ -0,0 +1,81 @@
<?php
/* return user's results */
//reconnection in case of session time out
if(!checkOrigin('qcmReader', array('qcm'=>$_POST['qcm'])) || !isset($_POST['user']))
{
relocate(getError('Vous devez r&eacute;pondre &agrave; un QCM pour acc&eacute;der &agrave; &agrave; la page de r&eacute;sultats'));
}
else
{
//reconnect session
setSession($_POST['user']);
//input Qcm data
$iQcmId = $_POST['qcm'];
$asQcm = getQcm($iQcmId);
$sQcmName = $asQcm[QCM_TABLE];
//display QCM results
$iNbRightAnswers = 0;
$iNbQuestions = getNbQuestions($iQcmId);
foreach($asQcm[QUESTION_TABLE] as $iQuestionId => $asQuestion)
{
$bAnswerUserResult = true;
$asDisplayRightResults = $asDisplayUserResults = '';
$asDisplayResults[$iQuestionId] = '<tr><td>'.$asQuestion[QUESTION_TABLE].'</td>';
foreach($asQuestion[ANSWER_TABLE] as $iAnswerId => $asAnswer)
{
$bUserAnswer = isset($_POST[QUESTION_TABLE.$iQuestionId.ANSWER_TABLE.$iAnswerId.RIGHT_ANSWER.$iAnswerId]);
$bRightAnswer = ($asAnswer[RIGHT_ANSWER] == '1');
$bAnswerUserResult = ($bAnswerUserResult && $bUserAnswer==$bRightAnswer);
$asDisplayRightResults .= $asAnswer[RIGHT_ANSWER]?'<p>&bull; '.$asAnswer[ANSWER_TABLE].'</p>':'' ;
$asDisplayUserResults .= $bUserAnswer?'<p>&bull; '.$asAnswer[ANSWER_TABLE].'</p>':'' ;
}
$asDisplayResults[$iQuestionId] .= '<td class="left">'.$asDisplayRightResults.'</td><td class="left">'.$asDisplayUserResults.'</td>';
if($bAnswerUserResult)
{
$asDisplayResults[$iQuestionId] .= "<td class=\"true\">Vrai</td>";
$iNbRightAnswers++;
}
else
{
$asDisplayResults[$iQuestionId] .= "<td class=\"false\">Faux</td>";
}
$asDisplayResults[$iQuestionId] .= '</tr>';
}
//Update results table
$sUpdateResult = '';
$bplayed = checkPreviousResults($_SESSION['user'], $iQcmId);
if($bplayed)
{
$sUpdateResult = '(Votre note n\'a pas &eacute;t&eacute; enregistr&eacute;e)';
}
else
{
addResult($_SESSION['user'], $iQcmId, $iNbRightAnswers/$iNbQuestions);
addFeed('CREATE', $_SESSION['firstName'].' '.$_SESSION['lastName'], RESULT_TABLE, getTextFromId(QCM_TABLE, $iQcmId));
}
}
?>
<table>
<tr>
<th colspan="4" class="rounded"><p class="tresimportant"><?php echo $sQcmName; ?> - R&eacute;sultats</p></th>
</tr>
<tr><td class="blank"></td></tr>
<tr>
<th class="top-left-rounded" width="40%"><p>Question</p></th>
<th width="25%"><p>Bonnes r&eacute;ponses</p></th>
<th width="25%"><p>Vos r&eacute;ponses</p></th>
<th width="10%" class="top-right-rounded"><p>Votre r&eacute;sultat</p></th>
</tr>
<?php echo implode("\n", $asDisplayResults); ?>
<tr>
<td colspan="4" class="bottom-left-rounded bottom-right-rounded">
<p class="tresimportant"><?php echo ucwords($_SESSION['firstName'].' '.$_SESSION['lastName']).', votre note : '.round($iNbRightAnswers/$iNbQuestions*20, 2).'/20'; ?></p>
<p><?php echo $sUpdateResult; ?></p>
</td>
</tr>
</table>

View File

@@ -0,0 +1,36 @@
<?php
$sLogin = isset($_POST['login'])?$_POST['login']:'';
$sFirstName = isset($_POST['firstname'])?$_POST['firstname']:'';
?>
<form action="?page=logon&register=1" method="post">
<table>
<tr><th colspan="2" class="top-left-rounded top-right-rounded">Cr&eacute;ation de compte</th></tr>
<tr>
<td>Pr&eacute;nom</td>
<td><input type="text" name="firstname" value="<?php echo $sFirstName; ?>" /></td>
</tr>
<tr>
<td>Nom de famille</td>
<td><input type="text" name="login" value="<?php echo $sLogin; ?>" /></td>
</tr>
<tr>
<td>Classe</td>
<td><?php echo getClasses(); ?></td>
</tr>
<tr>
<td>Mot de passe</td>
<td><input type="password" name="pass" /></td>
</tr>
<tr>
<td class="bottom-left-rounded">Mot de passe (une nouvelle fois)</td>
<td class="bottom-right-rounded"><input type="password" name="pass2" /></td>
</tr>
<tr>
<th colspan="2" class="blank">
<input type="button" name="annuler" onclick="goTo('?page=logon');" value="Annuler">
&nbsp;&nbsp;
<input type="submit" value="S'enregistrer">
</th>
</tr>
</table>
</form>

View File

@@ -0,0 +1,226 @@
<?php
/* RSS Feed */
$bNoTemplate = true;
$asRssFeed = selectRows(array('from'=>FEED_TABLE, 'constraint'=>array('id_ref'=>'0')));
$sRssFeedUrl = cleanRss('http://'.$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME'].'?page=rss');
$asItems = array();
foreach($asRssFeed as $asRssItem)
{
$sTitle = $sDesc = '';
switch($asRssItem['action'])
{
case 'CREATE':
$sTitle .= 'Cr<43>ation ';
switch($asRssItem['type'])
{
case 'database':
$sTitle .= 'd\'une nouvelle sauvegarde';
$sDesc = 'Une nouvelle sauvegarde de la base de donn<6E>es "'.$asRssItem['source'].'" a <20>t<EFBFBD> cr<63><72>e.
Chemin : '.$asRssItem['old_value'];
break;
case QCM_TABLE:
$sTitle .= 'd\'un QCM';
$sDesc = 'Le QCM nomm<6D> "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> cr<63><72>';
break;
case QUESTION_TABLE:
$sTitle .= 'd\'une question';
$sDesc = 'La question "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> cr<63><72>';
break;
case 'image':
$sTitle .= 'd\'une image';
$sDesc = 'L\'image "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> ajout<75>';
break;
case ANSWER_TABLE:
$sTitle .= 'd\'une proposition de r<>ponse';
$sDesc = 'La proposition de r<>ponse "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> cr<63><72>';
break;
case RESULT_TABLE:
$sTitle .= 'd\'un r<>sultat de qcm';
$sDesc = 'L\'utilisateur "'.ucwords($asRssItem['source']).'" a r<>pondu au qcm "'.$asRssItem['old_value'].'"';
break;
case USER_TABLE:
$sTitle .= 'd\'un compte utilisateur';
$sDesc = 'L\'utilisateur "'.ucwords($asRssItem['old_value']).'" s\'est enregistr<74>';
break;
case CHANGELOG_TABLE:
$sTitle .= 'd\'un changelog';
$sDesc = 'La modification n<>'.$asRssItem['source'].'. "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> ajout<75>';
break;
}
break;
case 'MODIFY':
$sTitle .= 'Modification ';
switch($asRssItem['type'])
{
case USER_TABLE.'_name':
$sTitle .= 'du nom d\'un utilisateur';
$sDesc = 'l\'utilisateur "'.ucwords($asRssItem['old_value']).'" est dor<6F>navant nomm<6D> '.$asRssItem['new_value'];
break;
case USER_TABLE.'_class':
$sTitle .= 'de la classe d\'un utilisateur ';
$sDesc = 'l\'utilisateur "'.ucwords($asRssItem['source']).'" est pass<73> de la classe '.$asRssItem['old_value'].' <20> la classe '.$asRssItem['new_value'];
break;
case QCM_TABLE:
$sTitle .= 'd\'un QCM';
$sDesc = 'Le QCM nomm<6D> "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> modifi<66>';
break;
case QUESTION_TABLE:
$sTitle .= 'd\'une question';
$sDesc = 'La question "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> modifi<66>e';
break;
case 'image':
$sTitle .= 'd\'une image';
$sDesc = 'L\'image "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> modifi<66>';
break;
case ANSWER_TABLE:
$sTitle .= 'd\'une proposition de r<>ponse';
$sDesc = 'La proposition de r<>ponse "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> modif<69>';
break;
case CHANGELOG_TABLE:
$sTitle .= 'd\'un changelog';
$sDesc = 'La modification n<>'.$asRssItem['source'].'. "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> modifi<66>e.
Nouvelle modification : "'.$asRssItem['new_value'].'"';
break;
}
break;
case 'ACTIVATE':
$sTitle .= 'Activation ';
switch($asRssItem['type'])
{
case QCM_TABLE:
$sTitle .= 'd\'un qcm';
$sDesc = 'Le qcm "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> activ<69>';
break;
case CHANGELOG_TABLE:
$sTitle .= 'd\'un changelog';
$sDesc = 'La modification n<>'.$asRssItem['source'].'. "'.$asRssItem['old_value'].'" est achev<65>';
break;
}
break;
case 'DESACTIVATE':
$sTitle .= 'D<>sactivation ';
switch($asRssItem['type'])
{
case QCM_TABLE:
$sTitle .= 'd\'un qcm';
$sDesc = 'Le qcm "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> d<>sactiv<69>';
break;
case CHANGELOG_TABLE:
$sTitle .= 'd\'un changelog';
$sDesc = 'La modification n<>'.$asRssItem['source'].'. "'.$asRssItem['old_value'].'" est pass<73> en mode "non achev<65>"';
break;
}
break;
case 'DELETE':
$sTitle .= 'Suppression ';
switch($asRssItem['type'])
{
case USER_TABLE:
$sTitle .= 'd\'un utilisateur';
$sDesc = 'Le compte de l\'utilisateur "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> supprim<69>';
break;
case QCM_TABLE:
$sTitle .= 'd\'un qcm ';
$sDesc = 'Le qcm intitul<75> "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> supprim<69>';
break;
case QUESTION_TABLE:
$sTitle .= 'd\'une question';
$sDesc = 'La question "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> supprim<69>e';
break;
case 'image':
$sTitle .= 'd\'une image';
$sDesc = 'L\'image "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> supprim<69>e';
break;
case ANSWER_TABLE:
$sTitle .= 'd\'une proposition de r<>ponse';
$sDesc = 'La proposition de r<>ponse "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> supprim<69>e';
break;
case CHANGELOG_TABLE:
$sTitle .= 'd\'un changelog';
$sDesc = 'La modification n<>'.$asRssItem['source'].'. "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> abandonn<6E>';
break;
}
break;
case 'RESET':
$sTitle .= 'R<>initialisation de la base de donn<6E>es ';
$sDesc = 'La base de donn<6E>es "'.$asRssItem['source'].'" a <20>t<EFBFBD> supprim<69>e et r<>install<6C>e';
break;
case 'RESTORE':
$sTitle .= 'Restauration de la base de donn<6E>es ';
$sDesc = 'La base de donn<6E>es "'.$asRssItem['old_value'].'" a <20>t<EFBFBD> restaur<75>e';
break;
case 'UPLOAD':
$sTitle .= 'Upload d\'une base de donn<6E>es ';
$sDesc = 'La base de donn<6E>es "'.$asRssItem['old_value'].'" ';
switch($asRssItem['type'])
{
case 'file':
$sDesc .= 'a <20>t<EFBFBD> upload<61>';
break;
case 'sync':
$sDesc = 'a <20>t<EFBFBD> synchronis<69>e avec le site '.$asRssItem['source'];
break;
}
break;
case 'CONNECT':
$sTitle .= 'Connexion d\'un utilisateur';
$sDesc = 'L\'utilisateur "'.ucwords($asRssItem['old_value']).'" s\'est connect<63>';
break;
}
$sAuthor = str_replace(' ', '.', strtolower($asRssItem['author'])).'@'.DOMAIN.' ('.ucwords($asRssItem['author']).')';
if($sTitle!='' && $sDesc!='')
{
$sRssItem = getHtml(cleanRss($sTitle), 'title');
$sRssItem .= getHtml(cleanRss($sAuthor), 'author');
$sRssItem .= getHtml($sRssFeedUrl, 'link');
$sRssItem .= getHtml(cleanRss($sDesc.'.'), 'description');
$sRssItem .= getHtml(cleanRss(date('r', strtotime($asRssItem['led']))), 'pubDate');
$sRssItem .= getHtml(cleanRss($sRssFeedUrl.'&id='.$asRssItem['id_'.FEED_TABLE]), 'guid', '', '', array('isPermaLink'=>'true'));
$asItems[] = getHtml($sRssItem, 'item');
}
}
function fillFeed($sText)
{
$asColumnNames = getTableColumnNames(FEED_TABLE);
foreach($asColumnNames as $sColumnName)
{
$sText = str_replace('#'.$sColumnName.'#', $_POST[$sColumnName], $sText);
}
}
function getFeedTitle($sAction, $sType)
{
}
function getFeedDesc($sAction, $sType)
{
}
//last feed update
$sPubDate = date('r', strtotime(getUniqueValue("SELECT /* ".basename(__FILE__)." ".__LINE__." */ MAX(led) FROM ".FEED_TABLE)));
//feed header
$sRssFeed = '<?xml version="1.0" encoding="ISO-8859-1" ?>';
$sRssFeedHeader = getHtml('QcmMaker Rss Feed', 'title');
$sRssFeedHeader .= getHtml($sRssFeedUrl, 'link');
$sRssFeedHeader .= getHtml('Copyright (C) '.date('Y').' Fran<61>ois Lutran', 'copyright');
$sRssFeedHeader .= getHtml('Users Activity', 'description');
$sRssFeedHeader .= getHtml('', 'atom:link', '', '', array('href'=>$sRssFeedUrl, 'rel'=>'self', 'type'=>'application/atom+xml'), true);
$sRssFeedHeader .= getHtml('fr', 'language');
$sRssFeedHeader .= getHtml(cleanRss($sPubDate), 'pubDate');
$sRssFeedHeader .= getHtml('qcmMaker rss Feed generator', 'generator');
$sRssFeedHeader .= getHtml(cleanRss(FEEDBACK_MAIL.' (Webmaster)'), 'webMaster');
//feed items
$sRssFeed .= getHtml(getHtml($sRssFeedHeader.implode("\n", $asItems), 'channel'), 'rss', '', '', array('version'=>'2.0', 'xmlns:atom'=>'http://www.w3.org/2005/Atom'));
echo $sRssFeed;
?>

View File

@@ -0,0 +1,76 @@
<?php
/* Search database for keywords */
//security check
if(!function_exists('checkOrigin') || !$bAdmin)
{
require_once 'config.php';
relocate(getError('Acc&egrave;s interdit'));
}
if(!isset($_REQUEST['keywords']))
{
relocate(getError('Cherchez au moins un mot'));
}
else
{
$asKeyWords = explode('+', $_REQUEST['keywords']);
$sHtmlKeyWords = getHtml($asKeyWords, 'em', '', '', array(), false, ', ');
foreach($asKeyWords as $sKeyWord)
{
foreach(getTables() as $sTableName)
{
$asColumnConstraint = "";
foreach(getTableColumnNames($sTableName) as $sColumnName)
{
if(strpos($sColumnName, 'id_')===false && $sColumnName != 'pass')
{
if($asColumnConstraint != "")
{
$asColumnConstraint .= "OR";
}
$asColumnConstraint .= " $sColumnName LIKE '%$sKeyWord%' ";
}
}
$sQuery = "SELECT /* ".basename(__FILE__)." ".__LINE__." */ *
FROM $sTableName
WHERE $asColumnConstraint";
$asTableResult = getArrayQuery($sQuery);
foreach($asTableResult as $asRow)
{
$sRowId = $sTableName.$asRow['id_'.$sTableName];
$asResult[$sRowId] = $asRow;
$asRank[$sRowId] = isset($asRank[$sRowId])?($asRank[$sRowId]+1):1;
}
}
}
if(isset($asRank))
{
arsort($asRank);
foreach($asRank as $sRowId=>$iRank)
{
$asColumnDisplayed = array_filter(array_keys($asResult[$sRowId]), 'filterTable');
$asResultRow = array_intersect_key($asResult[$sRowId], array_flip($asColumnDisplayed));
$sColumnNames = getHtml(ucwords(str_replace('_', ' ', getHtml(array_keys($asResultRow), 'th'))), 'tr');
$sHtmlRank = getHtml('Rang : '.$iRank, 'p', '', 'font-size:small;margin-top:10px;margin-bottom:0;');
$asSearchResults[] = $sHtmlRank.getHtml($sColumnNames.getHtml(getHtml($asResultRow, 'td'), 'tr'), 'table', 'maxWidth');
}
}
else
{
relocate(getWarning(array('Aucun r<>sultat', 'Recherche effectu<74>e sur les mots : '.$sHtmlKeyWords)));
}
}
function filterTable($sColumnName)
{
return (!is_numeric($sColumnName) && $sColumnName!='pass');
}
?>
<p>Mots recherch<63>s : <?php echo $sHtmlKeyWords; ?></p>
<p>R<>sultat<?php echo (count($asSearchResults)>1)?'s':''; ?> de la recherche :</p>
<?php echo implode($asSearchResults); ?>

View File

@@ -0,0 +1,34 @@
<?php
/*------------------------Remplacer les valeurs ci-dessous par vos parametres-----------------------*/
//remplacez par l'adresse de votre server
@define('DB_SERVER', 'localhost');
//remplacez par votre login mysql
@define('DB_LOGIN', 'root');
//remplacez par votre mot de passe mysql
@define('DB_PASS', '0nadmin');
//remplacez par le mot de passe de votre choix
@define('ADMIN_PASS', '123456');
//remplacer par l'adresse email de votre administrateur
@define('FEEDBACK_MAIL', 'francois.lutran@gmail.com');
/*------------------Remplacer les valeurs ci-dessous par vos parametres [OPTIONNEL]-----------------*/
//Nom de la base de donn<6E>es
@define('DB_NAME', 'dbqcm');
//Nombre maximum de class pour une meme section
@define('MAX_CLASS', 8);
//Premiere section (6 pour 6eme)
@define('MIN_GRADE', 6);
//Derniere section (3 pour 3eme)
@define('MAX_GRADE', 3);
?>

View File

@@ -0,0 +1,44 @@
<?php
/* displays user's grades */
$iOutOf = isset($_POST['outofvalue'])?$_POST['outofvalue']:20;
$aiConstraints = array('grade' => $_SESSION['grade'], 'class' => $_SESSION['class'], USER_TABLE => $_SESSION['user']);
$asResults = getResults($aiConstraints);
if(!$asResults)
{
$asDisplay = array('<tr><td colspan="3"><p class="noinfo">Aucune note.Vous avez r&eacute;pondu &agrave; aucun QCM</p></td></tr>', );
$sDisplayAverage = '<th colspan="3" class="bottom-left-rounded bottom-right-rounded">Moyenne : Aucune donn&eacute;e disponible</th>';
}
else
{
$asResults = $asResults[$_SESSION['grade']][$_SESSION['class']][$_SESSION['user']];
$iUserGlobalAvg = getResultsAverage($iOutOf, $aiConstraints);
$aiConstraints[USER_TABLE] = false;
$aiConstraints[QCM_TABLE] = array_keys($asResults);
$iClassGlobalAvg = getResultsAverage($iOutOf, $aiConstraints);
foreach($asResults as $iQcmId => $asQcmResultInfo)
{
$aiConstraints[QCM_TABLE] = $iQcmId;
$iClassAvg = getResultsAverage($iOutOf, $aiConstraints);
$asDisplay[$iQcmId] = '<tr><td>'.$asQcmResultInfo[QCM_TABLE].'</td><td>'.roundMark($iOutOf, $asQcmResultInfo[RESULT_TABLE]).' / '.$iOutOf.'</td><td>'.$iClassAvg.' / '.$iOutOf.'</td></tr>';
}
$sDisplayAverage = '<th colspan="2" class="bottom-left-rounded">Moyenne : '.$iUserGlobalAvg.' / '.$iOutOf.'</th><th class="bottom-right-rounded">Moyenne de la classe : '.$iClassGlobalAvg.' / '.$iOutOf.'</th>';
}
?>
<table class="maxWidth">
<tr>
<td colspan="3" class="rounded"><p class="tresimportant">Les notes de <?php echo $_SESSION['firstName']." ".$_SESSION['lastName']; ?></p></td>
</tr>
<tr><td colspan="3" class="blank"></td></tr>
<tr>
<th class="top-left-rounded">QCM</th>
<th><?php echo getOutOfForm($iOutOf, false, '?page=stats', 'Note de '.$_SESSION['firstName'].' '.$_SESSION['lastName'].' :'); ?></th>
<th class="top-right-rounded">Moyenne de la classe</th>
</tr>
<?php echo implode("\n", $asDisplay); ?>
<tr>
<?php echo $sDisplayAverage; ?>
</tr>
</table>

View File

@@ -0,0 +1,135 @@
<?php
/* Display students grades, by QCM and classes. Add a download button (csv format) */
//TODO lorsque le mask sera installé, remplir la page et le csv en meme temps
//Results
$asResultsDisplay = '';
$asExportCsv = array();
$iClass= 0;
if(isset($_POST['qcm']))
{
$bDisableExport = false;
$iOutOf = $_POST['outofvalue'];
list($iGrade, $iClass) = explode(GRADE_CLASS_SEPARATOR, $_POST['gradeClass']);
$asResultsConstraints = array();
$asOutputOrder = array('id_'.QCM_TABLE, 'grade', 'class', 'id_'.USER_TABLE);
$asConstraintColumns = array('grade'=>$iGrade, 'class'=>$iClass, USER_TABLE=>$_POST[USER_TABLE], QCM_TABLE=>$_POST[QCM_TABLE], 'outputOrder'=>$asOutputOrder);
foreach($asConstraintColumns as $sConstraintColumn=>$sConstraintValue)
{
if($sConstraintValue > 0)
{
$asResultsConstraints[$sConstraintColumn] = $sConstraintValue;
}
}
$asResults = getResults($asResultsConstraints);
//Display results & building export file
if(!$asResults)
{
$asResultsDisplay = getWarning('Aucune note disponible');
}
else
{
foreach($asResults as $iQcmId=>$asQcmInfo)
{
$sQcmName = getQcmName($iQcmId);
$asResultsDisplay .= '<table class="maxWidth stats rounded"><tr><td colspan="3" class="rounded"><p class="tresimportant">QCM <em>"'.$sQcmName.'"</em></p></td></tr>';
$asExportCsv[] = array('QCM', $sQcmName);
foreach($asQcmInfo as $iGradeId=>$asGradeInfo)
{
foreach($asGradeInfo as $iClassId=>$asClassInfo)
{
$sClass = $iGradeId.GRADE_CLASS_SEPARATOR.$iClassId;
$asResultsDisplay .= '<tr><td colspan="3" class="blank"></td></tr>';
$asResultsDisplay .= '<tr><td colspan="3" class="top-left-rounded top-right-rounded"><p class="important">'.$sClass.'</p></td></tr>';
$asExportCsv[] = array('');
$asExportCsv[] = array('Classe', $sClass, 'Note sur', $iOutOf);
$dClassAvgMark = getResultsAverage($iOutOf, array('grade' => $iGradeId, 'class' => $iClassId, QCM_TABLE=>$iQcmId));
$asResultsDisplay .= '<tr>
<th>Eleve</th>
<th>Note</th>
<th>Moyenne</th>
</tr>';
$asExportCsv[] = array('Eleve', 'Note', 'Moyenne de l\'eleve');
foreach($asClassInfo as $iUserId=>$asUserInfo)
{
$dUserAvgMark = getResultsAverage($iOutOf, array('grade' => $iGradeId, 'class' => $iClassId, USER_TABLE=>$iUserId, QCM_TABLE=>array_keys($asResults)));
$sUserLastName = ucwords($asUserInfo[USER_TABLE.'_last_name']);
$sUserFirstName = ucwords($asUserInfo[USER_TABLE.'_first_name']);
$sUserName = '<strong>'.$sUserLastName.'</strong> '.$sUserFirstName;
$asResultsDisplay .= '<tr>
<td style="text-align:left;"><strong>'.$sUserLastName.'</strong> '.$sUserFirstName.'</td>
<td>'.roundMark($iOutOf, $asUserInfo[RESULT_TABLE]).' / '.$iOutOf.'</td>
<td>'.$dUserAvgMark.' / '.$iOutOf.'</td>
</tr>';
$asExportCsv[] = array($sUserLastName.' '.$sUserFirstName, roundMark($iOutOf, $asUserInfo[RESULT_TABLE]), $dUserAvgMark);
}
$asResultsDisplay .= '<tr><td colspan="3" class="bottom-left-rounded bottom-right-rounded">Moyenne de la '.$sClass.' : '.$dClassAvgMark.' / '.$iOutOf.'</td></tr>';
$asExportCsv[] = array('Moyenne de la '.$sClass, $dClassAvgMark);
}
}
$asResultsDisplay .= '</table><a href="#top" class="toTheTop rounded">Haut de page</a>';
$asExportCsv[] = array('');
}
}
}
else
{
$bDisableExport = true;
}
//QCM selection
$asQcms = getListe(array( 'select'=>array(getId(QCM_TABLE), QCM_TABLE),
'from'=>QCM_TABLE,
'orderBy'=>QCM_TABLE));
$sSelectQcm = getSelect($asQcms, 'id_'.QCM_TABLE, QCM_TABLE, array(0=>'Tous'), isset($_POST['qcm'])?$_POST['qcm']:'');
//Classes selection
$asClasses = getListe(array('select'=>array( "CONCAT(grade, '".GRADE_CLASS_SEPARATOR."', class) AS gradeClass", 'grade', 'class'),
'from'=>USER_TABLE,
'constraint'=>"admin=0",
'groupBy' => 'gradeClass',
'orderBy'=>array('grade', 'class')));
$sSelectClasses = getSelect($asClasses, 'gradeClass', '', array('0'.GRADE_CLASS_SEPARATOR.'0'=>'Toutes'), isset($_POST['gradeClass'])?$_POST['gradeClass']:'');
//Students selection
$asStudents = getListe(array( 'select'=>array(getId(USER_TABLE), "CONCAT(user_last_name, ' ', user_first_name) AS name"),
'from'=>USER_TABLE,
'constraint'=>"admin=0",
'orderBy'=>'user_last_name'));
$sSelectStudents = getSelect($asStudents, 'id_'.USER_TABLE, 'name', array(0=>'Tous'), isset($_POST['user'])?$_POST['user']:'');
$sSelectOutOf = getOutOfForm(isset($_POST['outofvalue'])?$_POST['outofvalue']:20);
//pre($_POST);
//<select multiple="multiple" name="test" ><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option></select>
?>
<p>Choisissez l'affichage :</p>
<form method="post" action="?page=statsAdmin" name="stats">
<table class="maxWidth">
<tr>
<th class="top-left-rounded">QCM</th>
<th>Classe</th>
<th>&Eacute;l&egrave;ve</th>
<th>D&eacute;nominateur</th>
<th class="top-right-rounded">Validation</th>
</tr>
<tr>
<td class="bottom-left-rounded"><?php echo $sSelectQcm; ?></td>
<td><?php echo $sSelectClasses; ?></td>
<td><?php echo $sSelectStudents; ?></td>
<td><?php echo $sSelectOutOf; ?></td>
<td class="bottom-right-rounded"><input type="submit" value="Ok" /></td>
</tr>
<tr><td colspan="5" class="blank"><input type="button"<?php echo $bDisableExport?' disabled':''; ?> value="T&eacute;l&eacute;charger ces notes" onclick="document.forms['getCsv'].submit();" /></td></tr>
</table>
<?php echo $asResultsDisplay; ?>
<br /><br />
</form>
<form action="?page=download" method="post" name="getCsv">
<input type="hidden" name="generate" value="1" />
<input type="hidden" name="file" value="<?php echo 'notes'.($iClass>0?$_POST['gradeClass']:''); ?>" />
<input type="hidden" name="content" value="<?php echo urlencode(serialize($asExportCsv)); ?>" />
</form>

View File

@@ -0,0 +1,506 @@
@CHARSET "ISO-8859-1";
/* Global */
*:focus {
outline:none;
}
body {
margin:auto;
padding:0;
width:1024px;
min-width:1024px;
background-color:#CCC;
font-family: Verdana, Geneva, sans-serif;
font-size: medium;
font-style: normal;
font-weight: normal;
text-align: left;
}
/* Structure */
#header {
margin:50px auto 80px auto;
text-align:center;
background-color:#FFFFFF;
padding:10px;
width:500px;
border:2px solid #000000;
}
#topMenu {
margin-bottom:5px;
text-align:center;
}
#main {
padding:10px;
border:2px solid #000000;
background-color:#FFFFFF;
}
#info {
margin-bottom:10px;
}
#content {
clear:both;
}
#footer {
padding:5px 10px 50px 10px;
}
.layer {
position:fixed;
top:0;
left:0;
width:100%;
height:100%;
background-color:white;
opacity:0.8;
}
.inputBox {
width:500px;
}
.preload {
display:none;
}
.center {
margin:4px auto;
}
.no-margin {
margin:0;
}
.qcmReader, .qcmReaderDisabled {
margin:10px auto;
padding:15px;
width:90%;
background-color:#FFFFFF;
border:1px solid #006;
border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px;
}
.rounded {
border-width:1px;
border-style:solid;
border-radius:10px; -moz-border-radius:10px; -webkit-border-radius:10px;
}
.top-left-rounded {
border-radius:10px 0 0 0; -moz-border-radius-topleft: 10px; -webkit-border-top-left-radius: 10px;
}
.top-right-rounded {
border-radius:0 10px 0 0; -moz-border-radius-topright: 10px; -webkit-border-top-right-radius: 10px;
}
.bottom-right-rounded {
border-radius:0 0 10px 0; -moz-border-radius-bottomright: 10px; -webkit-border-bottom-right-radius: 10px;
}
.bottom-left-rounded {
border-radius:0 0 0 10px; -moz-border-radius-bottomleft: 10px; -webkit-border-bottom-left-radius: 10px;
}
.bottom-rounded {
border-radius:0 0 10px 10px;
-moz-border-radius-bottomleft: 10px; -webkit-border-bottom-left-radius: 10px;
-moz-border-radius-bottomright: 10px; -webkit-border-bottom-right-radius: 10px;
}
hr.separator {
margin:3px;
height:33px;
border:none;
background:none;
color:#FFFFFF;
}
/* Table */
table {
margin:auto;
border-spacing:2px;
}
table.maxWidth, #info table {
width:100%;
}
table.joinedTable {
margin-top:-2px;
}
table.stats {
background-color: #F5F5FF;
margin-top:50px;
border:1px solid #000000;
}
table tr {
text-align:center;
font-size:small;
}
table tr th {
border:1px solid #006;
text-align:center;
background-color:#006;
color:#FFFFFF;
font-size:medium;
}
table tr td {
border:1px solid #006;
background-color:#D5FFFF;
padding:5px;
}
table tr td.qcmSelection {
color:#006;
cursor:pointer;
text-align:left;
padding-left:50px;
font-weight:bold;
background:#D5FFFF url(images/qcm_selection.gif) 20px 50% no-repeat;
}
table tr td.qcmSelection:hover, table tr td.qcmSelection:active {
color:#000000;
border-color:#000000;
background:#d5ffd7 url(images/qcm_selection_hover.gif) 20px 50% no-repeat;
}
table tr td.qcmSelection:active {
background-image:url(images/qcm_selection_active.gif);
}
table tr td.left {
text-align:left;
padding-left:10px;
}
table tr td.true{
font-weight:bold;
background-color:#0F0;
}
table tr td.false{
font-weight:bold;
background-color:#F00;
color:#FFFFFF;
}
.green {
background-color:#d5ffd7;
}
.blank {
background-color:transparent;
border:none;
padding-top:10px;
padding-bottom:10px;
}
/* Form */
input, textarea {
margin:auto;
border:1px solid #006;
padding:2px 5px;
border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px;
}
input:disabled, textarea:disabled, textarea.disabled, .qcmReaderDisabled {
border-color:#aca899;
background-color:#D5FFFF;
color:#aca899;
}
input.nude, select.nude {
border:none;
background:none;
}
input[type=checkbox], input[type=checkbox]:disabled {
border:none;
}
input[type=button], input[type=submit] {
background:#FFFFFF url(images/button_gradient.gif) 0 100% repeat-x;
font-weight:bold;
color:#006;
}
input[type=button]:hover, input[type=submit]:hover {
background-image:url(images/button_gradient_hover.gif);
background-position:0 0;
}
input[type=button]:active, input[type=submit]:active {
background-color:#006;
background-image:none;
color:#FFFFFF;
}
input[type=button]:disabled, input[type=submit]:disabled {
background-image:none;
color:#aca899;
}
input[type="file"] {
border:1px solid #006;
}
.centered {
margin-top:4px;
}
textarea {
font-family:Verdana, Geneva, sans-serif;
font-size:small;
width:90%;
margin:10px auto;
padding:5px;
}
.spaceRight {
padding-right:25px;
}
select {
border:1px solid #006;
background:white;
}
select.mergeWithTh {
background-color:#006;
border-color:#FFFFFF;
color:#FFFFFF;
font-weight:bold;
font-size:medium;
}
.answerBox {
padding:3px;
height:25px;
}
/* Text */
h3 {
font-style:italic;
color:#666;
}
h1 span.logo {
border:3px solid #000000;
padding:0 8px 2px;
background-color:#CCCCCC;
}
fieldset {
border:1px solid #000000;
background-color:#F5F5FF;
padding:10px 10px 20px 10px;
margin-top:20px;
}
legend {
padding: 1px 6px 2px;
font-size: medium;
border:1px solid #000000;
background:#FFFFFF url(images/button_gradient.gif) 0 100% repeat-x;
}
a, a:visited {
color:#006;
}
a:hover {
color:#000000;
}
a:active {
outline: none;
}
a.beta {
position:absolute;
margin-left:740px;
margin-top:-30px;
padding:10px 20px;
color:#000000;
font-size:25pt;
font-style:italic;
text-decoration:none;
background-color:#FFFFFF;
border:2px solid #000000;
}
a.beta:hover {
background-color:#000000;
color:#FFFFFF;
border-color:#FFFFFF;
}
a.top {
position:absolute;
top:0;
}
a.toTheTop {
float:right;
margin-top:5px;
padding:2px 5px 2px 30px;
background:#D5FFFF url(images/arrow.png) 5px 1px no-repeat;
font-size:small;
text-decoration:none;
border:1px solid #006;
}
a.toTheTop:hover {
background-color:#d5ffd7;
background-position:5px 0;
color:#000000;
}
a.toTheTop:active {
background-color:#006;
background-position: 5px 0;
color:#FFFFFF;
}
a.deleteQuestion, a.deleteAnswer, a.XButton, a.deleteImage {
padding:2px 5px;
border:1px solid #006;
background-color:#FFFFFF;
text-decoration:none;
font-weight:bold;
}
a.deleteQuestion, a.deleteImage {
position:absolute;
margin-top:10px;
margin-left:-22px;
border-radius:0 5px; -moz-border-radius:0 5px; -webkit-border-radius:0 5px;
}
a.deleteAnswer {
position:absolute;
margin-left:-22px;
border-radius:0 5px 5px 0; -moz-border-radius:0 5px 5px 0; -webkit-border-radius:0 5px 5px 0;
}
a.deleteImage {
margin-top:139px;
margin-right:0;
}
a.XButton {
padding:1px 3px;
color:#006;
font-size:x-small;
}
a.deleteQuestion:hover, a.deleteQuestionHover, a.deleteAnswer:hover, a.deleteAnswerHover, a.XButton:hover, a.deleteImage:hover, a.deleteImageHover {
background-color:#006;
color:#FFFFFF;
}
a.XButton:hover {
text-decoration:none;
}
a.download {
padding:5px 10px 5px 28px;
text-decoration:none;
font-weight:bold;
color:#000066;
border-color:#000066;
background:url(images/arrow_down.png) 5px center no-repeat, url(images/button_gradient.gif) left bottom repeat-x;
}
a.download:hover {
background:url(images/arrow_down.png) 5px 60% no-repeat, url(images/button_gradient_hover.gif) left top repeat-x;
}
#topMenu a {
margin-left:10px;
margin-right:10px;
padding:5px 10px;
background-color:#E5E5E5;
color:#000000;
border:1px solid #666;
border-bottom-color:#000000;
font-weight:bold;
text-decoration:none;
}
#topMenu a.current {
border-width:2px;
border-color:#000000;
border-bottom-color:#FFFFFF;
background-color:#FFFFFF;
}
#topMenu a:hover {
border-color:#000000;
border-bottom-width:2px;
border-bottom-color:#FFFFFF;
background:#FFFFFF url(images/button_gradient_hover.gif) 0 0 repeat-x;
}
#main p {
padding-left:3px;
}
#main p.center {
text-align:center;
}
#main div.error, #main div.warning, #main div.success, #main div.notice {
border:1px solid #000000;
padding:5px;
margin-top:10px;
margin-bottom:10px;
}
#main div.error {
border-color:red;
}
#main div.warning {
border-color:orange;
}
#main div.success {
border-color:#008000;
}
#main p.error, #main p.warning, #main p.success, #main p.notice {
font-size:large;
padding:0;
margin: 0;
}
#main p.error {
color:red;
font-weight:bold;
}
#main p.warning {
color:orange;
}
#main p.success {
color:#008000;
}
#main p.notice {
margin:0;
font-size:medium;
font-style:italic;
}
#main .panel p {
font-size:small;
}
#info p.pageTitle, #info p.connectedUser {
padding:1px 5px;
margin:0;
border:1px solid #000000;
font-size:medium;
}
#info p.pageTitle {
float:left;
}
#info p.connectedUser {
float:right;
}
#footer p{
text-align:center;
font-size: x-small;
margin-top:0;
}
p.code, p.keyring {
font-family:"Courier New";
overflow:auto;
}
p.keyring {
overflow:hidden;
width:964px;
}
p.question{
text-align:left;
margin:15px 0 15px 40px ;
}
p.important, ul li {
font-size:medium;
font-weight:bold;
}
p.tresimportant {
font-size:x-large;
font-weight:bold;
}
p.separator {
text-align:center;
font-weight:bold;
font-size:large;
}
ul li {
margin-top:10px;
}
ul li a {
text-decoration:none;
}
ul li a:hover {
text-decoration:underline;
}
ul li ul li {
margin:2px;
font-size:small;
font-weight:normal;
font-style:italic;
}
.noinfo{
font-style:italic;
color:#666;
margin:auto;
}
.divDisabled {
background-color:#aca899;
}
.text {
}
.textDisabled {
color:#aca899;
}
/* Image */
img {
border:none;
}

View File

@@ -0,0 +1,3 @@
a.beta {
margin-left:480px;
}

View File

@@ -0,0 +1,100 @@
<?php
/* Tests */
/* TODO to be deleted on production */
//restricted area (admin)
if(!function_exists('checkOrigin') || !$bAdmin)
{
require_once 'config.php';
relocate(getError('Acc&egrave;s interdit'));
}
//Direct Access to database
$sSqlQuery = isset($_POST['sql'])?$_POST['sql']:"";
$sResult = '';
if($sSqlQuery!="")
{
$oResult = getQuery($sSqlQuery, false);
if($oResult===false)
{
$sResult = getError(array('', mysql_error(), 'Query : '.$sSqlQuery), true);
}
elseif($oResult===true)
{
$sResult = getSuccess(array('Requ&ecirc;te envoy&eacute;e', 'Query : '.$sSqlQuery));
}
elseif(mysql_num_rows($oResult)==0)
{
$sResult = getWarning(array('Aucun r&eacute;sultat', 'Query : '.$sSqlQuery));
}
else
{
$asDisplay[0] = '<table>';
$asDisplay[2] = '';
$i=0;
while($asCurrentRow = mysql_fetch_array($oResult))
{
$asDisplay[2] .= '<tr>';
foreach($asCurrentRow as $index=>$value)
{
if(!is_numeric($index))
{
if($i==0)
{
$asTitles[] = $index;
}
$asDisplay[2] .= '<td>'.$value.'</td>';
}
}
$asDisplay[2] .= '</tr>';
$i++;
}
$asDisplay[1] = '<tr style="font-weight:bold;"><td>'.implode('</td><td>', $asTitles).'</td></tr>';
$asDisplay[3] = '</table>';
ksort($asDisplay);
$sResult = implode("\n", $asDisplay);
}
}
/*
//Other Tests
pre(selectRows(array( 'select'=>array(getId(QCM_TABLE), QCM_TABLE),
'from'=>QCM_TABLE,
'constraint'=>array('valid' => '1'),
'orderBy'=>array(QCM_TABLE=>'ASC'))), 'apres');
pre(getListe(array( 'select'=>array(getId(QCM_TABLE), QCM_TABLE),
'from'=>QCM_TABLE,
'constraint'=>"valid = 1",
'orderBy'=>QCM_TABLE)), 'avant');
pre(getListe(array('select'=>array( "CONCAT(grade, '".GRADE_CLASS_SEPARATOR."', class) AS gradeClass", 'grade', 'class'),
'from'=>USER_TABLE,
'constraint'=>"admin=0",
'groupBy' => 'gradeClass',
'orderBy'=>array('grade', 'class'))), 'avant');
$as2 = selectRows(array('select'=>array('grade', 'class'),
'from'=>USER_TABLE,
'constraint'=>array('admin'=>'0'),
'groupBy' => array('grade', 'class'),
'orderBy'=>array('grade'=>'ASC', 'class'=>'ASC')));
foreach($as2 as $s2Key=>$s2)
{
$as2[$s2Key]['gradeClass'] = $s2['grade'].GRADE_CLASS_SEPARATOR.$s2['class'];
}
pre($as2, 'apres');
*/
?>
<form method="post" style="text-align:center;margin:30px;">
<input type="text" id="sql" name="sql" size="100%" value="<?php echo $sSqlQuery; ?>" />
</form>
<?php echo $sResult; ?>
<script type="text/javascript">
setFocus('sql');
</script>

Some files were not shown because too many files have changed in this diff Show More