diff --git a/web/css/bg.gif b/web/css/bg.gif
new file mode 100644
index 0000000..4283989
Binary files /dev/null and b/web/css/bg.gif differ
diff --git a/web/css/form.css b/web/css/form.css
new file mode 100644
index 0000000..7c4d096
--- /dev/null
+++ b/web/css/form.css
@@ -0,0 +1,164 @@
+/**
+ * CSS styles for forms generated by yiic.
+ *
+ * The styles can be applied to the following form structure:
+ *
+ *
+ *
+ *
+ *
+ *
hint text
+ *
+ *
+ *
+ *
+ *
hint text
+ *
+ *
+ *
+ *
+ *
hint text
+ *
+ *
+ *
+ * The above code will render the labels and input fields in separate lines.
+ * In order to render them in the same line, please use the "wide" form as follows,
+ *
+ *
+ * ......
+ *
+ *
+ * @author Qiang Xue
+ * @link http://www.yiiframework.com/
+ * @copyright 2008-2010 Yii Software LLC
+ * @license http://www.yiiframework.com/license/
+ */
+
+div.form
+{
+}
+
+div.form input,
+div.form textarea,
+div.form select
+{
+ margin: 0.2em 0 0.5em 0;
+}
+
+div.form fieldset
+{
+ border: 1px solid #DDD;
+ padding: 10px;
+ margin: 0 0 10px 0;
+ -moz-border-radius:7px;
+}
+
+div.form label
+{
+ font-weight: bold;
+ font-size: 0.9em;
+ display: block;
+}
+
+div.form .row
+{
+ margin: 5px 0;
+}
+
+div.form .hint
+{
+ margin: 0;
+ padding: 0;
+ color: #999;
+}
+
+div.form .note
+{
+ font-style: italic;
+}
+
+div.form span.required
+{
+ color: red;
+}
+
+div.form div.error label:first-child,
+div.form label.error,
+div.form span.error
+{
+ color: #C00;
+}
+
+div.form div.error input,
+div.form div.error textarea,
+div.form div.error select,
+div.form input.error,
+div.form textarea.error,
+div.form select.error
+{
+ background: #FEE;
+ border-color: #C00;
+}
+
+div.form div.success input,
+div.form div.success textarea,
+div.form div.success select,
+div.form input.success,
+div.form textarea.success,
+div.form select.success
+{
+ background: #E6EFC2;
+ border-color: #C6D880;
+}
+
+div.form div.success label
+{
+ color: inherit;
+}
+
+div.form .errorSummary
+{
+ border: 2px solid #C00;
+ padding: 7px 7px 12px 7px;
+ margin: 0 0 20px 0;
+ background: #FEE;
+ font-size: 0.9em;
+}
+
+div.form .errorMessage
+{
+ color: red;
+ font-size: 0.9em;
+}
+
+div.form .errorSummary p
+{
+ margin: 0;
+ padding: 5px;
+}
+
+div.form .errorSummary ul
+{
+ margin: 0;
+ padding: 0 0 0 20px;
+}
+
+div.wide.form label
+{
+ float: left;
+ margin-right: 10px;
+ position: relative;
+ text-align: right;
+ width: 100px;
+}
+
+div.wide.form .row
+{
+ clear: left;
+}
+
+div.wide.form .buttons, div.wide.form .hint, div.wide.form .errorMessage
+{
+ clear: left;
+ padding-left: 110px;
+}
diff --git a/web/css/ie.css b/web/css/ie.css
new file mode 100644
index 0000000..f015399
--- /dev/null
+++ b/web/css/ie.css
@@ -0,0 +1,36 @@
+/* -----------------------------------------------------------------------
+
+
+ Blueprint CSS Framework 1.0.1
+ http://blueprintcss.org
+
+ * Copyright (c) 2007-Present. See LICENSE for more info.
+ * See README for instructions on how to use Blueprint.
+ * For credits and origins, see AUTHORS.
+ * This is a compressed file. See the sources in the 'src' directory.
+
+----------------------------------------------------------------------- */
+
+/* ie.css */
+body {text-align:center;}
+.container {text-align:left;}
+* html .column, * html .span-1, * html .span-2, * html .span-3, * html .span-4, * html .span-5, * html .span-6, * html .span-7, * html .span-8, * html .span-9, * html .span-10, * html .span-11, * html .span-12, * html .span-13, * html .span-14, * html .span-15, * html .span-16, * html .span-17, * html .span-18, * html .span-19, * html .span-20, * html .span-21, * html .span-22, * html .span-23, * html .span-24 {display:inline;overflow-x:hidden;}
+* html legend {margin:0px -8px 16px 0;padding:0;}
+sup {vertical-align:text-top;}
+sub {vertical-align:text-bottom;}
+html>body p code {*white-space:normal;}
+hr {margin:-8px auto 11px;}
+img {-ms-interpolation-mode:bicubic;}
+.clearfix, .container {display:inline-block;}
+* html .clearfix, * html .container {height:1%;}
+fieldset {padding-top:0;}
+legend {margin-top:-0.2em;margin-bottom:1em;margin-left:-0.5em;}
+textarea {overflow:auto;}
+label {vertical-align:middle;position:relative;top:-0.25em;}
+input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;}
+input.text:focus, input.title:focus {border-color:#666;}
+input.text, input.title, textarea, select {margin:0.5em 0;}
+input.checkbox, input.radio {position:relative;top:.25em;}
+form.inline div, form.inline p {vertical-align:middle;}
+form.inline input.checkbox, form.inline input.radio, form.inline input.button, form.inline button {margin:0.5em 0;}
+button, input.button {position:relative;top:0.25em;}
\ No newline at end of file
diff --git a/web/css/main.css b/web/css/main.css
new file mode 100644
index 0000000..13327b8
--- /dev/null
+++ b/web/css/main.css
@@ -0,0 +1,229 @@
+body
+{
+ margin: 0;
+ padding: 0;
+ color: #555;
+ font: normal 10pt Arial,Helvetica,sans-serif;
+ background: #EFEFEF;
+}
+
+#page
+{
+ margin-top: 5px;
+ margin-bottom: 5px;
+ background: white;
+ border: 1px solid #C9E0ED;
+}
+
+#header
+{
+ margin: 0;
+ padding: 0;
+ border-top: 3px solid #C9E0ED;
+}
+
+#content
+{
+ padding: 20px;
+}
+
+#sidebar
+{
+ padding: 20px 20px 20px 0;
+}
+
+#footer
+{
+ padding: 10px;
+ margin: 10px 20px;
+ font-size: 0.8em;
+ text-align: center;
+ border-top: 1px solid #C9E0ED;
+}
+
+#logo
+{
+ padding: 10px 20px;
+ font-size: 200%;
+}
+
+#mainmenu
+{
+ background:white url(bg.gif) repeat-x left top;
+}
+
+#mainmenu ul
+{
+ padding:6px 20px 5px 20px;
+ margin:0px;
+}
+
+#mainmenu ul li
+{
+ display: inline;
+}
+
+#mainmenu ul li a
+{
+ color:#ffffff;
+ background-color:transparent;
+ font-size:12px;
+ font-weight:bold;
+ text-decoration:none;
+ padding:5px 8px;
+}
+
+#mainmenu ul li a:hover, #mainmenu ul li.active a
+{
+ color: #6399cd;
+ background-color:#EFF4FA;
+ text-decoration:none;
+}
+
+div.flash-error, div.flash-notice, div.flash-success
+{
+ padding:.8em;
+ margin-bottom:1em;
+ border:2px solid #ddd;
+}
+
+div.flash-error
+{
+ background:#FBE3E4;
+ color:#8a1f11;
+ border-color:#FBC2C4;
+}
+
+div.flash-notice
+{
+ background:#FFF6BF;
+ color:#514721;
+ border-color:#FFD324;
+}
+
+div.flash-success
+{
+ background:#E6EFC2;
+ color:#264409;
+ border-color:#C6D880;
+}
+
+div.flash-error a
+{
+ color:#8a1f11;
+}
+
+div.flash-notice a
+{
+ color:#514721;
+}
+
+div.flash-success a
+{
+ color:#264409;
+}
+
+div.form .rememberMe label
+{
+ display: inline;
+}
+
+div.view
+{
+ padding: 10px;
+ margin: 10px 0;
+ border: 1px solid #C9E0ED;
+}
+
+div.breadcrumbs
+{
+ font-size: 0.9em;
+ padding: 5px 20px;
+}
+
+div.breadcrumbs span
+{
+ font-weight: bold;
+}
+
+div.search-form
+{
+ padding: 10px;
+ margin: 10px 0;
+ background: #eee;
+}
+
+.portlet
+{
+
+}
+
+.portlet-decoration
+{
+ padding: 3px 8px;
+ background: #B7D6E7;
+ border-left: 5px solid #6FACCF;
+}
+
+.portlet-title
+{
+ font-size: 12px;
+ font-weight: bold;
+ padding: 0;
+ margin: 0;
+ color: #298dcd;
+}
+
+.portlet-content
+{
+ font-size:0.9em;
+ margin: 0 0 15px 0;
+ padding: 5px 8px;
+ background:#EFFDFF;
+}
+
+.portlet-content ul
+{
+ list-style-image:none;
+ list-style-position:outside;
+ list-style-type:none;
+ margin: 0;
+ padding: 0;
+}
+
+.portlet-content li
+{
+ padding: 2px 0 4px 0px;
+}
+
+.operations
+{
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+
+.operations li
+{
+ padding-bottom: 2px;
+}
+
+.operations li a
+{
+ font: bold 12px Arial;
+ color: #0066A4;
+ display: block;
+ padding: 2px 0 2px 8px;
+ line-height: 15px;
+ text-decoration: none;
+}
+
+.operations li a:visited
+{
+ color: #0066A4;
+}
+
+.operations li a:hover
+{
+ background: #80CFFF;
+}
\ No newline at end of file
diff --git a/web/css/print.css b/web/css/print.css
new file mode 100644
index 0000000..bd79afd
--- /dev/null
+++ b/web/css/print.css
@@ -0,0 +1,29 @@
+/* -----------------------------------------------------------------------
+
+
+ Blueprint CSS Framework 1.0.1
+ http://blueprintcss.org
+
+ * Copyright (c) 2007-Present. See LICENSE for more info.
+ * See README for instructions on how to use Blueprint.
+ * For credits and origins, see AUTHORS.
+ * This is a compressed file. See the sources in the 'src' directory.
+
+----------------------------------------------------------------------- */
+
+/* print.css */
+body {line-height:1.5;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;color:#000;background:none;font-size:10pt;}
+.container {background:none;}
+hr {background:#ccc;color:#ccc;width:100%;height:2px;margin:2em 0;padding:0;border:none;}
+hr.space {background:#fff;color:#fff;visibility:hidden;}
+h1, h2, h3, h4, h5, h6 {font-family:"Helvetica Neue", Arial, "Lucida Grande", sans-serif;}
+code {font:.9em "Courier New", Monaco, Courier, monospace;}
+a img {border:none;}
+p img.top {margin-top:0;}
+blockquote {margin:1.5em;padding:1em;font-style:italic;font-size:.9em;}
+.small {font-size:.9em;}
+.large {font-size:1.1em;}
+.quiet {color:#999;}
+.hide {display:none;}
+a:link, a:visited {background:transparent;font-weight:700;text-decoration:underline;}
+a:link:after, a:visited:after {content:" (" attr(href) ")";font-size:90%;}
\ No newline at end of file
diff --git a/web/css/screen.css b/web/css/screen.css
new file mode 100644
index 0000000..7824d07
--- /dev/null
+++ b/web/css/screen.css
@@ -0,0 +1,238 @@
+/* -----------------------------------------------------------------------
+
+
+ Blueprint CSS Framework 1.0.1
+ http://blueprintcss.org
+
+ * Copyright (c) 2007-Present. See LICENSE for more info.
+ * See README for instructions on how to use Blueprint.
+ * For credits and origins, see AUTHORS.
+ * This is a compressed file. See the sources in the 'src' directory.
+
+----------------------------------------------------------------------- */
+
+/* reset.css */
+html {margin:0;padding:0;border:0;}
+body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline;}
+article, aside, details, figcaption, figure, dialog, footer, header, hgroup, menu, nav, section {display:block;}
+body {line-height:1.5;background:white;}
+table {border-collapse:separate;border-spacing:0;}
+caption, th, td {text-align:left;font-weight:normal;float:none !important;}
+table, th, td {vertical-align:middle;}
+blockquote:before, blockquote:after, q:before, q:after {content:'';}
+blockquote, q {quotes:"" "";}
+a img {border:none;}
+:focus {outline:0;}
+
+/* typography.css */
+html {font-size:100.01%;}
+body {font-size:75%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;}
+h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;}
+h1 {font-size:2em;line-height:1;margin-bottom:0.5em;}
+h2 {font-size:1.6em;margin-bottom:0.75em;}
+h3 {font-size:1.4em;line-height:1;margin-bottom:1em;}
+h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;}
+h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;}
+h6 {font-size:1em;font-weight:bold;}
+h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;}
+p {margin:0 0 1.5em;}
+.left {float:left !important;}
+p .left {margin:1.5em 1.5em 1.5em 0;padding:0;}
+.right {float:right !important;}
+p .right {margin:1.5em 0 1.5em 1.5em;padding:0;}
+a:focus, a:hover {color:#09f;}
+a {color:#06c;text-decoration:underline;}
+blockquote {margin:1.5em;color:#666;font-style:italic;}
+strong, dfn {font-weight:bold;}
+em, dfn {font-style:italic;}
+sup, sub {line-height:0;}
+abbr, acronym {border-bottom:1px dotted #666;}
+address {margin:0 0 1.5em;font-style:italic;}
+del {color:#666;}
+pre {margin:1.5em 0;white-space:pre;}
+pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;}
+li ul, li ol {margin:0;}
+ul, ol {margin:0 1.5em 1.5em 0;padding-left:1.5em;}
+ul {list-style-type:disc;}
+ol {list-style-type:decimal;}
+dl {margin:0 0 1.5em 0;}
+dl dt {font-weight:bold;}
+dd {margin-left:1.5em;}
+table {margin-bottom:1.4em;width:100%;}
+th {font-weight:bold;}
+thead th {background:#c3d9ff;}
+th, td, caption {padding:4px 10px 4px 5px;}
+tfoot {font-style:italic;}
+caption {background:#eee;}
+.small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;}
+.large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;}
+.hide {display:none;}
+.quiet {color:#666;}
+.loud {color:#000;}
+.highlight {background:#ff0;}
+.added {background:#060;color:#fff;}
+.removed {background:#900;color:#fff;}
+.first {margin-left:0;padding-left:0;}
+.last {margin-right:0;padding-right:0;}
+.top {margin-top:0;padding-top:0;}
+.bottom {margin-bottom:0;padding-bottom:0;}
+
+/* grid.css */
+.container {width:950px;margin:0 auto;}
+.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 {float:left;margin-right:10px;}
+.last {margin-right:0;}
+.span-1 {width:30px;}
+.span-2 {width:70px;}
+.span-3 {width:110px;}
+.span-4 {width:150px;}
+.span-5 {width:190px;}
+.span-6 {width:230px;}
+.span-7 {width:270px;}
+.span-8 {width:310px;}
+.span-9 {width:350px;}
+.span-10 {width:390px;}
+.span-11 {width:430px;}
+.span-12 {width:470px;}
+.span-13 {width:510px;}
+.span-14 {width:550px;}
+.span-15 {width:590px;}
+.span-16 {width:630px;}
+.span-17 {width:670px;}
+.span-18 {width:710px;}
+.span-19 {width:750px;}
+.span-20 {width:790px;}
+.span-21 {width:830px;}
+.span-22 {width:870px;}
+.span-23 {width:910px;}
+.span-24 {width:950px;margin-right:0;}
+input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 {border-left-width:1px;border-right-width:1px;padding-left:5px;padding-right:5px;}
+input.span-1, textarea.span-1 {width:18px;}
+input.span-2, textarea.span-2 {width:58px;}
+input.span-3, textarea.span-3 {width:98px;}
+input.span-4, textarea.span-4 {width:138px;}
+input.span-5, textarea.span-5 {width:178px;}
+input.span-6, textarea.span-6 {width:218px;}
+input.span-7, textarea.span-7 {width:258px;}
+input.span-8, textarea.span-8 {width:298px;}
+input.span-9, textarea.span-9 {width:338px;}
+input.span-10, textarea.span-10 {width:378px;}
+input.span-11, textarea.span-11 {width:418px;}
+input.span-12, textarea.span-12 {width:458px;}
+input.span-13, textarea.span-13 {width:498px;}
+input.span-14, textarea.span-14 {width:538px;}
+input.span-15, textarea.span-15 {width:578px;}
+input.span-16, textarea.span-16 {width:618px;}
+input.span-17, textarea.span-17 {width:658px;}
+input.span-18, textarea.span-18 {width:698px;}
+input.span-19, textarea.span-19 {width:738px;}
+input.span-20, textarea.span-20 {width:778px;}
+input.span-21, textarea.span-21 {width:818px;}
+input.span-22, textarea.span-22 {width:858px;}
+input.span-23, textarea.span-23 {width:898px;}
+input.span-24, textarea.span-24 {width:938px;}
+.append-1 {padding-right:40px;}
+.append-2 {padding-right:80px;}
+.append-3 {padding-right:120px;}
+.append-4 {padding-right:160px;}
+.append-5 {padding-right:200px;}
+.append-6 {padding-right:240px;}
+.append-7 {padding-right:280px;}
+.append-8 {padding-right:320px;}
+.append-9 {padding-right:360px;}
+.append-10 {padding-right:400px;}
+.append-11 {padding-right:440px;}
+.append-12 {padding-right:480px;}
+.append-13 {padding-right:520px;}
+.append-14 {padding-right:560px;}
+.append-15 {padding-right:600px;}
+.append-16 {padding-right:640px;}
+.append-17 {padding-right:680px;}
+.append-18 {padding-right:720px;}
+.append-19 {padding-right:760px;}
+.append-20 {padding-right:800px;}
+.append-21 {padding-right:840px;}
+.append-22 {padding-right:880px;}
+.append-23 {padding-right:920px;}
+.prepend-1 {padding-left:40px;}
+.prepend-2 {padding-left:80px;}
+.prepend-3 {padding-left:120px;}
+.prepend-4 {padding-left:160px;}
+.prepend-5 {padding-left:200px;}
+.prepend-6 {padding-left:240px;}
+.prepend-7 {padding-left:280px;}
+.prepend-8 {padding-left:320px;}
+.prepend-9 {padding-left:360px;}
+.prepend-10 {padding-left:400px;}
+.prepend-11 {padding-left:440px;}
+.prepend-12 {padding-left:480px;}
+.prepend-13 {padding-left:520px;}
+.prepend-14 {padding-left:560px;}
+.prepend-15 {padding-left:600px;}
+.prepend-16 {padding-left:640px;}
+.prepend-17 {padding-left:680px;}
+.prepend-18 {padding-left:720px;}
+.prepend-19 {padding-left:760px;}
+.prepend-20 {padding-left:800px;}
+.prepend-21 {padding-left:840px;}
+.prepend-22 {padding-left:880px;}
+.prepend-23 {padding-left:920px;}
+.border {padding-right:4px;margin-right:5px;border-right:1px solid #ddd;}
+.colborder {padding-right:24px;margin-right:25px;border-right:1px solid #ddd;}
+.pull-1 {margin-left:-40px;}
+.pull-2 {margin-left:-80px;}
+.pull-3 {margin-left:-120px;}
+.pull-4 {margin-left:-160px;}
+.pull-5 {margin-left:-200px;}
+.pull-6 {margin-left:-240px;}
+.pull-7 {margin-left:-280px;}
+.pull-8 {margin-left:-320px;}
+.pull-9 {margin-left:-360px;}
+.pull-10 {margin-left:-400px;}
+.pull-11 {margin-left:-440px;}
+.pull-12 {margin-left:-480px;}
+.pull-13 {margin-left:-520px;}
+.pull-14 {margin-left:-560px;}
+.pull-15 {margin-left:-600px;}
+.pull-16 {margin-left:-640px;}
+.pull-17 {margin-left:-680px;}
+.pull-18 {margin-left:-720px;}
+.pull-19 {margin-left:-760px;}
+.pull-20 {margin-left:-800px;}
+.pull-21 {margin-left:-840px;}
+.pull-22 {margin-left:-880px;}
+.pull-23 {margin-left:-920px;}
+.pull-24 {margin-left:-960px;}
+.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float:left;position:relative;}
+.push-1 {margin:0 -40px 1.5em 40px;}
+.push-2 {margin:0 -80px 1.5em 80px;}
+.push-3 {margin:0 -120px 1.5em 120px;}
+.push-4 {margin:0 -160px 1.5em 160px;}
+.push-5 {margin:0 -200px 1.5em 200px;}
+.push-6 {margin:0 -240px 1.5em 240px;}
+.push-7 {margin:0 -280px 1.5em 280px;}
+.push-8 {margin:0 -320px 1.5em 320px;}
+.push-9 {margin:0 -360px 1.5em 360px;}
+.push-10 {margin:0 -400px 1.5em 400px;}
+.push-11 {margin:0 -440px 1.5em 440px;}
+.push-12 {margin:0 -480px 1.5em 480px;}
+.push-13 {margin:0 -520px 1.5em 520px;}
+.push-14 {margin:0 -560px 1.5em 560px;}
+.push-15 {margin:0 -600px 1.5em 600px;}
+.push-16 {margin:0 -640px 1.5em 640px;}
+.push-17 {margin:0 -680px 1.5em 680px;}
+.push-18 {margin:0 -720px 1.5em 720px;}
+.push-19 {margin:0 -760px 1.5em 760px;}
+.push-20 {margin:0 -800px 1.5em 800px;}
+.push-21 {margin:0 -840px 1.5em 840px;}
+.push-22 {margin:0 -880px 1.5em 880px;}
+.push-23 {margin:0 -920px 1.5em 920px;}
+.push-24 {margin:0 -960px 1.5em 960px;}
+.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float:left;position:relative;}
+div.prepend-top, .prepend-top {margin-top:1.5em;}
+div.append-bottom, .append-bottom {margin-bottom:1.5em;}
+.box {padding:1.5em;margin-bottom:1.5em;background:#e5eCf9;}
+hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:1px;margin:0 0 17px;border:none;}
+hr.space {background:#fff;color:#fff;visibility:hidden;}
+.clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;}
+.clearfix, .container {display:block;}
+.clear {clear:both;}
diff --git a/web/index-test.php b/web/index-test.php
new file mode 100644
index 0000000..2272044
--- /dev/null
+++ b/web/index-test.php
@@ -0,0 +1,15 @@
+run();
diff --git a/web/index.php b/web/index.php
new file mode 100644
index 0000000..d512b7c
--- /dev/null
+++ b/web/index.php
@@ -0,0 +1,13 @@
+run();
diff --git a/web/nbproject/private/private.properties b/web/nbproject/private/private.properties
new file mode 100644
index 0000000..cca1271
--- /dev/null
+++ b/web/nbproject/private/private.properties
@@ -0,0 +1,2 @@
+index.file=index.php
+url=http://localhost/bashgid/
diff --git a/web/nbproject/private/private.xml b/web/nbproject/private/private.xml
new file mode 100644
index 0000000..63aa7de
--- /dev/null
+++ b/web/nbproject/private/private.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+ file:/C:/Workplace/Apache2.4/htdocs/bashgid/protected/controllers/ChannelController.php
+ file:/C:/Workplace/Apache2.4/htdocs/bashgid/protected/controllers/PhotoController.php
+ file:/C:/Workplace/Apache2.4/htdocs/bashgid/protected/controllers/PhotoAlbumRelationController.php
+ file:/C:/Workplace/Apache2.4/htdocs/bashgid/protected/controllers/VideoController.php
+ file:/C:/Workplace/Apache2.4/htdocs/bashgid/protected/controllers/VideoChannelRelationController.php
+ file:/C:/Workplace/Apache2.4/htdocs/bashgid/protected/controllers/ArticleController.php
+ file:/C:/Workplace/Apache2.4/htdocs/bashgid/protected/controllers/ArticleJournalRelationController.php
+ file:/C:/Workplace/Apache2.4/htdocs/bashgid/protected/controllers/JournalController.php
+ file:/C:/Workplace/Apache2.4/htdocs/bashgid/protected/controllers/AlbumController.php
+ file:/C:/Workplace/Apache2.4/htdocs/bashgid/protected/controllers/ChannelArticleRelationController.php
+ file:/C:/Workplace/Apache2.4/htdocs/bashgid/protected/controllers/AlbumArticleRelationController.php
+ file:/C:/Workplace/Apache2.4/htdocs/bashgid/protected/models/Photo.php
+
+
+
diff --git a/web/nbproject/project.properties b/web/nbproject/project.properties
new file mode 100644
index 0000000..8b7302c
--- /dev/null
+++ b/web/nbproject/project.properties
@@ -0,0 +1,7 @@
+include.path=${php.global.include.path}
+php.version=PHP_54
+source.encoding=UTF-8
+src.dir=.
+tags.asp=false
+tags.short=false
+web.root=.
diff --git a/web/nbproject/project.xml b/web/nbproject/project.xml
new file mode 100644
index 0000000..52abf6b
--- /dev/null
+++ b/web/nbproject/project.xml
@@ -0,0 +1,9 @@
+
+
+ org.netbeans.modules.php.project
+
+
+ bashgid
+
+
+
diff --git a/web/protected/.htaccess b/web/protected/.htaccess
new file mode 100644
index 0000000..e019832
--- /dev/null
+++ b/web/protected/.htaccess
@@ -0,0 +1 @@
+deny from all
diff --git a/web/protected/components/Controller.php b/web/protected/components/Controller.php
new file mode 100644
index 0000000..4d27862
--- /dev/null
+++ b/web/protected/components/Controller.php
@@ -0,0 +1,23 @@
+find('username=:username', array('username'=>$this->username));
+
+ if ($admin === null)
+ {
+ $this->errorCode=self::ERROR_USERNAME_INVALID;
+ return false;
+ }
+
+ if (crypt($this->password, $admin->password) == $admin->password)
+ {
+ $this->errorCode=self::ERROR_NONE;
+ return true;
+ }
+
+ $this->errorCode=self::ERROR_PASSWORD_INVALID;
+ return false;
+ }
+
+}
\ No newline at end of file
diff --git a/web/protected/config/console.php b/web/protected/config/console.php
new file mode 100644
index 0000000..346a976
--- /dev/null
+++ b/web/protected/config/console.php
@@ -0,0 +1,37 @@
+dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
+ 'name'=>'My Console Application',
+
+ // preloading 'log' component
+ 'preload'=>array('log'),
+
+ // application components
+ 'components'=>array(
+ 'db'=>array(
+ 'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
+ ),
+ // uncomment the following to use a MySQL database
+ /*
+ 'db'=>array(
+ 'connectionString' => 'mysql:host=localhost;dbname=testdrive',
+ 'emulatePrepare' => true,
+ 'username' => 'root',
+ 'password' => '',
+ 'charset' => 'utf8',
+ ),
+ */
+ 'log'=>array(
+ 'class'=>'CLogRouter',
+ 'routes'=>array(
+ array(
+ 'class'=>'CFileLogRoute',
+ 'levels'=>'error, warning',
+ ),
+ ),
+ ),
+ ),
+);
\ No newline at end of file
diff --git a/web/protected/config/main.php b/web/protected/config/main.php
new file mode 100644
index 0000000..cdfa722
--- /dev/null
+++ b/web/protected/config/main.php
@@ -0,0 +1,94 @@
+dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
+ 'name'=>'My Web Application',
+
+ // preloading 'log' component
+ 'preload'=>array('log'),
+
+ // autoloading model and component classes
+ 'import'=>array(
+ 'application.models.*',
+ 'application.components.*',
+ ),
+
+ 'modules'=>array(
+ // uncomment the following to enable the Gii tool
+
+ 'gii'=>array(
+ 'class'=>'system.gii.GiiModule',
+ 'password'=>'giiPassword%%#24402@*',
+ // If removed, Gii defaults to localhost only. Edit carefully to taste.
+ 'ipFilters'=>array('127.0.0.1','::1'),
+ ),
+
+ ),
+
+ // application components
+ 'components'=>array(
+ 'user'=>array(
+ // enable cookie-based authentication
+ 'allowAutoLogin'=>true,
+ ),
+ // uncomment the following to enable URLs in path-format
+ /*
+ 'urlManager'=>array(
+ 'urlFormat'=>'path',
+ 'rules'=>array(
+ '/'=>'/view',
+ '//'=>'/',
+ '/'=>'/',
+ ),
+ ),
+ */
+ 'db'=>array(
+ 'connectionString' => 'mysql:host=localhost;dbname=bashgid',
+ 'emulatePrepare' => true,
+ 'username' => 'bashgid',
+ 'password' => 'bashgid%%135',
+ 'charset' => 'utf8',
+ ),
+ // uncomment the following to use a MySQL database
+ /*
+ 'db'=>array(
+ 'connectionString' => 'mysql:host=localhost;dbname=testdrive',
+ 'emulatePrepare' => true,
+ 'username' => 'root',
+ 'password' => '',
+ 'charset' => 'utf8',
+ ),
+ */
+ 'errorHandler'=>array(
+ // use 'site/error' action to display errors
+ 'errorAction'=>'site/error',
+ ),
+ 'log'=>array(
+ 'class'=>'CLogRouter',
+ 'routes'=>array(
+ array(
+ 'class'=>'CFileLogRoute',
+ 'levels'=>'error, warning',
+ ),
+ // uncomment the following to show log messages on web pages
+ /*
+ array(
+ 'class'=>'CWebLogRoute',
+ ),
+ */
+ ),
+ ),
+ ),
+
+ // application-level parameters that can be accessed
+ // using Yii::app()->params['paramName']
+ 'params'=>array(
+ // this is used in contact page
+ 'adminEmail'=>'webmaster@example.com',
+ ),
+);
\ No newline at end of file
diff --git a/web/protected/config/test.php b/web/protected/config/test.php
new file mode 100644
index 0000000..fd7085a
--- /dev/null
+++ b/web/protected/config/test.php
@@ -0,0 +1,17 @@
+array(
+ 'fixture'=>array(
+ 'class'=>'system.test.CDbFixtureManager',
+ ),
+ /* uncomment the following to provide test database connection
+ 'db'=>array(
+ 'connectionString'=>'DSN for test database',
+ ),
+ */
+ ),
+ )
+);
diff --git a/web/protected/controllers/AlbumArticleRelationController.php b/web/protected/controllers/AlbumArticleRelationController.php
new file mode 100644
index 0000000..beb0a99
--- /dev/null
+++ b/web/protected/controllers/AlbumArticleRelationController.php
@@ -0,0 +1,180 @@
+ array('index', 'view', 'create', 'update', 'admin', 'delete'),
+ 'users' => array('@'),
+ ),
+ array('allow',
+ 'actions' => array('json'),
+ 'users' => array('*'),
+ ),
+ array('deny', // deny all users
+ 'users' => array('*'),
+ ),
+ );
+ }
+
+ /**
+ * Displays a particular model.
+ * @param integer $id the ID of the model to be displayed
+ */
+ public function actionView($id)
+ {
+ $this->render('view', array(
+ 'model' => $this->loadModel($id),
+ ));
+ }
+
+ /**
+ * Creates a new model.
+ * If creation is successful, the browser will be redirected to the 'view' page.
+ */
+ public function actionCreate()
+ {
+ $model = new AlbumArticleRelation;
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['AlbumArticleRelation']))
+ {
+ $model->attributes = $_POST['AlbumArticleRelation'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('create', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Updates a particular model.
+ * If update is successful, the browser will be redirected to the 'view' page.
+ * @param integer $id the ID of the model to be updated
+ */
+ public function actionUpdate($id)
+ {
+ $model = $this->loadModel($id);
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['AlbumArticleRelation']))
+ {
+ $model->attributes = $_POST['AlbumArticleRelation'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('update', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Deletes a particular model.
+ * If deletion is successful, the browser will be redirected to the 'admin' page.
+ * @param integer $id the ID of the model to be deleted
+ */
+ public function actionDelete($id)
+ {
+ $this->loadModel($id)->delete();
+
+ // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
+ if (!isset($_GET['ajax']))
+ $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
+ }
+
+ /**
+ * Lists all models.
+ */
+ public function actionIndex()
+ {
+ $dataProvider = new CActiveDataProvider('AlbumArticleRelation');
+ $this->render('index', array(
+ 'dataProvider' => $dataProvider,
+ ));
+ }
+
+ /**
+ * Manages all models.
+ */
+ public function actionAdmin()
+ {
+ $model = new AlbumArticleRelation('search');
+ $model->unsetAttributes(); // clear any default values
+ if (isset($_GET['AlbumArticleRelation']))
+ $model->attributes = $_GET['AlbumArticleRelation'];
+
+ $this->render('admin', array(
+ 'model' => $model,
+ ));
+ }
+
+ public function actionJson()
+ {
+ $dataArray = AlbumArticleRelation::model()->findAll();
+
+ $this->layout = false;
+ header('Content-type: application/json');
+ echo CJavaScript::jsonEncode($dataArray);
+ Yii::app()->end();
+ }
+
+ /**
+ * Returns the data model based on the primary key given in the GET variable.
+ * If the data model is not found, an HTTP exception will be raised.
+ * @param integer $id the ID of the model to be loaded
+ * @return AlbumArticleRelation the loaded model
+ * @throws CHttpException
+ */
+ public function loadModel($id)
+ {
+ $model = AlbumArticleRelation::model()->findByPk($id);
+ if ($model === null)
+ throw new CHttpException(404, 'The requested page does not exist.');
+ return $model;
+ }
+
+ /**
+ * Performs the AJAX validation.
+ * @param AlbumArticleRelation $model the model to be validated
+ */
+ protected function performAjaxValidation($model)
+ {
+ if (isset($_POST['ajax']) && $_POST['ajax'] === 'album-article-relation-form')
+ {
+ echo CActiveForm::validate($model);
+ Yii::app()->end();
+ }
+ }
+
+}
diff --git a/web/protected/controllers/AlbumController.php b/web/protected/controllers/AlbumController.php
new file mode 100644
index 0000000..bec1607
--- /dev/null
+++ b/web/protected/controllers/AlbumController.php
@@ -0,0 +1,180 @@
+ array('index', 'view', 'create', 'update', 'admin', 'delete'),
+ 'users' => array('@'),
+ ),
+ array('allow',
+ 'actions' => array('json'),
+ 'users' => array('*'),
+ ),
+ array('deny', // deny all users
+ 'users' => array('*'),
+ ),
+ );
+ }
+
+ /**
+ * Displays a particular model.
+ * @param integer $id the ID of the model to be displayed
+ */
+ public function actionView($id)
+ {
+ $this->render('view', array(
+ 'model' => $this->loadModel($id),
+ ));
+ }
+
+ /**
+ * Creates a new model.
+ * If creation is successful, the browser will be redirected to the 'view' page.
+ */
+ public function actionCreate()
+ {
+ $model = new Album;
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['Album']))
+ {
+ $model->attributes = $_POST['Album'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('create', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Updates a particular model.
+ * If update is successful, the browser will be redirected to the 'view' page.
+ * @param integer $id the ID of the model to be updated
+ */
+ public function actionUpdate($id)
+ {
+ $model = $this->loadModel($id);
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['Album']))
+ {
+ $model->attributes = $_POST['Album'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('update', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Deletes a particular model.
+ * If deletion is successful, the browser will be redirected to the 'admin' page.
+ * @param integer $id the ID of the model to be deleted
+ */
+ public function actionDelete($id)
+ {
+ $this->loadModel($id)->delete();
+
+ // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
+ if (!isset($_GET['ajax']))
+ $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
+ }
+
+ /**
+ * Lists all models.
+ */
+ public function actionIndex()
+ {
+ $dataProvider = new CActiveDataProvider('Album');
+ $this->render('index', array(
+ 'dataProvider' => $dataProvider,
+ ));
+ }
+
+ /**
+ * Manages all models.
+ */
+ public function actionAdmin()
+ {
+ $model = new Album('search');
+ $model->unsetAttributes(); // clear any default values
+ if (isset($_GET['Album']))
+ $model->attributes = $_GET['Album'];
+
+ $this->render('admin', array(
+ 'model' => $model,
+ ));
+ }
+
+ public function actionJson()
+ {
+ $dataArray = Album::model()->findAll();
+
+ $this->layout = false;
+ header('Content-type: application/json');
+ echo CJavaScript::jsonEncode($dataArray);
+ Yii::app()->end();
+ }
+
+ /**
+ * Returns the data model based on the primary key given in the GET variable.
+ * If the data model is not found, an HTTP exception will be raised.
+ * @param integer $id the ID of the model to be loaded
+ * @return Album the loaded model
+ * @throws CHttpException
+ */
+ public function loadModel($id)
+ {
+ $model = Album::model()->findByPk($id);
+ if ($model === null)
+ throw new CHttpException(404, 'The requested page does not exist.');
+ return $model;
+ }
+
+ /**
+ * Performs the AJAX validation.
+ * @param Album $model the model to be validated
+ */
+ protected function performAjaxValidation($model)
+ {
+ if (isset($_POST['ajax']) && $_POST['ajax'] === 'album-form')
+ {
+ echo CActiveForm::validate($model);
+ Yii::app()->end();
+ }
+ }
+
+}
diff --git a/web/protected/controllers/ArticleController.php b/web/protected/controllers/ArticleController.php
new file mode 100644
index 0000000..0b5bad6
--- /dev/null
+++ b/web/protected/controllers/ArticleController.php
@@ -0,0 +1,185 @@
+ array('index', 'view', 'create', 'update', 'admin', 'delete'),
+ 'users' => array('@'),
+ ),
+ array('allow',
+ 'actions' => array('json'),
+ 'users' => array('*'),
+ ),
+ array('deny', // deny all users
+ 'users' => array('*'),
+ ),
+ );
+ }
+
+ /**
+ * Displays a particular model.
+ * @param integer $id the ID of the model to be displayed
+ */
+ public function actionView($id)
+ {
+ $this->render('view', array(
+ 'model' => $this->loadModel($id),
+ ));
+ }
+
+ /**
+ * Creates a new model.
+ * If creation is successful, the browser will be redirected to the 'view' page.
+ */
+ public function actionCreate()
+ {
+ $model = new Article;
+
+ $model->geoLat = 0;
+ $model->geoLon = 0;
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['Article']))
+ {
+ $model->attributes = $_POST['Article'];
+ date_default_timezone_set("UTC");
+ $model->dateTime = date('Y-m-d H:i:s');
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('create', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Updates a particular model.
+ * If update is successful, the browser will be redirected to the 'view' page.
+ * @param integer $id the ID of the model to be updated
+ */
+ public function actionUpdate($id)
+ {
+ $model = $this->loadModel($id);
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['Article']))
+ {
+ $model->attributes = $_POST['Article'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('update', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Deletes a particular model.
+ * If deletion is successful, the browser will be redirected to the 'admin' page.
+ * @param integer $id the ID of the model to be deleted
+ */
+ public function actionDelete($id)
+ {
+ $this->loadModel($id)->delete();
+
+ // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
+ if (!isset($_GET['ajax']))
+ $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
+ }
+
+ /**
+ * Lists all models.
+ */
+ public function actionIndex()
+ {
+ $dataProvider = new CActiveDataProvider('Article');
+ $this->render('index', array(
+ 'dataProvider' => $dataProvider,
+ ));
+ }
+
+ /**
+ * Manages all models.
+ */
+ public function actionAdmin()
+ {
+ $model = new Article('search');
+ $model->unsetAttributes(); // clear any default values
+ if (isset($_GET['Article']))
+ $model->attributes = $_GET['Article'];
+
+ $this->render('admin', array(
+ 'model' => $model,
+ ));
+ }
+
+ public function actionJson()
+ {
+ $dataArray = Article::model()->findAll();
+
+ $this->layout = false;
+ header('Content-type: application/json');
+ echo CJavaScript::jsonEncode($dataArray);
+ Yii::app()->end();
+ }
+
+ /**
+ * Returns the data model based on the primary key given in the GET variable.
+ * If the data model is not found, an HTTP exception will be raised.
+ * @param integer $id the ID of the model to be loaded
+ * @return Article the loaded model
+ * @throws CHttpException
+ */
+ public function loadModel($id)
+ {
+ $model = Article::model()->findByPk($id);
+ if ($model === null)
+ throw new CHttpException(404, 'The requested page does not exist.');
+ return $model;
+ }
+
+ /**
+ * Performs the AJAX validation.
+ * @param Article $model the model to be validated
+ */
+ protected function performAjaxValidation($model)
+ {
+ if (isset($_POST['ajax']) && $_POST['ajax'] === 'article-form')
+ {
+ echo CActiveForm::validate($model);
+ Yii::app()->end();
+ }
+ }
+
+}
diff --git a/web/protected/controllers/ArticleJournalRelationController.php b/web/protected/controllers/ArticleJournalRelationController.php
new file mode 100644
index 0000000..b4c1eb9
--- /dev/null
+++ b/web/protected/controllers/ArticleJournalRelationController.php
@@ -0,0 +1,180 @@
+ array('index', 'view', 'create', 'update', 'admin', 'delete'),
+ 'users' => array('@'),
+ ),
+ array('allow',
+ 'actions' => array('json'),
+ 'users' => array('*'),
+ ),
+ array('deny', // deny all users
+ 'users' => array('*'),
+ ),
+ );
+ }
+
+ /**
+ * Displays a particular model.
+ * @param integer $id the ID of the model to be displayed
+ */
+ public function actionView($id)
+ {
+ $this->render('view', array(
+ 'model' => $this->loadModel($id),
+ ));
+ }
+
+ /**
+ * Creates a new model.
+ * If creation is successful, the browser will be redirected to the 'view' page.
+ */
+ public function actionCreate()
+ {
+ $model = new ArticleJournalRelation;
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['ArticleJournalRelation']))
+ {
+ $model->attributes = $_POST['ArticleJournalRelation'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('create', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Updates a particular model.
+ * If update is successful, the browser will be redirected to the 'view' page.
+ * @param integer $id the ID of the model to be updated
+ */
+ public function actionUpdate($id)
+ {
+ $model = $this->loadModel($id);
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['ArticleJournalRelation']))
+ {
+ $model->attributes = $_POST['ArticleJournalRelation'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('update', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Deletes a particular model.
+ * If deletion is successful, the browser will be redirected to the 'admin' page.
+ * @param integer $id the ID of the model to be deleted
+ */
+ public function actionDelete($id)
+ {
+ $this->loadModel($id)->delete();
+
+ // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
+ if (!isset($_GET['ajax']))
+ $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
+ }
+
+ /**
+ * Lists all models.
+ */
+ public function actionIndex()
+ {
+ $dataProvider = new CActiveDataProvider('ArticleJournalRelation');
+ $this->render('index', array(
+ 'dataProvider' => $dataProvider,
+ ));
+ }
+
+ /**
+ * Manages all models.
+ */
+ public function actionAdmin()
+ {
+ $model = new ArticleJournalRelation('search');
+ $model->unsetAttributes(); // clear any default values
+ if (isset($_GET['ArticleJournalRelation']))
+ $model->attributes = $_GET['ArticleJournalRelation'];
+
+ $this->render('admin', array(
+ 'model' => $model,
+ ));
+ }
+
+ public function actionJson()
+ {
+ $dataArray = ArticleJournalRelation::model()->findAll();
+
+ $this->layout = false;
+ header('Content-type: application/json');
+ echo CJavaScript::jsonEncode($dataArray);
+ Yii::app()->end();
+ }
+
+ /**
+ * Returns the data model based on the primary key given in the GET variable.
+ * If the data model is not found, an HTTP exception will be raised.
+ * @param integer $id the ID of the model to be loaded
+ * @return ArticleJournalRelation the loaded model
+ * @throws CHttpException
+ */
+ public function loadModel($id)
+ {
+ $model = ArticleJournalRelation::model()->findByPk($id);
+ if ($model === null)
+ throw new CHttpException(404, 'The requested page does not exist.');
+ return $model;
+ }
+
+ /**
+ * Performs the AJAX validation.
+ * @param ArticleJournalRelation $model the model to be validated
+ */
+ protected function performAjaxValidation($model)
+ {
+ if (isset($_POST['ajax']) && $_POST['ajax'] === 'article-journal-relation-form')
+ {
+ echo CActiveForm::validate($model);
+ Yii::app()->end();
+ }
+ }
+
+}
diff --git a/web/protected/controllers/ChannelArticleRelationController.php b/web/protected/controllers/ChannelArticleRelationController.php
new file mode 100644
index 0000000..15688e3
--- /dev/null
+++ b/web/protected/controllers/ChannelArticleRelationController.php
@@ -0,0 +1,180 @@
+ array('index', 'view', 'create', 'update', 'admin', 'delete'),
+ 'users' => array('@'),
+ ),
+ array('allow',
+ 'actions' => array('json'),
+ 'users' => array('*'),
+ ),
+ array('deny', // deny all users
+ 'users' => array('*'),
+ ),
+ );
+ }
+
+ /**
+ * Displays a particular model.
+ * @param integer $id the ID of the model to be displayed
+ */
+ public function actionView($id)
+ {
+ $this->render('view', array(
+ 'model' => $this->loadModel($id),
+ ));
+ }
+
+ /**
+ * Creates a new model.
+ * If creation is successful, the browser will be redirected to the 'view' page.
+ */
+ public function actionCreate()
+ {
+ $model = new ChannelArticleRelation;
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['ChannelArticleRelation']))
+ {
+ $model->attributes = $_POST['ChannelArticleRelation'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('create', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Updates a particular model.
+ * If update is successful, the browser will be redirected to the 'view' page.
+ * @param integer $id the ID of the model to be updated
+ */
+ public function actionUpdate($id)
+ {
+ $model = $this->loadModel($id);
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['ChannelArticleRelation']))
+ {
+ $model->attributes = $_POST['ChannelArticleRelation'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('update', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Deletes a particular model.
+ * If deletion is successful, the browser will be redirected to the 'admin' page.
+ * @param integer $id the ID of the model to be deleted
+ */
+ public function actionDelete($id)
+ {
+ $this->loadModel($id)->delete();
+
+ // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
+ if (!isset($_GET['ajax']))
+ $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
+ }
+
+ /**
+ * Lists all models.
+ */
+ public function actionIndex()
+ {
+ $dataProvider = new CActiveDataProvider('ChannelArticleRelation');
+ $this->render('index', array(
+ 'dataProvider' => $dataProvider,
+ ));
+ }
+
+ /**
+ * Manages all models.
+ */
+ public function actionAdmin()
+ {
+ $model = new ChannelArticleRelation('search');
+ $model->unsetAttributes(); // clear any default values
+ if (isset($_GET['ChannelArticleRelation']))
+ $model->attributes = $_GET['ChannelArticleRelation'];
+
+ $this->render('admin', array(
+ 'model' => $model,
+ ));
+ }
+
+ public function actionJson()
+ {
+ $dataArray = ChannelArticleRelation::model()->findAll();
+
+ $this->layout = false;
+ header('Content-type: application/json');
+ echo CJavaScript::jsonEncode($dataArray);
+ Yii::app()->end();
+ }
+
+ /**
+ * Returns the data model based on the primary key given in the GET variable.
+ * If the data model is not found, an HTTP exception will be raised.
+ * @param integer $id the ID of the model to be loaded
+ * @return ChannelArticleRelation the loaded model
+ * @throws CHttpException
+ */
+ public function loadModel($id)
+ {
+ $model = ChannelArticleRelation::model()->findByPk($id);
+ if ($model === null)
+ throw new CHttpException(404, 'The requested page does not exist.');
+ return $model;
+ }
+
+ /**
+ * Performs the AJAX validation.
+ * @param ChannelArticleRelation $model the model to be validated
+ */
+ protected function performAjaxValidation($model)
+ {
+ if (isset($_POST['ajax']) && $_POST['ajax'] === 'channel-article-relation-form')
+ {
+ echo CActiveForm::validate($model);
+ Yii::app()->end();
+ }
+ }
+
+}
diff --git a/web/protected/controllers/ChannelController.php b/web/protected/controllers/ChannelController.php
new file mode 100644
index 0000000..3457fa2
--- /dev/null
+++ b/web/protected/controllers/ChannelController.php
@@ -0,0 +1,180 @@
+ array('index', 'view', 'create', 'update', 'admin', 'delete'),
+ 'users' => array('@'),
+ ),
+ array('allow',
+ 'actions' => array('json'),
+ 'users' => array('*'),
+ ),
+ array('deny', // deny all users
+ 'users' => array('*'),
+ ),
+ );
+ }
+
+ /**
+ * Displays a particular model.
+ * @param integer $id the ID of the model to be displayed
+ */
+ public function actionView($id)
+ {
+ $this->render('view', array(
+ 'model' => $this->loadModel($id),
+ ));
+ }
+
+ /**
+ * Creates a new model.
+ * If creation is successful, the browser will be redirected to the 'view' page.
+ */
+ public function actionCreate()
+ {
+ $model = new Channel;
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['Channel']))
+ {
+ $model->attributes = $_POST['Channel'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('create', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Updates a particular model.
+ * If update is successful, the browser will be redirected to the 'view' page.
+ * @param integer $id the ID of the model to be updated
+ */
+ public function actionUpdate($id)
+ {
+ $model = $this->loadModel($id);
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['Channel']))
+ {
+ $model->attributes = $_POST['Channel'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('update', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Deletes a particular model.
+ * If deletion is successful, the browser will be redirected to the 'admin' page.
+ * @param integer $id the ID of the model to be deleted
+ */
+ public function actionDelete($id)
+ {
+ $this->loadModel($id)->delete();
+
+ // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
+ if (!isset($_GET['ajax']))
+ $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
+ }
+
+ /**
+ * Lists all models.
+ */
+ public function actionIndex()
+ {
+ $dataProvider = new CActiveDataProvider('Channel');
+ $this->render('index', array(
+ 'dataProvider' => $dataProvider,
+ ));
+ }
+
+ /**
+ * Manages all models.
+ */
+ public function actionAdmin()
+ {
+ $model = new Channel('search');
+ $model->unsetAttributes(); // clear any default values
+ if (isset($_GET['Channel']))
+ $model->attributes = $_GET['Channel'];
+
+ $this->render('admin', array(
+ 'model' => $model,
+ ));
+ }
+
+ public function actionJson()
+ {
+ $dataArray = Channel::model()->findAll();
+
+ $this->layout = false;
+ header('Content-type: application/json');
+ echo CJavaScript::jsonEncode($dataArray);
+ Yii::app()->end();
+ }
+
+ /**
+ * Returns the data model based on the primary key given in the GET variable.
+ * If the data model is not found, an HTTP exception will be raised.
+ * @param integer $id the ID of the model to be loaded
+ * @return Channel the loaded model
+ * @throws CHttpException
+ */
+ public function loadModel($id)
+ {
+ $model = Channel::model()->findByPk($id);
+ if ($model === null)
+ throw new CHttpException(404, 'The requested page does not exist.');
+ return $model;
+ }
+
+ /**
+ * Performs the AJAX validation.
+ * @param Channel $model the model to be validated
+ */
+ protected function performAjaxValidation($model)
+ {
+ if (isset($_POST['ajax']) && $_POST['ajax'] === 'channel-form')
+ {
+ echo CActiveForm::validate($model);
+ Yii::app()->end();
+ }
+ }
+
+}
diff --git a/web/protected/controllers/JournalController.php b/web/protected/controllers/JournalController.php
new file mode 100644
index 0000000..d0f5b4e
--- /dev/null
+++ b/web/protected/controllers/JournalController.php
@@ -0,0 +1,180 @@
+ array('index', 'view', 'create', 'update', 'admin', 'delete'),
+ 'users' => array('@'),
+ ),
+ array('allow',
+ 'actions' => array('json'),
+ 'users' => array('*'),
+ ),
+ array('deny', // deny all users
+ 'users' => array('*'),
+ ),
+ );
+ }
+
+ /**
+ * Displays a particular model.
+ * @param integer $id the ID of the model to be displayed
+ */
+ public function actionView($id)
+ {
+ $this->render('view', array(
+ 'model' => $this->loadModel($id),
+ ));
+ }
+
+ /**
+ * Creates a new model.
+ * If creation is successful, the browser will be redirected to the 'view' page.
+ */
+ public function actionCreate()
+ {
+ $model = new Journal;
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['Journal']))
+ {
+ $model->attributes = $_POST['Journal'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('create', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Updates a particular model.
+ * If update is successful, the browser will be redirected to the 'view' page.
+ * @param integer $id the ID of the model to be updated
+ */
+ public function actionUpdate($id)
+ {
+ $model = $this->loadModel($id);
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['Journal']))
+ {
+ $model->attributes = $_POST['Journal'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('update', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Deletes a particular model.
+ * If deletion is successful, the browser will be redirected to the 'admin' page.
+ * @param integer $id the ID of the model to be deleted
+ */
+ public function actionDelete($id)
+ {
+ $this->loadModel($id)->delete();
+
+ // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
+ if (!isset($_GET['ajax']))
+ $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
+ }
+
+ /**
+ * Lists all models.
+ */
+ public function actionIndex()
+ {
+ $dataProvider = new CActiveDataProvider('Journal');
+ $this->render('index', array(
+ 'dataProvider' => $dataProvider,
+ ));
+ }
+
+ /**
+ * Manages all models.
+ */
+ public function actionAdmin()
+ {
+ $model = new Journal('search');
+ $model->unsetAttributes(); // clear any default values
+ if (isset($_GET['Journal']))
+ $model->attributes = $_GET['Journal'];
+
+ $this->render('admin', array(
+ 'model' => $model,
+ ));
+ }
+
+ public function actionJson()
+ {
+ $dataArray = Journal::model()->findAll();
+
+ $this->layout = false;
+ header('Content-type: application/json');
+ echo CJavaScript::jsonEncode($dataArray);
+ Yii::app()->end();
+ }
+
+ /**
+ * Returns the data model based on the primary key given in the GET variable.
+ * If the data model is not found, an HTTP exception will be raised.
+ * @param integer $id the ID of the model to be loaded
+ * @return Journal the loaded model
+ * @throws CHttpException
+ */
+ public function loadModel($id)
+ {
+ $model = Journal::model()->findByPk($id);
+ if ($model === null)
+ throw new CHttpException(404, 'The requested page does not exist.');
+ return $model;
+ }
+
+ /**
+ * Performs the AJAX validation.
+ * @param Journal $model the model to be validated
+ */
+ protected function performAjaxValidation($model)
+ {
+ if (isset($_POST['ajax']) && $_POST['ajax'] === 'journal-form')
+ {
+ echo CActiveForm::validate($model);
+ Yii::app()->end();
+ }
+ }
+
+}
diff --git a/web/protected/controllers/PhotoAlbumRelationController.php b/web/protected/controllers/PhotoAlbumRelationController.php
new file mode 100644
index 0000000..7a62efa
--- /dev/null
+++ b/web/protected/controllers/PhotoAlbumRelationController.php
@@ -0,0 +1,180 @@
+ array('index', 'view', 'create', 'update', 'admin', 'delete'),
+ 'users' => array('@'),
+ ),
+ array('allow',
+ 'actions' => array('json'),
+ 'users' => array('*'),
+ ),
+ array('deny', // deny all users
+ 'users' => array('*'),
+ ),
+ );
+ }
+
+ /**
+ * Displays a particular model.
+ * @param integer $id the ID of the model to be displayed
+ */
+ public function actionView($id)
+ {
+ $this->render('view', array(
+ 'model' => $this->loadModel($id),
+ ));
+ }
+
+ /**
+ * Creates a new model.
+ * If creation is successful, the browser will be redirected to the 'view' page.
+ */
+ public function actionCreate()
+ {
+ $model = new PhotoAlbumRelation;
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['PhotoAlbumRelation']))
+ {
+ $model->attributes = $_POST['PhotoAlbumRelation'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('create', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Updates a particular model.
+ * If update is successful, the browser will be redirected to the 'view' page.
+ * @param integer $id the ID of the model to be updated
+ */
+ public function actionUpdate($id)
+ {
+ $model = $this->loadModel($id);
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['PhotoAlbumRelation']))
+ {
+ $model->attributes = $_POST['PhotoAlbumRelation'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('update', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Deletes a particular model.
+ * If deletion is successful, the browser will be redirected to the 'admin' page.
+ * @param integer $id the ID of the model to be deleted
+ */
+ public function actionDelete($id)
+ {
+ $this->loadModel($id)->delete();
+
+ // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
+ if (!isset($_GET['ajax']))
+ $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
+ }
+
+ /**
+ * Lists all models.
+ */
+ public function actionIndex()
+ {
+ $dataProvider = new CActiveDataProvider('PhotoAlbumRelation');
+ $this->render('index', array(
+ 'dataProvider' => $dataProvider,
+ ));
+ }
+
+ /**
+ * Manages all models.
+ */
+ public function actionAdmin()
+ {
+ $model = new PhotoAlbumRelation('search');
+ $model->unsetAttributes(); // clear any default values
+ if (isset($_GET['PhotoAlbumRelation']))
+ $model->attributes = $_GET['PhotoAlbumRelation'];
+
+ $this->render('admin', array(
+ 'model' => $model,
+ ));
+ }
+
+ public function actionJson()
+ {
+ $dataArray = PhotoAlbumRelation::model()->findAll();
+
+ $this->layout = false;
+ header('Content-type: application/json');
+ echo CJavaScript::jsonEncode($dataArray);
+ Yii::app()->end();
+ }
+
+ /**
+ * Returns the data model based on the primary key given in the GET variable.
+ * If the data model is not found, an HTTP exception will be raised.
+ * @param integer $id the ID of the model to be loaded
+ * @return PhotoAlbumRelation the loaded model
+ * @throws CHttpException
+ */
+ public function loadModel($id)
+ {
+ $model = PhotoAlbumRelation::model()->findByPk($id);
+ if ($model === null)
+ throw new CHttpException(404, 'The requested page does not exist.');
+ return $model;
+ }
+
+ /**
+ * Performs the AJAX validation.
+ * @param PhotoAlbumRelation $model the model to be validated
+ */
+ protected function performAjaxValidation($model)
+ {
+ if (isset($_POST['ajax']) && $_POST['ajax'] === 'photo-album-relation-form')
+ {
+ echo CActiveForm::validate($model);
+ Yii::app()->end();
+ }
+ }
+
+}
diff --git a/web/protected/controllers/PhotoController.php b/web/protected/controllers/PhotoController.php
new file mode 100644
index 0000000..2ffab20
--- /dev/null
+++ b/web/protected/controllers/PhotoController.php
@@ -0,0 +1,186 @@
+ array('index', 'view', 'create', 'update', 'admin', 'delete'),
+ 'users' => array('@'),
+ ),
+ array('allow',
+ 'actions' => array('json'),
+ 'users' => array('*'),
+ ),
+ array('deny', // deny all users
+ 'users' => array('*'),
+ ),
+ );
+ }
+
+ /**
+ * Displays a particular model.
+ * @param integer $id the ID of the model to be displayed
+ */
+ public function actionView($id)
+ {
+ $this->render('view', array(
+ 'model' => $this->loadModel($id),
+ ));
+ }
+
+ /**
+ * Creates a new model.
+ * If creation is successful, the browser will be redirected to the 'view' page.
+ */
+ public function actionCreate()
+ {
+ $model = new Photo;
+
+ $model->geoLat = 0;
+ $model->geoLon = 0;
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['Photo']))
+ {
+ $model->attributes = $_POST['Photo'];
+
+ $model->imageHash = md5_file($model->imageUrl);
+
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('create', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Updates a particular model.
+ * If update is successful, the browser will be redirected to the 'view' page.
+ * @param integer $id the ID of the model to be updated
+ */
+ public function actionUpdate($id)
+ {
+ $model = $this->loadModel($id);
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['Photo']))
+ {
+ $model->attributes = $_POST['Photo'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('update', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Deletes a particular model.
+ * If deletion is successful, the browser will be redirected to the 'admin' page.
+ * @param integer $id the ID of the model to be deleted
+ */
+ public function actionDelete($id)
+ {
+ $this->loadModel($id)->delete();
+
+ // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
+ if (!isset($_GET['ajax']))
+ $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
+ }
+
+ /**
+ * Lists all models.
+ */
+ public function actionIndex()
+ {
+ $dataProvider = new CActiveDataProvider('Photo');
+ $this->render('index', array(
+ 'dataProvider' => $dataProvider,
+ ));
+ }
+
+ /**
+ * Manages all models.
+ */
+ public function actionAdmin()
+ {
+ $model = new Photo('search');
+ $model->unsetAttributes(); // clear any default values
+ if (isset($_GET['Photo']))
+ $model->attributes = $_GET['Photo'];
+
+ $this->render('admin', array(
+ 'model' => $model,
+ ));
+ }
+
+ public function actionJson()
+ {
+ $dataArray = Photo::model()->findAll();
+
+ $this->layout = false;
+ header('Content-type: application/json');
+ echo CJavaScript::jsonEncode($dataArray);
+ Yii::app()->end();
+ }
+
+ /**
+ * Returns the data model based on the primary key given in the GET variable.
+ * If the data model is not found, an HTTP exception will be raised.
+ * @param integer $id the ID of the model to be loaded
+ * @return Photo the loaded model
+ * @throws CHttpException
+ */
+ public function loadModel($id)
+ {
+ $model = Photo::model()->findByPk($id);
+ if ($model === null)
+ throw new CHttpException(404, 'The requested page does not exist.');
+ return $model;
+ }
+
+ /**
+ * Performs the AJAX validation.
+ * @param Photo $model the model to be validated
+ */
+ protected function performAjaxValidation($model)
+ {
+ if (isset($_POST['ajax']) && $_POST['ajax'] === 'photo-form')
+ {
+ echo CActiveForm::validate($model);
+ Yii::app()->end();
+ }
+ }
+
+}
diff --git a/web/protected/controllers/SiteController.php b/web/protected/controllers/SiteController.php
new file mode 100644
index 0000000..6fc251e
--- /dev/null
+++ b/web/protected/controllers/SiteController.php
@@ -0,0 +1,152 @@
+array(
+ 'class'=>'CCaptchaAction',
+ 'backColor'=>0xFFFFFF,
+ ),
+ // page action renders "static" pages stored under 'protected/views/site/pages'
+ // They can be accessed via: index.php?r=site/page&view=FileName
+ 'page'=>array(
+ 'class'=>'CViewAction',
+ ),
+ );
+ }
+
+ /**
+ * This is the default 'index' action that is invoked
+ * when an action is not explicitly requested by users.
+ */
+ public function actionIndex()
+ {
+ // renders the view file 'protected/views/site/index.php'
+ // using the default layout 'protected/views/layouts/main.php'
+ $this->render('index');
+ }
+
+ /**
+ * This is the action to handle external exceptions.
+ */
+ public function actionError()
+ {
+ if($error=Yii::app()->errorHandler->error)
+ {
+ if(Yii::app()->request->isAjaxRequest)
+ echo $error['message'];
+ else
+ $this->render('error', $error);
+ }
+ }
+
+ /**
+ * Displays the contact page
+ */
+ public function actionContact()
+ {
+ $model=new ContactForm;
+ if(isset($_POST['ContactForm']))
+ {
+ $model->attributes=$_POST['ContactForm'];
+ if($model->validate())
+ {
+ $name='=?UTF-8?B?'.base64_encode($model->name).'?=';
+ $subject='=?UTF-8?B?'.base64_encode($model->subject).'?=';
+ $headers="From: $name <{$model->email}>\r\n".
+ "Reply-To: {$model->email}\r\n".
+ "MIME-Version: 1.0\r\n".
+ "Content-Type: text/plain; charset=UTF-8";
+
+ mail(Yii::app()->params['adminEmail'],$subject,$model->body,$headers);
+ Yii::app()->user->setFlash('contact','Thank you for contacting us. We will respond to you as soon as possible.');
+ $this->refresh();
+ }
+ }
+ $this->render('contact',array('model'=>$model));
+ }
+
+ /**
+ * Displays the login page
+ */
+ public function actionLogin()
+ {
+ $model=new LoginForm;
+
+ // if it is ajax validation request
+ if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
+ {
+ echo CActiveForm::validate($model);
+ Yii::app()->end();
+ }
+
+ // collect user input data
+ if(isset($_POST['LoginForm']))
+ {
+ $model->attributes=$_POST['LoginForm'];
+ // validate user input and redirect to the previous page if valid
+ if($model->validate() && $model->login())
+ $this->redirect(Yii::app()->user->returnUrl);
+ }
+ // display the login form
+ $this->render('login',array('model'=>$model));
+ }
+
+
+ public function actionRegister()
+ {
+ $model = new User('register');
+
+ if (isset($_POST['User']))
+ {
+ $model->attributes = $_POST['User'];
+ if ($model->validate())
+ {
+
+ $oldPassword = $model->password;
+ $model->password = $this->better_crypt($model->password);
+
+
+ date_default_timezone_set("UTC");
+ $model->date = date('Y-m-d H:i:s');
+
+ if ($model->save())
+ {
+
+ //$this->redirect(Yii::app()->user->returnUrl);
+ $this->redirect(array("site/login"));
+
+ return;
+ }
+ $model->password = $oldPassword;
+ }
+ }
+ $this->render('register', array('model' => $model));
+ }
+
+ /**
+ * Logs out the current user and redirect to homepage.
+ */
+ public function actionLogout()
+ {
+ Yii::app()->user->logout();
+ $this->redirect(Yii::app()->homeUrl);
+ }
+
+ private function better_crypt($input)
+ {
+ $salt = "";
+ $salt_chars = array_merge(range('A', 'Z'), range('a', 'z'), range(0, 9));
+ for ($i = 0; $i < 22; $i++)
+ {
+ $salt .= $salt_chars[array_rand($salt_chars)];
+ }
+ return crypt($input, '$2y$10$' . $salt);
+ }
+}
\ No newline at end of file
diff --git a/web/protected/controllers/VideoChannelRelationController.php b/web/protected/controllers/VideoChannelRelationController.php
new file mode 100644
index 0000000..6c7463d
--- /dev/null
+++ b/web/protected/controllers/VideoChannelRelationController.php
@@ -0,0 +1,180 @@
+ array('index', 'view', 'create', 'update', 'admin', 'delete'),
+ 'users' => array('@'),
+ ),
+ array('allow',
+ 'actions' => array('json'),
+ 'users' => array('*'),
+ ),
+ array('deny', // deny all users
+ 'users' => array('*'),
+ ),
+ );
+ }
+
+ /**
+ * Displays a particular model.
+ * @param integer $id the ID of the model to be displayed
+ */
+ public function actionView($id)
+ {
+ $this->render('view', array(
+ 'model' => $this->loadModel($id),
+ ));
+ }
+
+ /**
+ * Creates a new model.
+ * If creation is successful, the browser will be redirected to the 'view' page.
+ */
+ public function actionCreate()
+ {
+ $model = new VideoChannelRelation;
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['VideoChannelRelation']))
+ {
+ $model->attributes = $_POST['VideoChannelRelation'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('create', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Updates a particular model.
+ * If update is successful, the browser will be redirected to the 'view' page.
+ * @param integer $id the ID of the model to be updated
+ */
+ public function actionUpdate($id)
+ {
+ $model = $this->loadModel($id);
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['VideoChannelRelation']))
+ {
+ $model->attributes = $_POST['VideoChannelRelation'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('update', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Deletes a particular model.
+ * If deletion is successful, the browser will be redirected to the 'admin' page.
+ * @param integer $id the ID of the model to be deleted
+ */
+ public function actionDelete($id)
+ {
+ $this->loadModel($id)->delete();
+
+ // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
+ if (!isset($_GET['ajax']))
+ $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
+ }
+
+ /**
+ * Lists all models.
+ */
+ public function actionIndex()
+ {
+ $dataProvider = new CActiveDataProvider('VideoChannelRelation');
+ $this->render('index', array(
+ 'dataProvider' => $dataProvider,
+ ));
+ }
+
+ /**
+ * Manages all models.
+ */
+ public function actionAdmin()
+ {
+ $model = new VideoChannelRelation('search');
+ $model->unsetAttributes(); // clear any default values
+ if (isset($_GET['VideoChannelRelation']))
+ $model->attributes = $_GET['VideoChannelRelation'];
+
+ $this->render('admin', array(
+ 'model' => $model,
+ ));
+ }
+
+ public function actionJson()
+ {
+ $dataArray = VideoChannelRelation::model()->findAll();
+
+ $this->layout = false;
+ header('Content-type: application/json');
+ echo CJavaScript::jsonEncode($dataArray);
+ Yii::app()->end();
+ }
+
+ /**
+ * Returns the data model based on the primary key given in the GET variable.
+ * If the data model is not found, an HTTP exception will be raised.
+ * @param integer $id the ID of the model to be loaded
+ * @return VideoChannelRelation the loaded model
+ * @throws CHttpException
+ */
+ public function loadModel($id)
+ {
+ $model = VideoChannelRelation::model()->findByPk($id);
+ if ($model === null)
+ throw new CHttpException(404, 'The requested page does not exist.');
+ return $model;
+ }
+
+ /**
+ * Performs the AJAX validation.
+ * @param VideoChannelRelation $model the model to be validated
+ */
+ protected function performAjaxValidation($model)
+ {
+ if (isset($_POST['ajax']) && $_POST['ajax'] === 'video-channel-relation-form')
+ {
+ echo CActiveForm::validate($model);
+ Yii::app()->end();
+ }
+ }
+
+}
diff --git a/web/protected/controllers/VideoController.php b/web/protected/controllers/VideoController.php
new file mode 100644
index 0000000..10a720d
--- /dev/null
+++ b/web/protected/controllers/VideoController.php
@@ -0,0 +1,183 @@
+ array('index', 'view', 'create', 'update', 'admin', 'delete'),
+ 'users' => array('@'),
+ ),
+ array('allow',
+ 'actions' => array('json'),
+ 'users' => array('*'),
+ ),
+ array('deny', // deny all users
+ 'users' => array('*'),
+ ),
+ );
+ }
+
+ /**
+ * Displays a particular model.
+ * @param integer $id the ID of the model to be displayed
+ */
+ public function actionView($id)
+ {
+ $this->render('view', array(
+ 'model' => $this->loadModel($id),
+ ));
+ }
+
+ /**
+ * Creates a new model.
+ * If creation is successful, the browser will be redirected to the 'view' page.
+ */
+ public function actionCreate()
+ {
+ $model = new Video;
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['Video']))
+ {
+ $model->attributes = $_POST['Video'];
+
+ $model->previewImageHash = md5_file($model->previewImageUrl);
+
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('create', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Updates a particular model.
+ * If update is successful, the browser will be redirected to the 'view' page.
+ * @param integer $id the ID of the model to be updated
+ */
+ public function actionUpdate($id)
+ {
+ $model = $this->loadModel($id);
+
+ // Uncomment the following line if AJAX validation is needed
+ // $this->performAjaxValidation($model);
+
+ if (isset($_POST['Video']))
+ {
+ $model->attributes = $_POST['Video'];
+ if ($model->save())
+ $this->redirect(array('view', 'id' => $model->id));
+ }
+
+ $this->render('update', array(
+ 'model' => $model,
+ ));
+ }
+
+ /**
+ * Deletes a particular model.
+ * If deletion is successful, the browser will be redirected to the 'admin' page.
+ * @param integer $id the ID of the model to be deleted
+ */
+ public function actionDelete($id)
+ {
+ $this->loadModel($id)->delete();
+
+ // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
+ if (!isset($_GET['ajax']))
+ $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
+ }
+
+ /**
+ * Lists all models.
+ */
+ public function actionIndex()
+ {
+ $dataProvider = new CActiveDataProvider('Video');
+ $this->render('index', array(
+ 'dataProvider' => $dataProvider,
+ ));
+ }
+
+ /**
+ * Manages all models.
+ */
+ public function actionAdmin()
+ {
+ $model = new Video('search');
+ $model->unsetAttributes(); // clear any default values
+ if (isset($_GET['Video']))
+ $model->attributes = $_GET['Video'];
+
+ $this->render('admin', array(
+ 'model' => $model,
+ ));
+ }
+
+ public function actionJson()
+ {
+ $dataArray = Video::model()->findAll();
+
+ $this->layout = false;
+ header('Content-type: application/json');
+ echo CJavaScript::jsonEncode($dataArray);
+ Yii::app()->end();
+ }
+
+ /**
+ * Returns the data model based on the primary key given in the GET variable.
+ * If the data model is not found, an HTTP exception will be raised.
+ * @param integer $id the ID of the model to be loaded
+ * @return Video the loaded model
+ * @throws CHttpException
+ */
+ public function loadModel($id)
+ {
+ $model = Video::model()->findByPk($id);
+ if ($model === null)
+ throw new CHttpException(404, 'The requested page does not exist.');
+ return $model;
+ }
+
+ /**
+ * Performs the AJAX validation.
+ * @param Video $model the model to be validated
+ */
+ protected function performAjaxValidation($model)
+ {
+ if (isset($_POST['ajax']) && $_POST['ajax'] === 'video-form')
+ {
+ echo CActiveForm::validate($model);
+ Yii::app()->end();
+ }
+ }
+
+}
diff --git a/web/protected/data/schema.mysql.sql b/web/protected/data/schema.mysql.sql
new file mode 100644
index 0000000..32788bd
--- /dev/null
+++ b/web/protected/data/schema.mysql.sql
@@ -0,0 +1,28 @@
+CREATE TABLE tbl_user (
+ id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ username VARCHAR(128) NOT NULL,
+ password VARCHAR(128) NOT NULL,
+ email VARCHAR(128) NOT NULL
+);
+
+INSERT INTO tbl_user (username, password, email) VALUES ('test1', 'pass1', 'test1@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test2', 'pass2', 'test2@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test3', 'pass3', 'test3@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test4', 'pass4', 'test4@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test5', 'pass5', 'test5@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test6', 'pass6', 'test6@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test7', 'pass7', 'test7@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test8', 'pass8', 'test8@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test9', 'pass9', 'test9@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test10', 'pass10', 'test10@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test11', 'pass11', 'test11@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test12', 'pass12', 'test12@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test13', 'pass13', 'test13@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test14', 'pass14', 'test14@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test15', 'pass15', 'test15@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test16', 'pass16', 'test16@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test17', 'pass17', 'test17@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test18', 'pass18', 'test18@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test19', 'pass19', 'test19@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test20', 'pass20', 'test20@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test21', 'pass21', 'test21@example.com');
diff --git a/web/protected/data/schema.sqlite.sql b/web/protected/data/schema.sqlite.sql
new file mode 100644
index 0000000..e5e0830
--- /dev/null
+++ b/web/protected/data/schema.sqlite.sql
@@ -0,0 +1,28 @@
+CREATE TABLE tbl_user (
+ id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
+ username VARCHAR(128) NOT NULL,
+ password VARCHAR(128) NOT NULL,
+ email VARCHAR(128) NOT NULL
+);
+
+INSERT INTO tbl_user (username, password, email) VALUES ('test1', 'pass1', 'test1@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test2', 'pass2', 'test2@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test3', 'pass3', 'test3@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test4', 'pass4', 'test4@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test5', 'pass5', 'test5@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test6', 'pass6', 'test6@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test7', 'pass7', 'test7@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test8', 'pass8', 'test8@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test9', 'pass9', 'test9@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test10', 'pass10', 'test10@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test11', 'pass11', 'test11@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test12', 'pass12', 'test12@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test13', 'pass13', 'test13@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test14', 'pass14', 'test14@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test15', 'pass15', 'test15@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test16', 'pass16', 'test16@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test17', 'pass17', 'test17@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test18', 'pass18', 'test18@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test19', 'pass19', 'test19@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test20', 'pass20', 'test20@example.com');
+INSERT INTO tbl_user (username, password, email) VALUES ('test21', 'pass21', 'test21@example.com');
diff --git a/web/protected/data/testdrive.db b/web/protected/data/testdrive.db
new file mode 100644
index 0000000..0672b21
Binary files /dev/null and b/web/protected/data/testdrive.db differ
diff --git a/web/protected/models/Album.php b/web/protected/models/Album.php
new file mode 100644
index 0000000..cb585f2
--- /dev/null
+++ b/web/protected/models/Album.php
@@ -0,0 +1,100 @@
+'search'),
+ );
+ }
+
+ /**
+ * @return array relational rules.
+ */
+ public function relations()
+ {
+ // NOTE: you may need to adjust the relation name and the related
+ // class name for the relations automatically generated below.
+ return array(
+ );
+ }
+
+ /**
+ * @return array customized attribute labels (name=>label)
+ */
+ public function attributeLabels()
+ {
+ return array(
+ 'id' => 'ID',
+ 'name' => 'Name',
+ 'title' => 'Title',
+ 'description' => 'Description',
+ );
+ }
+
+ /**
+ * Retrieves a list of models based on the current search/filter conditions.
+ *
+ * Typical usecase:
+ * - Initialize the model fields with values from filter form.
+ * - Execute this method to get CActiveDataProvider instance which will filter
+ * models according to data in model fields.
+ * - Pass data provider to CGridView, CListView or any similar widget.
+ *
+ * @return CActiveDataProvider the data provider that can return the models
+ * based on the search/filter conditions.
+ */
+ public function search()
+ {
+ // @todo Please modify the following code to remove attributes that should not be searched.
+
+ $criteria=new CDbCriteria;
+
+ $criteria->compare('id',$this->id);
+ $criteria->compare('name',$this->name,true);
+ $criteria->compare('title',$this->title,true);
+ $criteria->compare('description',$this->description,true);
+
+ return new CActiveDataProvider($this, array(
+ 'criteria'=>$criteria,
+ ));
+ }
+
+ /**
+ * Returns the static model of the specified AR class.
+ * Please note that you should have this exact method in all your CActiveRecord descendants!
+ * @param string $className active record class name.
+ * @return Album the static model class
+ */
+ public static function model($className=__CLASS__)
+ {
+ return parent::model($className);
+ }
+}
diff --git a/web/protected/models/AlbumArticleRelation.php b/web/protected/models/AlbumArticleRelation.php
new file mode 100644
index 0000000..f3c5f4d
--- /dev/null
+++ b/web/protected/models/AlbumArticleRelation.php
@@ -0,0 +1,96 @@
+'search'),
+ );
+ }
+
+ /**
+ * @return array relational rules.
+ */
+ public function relations()
+ {
+ // NOTE: you may need to adjust the relation name and the related
+ // class name for the relations automatically generated below.
+ return array(
+ );
+ }
+
+ /**
+ * @return array customized attribute labels (name=>label)
+ */
+ public function attributeLabels()
+ {
+ return array(
+ 'id' => 'ID',
+ 'albumName' => 'Album Name',
+ 'articleName' => 'Article Name',
+ );
+ }
+
+ /**
+ * Retrieves a list of models based on the current search/filter conditions.
+ *
+ * Typical usecase:
+ * - Initialize the model fields with values from filter form.
+ * - Execute this method to get CActiveDataProvider instance which will filter
+ * models according to data in model fields.
+ * - Pass data provider to CGridView, CListView or any similar widget.
+ *
+ * @return CActiveDataProvider the data provider that can return the models
+ * based on the search/filter conditions.
+ */
+ public function search()
+ {
+ // @todo Please modify the following code to remove attributes that should not be searched.
+
+ $criteria=new CDbCriteria;
+
+ $criteria->compare('id',$this->id);
+ $criteria->compare('albumName',$this->albumName,true);
+ $criteria->compare('articleName',$this->articleName,true);
+
+ return new CActiveDataProvider($this, array(
+ 'criteria'=>$criteria,
+ ));
+ }
+
+ /**
+ * Returns the static model of the specified AR class.
+ * Please note that you should have this exact method in all your CActiveRecord descendants!
+ * @param string $className active record class name.
+ * @return AlbumArticleRelation the static model class
+ */
+ public static function model($className=__CLASS__)
+ {
+ return parent::model($className);
+ }
+}
diff --git a/web/protected/models/Article.php b/web/protected/models/Article.php
new file mode 100644
index 0000000..749b419
--- /dev/null
+++ b/web/protected/models/Article.php
@@ -0,0 +1,117 @@
+true),
+ array('geoLat, geoLon', 'numerical'),
+ array('title, content, externalLink, dateTime', 'safe'),
+ // The following rule is used by search().
+ // @todo Please remove those attributes that should not be searched.
+ array('id, name, type, title, content, geoLat, geoLon, externalLink, dateTime', 'safe', 'on'=>'search'),
+ );
+ }
+
+ /**
+ * @return array relational rules.
+ */
+ public function relations()
+ {
+ // NOTE: you may need to adjust the relation name and the related
+ // class name for the relations automatically generated below.
+ return array(
+ );
+ }
+
+ /**
+ * @return array customized attribute labels (name=>label)
+ */
+ public function attributeLabels()
+ {
+ return array(
+ 'id' => 'ID',
+ 'name' => 'Name',
+ 'type' => 'Type',
+ 'title' => 'Title',
+ 'content' => 'Content',
+ 'geoLat' => 'Geo Lat',
+ 'geoLon' => 'Geo Lon',
+ 'externalLink' => 'External Link',
+ 'dateTime' => 'Date Time',
+ );
+ }
+
+ /**
+ * Retrieves a list of models based on the current search/filter conditions.
+ *
+ * Typical usecase:
+ * - Initialize the model fields with values from filter form.
+ * - Execute this method to get CActiveDataProvider instance which will filter
+ * models according to data in model fields.
+ * - Pass data provider to CGridView, CListView or any similar widget.
+ *
+ * @return CActiveDataProvider the data provider that can return the models
+ * based on the search/filter conditions.
+ */
+ public function search()
+ {
+ // @todo Please modify the following code to remove attributes that should not be searched.
+
+ $criteria=new CDbCriteria;
+
+ $criteria->compare('id',$this->id);
+ $criteria->compare('name',$this->name,true);
+ $criteria->compare('type',$this->type);
+ $criteria->compare('title',$this->title,true);
+ $criteria->compare('content',$this->content,true);
+ $criteria->compare('geoLat',$this->geoLat);
+ $criteria->compare('geoLon',$this->geoLon);
+ $criteria->compare('externalLink',$this->externalLink,true);
+ $criteria->compare('dateTime',$this->dateTime,true);
+
+ return new CActiveDataProvider($this, array(
+ 'criteria'=>$criteria,
+ ));
+ }
+
+ /**
+ * Returns the static model of the specified AR class.
+ * Please note that you should have this exact method in all your CActiveRecord descendants!
+ * @param string $className active record class name.
+ * @return Article the static model class
+ */
+ public static function model($className=__CLASS__)
+ {
+ return parent::model($className);
+ }
+}
diff --git a/web/protected/models/ArticleJournalRelation.php b/web/protected/models/ArticleJournalRelation.php
new file mode 100644
index 0000000..00d49ed
--- /dev/null
+++ b/web/protected/models/ArticleJournalRelation.php
@@ -0,0 +1,96 @@
+'search'),
+ );
+ }
+
+ /**
+ * @return array relational rules.
+ */
+ public function relations()
+ {
+ // NOTE: you may need to adjust the relation name and the related
+ // class name for the relations automatically generated below.
+ return array(
+ );
+ }
+
+ /**
+ * @return array customized attribute labels (name=>label)
+ */
+ public function attributeLabels()
+ {
+ return array(
+ 'id' => 'ID',
+ 'articleName' => 'Article Name',
+ 'journalName' => 'Journal Name',
+ );
+ }
+
+ /**
+ * Retrieves a list of models based on the current search/filter conditions.
+ *
+ * Typical usecase:
+ * - Initialize the model fields with values from filter form.
+ * - Execute this method to get CActiveDataProvider instance which will filter
+ * models according to data in model fields.
+ * - Pass data provider to CGridView, CListView or any similar widget.
+ *
+ * @return CActiveDataProvider the data provider that can return the models
+ * based on the search/filter conditions.
+ */
+ public function search()
+ {
+ // @todo Please modify the following code to remove attributes that should not be searched.
+
+ $criteria=new CDbCriteria;
+
+ $criteria->compare('id',$this->id);
+ $criteria->compare('articleName',$this->articleName,true);
+ $criteria->compare('journalName',$this->journalName,true);
+
+ return new CActiveDataProvider($this, array(
+ 'criteria'=>$criteria,
+ ));
+ }
+
+ /**
+ * Returns the static model of the specified AR class.
+ * Please note that you should have this exact method in all your CActiveRecord descendants!
+ * @param string $className active record class name.
+ * @return ArticleJournalRelation the static model class
+ */
+ public static function model($className=__CLASS__)
+ {
+ return parent::model($className);
+ }
+}
diff --git a/web/protected/models/Channel.php b/web/protected/models/Channel.php
new file mode 100644
index 0000000..11a0cc1
--- /dev/null
+++ b/web/protected/models/Channel.php
@@ -0,0 +1,100 @@
+'search'),
+ );
+ }
+
+ /**
+ * @return array relational rules.
+ */
+ public function relations()
+ {
+ // NOTE: you may need to adjust the relation name and the related
+ // class name for the relations automatically generated below.
+ return array(
+ );
+ }
+
+ /**
+ * @return array customized attribute labels (name=>label)
+ */
+ public function attributeLabels()
+ {
+ return array(
+ 'id' => 'ID',
+ 'name' => 'Name',
+ 'title' => 'Title',
+ 'description' => 'Description',
+ );
+ }
+
+ /**
+ * Retrieves a list of models based on the current search/filter conditions.
+ *
+ * Typical usecase:
+ * - Initialize the model fields with values from filter form.
+ * - Execute this method to get CActiveDataProvider instance which will filter
+ * models according to data in model fields.
+ * - Pass data provider to CGridView, CListView or any similar widget.
+ *
+ * @return CActiveDataProvider the data provider that can return the models
+ * based on the search/filter conditions.
+ */
+ public function search()
+ {
+ // @todo Please modify the following code to remove attributes that should not be searched.
+
+ $criteria=new CDbCriteria;
+
+ $criteria->compare('id',$this->id);
+ $criteria->compare('name',$this->name,true);
+ $criteria->compare('title',$this->title,true);
+ $criteria->compare('description',$this->description,true);
+
+ return new CActiveDataProvider($this, array(
+ 'criteria'=>$criteria,
+ ));
+ }
+
+ /**
+ * Returns the static model of the specified AR class.
+ * Please note that you should have this exact method in all your CActiveRecord descendants!
+ * @param string $className active record class name.
+ * @return Channel the static model class
+ */
+ public static function model($className=__CLASS__)
+ {
+ return parent::model($className);
+ }
+}
diff --git a/web/protected/models/ChannelArticleRelation.php b/web/protected/models/ChannelArticleRelation.php
new file mode 100644
index 0000000..c432a4d
--- /dev/null
+++ b/web/protected/models/ChannelArticleRelation.php
@@ -0,0 +1,96 @@
+'search'),
+ );
+ }
+
+ /**
+ * @return array relational rules.
+ */
+ public function relations()
+ {
+ // NOTE: you may need to adjust the relation name and the related
+ // class name for the relations automatically generated below.
+ return array(
+ );
+ }
+
+ /**
+ * @return array customized attribute labels (name=>label)
+ */
+ public function attributeLabels()
+ {
+ return array(
+ 'id' => 'ID',
+ 'channelName' => 'Channel Name',
+ 'articleName' => 'Article Name',
+ );
+ }
+
+ /**
+ * Retrieves a list of models based on the current search/filter conditions.
+ *
+ * Typical usecase:
+ * - Initialize the model fields with values from filter form.
+ * - Execute this method to get CActiveDataProvider instance which will filter
+ * models according to data in model fields.
+ * - Pass data provider to CGridView, CListView or any similar widget.
+ *
+ * @return CActiveDataProvider the data provider that can return the models
+ * based on the search/filter conditions.
+ */
+ public function search()
+ {
+ // @todo Please modify the following code to remove attributes that should not be searched.
+
+ $criteria=new CDbCriteria;
+
+ $criteria->compare('id',$this->id);
+ $criteria->compare('channelName',$this->channelName,true);
+ $criteria->compare('articleName',$this->articleName,true);
+
+ return new CActiveDataProvider($this, array(
+ 'criteria'=>$criteria,
+ ));
+ }
+
+ /**
+ * Returns the static model of the specified AR class.
+ * Please note that you should have this exact method in all your CActiveRecord descendants!
+ * @param string $className active record class name.
+ * @return ChannelArticleRelation the static model class
+ */
+ public static function model($className=__CLASS__)
+ {
+ return parent::model($className);
+ }
+}
diff --git a/web/protected/models/ContactForm.php b/web/protected/models/ContactForm.php
new file mode 100644
index 0000000..86541cb
--- /dev/null
+++ b/web/protected/models/ContactForm.php
@@ -0,0 +1,42 @@
+!CCaptcha::checkRequirements()),
+ );
+ }
+
+ /**
+ * Declares customized attribute labels.
+ * If not declared here, an attribute would have a label that is
+ * the same as its name with the first letter in upper case.
+ */
+ public function attributeLabels()
+ {
+ return array(
+ 'verifyCode'=>'Verification Code',
+ );
+ }
+}
\ No newline at end of file
diff --git a/web/protected/models/Journal.php b/web/protected/models/Journal.php
new file mode 100644
index 0000000..fc38754
--- /dev/null
+++ b/web/protected/models/Journal.php
@@ -0,0 +1,100 @@
+'search'),
+ );
+ }
+
+ /**
+ * @return array relational rules.
+ */
+ public function relations()
+ {
+ // NOTE: you may need to adjust the relation name and the related
+ // class name for the relations automatically generated below.
+ return array(
+ );
+ }
+
+ /**
+ * @return array customized attribute labels (name=>label)
+ */
+ public function attributeLabels()
+ {
+ return array(
+ 'id' => 'ID',
+ 'name' => 'Name',
+ 'title' => 'Title',
+ 'description' => 'Description',
+ );
+ }
+
+ /**
+ * Retrieves a list of models based on the current search/filter conditions.
+ *
+ * Typical usecase:
+ * - Initialize the model fields with values from filter form.
+ * - Execute this method to get CActiveDataProvider instance which will filter
+ * models according to data in model fields.
+ * - Pass data provider to CGridView, CListView or any similar widget.
+ *
+ * @return CActiveDataProvider the data provider that can return the models
+ * based on the search/filter conditions.
+ */
+ public function search()
+ {
+ // @todo Please modify the following code to remove attributes that should not be searched.
+
+ $criteria=new CDbCriteria;
+
+ $criteria->compare('id',$this->id);
+ $criteria->compare('name',$this->name,true);
+ $criteria->compare('title',$this->title,true);
+ $criteria->compare('description',$this->description,true);
+
+ return new CActiveDataProvider($this, array(
+ 'criteria'=>$criteria,
+ ));
+ }
+
+ /**
+ * Returns the static model of the specified AR class.
+ * Please note that you should have this exact method in all your CActiveRecord descendants!
+ * @param string $className active record class name.
+ * @return Journal the static model class
+ */
+ public static function model($className=__CLASS__)
+ {
+ return parent::model($className);
+ }
+}
diff --git a/web/protected/models/LoginForm.php b/web/protected/models/LoginForm.php
new file mode 100644
index 0000000..eb36e4a
--- /dev/null
+++ b/web/protected/models/LoginForm.php
@@ -0,0 +1,77 @@
+'Remember me next time',
+ );
+ }
+
+ /**
+ * Authenticates the password.
+ * This is the 'authenticate' validator as declared in rules().
+ */
+ public function authenticate($attribute,$params)
+ {
+ if(!$this->hasErrors())
+ {
+ $this->_identity=new UserIdentity($this->username,$this->password);
+ if(!$this->_identity->authenticate())
+ $this->addError('password','Incorrect username or password.');
+ }
+ }
+
+ /**
+ * Logs in the user using the given username and password in the model.
+ * @return boolean whether login is successful
+ */
+ public function login()
+ {
+ if($this->_identity===null)
+ {
+ $this->_identity=new UserIdentity($this->username,$this->password);
+ $this->_identity->authenticate();
+ }
+ if($this->_identity->errorCode===UserIdentity::ERROR_NONE)
+ {
+ $duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days
+ Yii::app()->user->login($this->_identity,$duration);
+ return true;
+ }
+ else
+ return false;
+ }
+}
diff --git a/web/protected/models/Photo.php b/web/protected/models/Photo.php
new file mode 100644
index 0000000..6c970af
--- /dev/null
+++ b/web/protected/models/Photo.php
@@ -0,0 +1,108 @@
+'search'),
+ );
+ }
+
+ /**
+ * @return array relational rules.
+ */
+ public function relations()
+ {
+ // NOTE: you may need to adjust the relation name and the related
+ // class name for the relations automatically generated below.
+ return array(
+ );
+ }
+
+ /**
+ * @return array customized attribute labels (name=>label)
+ */
+ public function attributeLabels()
+ {
+ return array(
+ 'id' => 'ID',
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'imageUrl' => 'Image Url',
+ 'geoLat' => 'Geo Lat',
+ 'geoLon' => 'Geo Lon',
+ );
+ }
+
+ /**
+ * Retrieves a list of models based on the current search/filter conditions.
+ *
+ * Typical usecase:
+ * - Initialize the model fields with values from filter form.
+ * - Execute this method to get CActiveDataProvider instance which will filter
+ * models according to data in model fields.
+ * - Pass data provider to CGridView, CListView or any similar widget.
+ *
+ * @return CActiveDataProvider the data provider that can return the models
+ * based on the search/filter conditions.
+ */
+ public function search()
+ {
+ // @todo Please modify the following code to remove attributes that should not be searched.
+
+ $criteria=new CDbCriteria;
+
+ $criteria->compare('id',$this->id);
+ $criteria->compare('title',$this->title,true);
+ $criteria->compare('description',$this->description,true);
+ $criteria->compare('imageUrl',$this->imageUrl,true);
+ $criteria->compare('geoLat',$this->geoLat);
+ $criteria->compare('geoLon',$this->geoLon);
+
+ return new CActiveDataProvider($this, array(
+ 'criteria'=>$criteria,
+ ));
+ }
+
+ /**
+ * Returns the static model of the specified AR class.
+ * Please note that you should have this exact method in all your CActiveRecord descendants!
+ * @param string $className active record class name.
+ * @return Photo the static model class
+ */
+ public static function model($className=__CLASS__)
+ {
+ return parent::model($className);
+ }
+}
diff --git a/web/protected/models/PhotoAlbumRelation.php b/web/protected/models/PhotoAlbumRelation.php
new file mode 100644
index 0000000..b58bbe1
--- /dev/null
+++ b/web/protected/models/PhotoAlbumRelation.php
@@ -0,0 +1,97 @@
+45),
+ // The following rule is used by search().
+ // @todo Please remove those attributes that should not be searched.
+ array('id, imageUrl, name', 'safe', 'on'=>'search'),
+ );
+ }
+
+ /**
+ * @return array relational rules.
+ */
+ public function relations()
+ {
+ // NOTE: you may need to adjust the relation name and the related
+ // class name for the relations automatically generated below.
+ return array(
+ );
+ }
+
+ /**
+ * @return array customized attribute labels (name=>label)
+ */
+ public function attributeLabels()
+ {
+ return array(
+ 'id' => 'ID',
+ 'imageUrl' => 'Image Url',
+ 'name' => 'Name',
+ );
+ }
+
+ /**
+ * Retrieves a list of models based on the current search/filter conditions.
+ *
+ * Typical usecase:
+ * - Initialize the model fields with values from filter form.
+ * - Execute this method to get CActiveDataProvider instance which will filter
+ * models according to data in model fields.
+ * - Pass data provider to CGridView, CListView or any similar widget.
+ *
+ * @return CActiveDataProvider the data provider that can return the models
+ * based on the search/filter conditions.
+ */
+ public function search()
+ {
+ // @todo Please modify the following code to remove attributes that should not be searched.
+
+ $criteria=new CDbCriteria;
+
+ $criteria->compare('id',$this->id);
+ $criteria->compare('imageUrl',$this->imageUrl,true);
+ $criteria->compare('name',$this->name,true);
+
+ return new CActiveDataProvider($this, array(
+ 'criteria'=>$criteria,
+ ));
+ }
+
+ /**
+ * Returns the static model of the specified AR class.
+ * Please note that you should have this exact method in all your CActiveRecord descendants!
+ * @param string $className active record class name.
+ * @return PhotoAlbumRelation the static model class
+ */
+ public static function model($className=__CLASS__)
+ {
+ return parent::model($className);
+ }
+}
diff --git a/web/protected/models/User.php b/web/protected/models/User.php
new file mode 100644
index 0000000..7b135c3
--- /dev/null
+++ b/web/protected/models/User.php
@@ -0,0 +1,49 @@
+ '{attribute} ' . Yii::t('app', 'Field should not be blank')),
+ array('username, password, email', 'length', 'max' => 100, 'tooLong' => '{attribute} ' . Yii::t('app', 'Line is too long')),
+ array('email', 'email', 'message' => Yii::t('app', 'Email address is not correct')),
+ array('username, email', 'unique'),
+ array('verifyCode', 'captcha', 'allowEmpty' => false, 'message' => Yii::t('app', 'Confirmation code is not correct')),
+ );
+ }
+
+ public function unique($attribute, $params)
+ {
+
+ if (!$this->hasErrors())
+ {
+ $count = user::model()->count($attribute . '=:attribute', array('attribute' => $this->attributes[$attribute]));
+ if ($count != 0)
+ $this->addError($attribute, Yii::t('app', 'User {attribute} is already registered in system'), array('{attribute}' => $this->attributes[$attribute]));
+ }
+ }
+
+ function attributeLabels()
+ {
+ return array(
+ 'username' => Yii::t('app', 'Username:'),
+ 'password' => Yii::t('app', 'Password:'),
+ 'email' => Yii::t('app', 'Email:'),
+ 'verifyCode' => Yii::t('app', 'Confirmation code:'),
+ );
+ }
+
+}
diff --git a/web/protected/models/Video.php b/web/protected/models/Video.php
new file mode 100644
index 0000000..48ca4c1
--- /dev/null
+++ b/web/protected/models/Video.php
@@ -0,0 +1,108 @@
+true),
+ array('title, description', 'safe'),
+ // The following rule is used by search().
+ // @todo Please remove those attributes that should not be searched.
+ array('id, type, videoUrl, title, description, previewImageUrl', 'safe', 'on'=>'search'),
+ );
+ }
+
+ /**
+ * @return array relational rules.
+ */
+ public function relations()
+ {
+ // NOTE: you may need to adjust the relation name and the related
+ // class name for the relations automatically generated below.
+ return array(
+ );
+ }
+
+ /**
+ * @return array customized attribute labels (name=>label)
+ */
+ public function attributeLabels()
+ {
+ return array(
+ 'id' => 'ID',
+ 'type' => 'Type',
+ 'videoUrl' => 'Video Url',
+ 'title' => 'Title',
+ 'description' => 'Description',
+ 'previewImageUrl' => 'Preview Image Url',
+ );
+ }
+
+ /**
+ * Retrieves a list of models based on the current search/filter conditions.
+ *
+ * Typical usecase:
+ * - Initialize the model fields with values from filter form.
+ * - Execute this method to get CActiveDataProvider instance which will filter
+ * models according to data in model fields.
+ * - Pass data provider to CGridView, CListView or any similar widget.
+ *
+ * @return CActiveDataProvider the data provider that can return the models
+ * based on the search/filter conditions.
+ */
+ public function search()
+ {
+ // @todo Please modify the following code to remove attributes that should not be searched.
+
+ $criteria=new CDbCriteria;
+
+ $criteria->compare('id',$this->id);
+ $criteria->compare('type',$this->type);
+ $criteria->compare('videoUrl',$this->videoUrl,true);
+ $criteria->compare('title',$this->title,true);
+ $criteria->compare('description',$this->description,true);
+ $criteria->compare('previewImageUrl',$this->previewImageUrl,true);
+
+ return new CActiveDataProvider($this, array(
+ 'criteria'=>$criteria,
+ ));
+ }
+
+ /**
+ * Returns the static model of the specified AR class.
+ * Please note that you should have this exact method in all your CActiveRecord descendants!
+ * @param string $className active record class name.
+ * @return Video the static model class
+ */
+ public static function model($className=__CLASS__)
+ {
+ return parent::model($className);
+ }
+}
diff --git a/web/protected/models/VideoChannelRelation.php b/web/protected/models/VideoChannelRelation.php
new file mode 100644
index 0000000..8603318
--- /dev/null
+++ b/web/protected/models/VideoChannelRelation.php
@@ -0,0 +1,97 @@
+true),
+ // The following rule is used by search().
+ // @todo Please remove those attributes that should not be searched.
+ array('id, videoUrl, name', 'safe', 'on'=>'search'),
+ );
+ }
+
+ /**
+ * @return array relational rules.
+ */
+ public function relations()
+ {
+ // NOTE: you may need to adjust the relation name and the related
+ // class name for the relations automatically generated below.
+ return array(
+ );
+ }
+
+ /**
+ * @return array customized attribute labels (name=>label)
+ */
+ public function attributeLabels()
+ {
+ return array(
+ 'id' => 'ID',
+ 'videoUrl' => 'Video Url',
+ 'name' => 'Name',
+ );
+ }
+
+ /**
+ * Retrieves a list of models based on the current search/filter conditions.
+ *
+ * Typical usecase:
+ * - Initialize the model fields with values from filter form.
+ * - Execute this method to get CActiveDataProvider instance which will filter
+ * models according to data in model fields.
+ * - Pass data provider to CGridView, CListView or any similar widget.
+ *
+ * @return CActiveDataProvider the data provider that can return the models
+ * based on the search/filter conditions.
+ */
+ public function search()
+ {
+ // @todo Please modify the following code to remove attributes that should not be searched.
+
+ $criteria=new CDbCriteria;
+
+ $criteria->compare('id',$this->id);
+ $criteria->compare('videoUrl',$this->videoUrl,true);
+ $criteria->compare('name',$this->name,true);
+
+ return new CActiveDataProvider($this, array(
+ 'criteria'=>$criteria,
+ ));
+ }
+
+ /**
+ * Returns the static model of the specified AR class.
+ * Please note that you should have this exact method in all your CActiveRecord descendants!
+ * @param string $className active record class name.
+ * @return VideoChannelRelation the static model class
+ */
+ public static function model($className=__CLASS__)
+ {
+ return parent::model($className);
+ }
+}
diff --git a/web/protected/runtime/application.log b/web/protected/runtime/application.log
new file mode 100644
index 0000000..7df82b0
--- /dev/null
+++ b/web/protected/runtime/application.log
@@ -0,0 +1,138 @@
+2015/06/23 13:52:37 [error] [system.db.CDbCommand] CDbCommand::execute() failed: SQLSTATE[HY000]: General error: 1364 Field 'date' doesn't have a default value. The SQL statement executed was: INSERT INTO `tbl_user` (`level`, `username`, `password`, `email`) VALUES (:yp0, :yp1, :yp2, :yp3).
+in C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\SiteController.php (115)
+in C:\Workplace\Apache2.4\htdocs\bashgid\index.php (13)
+2015/06/23 13:52:37 [error] [exception.CDbException] exception 'CDbException' with message 'CDbCommand failed to execute the SQL statement: SQLSTATE[HY000]: General error: 1364 Field 'date' doesn't have a default value. The SQL statement executed was: INSERT INTO `tbl_user` (`level`, `username`, `password`, `email`) VALUES (:yp0, :yp1, :yp2, :yp3)' in C:\Workplace\yii1.1.15\framework\db\CDbCommand.php:358
+Stack trace:
+#0 C:\Workplace\yii1.1.15\framework\db\ar\CActiveRecord.php(1077): CDbCommand->execute()
+#1 C:\Workplace\yii1.1.15\framework\db\ar\CActiveRecord.php(806): CActiveRecord->insert(NULL)
+#2 C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\SiteController.php(115): CActiveRecord->save()
+#3 C:\Workplace\yii1.1.15\framework\web\actions\CInlineAction.php(49): SiteController->actionRegister()
+#4 C:\Workplace\yii1.1.15\framework\web\CController.php(308): CInlineAction->runWithParams(Array)
+#5 C:\Workplace\yii1.1.15\framework\web\CController.php(286): CController->runAction(Object(CInlineAction))
+#6 C:\Workplace\yii1.1.15\framework\web\CController.php(265): CController->runActionWithFilters(Object(CInlineAction), Array)
+#7 C:\Workplace\yii1.1.15\framework\web\CWebApplication.php(282): CController->run('register')
+#8 C:\Workplace\yii1.1.15\framework\web\CWebApplication.php(141): CWebApplication->runController('site/register')
+#9 C:\Workplace\yii1.1.15\framework\base\CApplication.php(180): CWebApplication->processRequest()
+#10 C:\Workplace\Apache2.4\htdocs\bashgid\index.php(13): CApplication->run()
+#11 {main}
+REQUEST_URI=/bashgid/index.php?r=site/register
+HTTP_REFERER=http://localhost/bashgid/index.php?r=site/register
+---
+2015/06/23 15:00:02 [warning] [application] Failed to set unsafe attribute "title" of "Photo".
+in C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\PhotoController.php (67)
+in C:\Workplace\Apache2.4\htdocs\bashgid\index.php (13)
+2015/06/23 15:00:02 [warning] [application] Failed to set unsafe attribute "description" of "Photo".
+in C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\PhotoController.php (67)
+in C:\Workplace\Apache2.4\htdocs\bashgid\index.php (13)
+2015/06/23 15:00:03 [error] [system.db.CDbCommand] CDbCommand::execute() failed: SQLSTATE[HY000]: General error: 1364 Field 'title' doesn't have a default value. The SQL statement executed was: INSERT INTO `table_photo` (`geoLat`, `geoLon`, `imageUrl`, `imageHash`) VALUES (:yp0, :yp1, :yp2, :yp3).
+in C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\PhotoController.php (71)
+in C:\Workplace\Apache2.4\htdocs\bashgid\index.php (13)
+2015/06/23 15:00:03 [error] [exception.CDbException] exception 'CDbException' with message 'CDbCommand failed to execute the SQL statement: SQLSTATE[HY000]: General error: 1364 Field 'title' doesn't have a default value. The SQL statement executed was: INSERT INTO `table_photo` (`geoLat`, `geoLon`, `imageUrl`, `imageHash`) VALUES (:yp0, :yp1, :yp2, :yp3)' in C:\Workplace\yii1.1.15\framework\db\CDbCommand.php:358
+Stack trace:
+#0 C:\Workplace\yii1.1.15\framework\db\ar\CActiveRecord.php(1077): CDbCommand->execute()
+#1 C:\Workplace\yii1.1.15\framework\db\ar\CActiveRecord.php(806): CActiveRecord->insert(NULL)
+#2 C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\PhotoController.php(71): CActiveRecord->save()
+#3 C:\Workplace\yii1.1.15\framework\web\actions\CInlineAction.php(49): PhotoController->actionCreate()
+#4 C:\Workplace\yii1.1.15\framework\web\CController.php(308): CInlineAction->runWithParams(Array)
+#5 C:\Workplace\yii1.1.15\framework\web\filters\CFilterChain.php(133): CController->runAction(Object(CInlineAction))
+#6 C:\Workplace\yii1.1.15\framework\web\filters\CFilter.php(40): CFilterChain->run()
+#7 C:\Workplace\yii1.1.15\framework\web\CController.php(1145): CFilter->filter(Object(CFilterChain))
+#8 C:\Workplace\yii1.1.15\framework\web\filters\CInlineFilter.php(58): CController->filterAccessControl(Object(CFilterChain))
+#9 C:\Workplace\yii1.1.15\framework\web\filters\CFilterChain.php(130): CInlineFilter->filter(Object(CFilterChain))
+#10 C:\Workplace\yii1.1.15\framework\web\CController.php(291): CFilterChain->run()
+#11 C:\Workplace\yii1.1.15\framework\web\CController.php(265): CController->runActionWithFilters(Object(CInlineAction), Array)
+#12 C:\Workplace\yii1.1.15\framework\web\CWebApplication.php(282): CController->run('create')
+#13 C:\Workplace\yii1.1.15\framework\web\CWebApplication.php(141): CWebApplication->runController('photo/create')
+#14 C:\Workplace\yii1.1.15\framework\base\CApplication.php(180): CWebApplication->processRequest()
+#15 C:\Workplace\Apache2.4\htdocs\bashgid\index.php(13): CApplication->run()
+#16 {main}
+REQUEST_URI=/bashgid/index.php?r=photo/create
+HTTP_REFERER=http://localhost/bashgid/index.php?r=photo/create
+---
+2015/06/23 15:02:57 [warning] [application] Failed to set unsafe attribute "title" of "Photo".
+in C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\PhotoController.php (67)
+in C:\Workplace\Apache2.4\htdocs\bashgid\index.php (13)
+2015/06/23 15:02:57 [warning] [application] Failed to set unsafe attribute "description" of "Photo".
+in C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\PhotoController.php (67)
+in C:\Workplace\Apache2.4\htdocs\bashgid\index.php (13)
+2015/06/23 15:10:41 [error] [exception.CHttpException.403] exception 'CHttpException' with message 'You are not authorized to perform this action.' in C:\Workplace\yii1.1.15\framework\web\auth\CAccessControlFilter.php:182
+Stack trace:
+#0 C:\Workplace\yii1.1.15\framework\web\auth\CAccessControlFilter.php(145): CAccessControlFilter->accessDenied(Object(CWebUser), 'You are not aut...')
+#1 C:\Workplace\yii1.1.15\framework\web\filters\CFilter.php(38): CAccessControlFilter->preFilter(Object(CFilterChain))
+#2 C:\Workplace\yii1.1.15\framework\web\CController.php(1145): CFilter->filter(Object(CFilterChain))
+#3 C:\Workplace\yii1.1.15\framework\web\filters\CInlineFilter.php(58): CController->filterAccessControl(Object(CFilterChain))
+#4 C:\Workplace\yii1.1.15\framework\web\filters\CFilterChain.php(130): CInlineFilter->filter(Object(CFilterChain))
+#5 C:\Workplace\yii1.1.15\framework\web\CController.php(291): CFilterChain->run()
+#6 C:\Workplace\yii1.1.15\framework\web\CController.php(265): CController->runActionWithFilters(Object(CInlineAction), Array)
+#7 C:\Workplace\yii1.1.15\framework\web\CWebApplication.php(282): CController->run('admin')
+#8 C:\Workplace\yii1.1.15\framework\web\CWebApplication.php(141): CWebApplication->runController('video/admin')
+#9 C:\Workplace\yii1.1.15\framework\base\CApplication.php(180): CWebApplication->processRequest()
+#10 C:\Workplace\Apache2.4\htdocs\bashgid\index.php(13): CApplication->run()
+#11 {main}
+REQUEST_URI=/bashgid/index.php?r=video/admin
+HTTP_REFERER=http://localhost/bashgid/index.php?r=site/index
+---
+2015/06/23 15:17:31 [warning] [application] Failed to set unsafe attribute "title" of "Video".
+in C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\VideoController.php (64)
+in C:\Workplace\Apache2.4\htdocs\bashgid\index.php (13)
+2015/06/23 15:17:31 [warning] [application] Failed to set unsafe attribute "description" of "Video".
+in C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\VideoController.php (64)
+in C:\Workplace\Apache2.4\htdocs\bashgid\index.php (13)
+2015/06/23 15:17:49 [warning] [application] Failed to set unsafe attribute "title" of "Video".
+in C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\VideoController.php (91)
+in C:\Workplace\Apache2.4\htdocs\bashgid\index.php (13)
+2015/06/23 15:17:49 [warning] [application] Failed to set unsafe attribute "description" of "Video".
+in C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\VideoController.php (91)
+in C:\Workplace\Apache2.4\htdocs\bashgid\index.php (13)
+2015/06/23 15:19:51 [warning] [application] Failed to set unsafe attribute "title" of "Video".
+in C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\VideoController.php (64)
+in C:\Workplace\Apache2.4\htdocs\bashgid\index.php (13)
+2015/06/23 15:19:51 [warning] [application] Failed to set unsafe attribute "description" of "Video".
+in C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\VideoController.php (64)
+in C:\Workplace\Apache2.4\htdocs\bashgid\index.php (13)
+2015/06/23 15:22:49 [warning] [application] Failed to set unsafe attribute "title" of "Video".
+in C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\VideoController.php (91)
+in C:\Workplace\Apache2.4\htdocs\bashgid\index.php (13)
+2015/06/23 15:22:49 [warning] [application] Failed to set unsafe attribute "description" of "Video".
+in C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\VideoController.php (91)
+in C:\Workplace\Apache2.4\htdocs\bashgid\index.php (13)
+2015/06/23 15:23:10 [warning] [application] Failed to set unsafe attribute "title" of "Video".
+in C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\VideoController.php (91)
+in C:\Workplace\Apache2.4\htdocs\bashgid\index.php (13)
+2015/06/23 15:23:10 [warning] [application] Failed to set unsafe attribute "description" of "Video".
+in C:\Workplace\Apache2.4\htdocs\bashgid\protected\controllers\VideoController.php (91)
+in C:\Workplace\Apache2.4\htdocs\bashgid\index.php (13)
+2015/06/23 15:23:38 [error] [exception.CHttpException.404] exception 'CHttpException' with message 'Unable to resolve the request "пшш".' in C:\Workplace\yii1.1.15\framework\web\CWebApplication.php:286
+Stack trace:
+#0 C:\Workplace\yii1.1.15\framework\web\CWebApplication.php(141): CWebApplication->runController('\xD0\xBF\xD1\x88\xD1\x88')
+#1 C:\Workplace\yii1.1.15\framework\base\CApplication.php(180): CWebApplication->processRequest()
+#2 C:\Workplace\Apache2.4\htdocs\bashgid\index.php(13): CApplication->run()
+#3 {main}
+REQUEST_URI=/bashgid/index.php?r=%D0%BF%D1%88%D1%88
+---
+2015/06/23 16:08:52 [error] [exception.CHttpException.403] exception 'CHttpException' with message 'You are not authorized to perform this action.' in C:\Workplace\yii1.1.15\framework\web\auth\CAccessControlFilter.php:182
+Stack trace:
+#0 C:\Workplace\yii1.1.15\framework\web\auth\CAccessControlFilter.php(145): CAccessControlFilter->accessDenied(Object(CWebUser), 'You are not aut...')
+#1 C:\Workplace\yii1.1.15\framework\web\filters\CFilter.php(38): CAccessControlFilter->preFilter(Object(CFilterChain))
+#2 C:\Workplace\yii1.1.15\framework\web\CController.php(1145): CFilter->filter(Object(CFilterChain))
+#3 C:\Workplace\yii1.1.15\framework\web\filters\CInlineFilter.php(58): CController->filterAccessControl(Object(CFilterChain))
+#4 C:\Workplace\yii1.1.15\framework\web\filters\CFilterChain.php(130): CInlineFilter->filter(Object(CFilterChain))
+#5 C:\Workplace\yii1.1.15\framework\web\CController.php(291): CFilterChain->run()
+#6 C:\Workplace\yii1.1.15\framework\web\CController.php(265): CController->runActionWithFilters(Object(CInlineAction), Array)
+#7 C:\Workplace\yii1.1.15\framework\web\CWebApplication.php(282): CController->run('json')
+#8 C:\Workplace\yii1.1.15\framework\web\CWebApplication.php(141): CWebApplication->runController('photo/json')
+#9 C:\Workplace\yii1.1.15\framework\base\CApplication.php(180): CWebApplication->processRequest()
+#10 C:\Workplace\Apache2.4\htdocs\bashgid\index.php(13): CApplication->run()
+#11 {main}
+REQUEST_URI=/bashgid/index.php?r=photo/json
+---
+2015/06/23 16:37:01 [error] [exception.CHttpException.404] exception 'CHttpException' with message 'The system is unable to find the requested action "оыщт".' in C:\Workplace\yii1.1.15\framework\web\CController.php:483
+Stack trace:
+#0 C:\Workplace\yii1.1.15\framework\web\CController.php(270): CController->missingAction('\xD0\xBE\xD1\x8B\xD1\x89\xD1\x82')
+#1 C:\Workplace\yii1.1.15\framework\web\CWebApplication.php(282): CController->run('\xD0\xBE\xD1\x8B\xD1\x89\xD1\x82')
+#2 C:\Workplace\yii1.1.15\framework\web\CWebApplication.php(141): CWebApplication->runController('article/\xD0\xBE\xD1\x8B\xD1\x89\xD1...')
+#3 C:\Workplace\yii1.1.15\framework\base\CApplication.php(180): CWebApplication->processRequest()
+#4 C:\Workplace\Apache2.4\htdocs\bashgid\index.php(13): CApplication->run()
+#5 {main}
+REQUEST_URI=/bashgid/index.php?r=article/%D0%BE%D1%8B%D1%89%D1%82
+---
diff --git a/web/protected/runtime/gii-1.1.15/CrudCode.php b/web/protected/runtime/gii-1.1.15/CrudCode.php
new file mode 100644
index 0000000..20e6de0
--- /dev/null
+++ b/web/protected/runtime/gii-1.1.15/CrudCode.php
@@ -0,0 +1,5 @@
+ 'default',
+ 'baseControllerClass' => 'Controller',
+);
diff --git a/web/protected/runtime/gii-1.1.15/ModelCode.php b/web/protected/runtime/gii-1.1.15/ModelCode.php
new file mode 100644
index 0000000..6c7e0e3
--- /dev/null
+++ b/web/protected/runtime/gii-1.1.15/ModelCode.php
@@ -0,0 +1,10 @@
+ 'default',
+ 'connectionId' => 'db',
+ 'tablePrefix' => '',
+ 'modelPath' => 'application.models',
+ 'baseClass' => 'CActiveRecord',
+ 'buildRelations' => '1',
+ 'commentsAsLabels' => '0',
+);
diff --git a/web/protected/tests/WebTestCase.php b/web/protected/tests/WebTestCase.php
new file mode 100644
index 0000000..d252bba
--- /dev/null
+++ b/web/protected/tests/WebTestCase.php
@@ -0,0 +1,25 @@
+setBrowserUrl(TEST_BASE_URL);
+ }
+}
diff --git a/web/protected/tests/bootstrap.php b/web/protected/tests/bootstrap.php
new file mode 100644
index 0000000..77361e9
--- /dev/null
+++ b/web/protected/tests/bootstrap.php
@@ -0,0 +1,10 @@
+open('');
+ $this->assertTextPresent('Welcome');
+ }
+
+ public function testContact()
+ {
+ $this->open('?r=site/contact');
+ $this->assertTextPresent('Contact Us');
+ $this->assertElementPresent('name=ContactForm[name]');
+
+ $this->type('name=ContactForm[name]','tester');
+ $this->type('name=ContactForm[email]','tester@example.com');
+ $this->type('name=ContactForm[subject]','test subject');
+ $this->click("//input[@value='Submit']");
+ $this->waitForTextPresent('Body cannot be blank.');
+ }
+
+ public function testLoginLogout()
+ {
+ $this->open('');
+ // ensure the user is logged out
+ if($this->isTextPresent('Logout'))
+ $this->clickAndWait('link=Logout (demo)');
+
+ // test login process, including validation
+ $this->clickAndWait('link=Login');
+ $this->assertElementPresent('name=LoginForm[username]');
+ $this->type('name=LoginForm[username]','demo');
+ $this->click("//input[@value='Login']");
+ $this->waitForTextPresent('Password cannot be blank.');
+ $this->type('name=LoginForm[password]','demo');
+ $this->clickAndWait("//input[@value='Login']");
+ $this->assertTextNotPresent('Password cannot be blank.');
+ $this->assertTextPresent('Logout');
+
+ // test logout process
+ $this->assertTextNotPresent('Login');
+ $this->clickAndWait('link=Logout (demo)');
+ $this->assertTextPresent('Login');
+ }
+}
diff --git a/web/protected/tests/phpunit.xml b/web/protected/tests/phpunit.xml
new file mode 100644
index 0000000..22c96ff
--- /dev/null
+++ b/web/protected/tests/phpunit.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/web/protected/views/album/_form.php b/web/protected/views/album/_form.php
new file mode 100644
index 0000000..b158efc
--- /dev/null
+++ b/web/protected/views/album/_form.php
@@ -0,0 +1,46 @@
+
+
+
+
+beginWidget('CActiveForm', array(
+ 'id'=>'album-form',
+ // Please note: When you enable ajax validation, make sure the corresponding
+ // controller action is handling ajax validation correctly.
+ // There is a call to performAjaxValidation() commented in generated controller code.
+ // See class documentation of CActiveForm for details on this.
+ 'enableAjaxValidation'=>false,
+)); ?>
+
+
\ No newline at end of file
diff --git a/web/protected/views/album/_search.php b/web/protected/views/album/_search.php
new file mode 100644
index 0000000..feb7e59
--- /dev/null
+++ b/web/protected/views/album/_search.php
@@ -0,0 +1,40 @@
+
+
+
\ No newline at end of file
diff --git a/web/protected/views/album/_view.php b/web/protected/views/album/_view.php
new file mode 100644
index 0000000..ef3d2bb
--- /dev/null
+++ b/web/protected/views/album/_view.php
@@ -0,0 +1,25 @@
+
+
+
+You may optionally enter a comparison operator (<, <=, >, >=, <>
+or =) at the beginning of each of your search values to specify how the comparison should be done.
+
+
+beginWidget('CActiveForm', array(
+ 'id'=>'album-article-relation-form',
+ // Please note: When you enable ajax validation, make sure the corresponding
+ // controller action is handling ajax validation correctly.
+ // There is a call to performAjaxValidation() commented in generated controller code.
+ // See class documentation of CActiveForm for details on this.
+ 'enableAjaxValidation'=>false,
+)); ?>
+
+
\ No newline at end of file
diff --git a/web/protected/views/albumArticleRelation/_search.php b/web/protected/views/albumArticleRelation/_search.php
new file mode 100644
index 0000000..55cbdf8
--- /dev/null
+++ b/web/protected/views/albumArticleRelation/_search.php
@@ -0,0 +1,35 @@
+
+
+
\ No newline at end of file
diff --git a/web/protected/views/albumArticleRelation/_view.php b/web/protected/views/albumArticleRelation/_view.php
new file mode 100644
index 0000000..15df923
--- /dev/null
+++ b/web/protected/views/albumArticleRelation/_view.php
@@ -0,0 +1,21 @@
+
+
+
+You may optionally enter a comparison operator (<, <=, >, >=, <>
+or =) at the beginning of each of your search values to specify how the comparison should be done.
+
+
+beginWidget('CActiveForm', array(
+ 'id'=>'article-form',
+ // Please note: When you enable ajax validation, make sure the corresponding
+ // controller action is handling ajax validation correctly.
+ // There is a call to performAjaxValidation() commented in generated controller code.
+ // See class documentation of CActiveForm for details on this.
+ 'enableAjaxValidation'=>false,
+)); ?>
+
+
\ No newline at end of file
diff --git a/web/protected/views/article/_search.php b/web/protected/views/article/_search.php
new file mode 100644
index 0000000..643b81e
--- /dev/null
+++ b/web/protected/views/article/_search.php
@@ -0,0 +1,65 @@
+
+
+
\ No newline at end of file
diff --git a/web/protected/views/article/_view.php b/web/protected/views/article/_view.php
new file mode 100644
index 0000000..3b92b4f
--- /dev/null
+++ b/web/protected/views/article/_view.php
@@ -0,0 +1,47 @@
+
+
+
+You may optionally enter a comparison operator (<, <=, >, >=, <>
+or =) at the beginning of each of your search values to specify how the comparison should be done.
+
+
+beginWidget('CActiveForm', array(
+ 'id'=>'article-journal-relation-form',
+ // Please note: When you enable ajax validation, make sure the corresponding
+ // controller action is handling ajax validation correctly.
+ // There is a call to performAjaxValidation() commented in generated controller code.
+ // See class documentation of CActiveForm for details on this.
+ 'enableAjaxValidation'=>false,
+)); ?>
+
+
\ No newline at end of file
diff --git a/web/protected/views/articleJournalRelation/_search.php b/web/protected/views/articleJournalRelation/_search.php
new file mode 100644
index 0000000..9ff7eaa
--- /dev/null
+++ b/web/protected/views/articleJournalRelation/_search.php
@@ -0,0 +1,35 @@
+
+
+
\ No newline at end of file
diff --git a/web/protected/views/articleJournalRelation/_view.php b/web/protected/views/articleJournalRelation/_view.php
new file mode 100644
index 0000000..e65da6e
--- /dev/null
+++ b/web/protected/views/articleJournalRelation/_view.php
@@ -0,0 +1,21 @@
+
+
+
+You may optionally enter a comparison operator (<, <=, >, >=, <>
+or =) at the beginning of each of your search values to specify how the comparison should be done.
+
+
+beginWidget('CActiveForm', array(
+ 'id'=>'channel-form',
+ // Please note: When you enable ajax validation, make sure the corresponding
+ // controller action is handling ajax validation correctly.
+ // There is a call to performAjaxValidation() commented in generated controller code.
+ // See class documentation of CActiveForm for details on this.
+ 'enableAjaxValidation'=>false,
+)); ?>
+
+
\ No newline at end of file
diff --git a/web/protected/views/channel/_search.php b/web/protected/views/channel/_search.php
new file mode 100644
index 0000000..1a522e7
--- /dev/null
+++ b/web/protected/views/channel/_search.php
@@ -0,0 +1,40 @@
+
+
+
\ No newline at end of file
diff --git a/web/protected/views/channel/_view.php b/web/protected/views/channel/_view.php
new file mode 100644
index 0000000..d2373f3
--- /dev/null
+++ b/web/protected/views/channel/_view.php
@@ -0,0 +1,25 @@
+
+
+
+You may optionally enter a comparison operator (<, <=, >, >=, <>
+or =) at the beginning of each of your search values to specify how the comparison should be done.
+
+
+beginWidget('CActiveForm', array(
+ 'id'=>'channel-article-relation-form',
+ // Please note: When you enable ajax validation, make sure the corresponding
+ // controller action is handling ajax validation correctly.
+ // There is a call to performAjaxValidation() commented in generated controller code.
+ // See class documentation of CActiveForm for details on this.
+ 'enableAjaxValidation'=>false,
+)); ?>
+
+
\ No newline at end of file
diff --git a/web/protected/views/channelArticleRelation/_search.php b/web/protected/views/channelArticleRelation/_search.php
new file mode 100644
index 0000000..91289f5
--- /dev/null
+++ b/web/protected/views/channelArticleRelation/_search.php
@@ -0,0 +1,35 @@
+
+
+
\ No newline at end of file
diff --git a/web/protected/views/channelArticleRelation/_view.php b/web/protected/views/channelArticleRelation/_view.php
new file mode 100644
index 0000000..6facc33
--- /dev/null
+++ b/web/protected/views/channelArticleRelation/_view.php
@@ -0,0 +1,21 @@
+
+
+
+You may optionally enter a comparison operator (<, <=, >, >=, <>
+or =) at the beginning of each of your search values to specify how the comparison should be done.
+
+
+beginWidget('CActiveForm', array(
+ 'id'=>'journal-form',
+ // Please note: When you enable ajax validation, make sure the corresponding
+ // controller action is handling ajax validation correctly.
+ // There is a call to performAjaxValidation() commented in generated controller code.
+ // See class documentation of CActiveForm for details on this.
+ 'enableAjaxValidation'=>false,
+)); ?>
+
+
\ No newline at end of file
diff --git a/web/protected/views/journal/_search.php b/web/protected/views/journal/_search.php
new file mode 100644
index 0000000..31086b4
--- /dev/null
+++ b/web/protected/views/journal/_search.php
@@ -0,0 +1,40 @@
+
+
+
\ No newline at end of file
diff --git a/web/protected/views/journal/_view.php b/web/protected/views/journal/_view.php
new file mode 100644
index 0000000..cd72fb5
--- /dev/null
+++ b/web/protected/views/journal/_view.php
@@ -0,0 +1,25 @@
+
+
+
+You may optionally enter a comparison operator (<, <=, >, >=, <>
+or =) at the beginning of each of your search values to specify how the comparison should be done.
+
+
+beginWidget('CActiveForm', array(
+ 'id'=>'photo-form',
+ // Please note: When you enable ajax validation, make sure the corresponding
+ // controller action is handling ajax validation correctly.
+ // There is a call to performAjaxValidation() commented in generated controller code.
+ // See class documentation of CActiveForm for details on this.
+ 'enableAjaxValidation'=>false,
+)); ?>
+
+
\ No newline at end of file
diff --git a/web/protected/views/photo/_search.php b/web/protected/views/photo/_search.php
new file mode 100644
index 0000000..9d94274
--- /dev/null
+++ b/web/protected/views/photo/_search.php
@@ -0,0 +1,50 @@
+
+
+
\ No newline at end of file
diff --git a/web/protected/views/photo/_view.php b/web/protected/views/photo/_view.php
new file mode 100644
index 0000000..3ddbbbc
--- /dev/null
+++ b/web/protected/views/photo/_view.php
@@ -0,0 +1,33 @@
+
+
+
+You may optionally enter a comparison operator (<, <=, >, >=, <>
+or =) at the beginning of each of your search values to specify how the comparison should be done.
+
+
+beginWidget('CActiveForm', array(
+ 'id'=>'photo-album-relation-form',
+ // Please note: When you enable ajax validation, make sure the corresponding
+ // controller action is handling ajax validation correctly.
+ // There is a call to performAjaxValidation() commented in generated controller code.
+ // See class documentation of CActiveForm for details on this.
+ 'enableAjaxValidation'=>false,
+)); ?>
+
+
\ No newline at end of file
diff --git a/web/protected/views/photoAlbumRelation/_search.php b/web/protected/views/photoAlbumRelation/_search.php
new file mode 100644
index 0000000..e5c89cd
--- /dev/null
+++ b/web/protected/views/photoAlbumRelation/_search.php
@@ -0,0 +1,35 @@
+
+
+
\ No newline at end of file
diff --git a/web/protected/views/photoAlbumRelation/_view.php b/web/protected/views/photoAlbumRelation/_view.php
new file mode 100644
index 0000000..e39e98a
--- /dev/null
+++ b/web/protected/views/photoAlbumRelation/_view.php
@@ -0,0 +1,21 @@
+
+
+
+You may optionally enter a comparison operator (<, <=, >, >=, <>
+or =) at the beginning of each of your search values to specify how the comparison should be done.
+
+
+beginWidget('CActiveForm', array(
+ 'id'=>'register-form-register-form',
+ // Please note: When you enable ajax validation, make sure the corresponding
+ // controller action is handling ajax validation correctly.
+ // See class documentation of CActiveForm for details on this,
+ // you need to use the performAjaxValidation()-method described there.
+ 'enableAjaxValidation'=>false,
+)); ?>
+
=Yii::t('app', 'Register')?>
+
+
=Yii::t('app', 'Please fill out the registation form')?>
+
+
=Yii::t('app', 'Fields with {*} are required.', array('{*}'=>'*'))?>
\ No newline at end of file
diff --git a/web/protected/views/video/_form.php b/web/protected/views/video/_form.php
new file mode 100644
index 0000000..1e8553d
--- /dev/null
+++ b/web/protected/views/video/_form.php
@@ -0,0 +1,59 @@
+
+
+
+
+beginWidget('CActiveForm', array(
+ 'id'=>'video-form',
+ // Please note: When you enable ajax validation, make sure the corresponding
+ // controller action is handling ajax validation correctly.
+ // There is a call to performAjaxValidation() commented in generated controller code.
+ // See class documentation of CActiveForm for details on this.
+ 'enableAjaxValidation'=>false,
+)); ?>
+
+
\ No newline at end of file
diff --git a/web/protected/views/video/_search.php b/web/protected/views/video/_search.php
new file mode 100644
index 0000000..eae4dfc
--- /dev/null
+++ b/web/protected/views/video/_search.php
@@ -0,0 +1,50 @@
+
+
+
\ No newline at end of file
diff --git a/web/protected/views/video/_view.php b/web/protected/views/video/_view.php
new file mode 100644
index 0000000..3c3b30d
--- /dev/null
+++ b/web/protected/views/video/_view.php
@@ -0,0 +1,34 @@
+
+
+
+You may optionally enter a comparison operator (<, <=, >, >=, <>
+or =) at the beginning of each of your search values to specify how the comparison should be done.
+
+
+beginWidget('CActiveForm', array(
+ 'id'=>'video-channel-relation-form',
+ // Please note: When you enable ajax validation, make sure the corresponding
+ // controller action is handling ajax validation correctly.
+ // There is a call to performAjaxValidation() commented in generated controller code.
+ // See class documentation of CActiveForm for details on this.
+ 'enableAjaxValidation'=>false,
+)); ?>
+
+
\ No newline at end of file
diff --git a/web/protected/views/videoChannelRelation/_search.php b/web/protected/views/videoChannelRelation/_search.php
new file mode 100644
index 0000000..66b21c2
--- /dev/null
+++ b/web/protected/views/videoChannelRelation/_search.php
@@ -0,0 +1,35 @@
+
+
+
\ No newline at end of file
diff --git a/web/protected/views/videoChannelRelation/_view.php b/web/protected/views/videoChannelRelation/_view.php
new file mode 100644
index 0000000..88c440a
--- /dev/null
+++ b/web/protected/views/videoChannelRelation/_view.php
@@ -0,0 +1,21 @@
+
+
+
+You may optionally enter a comparison operator (<, <=, >, >=, <>
+or =) at the beginning of each of your search values to specify how the comparison should be done.
+