Add files via upload

This commit is contained in:
Fernando Méndez 2021-05-26 09:03:02 +02:00 committed by GitHub
parent a5c8dd4ff8
commit cf3f36c9d4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
41 changed files with 5652 additions and 0 deletions

772
assets/css/highContrast.css Normal file
View File

@ -0,0 +1,772 @@
/* Basic */
* {
box-sizing: border-box;
margin: 0px;
}
/* Headers */
h1, h2, h3, h4 {
color: #d3ebff;
text-transform: uppercase;
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
vertical-align: baseline;
text-align: center;
}
h2 {
font-size: 95%;
}
h3 {
font-size: 85%;
}
h4 {
font-size: 75%;
}
/* Buttons */
button, .button.large {
display: inline-block;
margin: 10px;
width: 150px;
height: 30px;
padding: 5px 10px;
background-color :#1f2c3d;
border: 1px solid #dadada;
text-align: center;
color :#dadada;
font-weight: bold;
position: relative;
}
.button.large {
width: 95%;
}
button:hover, .button:hover {
cursor: pointer;
background-color:#dadada;
color:#1f2c3d;
border-color: #1f2c3d;
}
/* Header */
.header {
background-color: #1f2c3d;
color: #dadada;
padding: 15px;
text-align: left;
font-size: 18px;
}
.header img {
width: 13px;
}
/* Header Menu */
.menu {
margin-top: 10px;
text-align: right;
font-size: 15px;
}
.menu nav a{
text-decoration: none;
color: inherit;
font-size: 15px;
}
.menu nav li{
display: inline-block;
width: 150px;
height: 30px;
padding: 5px 10px;
background-color :#1f2c3d;
border: 1px solid #dadada;
text-align: center;
color :#dadada;
position: relative;
}
.menu nav li.danger{
background-color: #791515;
}
.menu nav li:hover{
background-color:#dadada;
color:#1f2c3d;
border-color: #1f2c3d;
}
.menu nav li.danger:hover{
color: #d3ebff;
background-color: #2c0000;
border-color: #d3ebff;
}
.menu nav li>ul{
display: none;
}
.menu nav li:hover>ul{
display: block;
position: absolute;
top: 29px;
right: -1px;
}
/* Sub Header */
.header.sub {
margin-bottom: 20px;
padding: 5px;
display: flex;
flex-direction: row;
text-align: center;
justify-content: center;
font-size: 20px;
}
.header.sub .menu {
margin-top: 0px;
text-align: center;
font-size: 15px;
}
/* Responsive layout */
@media (max-width: 850px) {
.header.sub .menu nav li:hover>ul{
display: block;
position: relative;
top: 5px;
left: -51px;
}
}
/* Paragraphs */
p {
padding: 0;
border: 0;
}
a {
color: #dadada;
text-decoration: none;
}
a:hover{
color:rgb(138, 150, 32);
}
/* Body */
body {
font-family: Arial, Helvetica, sans-serif;
background-color: #00020f;
color: #dadada;
}
/* Table */
table {
border-collapse: collapse;
border-spacing: 0;
margin: 0 0 2em 0;
width: 100%;
text-align: left;
font-size: 15px;
}
table a{
color: #dadada;
}
table tbody tr {
color: #dadada;
border: solid 1px #dadada;
border-left: 0;
border-right: 0;
}
table tbody tr:nth-child(2n + 1) {
background-color: rgba(255, 255, 255, 0.25);
}
table td {
padding: 0.75em 0.75em;
}
table th {
color: #dadada;
font-size: 0.9em;
font-weight: 600;
padding: 0.85em 0.85em 0.85em 0.85em;
}
table thead, table tfoot {
border-bottom: solid 2px #dadada;
}
table.alt {
border-collapse: separate;
}
table.alt tbody tr td {
border: solid 1px #dadada;
border-left-width: 0;
border-top-width: 0;
}
table.alt tbody tr td:first-child {
border-left-width: 1px;
}
table.alt tbody tr:first-child td {
border-top-width: 1px;
}
table.alt thead, table.alt tfoot {
border-top: 0;
}
/* Main */
main {
padding: 30px;
text-align: center;
font-size: 35px;
}
main h1, h2, h3, h4 {
color: #dadada;
}
main img {
width: 40%;
}
/* Create three unequal columns that floats next to each other */
.column {
float: left;
padding: 10px;
}
/* Left and right column */
.column.side {
width: 33.33%;
}
/* Middle column */
.column.middle {
width: 33.33%;
}
.column.middle .image img, .column.side .image img{
border-radius: 4px;
border: 0;
position: relative;
border-radius: 4px;
display: block;
margin: 0 0 3rem 0;
width: 100%;
}
/* Left column */
.column.left {
width: 50%;
}
/* Right column */
.column.right {
float: right;
width: 50%;
}
/* Clear floats after the columns */
.row:after {
content: "";
display: table;
clear: both;
}
/* Responsive layout: makes the three columns stack on top of each other instead of next to each other */
@media (max-width: 1000px) {
.column.side, .column.middle, .column.left, .column.right{
width: 100%;
}
}
/* Zoom */
.zoom {
transition: transform .2s;
}
.zoom:hover {
transform: scale(1.05);
}
/* Code & Blockquote */
.code {
background: #1f2c3d;
border-radius: 3px;
font-size: 0.9em;
margin: 10px;
display: block;
line-height: 1.75em;
padding: 1em 1.5em;
overflow-x: auto;
overflow-y: auto;
}
.code h1, .code h2{
color: #dadada;
}
.code h3, .code h4 {
color: #d3ebff;
}
.code p {
color: #dadada;
}
.code a {
text-decoration: underline;
}
.code ul, .code ol, .code li {
color: #dadada;
}
.code img{
/* width: 80px; height: 80px; */
width: 25%;
}
.code fieldset{
margin: 1px;
border-color: #dadada;
border-style: groove;
}
.code fieldset legend {
text-transform: uppercase;
font-weight: bold;
font-size: 90%;
color: #d3ebff;
}
.code label{
color: #d3ebff;
}
.code.details{
height: 750px;
}
.code.plan {
height: 1150px;
}
.code.info{
text-align: center;
height: 250px;
}
.code.info img{
width: 75px;
height: 75px;
margin-top: 5px;
border: 1px solid #d3ebff;
border-radius: 5px;
padding: 5px;
transition: .5s ease;
backface-visibility: hidden;
}
.code.showtimes{
height: 600px;
}
.code.showtimes p{
height: 5em;
overflow-x: auto;
overflow-y: auto;
}
.code.showtimes:hover {
filter: drop-shadow(5px 5px 10px #1f2c3d);
}
.code.cinemas {
height: 200px;
}
.code.promo img {
margin: 0.1em 0 0.8em 0;
width: 30%;
height: 10%;
display: block;
margin-left: auto;
margin-right: auto;
box-shadow: 0 4px 8px 0 #00020f, 0 6px 20px 0 #00020f;
}
.code.purchase {
text-align: center;
}
.code.purchase h3 {
margin-top: 2em;
}
.code.purchase img {
margin: 0.1em 0 0.8em 0;
width: 100%;
box-shadow: 0 4px 8px 0 #d3ebff, 0 6px 20px 0 #d3ebff;
}
.code.purchase select, .code.purchase select option {
display: block;
width: 100%;
height: 30px;
margin: 0.1em 0.5em 1em 0.5em;
font-weight: bold !important;
color: #1f2c3d !important;
background-color: #d3ebff;
text-transform: uppercase;
}
/* BlockQuotes */
.blockquote {
border-left: solid 4px #dadada;
margin: 0 0 2em 0;
margin-top: 10px;
padding: 0.5em 0 0.5em 2em;
}
.blockquote.bio {
height: 250px;
}
/* Sketches */
.sketches {
text-align: center;
display: block;
line-height: 1.25em;
padding: 1em 1em;
overflow-x: auto;
background: #1f2c3d;
border-radius: 3px;
height: 680px;
}
.sketches h1, .sketches h2, .sketches h3, .sketches h4, .sketches p {
color: #dadada;
}
.sketches img {
width: 550px;
height: 550px;
}
.sketches .description {
color: #00020f;
}
/* Responsive layout */
@media (max-width: 1500px) {
.column.side .sketches, .column.middle .sketches {
width: 100%;
height: 500px;
}
.column.side .sketches img, .column.middle .sketches img {
width: 100%;
height: 75%;
}
}
@media (max-width: 1150px) {
.sketches img {
width: 100%;
height: 75%;
}
}
/* Promotions */
.promotions {
max-width: 1000px;
margin: 0 auto;
display: flex;
}
.promotions a {
width: 100%;
height: 150px;
display: block;
margin-left: auto;
margin-right: auto;
background-size: cover;
border-radius: 10px;
border-style: dashed;
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(255, 255, 255, 0.19);
}
.promotions button {
margin: 1em 1em 0 1em;
background-repeat: no-repeat;
height: 125px;
width: 125px;
background-position: center;
}
.controls {
text-align: center;
}
.controls #play {
height: 30px;
width: 30px;
border-radius: 25px;
background-repeat: no-repeat;
background-position: center;
}
.controls #stop {
height: 30px;
width: 30px;
border-radius: 25px;
background-repeat: no-repeat;
background-position: center;
}
/* Responsive layout */
@media (max-width: 750px) {
.promotions button {
margin: 0 1em 0 1em;
}
.promotions img {
width: 100%;
height: auto;
}
}
/* Text Box */
.textbox {
color: #d3ebff;
padding: 15px 15px 10px 15px;
margin: 10px 0 10px;
overflow: hidden;
border-radius: 25px 0px 25px 0px;
border: 2px solid #d3ebff;
}
.textbox h1, .textbox h2, .textbox h3 {
color: #d3ebff;
text-align: left;
}
/* Galery */
.galery {
box-sizing: border-box;
}
.galery .columna {
margin-top: 10px;
float: left;
width: 50%;
padding-right: 10px;
}
.galery .fila::after {
content: "";
clear: both;
display: table;
}
.galery .image img {
width: 100%;
}
.galery .image.main img {
width: 100%;
}
/* Percentage bar */
.bar {
height: 15px;
line-height: 15px;
font-size: 13px;
font-weight: bold;
width: 100%;
color: #dadada;
background-color: #00020f;
text-align: right;
}
.bar.seventyfive {
width: 75%;
}
.bar.fifty {
width: 50%;
}
.bar.twentyfive {
width: 25%;
}
/* Timeline Image */
.timeline h2 {
padding-top: 50px;
}
.timeline img{
width: 100%;
text-align: center;
padding-bottom: 50px;
padding-left: 15px;
padding-right: 15px;
}
/* Sidebars */
.sidebar.left {
padding: 5px;
margin-top: 10px;
margin-bottom: 10px;
float: left;
width: 300px;
height: 370PX;
color: #00020f;
background-color: #1f2c3d;
}
.sidebar.left a {
color: #00020f;
font-weight: bold;
text-decoration: none;
}
.sidebar.left a:hover {
color: #00020f;
text-decoration: underline;
}
/* Responsibe sidebar */
@media (max-width: 1000px) {
.sidebar.left {
width: 100%;
height: 100%;
}
}
/* Form */
form {
margin: auto;
width: 65%;
}
form h1, h2, h3, h4 {
color: #dadada;
}
label {
color: #dadada;
text-align: center;
font-weight: bold;
}
input, textarea {
width: 100%;
height: 27px;
border: 1px solid #dadada;
padding: 10px;
margin-top: 5px;
font-size: 15px;
}
textarea {
width: 100%;
height: 150px;
}
legend {
color: #dadada;
}
#radio, #checkbox {
width: auto;
height: 15px;
cursor: pointer;
}
.verify {
font-size: 11px;
}
.verify a {
color: #dadada;
}
.verify a:hover {
color: rgb(138, 150, 32);
}
#submit, #register {
width: 100%;
height: 35px;
border: 1px solid #dadada;
padding: 5px;
margin-top: 5px;
font-size: 15px;
font-weight: bold;
box-shadow: 2px 2px #1f2c3d;
filter: brightness(105%);
cursor: pointer;
}
#submit:hover, #register:hover {
color: #dadada;
background-color: #1f2c3d;
}
#reset {
width: 100%;
height: 30px;
border: 1px solid #dadada;
background-color: #00020f;
color: #dadada;
padding: 5px;
margin-top: 5px;
font-size: 12px;
font-weight: bold;
box-shadow: 2px 2px #1f2c3d;
cursor: pointer;
}
#reset:hover {
border:#000000;
background-color: #791515;
}
.file{
margin-top: 10px;
}
.file input{
height: 110%;
}
.card-holder {
width: 75%;
display: inline-block;
}
.input-cart-number, .fieldset-cvv, .select {
width: 70px;
max-width: 100%;
display: inline-block;
}
form select {
display: inline-block;
font-size: 15px;
font-weight: 400;
color: #1f2c3d;
line-height: 1.3;
padding: .4em 1.4em .3em .8em;
width: 75px;
max-width: 100%;
box-sizing: border-box;
margin: 10px auto;
border: 1px solid #d3ebff;
box-shadow: 0 1px 0 1px #1f2c3d;
border-radius: .3em;
-moz-appearance: none;
-webkit-appearance: none;
appearance: none;
background-color: #fff;
}
form select::-ms-expand {
display: none;
}
form select:hover {
border-color: #d3ebff;
}
form select:focus {
border-color: #d3ebff;
box-shadow: 0 0 1px 3px #1f2c3d;
box-shadow: 0 0 0 3px -moz-mac-focusring;
color: #1f2c3d;
outline: none;
}
form select option {
font-weight:normal;
}
/* Preformatted Text */
pre {
font-weight: bold;
}
fieldset pre {
color: red;
}
/* Footer */
footer {
text-align: left;
background-color: #1f2c3d;
color: #dadada;
padding: 20px;
margin-top: 100px;
width: 100%;
height: 80px;
}
.footer {
text-align: right;
}
footer button {
display: inline-block;
margin: 1px;
width: 115px;
height: 25px;
padding: 0px 0px;
text-align: center;
font-weight: bold;
position: relative;
}
@media (max-width: 500px) {
footer {
width: 100%;
height: 100%;
}
}

766
assets/css/main.css Normal file
View File

@ -0,0 +1,766 @@
/* Basic */
* {
box-sizing: border-box;
margin: 0px;
}
/* Headers */
h1, h2, h3, h4 {
color: #363636;
text-transform: uppercase;
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
vertical-align: baseline;
text-align: center;
}
h2 {
font-size: 95%;
}
h3 {
font-size: 85%;
}
h4 {
font-size: 75%;
}
/* Buttons */
button, .button.large{
display: inline-block;
margin: 10px;
width: 150px;
height: 30px;
padding: 5px 10px;
background-color :#1f2c3d;
border: 1px solid #d3ebff;
text-align: center;
color :#d3ebff;
font-weight: bold;
position: relative;
}
.button.large {
width: 95%;
}
button:hover, .button:hover {
cursor: pointer;
background-color:#d3ebff;
color:#1f2c3d;
border-color: #1f2c3d;
}
/* Header */
.header {
background-color: #1f2c3d;
color: #dadada;
padding: 15px;
text-align: left;
font-size: 18px;
}
.header img {
width: 13px;
}
/* Header Menu */
.menu {
margin-top: 10px;
text-align: right;
font-size: 15px;
}
.menu nav a {
text-decoration: none;
color: inherit;
font-size: 15px;
}
.menu nav li{
display: inline-block;
width: 150px;
height: 30px;
padding: 5px 10px;
background-color :#1f2c3d;
border: 1px solid #d3ebff;
text-align: center;
color :#d3ebff;
position: relative;
}
.menu nav li.danger{
background-color: #791515;
}
.menu nav li:hover{
background-color:#d3ebff;
color:#1f2c3d;
border-color: #1f2c3d;
}
.menu nav li.danger:hover{
color: #d3ebff;
background-color: #2c0000;
border-color: #d3ebff;
}
.menu nav li>ul{
display: none;
}
.menu nav li:hover>ul{
display: block;
position: absolute;
top: 29px;
right: -1px;
}
/* Sub Header */
.header.sub {
margin-bottom: 20px;
padding: 5px;
display: flex;
flex-direction: row;
text-align: center;
justify-content: center;
font-size: 20px;
}
.header.sub .menu {
margin-top: 0px;
text-align: center;
font-size: 15px;
}
/* Responsive layout */
@media (max-width: 850px) {
.header.sub .menu nav li:hover>ul{
display: block;
position: relative;
top: 5px;
left: -51px;
}
}
/* Paragraphs */
p {
padding: 0;
border: 0;
}
a {
color: #dadada;
text-decoration: none;
}
a:hover{
color:rgb(138, 150, 32);
}
/* Body */
body {
font-family: Arial, Helvetica, sans-serif;
background-color: #d3ebff;
color: #000000;
}
/* Table */
table {
border-collapse: collapse;
border-spacing: 0;
margin: 0 0 2em 0;
width: 100%;
text-align: left;
font-size: 15px;
}
table a{
color: #1f2c3d;
}
table tbody tr {
border: solid 1px #1f2c3d;
border-left: 0;
border-right: 0;
}
table tbody tr:nth-child(2n + 1) {
background-color: rgba(144, 144, 144, 0.25);
}
table td {
padding: 0.75em 0.75em;
}
table th {
color: #1f2c3d;
font-size: 0.9em;
font-weight: 600;
padding: 0.85em 0.85em 0.85em 0.85em;
}
table thead, table tfoot {
border-bottom: solid 2px #1f2c3d;
}
table.alt {
border-collapse: separate;
}
table.alt tbody tr td {
border: solid 1px #1f2c3d;
border-left-width: 0;
border-top-width: 0;
}
table.alt tbody tr td:first-child {
border-left-width: 1px;
}
table.alt tbody tr:first-child td {
border-top-width: 1px;
}
table.alt thead, table.alt tfoot {
border-top: 0;
}
/* Main */
main {
padding: 30px;
text-align: center;
font-size: 35px;
}
main h1, h2, h3, h4 {
color: #363636;
}
main img {
width: 40%;
}
/* Create three unequal columns that floats next to each other */
.column {
float: left;
padding: 10px;
}
/* Left and right column */
.column.side {
width: 33.33%;
}
/* Middle column */
.column.middle {
width: 33.33%;
}
.column.middle .image img, .column.side .image img{
border-radius: 4px;
border: 0;
position: relative;
border-radius: 4px;
display: block;
margin: 0 0 3rem 0;
width: 100%;
}
/* Left column */
.column.left {
width: 50%;
}
/* Right column */
.column.right {
float: right;
width: 50%;
}
/* Clear floats after the columns */
.row:after {
content: "";
display: table;
clear: both;
}
/* Responsive layout: makes the three columns stack on top of each other instead of next to each other */
@media (max-width: 1000px) {
.column.side, .column.middle, .column.left, .column.right{
width: 100%;
}
}
/* Zoom */
.zoom {
transition: transform .2s;
}
.zoom:hover {
transform: scale(1.05);
}
/* Code & Blockquote */
.code {
background: #1f2c3d;
border-radius: 3px;
font-size: 0.9em;
margin: 10px;
display: block;
line-height: 1.75em;
padding: 1em 1.5em;
overflow-x: auto;
overflow-y: auto;
}
.code h1, .code h2{
color: #dadada;
}
.code h3, .code h4 {
color: #d3ebff;
}
.code p {
color: #dadada;
}
.code a {
text-decoration: underline;
}
.code ul, .code ol, .code li {
color: #dadada;
}
.code img{
/* width: 80px; height: 80px; */
width: 25%;
}
.code fieldset{
margin: 1px;
border-color: #dadada;
border-style: groove;
}
.code fieldset legend {
text-transform: uppercase;
font-weight: bold;
font-size: 90%;
color: #d3ebff;
}
.code label{
color: #d3ebff;
}
.code.details{
height: 750px;
}
.code.plan {
height: 1150px;
}
.code.info {
text-align: center;
height: 250px;
}
.code.info img {
width: 75px;
height: 75px;
margin-top: 5px;
border: 1px solid #d3ebff;
border-radius: 5px;
padding: 5px;
transition: .5s ease;
backface-visibility: hidden;
}
.code.showtimes {
height: 600px;
}
.code.showtimes p {
height: 5em;
overflow-x: auto;
overflow-y: auto;
}
.code.showtimes:hover {
filter: drop-shadow(5px 5px 10px #1f2c3d);
}
.code.cinemas {
height: 200px;
}
.code.promo img {
margin: 0.1em 0 0.8em 0;
width: 30%;
height: 10%;
display: block;
margin-left: auto;
margin-right: auto;
box-shadow: 0 4px 8px 0 #00020f, 0 6px 20px 0 #00020f;
}
.code.purchase {
text-align: center;
}
.code.purchase h3 {
margin-top: 2em;
}
.code.purchase img {
margin: 0.1em 0 0.8em 0;
width: 100%;
box-shadow: 0 4px 8px 0 #d3ebff, 0 6px 20px 0 #d3ebff;
}
.code.purchase select, .code.purchase select option {
display: block;
width: 100%;
height: 30px;
margin: 0.1em 0.5em 1em 0.5em;
font-weight: bold !important;
color: #1f2c3d !important;
background-color: #d3ebff;
text-transform: uppercase;
}
/* BlockQuotes */
.blockquote {
border-left: solid 4px #dadada;
margin: 0 0 2em 0;
margin-top: 10px;
padding: 0.5em 0 0.5em 2em;
}
.blockquote.bio {
height: 250px;
}
/* Sketches */
.sketches {
text-align: center;
display: block;
line-height: 1.25em;
padding: 1em 1em;
overflow-x: auto;
background: #1f2c3d;
border-radius: 3px;
height: 680px;
}
.sketches h1, .sketches h2, .sketches h3, .sketches h4, .sketches p {
color: #dadada;
}
.sketches img {
width: 550px;
height: 550px;
}
.sketches .description {
color: #d3ebff;
}
/* Responsive layout */
@media (max-width: 1500px) {
.column.side .sketches, .column.middle .sketches {
width: 100%;
height: 500px;
}
.column.side .sketches img, .column.middle .sketches img {
width: 100%;
height: 75%;
}
}
@media (max-width: 1150px) {
.sketches img {
width: 100%;
height: 75%;
}
}
/* Text Box */
.textbox {
color: #d3ebff;
padding: 15px 15px 10px 15px;
margin: 10px 0 10px;
overflow: hidden;
border-radius: 25px 0px 25px 0px;
border: 2px solid #d3ebff;
}
.textbox h1, .textbox h2, .textbox h3 {
color: #d3ebff;
text-align: left;
}
/* Galery */
.galery {
box-sizing: border-box;
}
.galery .columna {
margin-top: 10px;
float: left;
width: 50%;
padding-right: 10px;
}
.galery .fila::after {
content: "";
clear: both;
display: table;
}
.galery .image img {
width: 100%;
}
.galery .image.main img {
width: 100%;
}
/* Promotions */
.promotions {
max-width: 1000px;
margin: 0 auto;
display: flex;
}
.promotions a {
width: 100%;
height: 150px;
display: block;
margin-left: auto;
margin-right: auto;
background-size: cover;
border-radius: 10px;
border-style: dashed;
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(255, 255, 255, 0.19);
}
.promotions button {
margin: 1em 1em 0 1em;
background-repeat: no-repeat;
height: 125px;
width: 125px;
background-position: center;
}
.controls {
text-align: center;
}
.controls #play {
height: 30px;
width: 30px;
border-radius: 25px;
background-repeat: no-repeat;
background-position: center;
}
.controls #stop {
height: 30px;
width: 30px;
border-radius: 25px;
background-repeat: no-repeat;
background-position: center;
}
/* Responsive layout */
@media (max-width: 750px) {
.promotions button {
margin: 0 1em 0 1em;
}
.promotions img {
width: 100%;
height: auto;
}
}
/* Percentage bar */
.bar {
height: 15px;
line-height: 15px;
font-size: 13px;
font-weight: bold;
width: 100%;
color: #00020f;
background-color: #d3ebff;
text-align: right;
}
.bar.seventyfive {
width: 75%;
}
.bar.fifty {
width: 50%;
}
.bar.twentyfive {
width: 25%;
}
/* Timeline Image */
.timeline h2 {
padding-top: 50px;
}
.timeline img{
width: 100%;
text-align: center;
padding-bottom: 50px;
padding-left: 15px;
padding-right: 15px;
}
/* Sidebars */
.sidebar.left {
padding: 5px;
margin-top: 10px;
margin-bottom: 10px;
float: left;
width: 300px;
height: 370PX;
color: #d3ebff;
background-color: #1f2c3d;
}
.sidebar.left a {
color: #d3ebff;
font-weight: bold;
text-decoration: none;
}
.sidebar.left a:hover {
color: #d3ebff;
text-decoration: underline;
}
/* Responsibe sidebar */
@media (max-width: 1000px) {
.sidebar.left {
width: 100%;
height: 100%;
}
}
/* Form */
form {
margin: auto;
width: 65%;
}
form h1, h2, h3, h4 {
color: #363636;
}
label {
text-align: center;
font-weight: bold;
}
input, textarea {
width: 100%;
height: 27px;
border: 1px solid #000000;
padding: 10px;
margin-top: 5px;
font-size: 15px;
}
textarea {
width: 100%;
height: 150px;
}
#radio, #checkbox {
width: auto;
height: 15px;
cursor: pointer;
}
.verify {
font-size: 11px;
}
.verify a {
color: #1f2c3d;
}
.verify a:hover {
color: rgb(138, 150, 32);
}
#submit, #register {
width: 100%;
height: 35px;
border: 1px solid #000000;
padding: 5px;
margin-top: 5px;
font-size: 15px;
font-weight: bold;
box-shadow: 2px 2px #1f2c3d;
filter: brightness(105%);
cursor: pointer;
}
#submit:hover, #register:hover {
background-color: #d3ebff;
}
#reset {
width: 100%;
height: 30px;
border: 1px solid #dadada;
background-color: #00020f;
color: #dadada;
padding: 5px;
margin-top: 5px;
font-size: 12px;
font-weight: bold;
box-shadow: 2px 2px #1f2c3d;
cursor: pointer;
}
#reset:hover {
border:#000000;
background-color: #791515;
}
.file{
margin-top: 10px;
}
.file input{
height: 110%;
}
.card-holder {
width: 75%;
display: inline-block;
}
.input-cart-number, .fieldset-cvv, .select {
width: 70px;
max-width: 100%;
display: inline-block;
}
form select {
display: inline-block;
font-size: 15px;
font-weight: 400;
color: #1f2c3d;
line-height: 1.3;
padding: .4em 1.4em .3em .8em;
width: 75px;
max-width: 100%;
box-sizing: border-box;
margin: 10px auto;
border: 1px solid #d3ebff;
box-shadow: 0 1px 0 1px #1f2c3d;
border-radius: .3em;
-moz-appearance: none;
-webkit-appearance: none;
appearance: none;
background-color: #fff;
}
form select::-ms-expand {
display: none;
}
form select:hover {
border-color: #d3ebff;
}
form select:focus {
border-color: #d3ebff;
box-shadow: 0 0 1px 3px #1f2c3d;
box-shadow: 0 0 0 3px -moz-mac-focusring;
color: #1f2c3d;
outline: none;
}
form select option {
font-weight:normal;
}
/* Preformatted Text */
pre {
font-weight: bold;
}
fieldset pre {
color: red;
}
/* Footer */
footer {
text-align: left;
background-color: #1f2c3d;
color: #dadada;
padding: 20px;
margin-top: 100px;
width: 100%;
height: 80px;
}
.footer {
text-align: right;
}
footer button {
display: inline-block;
margin: 1px;
width: 115px;
height: 25px;
padding: 0px 0px;
text-align: center;
font-weight: bold;
position: relative;
}
@media (max-width: 500px) {
footer {
width: 100%;
height: 100%;
}
}

131
assets/css/manager.css Normal file
View File

@ -0,0 +1,131 @@
h3.table_title{
text-align: center;
margin-bottom: 1em;
}
table.seat {
border: solid 10px #1f2c3d;
text-align: center;
background-color: rgba(215, 215, 215, 1);
}
table.seat tbody tr:nth-child(2n + 1) {
background-color: rgba(204, 255, 204, 0);
}
table.seat th{
font-size: 0.9em;
padding: 0.30em 0.30em 0.30em 0.30em;
border-bottom: solid 2px #1f2c3d;
}
table.seat th:first-child {
border-right: solid 2px #1f2c3d;
}
table.seat td {
padding: 0.35em 0.35em;
}
table.seat td:first-child {
font-size: 0.9em;
padding: 0.30em 0.30em 0.30em 0.30em;
font-weight: 600;
border-right: solid 2px #1f2c3d;
}
.check_box {
display:none;
}
.check_box+label{
background:url('../../img/seat_red.png') no-repeat;
height: 16px;
width: 16px;
display:inline-block;
}
.check_box:checked+label{
background:url('../../img/seat_green.png') no-repeat;
}
.black.button {
width: 100%;
height: 30px;
border: 1px solid #dadada;
background-color: #00020f;
color: #dadada;
padding: 5px;
margin-top: 5px;
font-size: 12px;
font-weight: bold;
box-shadow: 2px 2px #1f2c3d;
cursor: pointer;
}
.black.button:hover {
border:#000000;
background-color: #791515;
}
h3.tablelike_title{
text-align: left;
margin-bottom: 1em;
margin-left: 13%;
float:left;
}
a.tablelike_link {
color: #1f2c3d;
text-decoration: none;
float:left;
padding:10px;
border-bottom:1px solid #000;
border-right:1px solid #000;
min-width:46px;
width: 25%;
height: 40px;
}
a.tablelike_link:nth-child(8n){
background-color:rgba(144, 144, 144, 0.25);
}
a.tablelike_link:nth-child(8n-1){
background-color:rgba(144, 144, 144, 0.25);
}
a.tablelike_link:nth-child(-n+4){
border-top:1px solid #000;
}
a.tablelike_link:hover{
color:rgb(138, 150, 32);
}
ul.tablelike{
list-style:none;
text-align:center;
}
ul.tablelike li.tablelike{
float:left;
padding:10px;
border-bottom:1px solid #000;
border-right:1px solid #000;
min-width:46px;
width: 25%;
height: 40px;
}
ul.tablelike li.tablelike:nth-child(2n+1){
clear:both;
border-left:1px solid #000;
}
ul.tablelike li.tablelike:nth-child(-n+2){
border-top:1px solid #000;
}
li.tablelike:nth-child(8n-2){
background-color:rgba(144, 144, 144, 0.25);
}
li.tablelike:nth-child(8n-3){
background-color:rgba(144, 144, 144, 0.25);
}

3
assets/index.php Normal file
View File

@ -0,0 +1,3 @@
<?php
header("Location: ../");
?>

3
assets/js/cambiarCSS.js Normal file
View File

@ -0,0 +1,3 @@
function cambiarCSS(nuevo){
document.getElementById('estilo').setAttribute('href', nuevo);
}

153
assets/js/checkForms.js Normal file
View File

@ -0,0 +1,153 @@
/**
* Práctica - Sistemas Web | Grupo D
* CompluCine - FDI-cines
*/
//Expresión regular para comprobar que la contraseña tiene al menos 1 mayúscula y 1 número:
const regExprPass = /^(?=\w*\d)(?=\w*[A-Z])(?=\w*[a-z])\S{4,16}$/;
$(document).ready(function() {
//Iconos para validar el usuario:
$("#userValid").hide();
$("#userInvalid").hide();
$("#userWarning").hide();
//Iconos para validar el email:
$("#emailValid").hide();
$("#emailInvalid").hide();
//Iconos para validar el password:
$("#passValid").hide();
$("#passInvalid").hide();
$("#passWarning").hide();
//Iconos para validar que las contraseñas coindicen:
$("#repassValid").hide();
$("#repassInvalid").hide();
//Comprueba que el nombre de usuario introducido para el login, exista.
$("#name").change(function(){
var url = "../assets/php/common/checkUser.php?user=" + $("#name").val();
$.get(url, userLoginCheck);
});
//Comprueba que el nombre de usuario no esté registrado en la aplicación.
$("#new_name").change(function(){
var url = "../assets/php/common/checkUser.php?user=" + $("#new_name").val();
$.get(url, userCheck);
});
//Comprueba que el email introducido no esté registrado en la aplicación.
$("#new_email").change(function(){
var url = "../assets/php/common/checkEmail.php?email=" + $("#new_email").val();
$.get(url, emailCheck);
});
//Comprueba que la contraseña sea válida en base a los criterios de la aplicación.
$("#new_pass").change(function(){
const fieldPass = $("#new_pass");
fieldPass[0].setCustomValidity("");
const isPassValid = fieldPass[0].checkValidity();
if(fieldPass.val().length < 4){
$("#passValid").hide();
$("#passInvalid").hide();
$("#passWarning").show();
fieldPass[0].setCustomValidity("La contraseña debe contener almenos 4 caracteres.");
}
else if (isPassValid && passCheck(fieldPass.val())) {
$("#passValid").show();
$("#passInvalid").hide();
$("#passWarning").hide();
fieldPass[0].setCustomValidity("");
} else {
$("#passValid").hide();
$("#passInvalid").show();
$("#passWarning").hide();
fieldPass[0].setCustomValidity("La contraseña debe contener al menos 1 mayúscula y 1 número.");
}
});
//Comprueba que las contraseñas sean iguales.
$("#repass").change(function(){
const fieldPass = $("#new_pass");
const fieldRepass = $("#repass");
fieldRepass[0].setCustomValidity("");
if (Object.is(fieldPass.val(), fieldRepass.val())) {
$("#repassValid").show();
$("#repassInvalid").hide();
fieldRepass[0].setCustomValidity("");
} else {
$("#repassValid").hide();
$("#repassInvalid").show();
fieldRepass[0].setCustomValidity("Las contraseñas deben coincidir.");
}
});
//Muestra si el nombre de usuario introducido para el login existe o no.
function userLoginCheck(data, status) {
const fieldLogin = $("#name");
fieldLogin[0].setCustomValidity("");
if(data === "!avaliable") {
fieldLogin[0].setCustomValidity("");
} else {
fieldLogin[0].setCustomValidity("El nombre de usuario no está registrado.");
}
}
//Muestra si el nombre de usuario introducido es válido o no.
function userCheck(data, status) {
const fieldUser = $("#new_name");
fieldUser[0].setCustomValidity("");
if(fieldUser.val().length < 3){
$("#userValid").hide();
$("#userInvalid").hide();
$("#userWarning").show();
fieldUser[0].setCustomValidity("El nombre de usuario debe tener almenos 3 caracteres.");
}
else if(data === "avaliable") {
$("#userValid").show();
$("#userInvalid").hide();
$("#userWarning").hide();
fieldUser[0].setCustomValidity("");
} else {
$("#userValid").hide();
$("#userInvalid").show();
$("#userWarning").hide();
fieldUser[0].setCustomValidity("El nombre de usuario ya está registrado.");
}
}
//Muestra si el email introducido es válido o no.
function emailCheck(data, status) {
const fieldEmail = $("#new_email");
fieldEmail[0].setCustomValidity("");
const isEmailValid = fieldEmail[0].checkValidity();
if(!isEmailValid){
$("#emailValid").hide();
$("#emailInvalid").show();
}
else if (data === "avaliable") {
$("#emailValid").show();
$("#emailInvalid").hide();
fieldEmail[0].setCustomValidity("");
} else {
$("#emailValid").hide();
$("#emailInvalid").show();
fieldEmail[0].setCustomValidity("El email ya está registrado.");
}
}
//Devuelve true si la contraseña cumple los reuqisitos de seguridad, false en caso contrario.
function passCheck(pass) {
return regExprPass.test(pass) ? true : false;
}
})

View File

@ -0,0 +1,3 @@
function newWindow(page){
window.open(page, 'Ventana de Confirmación', 'width=500, height=300');
}

4
assets/js/jquery-3.2.1.min.js vendored Normal file

File diff suppressed because one or more lines are too long

85
assets/js/promotions.js Normal file
View File

@ -0,0 +1,85 @@
window.onload = function () {
var promos = document.getElementById("promotions").value;
console.log(promos);
// Promociones (Cambiar por el contenido del array "promotions")
const IMAGENES = [
'../img/promos/promo_vuelve.jpg',
'../img/promos/promo_palomitas.jpg',
'../img/promos/promo_miercoles.jpg'
];
const TIEMPO_INTERVALO_MILESIMAS_SEG = 3500;
let posicionActual = 0;
let $botonRetroceder = document.querySelector('#retroceder');
let $botonAvanzar = document.querySelector('#avanzar');
let $imagen = document.querySelector('.imagen');
let $botonPlay = document.querySelector('#play');
let $botonStop = document.querySelector('#stop');
let intervalo;
// Funciones
/**
* Funcion que cambia la foto en la siguiente posicion
*/
function pasarFoto() {
if(posicionActual >= IMAGENES.length - 1) {
posicionActual = 0;
} else {
posicionActual++;
}
renderizarImagen();
}
/**
* Funcion que cambia la foto en la anterior posicion
*/
function retrocederFoto() {
if(posicionActual <= 0) {
posicionActual = IMAGENES.length - 1;
} else {
posicionActual--;
}
renderizarImagen();
}
/**
* Funcion que actualiza la imagen de imagen dependiendo de posicionActual
*/
function renderizarImagen () {
$imagen.style.backgroundImage = `url(${IMAGENES[posicionActual]})`;
}
/**
* Activa el autoplay de la imagen
*/
function playIntervalo() {
intervalo = setInterval(pasarFoto, TIEMPO_INTERVALO_MILESIMAS_SEG);
// Desactivamos los botones de control
//$botonAvanzar.setAttribute('disabled', true);
//$botonRetroceder.setAttribute('disabled', true);
$botonPlay.setAttribute('disabled', true);
$botonStop.removeAttribute('disabled');
}
/**
* Para el autoplay de la imagen
*/
function stopIntervalo() {
clearInterval(intervalo);
// Activamos los botones de control
$botonAvanzar.removeAttribute('disabled');
$botonRetroceder.removeAttribute('disabled');
$botonPlay.removeAttribute('disabled');
$botonStop.setAttribute('disabled', true);
}
// Eventos
$botonAvanzar.addEventListener('click', pasarFoto);
$botonRetroceder.addEventListener('click', retrocederFoto);
$botonPlay.addEventListener('click', playIntervalo);
$botonStop.addEventListener('click', stopIntervalo);
// Iniciar
renderizarImagen();
playIntervalo();
}

598
assets/mysql/complucine.sql Normal file
View File

@ -0,0 +1,598 @@
-- phpMyAdmin SQL Dump
-- version 4.6.6deb5
-- https://www.phpmyadmin.net/
--
-- Servidor: localhost:3306
-- Tiempo de generación: 14-05-2021 a las 11:28:23
-- Versión del servidor: 10.0.28-MariaDB-2+b1
-- Versión de PHP: 7.3.27-1~deb10u1
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Base de datos: `complucine`
--
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `admin`
--
CREATE TABLE `admin` (
`id` int(15) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `cinema`
--
CREATE TABLE `cinema` (
`id` int(15) UNSIGNED NOT NULL,
`name` varchar(10) NOT NULL,
`direction` varchar(120) NOT NULL,
`phone` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Volcado de datos para la tabla `cinema`
--
INSERT INTO `cinema` (`id`, `name`, `direction`, `phone`) VALUES
(1, 'Cinema 1st', 'Calle de ejemplo 111', '77777777'),
(3, 'Cinema 2st', 'Calle falsa 123', '123456789');
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `film`
--
CREATE TABLE `film` (
`id` int(15) UNSIGNED NOT NULL,
`tittle` varchar(60) NOT NULL,
`duration` int(3) UNSIGNED NOT NULL,
`language` varchar(30) NOT NULL,
`description` text NOT NULL,
`img` varchar(60) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Volcado de datos para la tabla `film`
--
INSERT INTO `film` (`id`, `tittle`, `duration`, `language`, `description`, `img`) VALUES
(1, 'iron_man', 120, 'spanish', 'Un empresario millonario construye un traje blindado y lo usa para combatir el crimen y el terrorismo.', ''),
(2, 'iron_man_2', 120, 'spanish', 'Con el mundo ahora consciente de que él es Iron Man, el millonario inventor Tony Stark debe forjar nuevas alianzas y confrontar a un enemigo nuevo y poderoso.', ''),
(3, 'iron_man_3', 120, 'spanish', 'El descarado y brillante Tony Stark, tras ver destruido todo su universo personal, debe encontrar y enfrentarse a un enemigo cuyo poder no conoce límites. Este viaje pondrá a prueba su entereza una y otra vez, y le obligará a confiar en su ingenio.', ''),
(4, 'capitan_america_el_primer_vengador', 120, 'spanish', 'Tras tres meses de someterse a un programa de entrenamiento físico y táctico, encomiendan a Steve Rogers su primera misión como Capitán América. Armado con un escudo indestructible, emprende la guerra contra la perversa organización HYDRA.', ''),
(5, 'capitan_america_el_soldado_de_invierno', 120, 'spanish', 'Capitán América, Viuda Negra y un nuevo aliado, Falcon, se enfrentan a un enemigo inesperado mientras intentan exponer una conspiración que pone en riesgo al mundo.', ''),
(6, 'capitan_america_civil_war', 180, 'spanish', 'Después de que otro incidente internacional, en el que se ven envueltos los Vengadores, produzca daños colaterales, la presión política obliga a poner en marcha un sistema para depurar responsabilidades.', ''),
(7, 'marvel_avengers', 120, 'spanish', 'El director de la Agencia SHIELD decide reclutar a un equipo para salvar al mundo de un desastre casi seguro cuando un enemigo inesperado surge como una gran amenaza para la seguridad mundial.', ''),
(8, 'avengers_age_of_ultron', 120, 'spanish', 'Los Vengadores se reúnen de nuevo y juntan sus fuerzas con las de los recién llegados Quicksilver y Bruja Escarlata para luchar contra un robot maquiavélico llamado Ultrón, el cual Tony Stark creó con el fin de defender la paz, pero resultó defectuoso y ahora pretende exterminar a toda la humanidad.', ''),
(9, 'avengers_inifinity_war', 180, 'spanish', 'Los superhéroes se alían para vencer al poderoso Thanos, el peor enemigo al que se han enfrentado. Si Thanos logra reunir las seis gemas del infinito: poder, tiempo, alma, realidad, mente y espacio, nadie podrá detenerlo.', ''),
(10, 'avengers_end_game', 180, 'spanish', 'Los Vengadores restantes deben encontrar una manera de recuperar a sus aliados para un enfrentamiento épico con Thanos, el malvado que diezmó el planeta y el universo.', '');
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `hall`
--
CREATE TABLE `hall` (
`number` int(15) UNSIGNED NOT NULL,
`idcinema` int(15) UNSIGNED NOT NULL,
`numrows` int(3) NOT NULL,
`numcolumns` int(3) NOT NULL,
`total_seats` int(3) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Volcado de datos para la tabla `hall`
--
INSERT INTO `hall` (`number`, `idcinema`, `numrows`, `numcolumns`, `total_seats`) VALUES
(1, 1, 12, 8, 60),
(2, 1, 14, 8, 97);
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `manager`
--
CREATE TABLE `manager` (
`id` int(15) UNSIGNED NOT NULL,
`idcinema` int(15) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Volcado de datos para la tabla `manager`
--
INSERT INTO `manager` (`id`, `idcinema`) VALUES
(1, 1);
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `promotion`
--
CREATE TABLE `promotion` (
`id` int(15) UNSIGNED NOT NULL,
`tittle` varchar(30) NOT NULL,
`description` text NOT NULL,
`code` varchar(15) NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Volcado de datos para la tabla `promotion`
--
INSERT INTO `promotion` (`id`, `tittle`, `description`, `code`, `active`) VALUES
(1, '3x2', 'en entradas', '000001A', 0),
(2, 'Promocion de ejemplo', 'Esto es un ejemplo', '1234', 0);
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `purchase`
--
CREATE TABLE `purchase` (
`iduser` int(15) UNSIGNED NOT NULL,
`idsession` int(15) UNSIGNED NOT NULL,
`idhall` int(15) UNSIGNED NOT NULL,
`idcinema` int(15) UNSIGNED NOT NULL,
`numrow` int(3) UNSIGNED NOT NULL,
`numcolum` int(3) UNSIGNED NOT NULL,
`time_purchase` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `seat`
--
CREATE TABLE `seat` (
`idhall` int(15) UNSIGNED NOT NULL,
`idcinema` int(15) UNSIGNED NOT NULL,
`numrow` int(3) UNSIGNED NOT NULL,
`numcolum` int(3) UNSIGNED NOT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Volcado de datos para la tabla `seat`
--
INSERT INTO `seat` (`idhall`, `idcinema`, `numrow`, `numcolum`, `active`) VALUES
(1, 1, 1, 1, 0),
(1, 1, 1, 2, 0),
(1, 1, 1, 3, 0),
(1, 1, 1, 4, -1),
(1, 1, 1, 5, -1),
(1, 1, 1, 6, 0),
(1, 1, 1, 7, 0),
(1, 1, 1, 8, 0),
(1, 1, 2, 1, 0),
(1, 1, 2, 2, 0),
(1, 1, 2, 3, 0),
(1, 1, 2, 4, -1),
(1, 1, 2, 5, -1),
(1, 1, 2, 6, 0),
(1, 1, 2, 7, 0),
(1, 1, 2, 8, 0),
(1, 1, 3, 1, 0),
(1, 1, 3, 2, 0),
(1, 1, 3, 3, 0),
(1, 1, 3, 4, -1),
(1, 1, 3, 5, -1),
(1, 1, 3, 6, 0),
(1, 1, 3, 7, 0),
(1, 1, 3, 8, 0),
(1, 1, 4, 1, -1),
(1, 1, 4, 2, -1),
(1, 1, 4, 3, -1),
(1, 1, 4, 4, -1),
(1, 1, 4, 5, -1),
(1, 1, 4, 6, -1),
(1, 1, 4, 7, -1),
(1, 1, 4, 8, -1),
(1, 1, 5, 1, -1),
(1, 1, 5, 2, -1),
(1, 1, 5, 3, -1),
(1, 1, 5, 4, -1),
(1, 1, 5, 5, -1),
(1, 1, 5, 6, -1),
(1, 1, 5, 7, -1),
(1, 1, 5, 8, -1),
(1, 1, 6, 1, 0),
(1, 1, 6, 2, 0),
(1, 1, 6, 3, 0),
(1, 1, 6, 4, -1),
(1, 1, 6, 5, -1),
(1, 1, 6, 6, 0),
(1, 1, 6, 7, 0),
(1, 1, 6, 8, 0),
(1, 1, 7, 1, 0),
(1, 1, 7, 2, 0),
(1, 1, 7, 3, 0),
(1, 1, 7, 4, -1),
(1, 1, 7, 5, -1),
(1, 1, 7, 6, 0),
(1, 1, 7, 7, 0),
(1, 1, 7, 8, 0),
(1, 1, 8, 1, 0),
(1, 1, 8, 2, 0),
(1, 1, 8, 3, 0),
(1, 1, 8, 4, -1),
(1, 1, 8, 5, -1),
(1, 1, 8, 6, 0),
(1, 1, 8, 7, 0),
(1, 1, 8, 8, 0),
(1, 1, 9, 1, 0),
(1, 1, 9, 2, 0),
(1, 1, 9, 3, 0),
(1, 1, 9, 4, -1),
(1, 1, 9, 5, -1),
(1, 1, 9, 6, 0),
(1, 1, 9, 7, 0),
(1, 1, 9, 8, 0),
(1, 1, 10, 1, 0),
(1, 1, 10, 2, 0),
(1, 1, 10, 3, 0),
(1, 1, 10, 4, -1),
(1, 1, 10, 5, -1),
(1, 1, 10, 6, 0),
(1, 1, 10, 7, 0),
(1, 1, 10, 8, 0),
(1, 1, 11, 1, 0),
(1, 1, 11, 2, 0),
(1, 1, 11, 3, 0),
(1, 1, 11, 4, -1),
(1, 1, 11, 5, -1),
(1, 1, 11, 6, 0),
(1, 1, 11, 7, 0),
(1, 1, 11, 8, 0),
(1, 1, 12, 1, 0),
(1, 1, 12, 2, 0),
(1, 1, 12, 3, 0),
(1, 1, 12, 4, -1),
(1, 1, 12, 5, -1),
(1, 1, 12, 6, 0),
(1, 1, 12, 7, 0),
(1, 1, 12, 8, 0),
(2, 1, 1, 1, 1),
(2, 1, 1, 2, 1),
(2, 1, 1, 3, 1),
(2, 1, 1, 4, 1),
(2, 1, 1, 5, 1),
(2, 1, 1, 6, 1),
(2, 1, 1, 7, 1),
(2, 1, 1, 8, 1),
(2, 1, 2, 1, 1),
(2, 1, 2, 2, 1),
(2, 1, 2, 3, 1),
(2, 1, 2, 4, 1),
(2, 1, 2, 5, 1),
(2, 1, 2, 6, 1),
(2, 1, 2, 7, 1),
(2, 1, 2, 8, 1),
(2, 1, 3, 1, 1),
(2, 1, 3, 2, -1),
(2, 1, 3, 3, -1),
(2, 1, 3, 4, -1),
(2, 1, 3, 5, 1),
(2, 1, 3, 6, 1),
(2, 1, 3, 7, 1),
(2, 1, 3, 8, 1),
(2, 1, 4, 1, 1),
(2, 1, 4, 2, -1),
(2, 1, 4, 3, -1),
(2, 1, 4, 4, -1),
(2, 1, 4, 5, 1),
(2, 1, 4, 6, 1),
(2, 1, 4, 7, 1),
(2, 1, 4, 8, 1),
(2, 1, 5, 1, 1),
(2, 1, 5, 2, -1),
(2, 1, 5, 3, -1),
(2, 1, 5, 4, -1),
(2, 1, 5, 5, 1),
(2, 1, 5, 6, 1),
(2, 1, 5, 7, 1),
(2, 1, 5, 8, 1),
(2, 1, 6, 1, 1),
(2, 1, 6, 2, 1),
(2, 1, 6, 3, 1),
(2, 1, 6, 4, 1),
(2, 1, 6, 5, 1),
(2, 1, 6, 6, 1),
(2, 1, 6, 7, 1),
(2, 1, 6, 8, 1),
(2, 1, 7, 1, 1),
(2, 1, 7, 2, 1),
(2, 1, 7, 3, 1),
(2, 1, 7, 4, 1),
(2, 1, 7, 5, -1),
(2, 1, 7, 6, -1),
(2, 1, 7, 7, 1),
(2, 1, 7, 8, 1),
(2, 1, 8, 1, 1),
(2, 1, 8, 2, 1),
(2, 1, 8, 3, 1),
(2, 1, 8, 4, 1),
(2, 1, 8, 5, -1),
(2, 1, 8, 6, -1),
(2, 1, 8, 7, 1),
(2, 1, 8, 8, 1),
(2, 1, 9, 1, 1),
(2, 1, 9, 2, 1),
(2, 1, 9, 3, 1),
(2, 1, 9, 4, 1),
(2, 1, 9, 5, -1),
(2, 1, 9, 6, -1),
(2, 1, 9, 7, 1),
(2, 1, 9, 8, 1),
(2, 1, 10, 1, 1),
(2, 1, 10, 2, 1),
(2, 1, 10, 3, 1),
(2, 1, 10, 4, 1),
(2, 1, 10, 5, 1),
(2, 1, 10, 6, 1),
(2, 1, 10, 7, 1),
(2, 1, 10, 8, 1),
(2, 1, 11, 1, 1),
(2, 1, 11, 2, 1),
(2, 1, 11, 3, 1),
(2, 1, 11, 4, 1),
(2, 1, 11, 5, 1),
(2, 1, 11, 6, 1),
(2, 1, 11, 7, 1),
(2, 1, 11, 8, 1),
(2, 1, 12, 1, 1),
(2, 1, 12, 2, 1),
(2, 1, 12, 3, 1),
(2, 1, 12, 4, 1),
(2, 1, 12, 5, 1),
(2, 1, 12, 6, 1),
(2, 1, 12, 7, 1),
(2, 1, 12, 8, 1),
(2, 1, 13, 1, 1),
(2, 1, 13, 2, 1),
(2, 1, 13, 3, 1),
(2, 1, 13, 4, 1),
(2, 1, 13, 5, 1),
(2, 1, 13, 6, 1),
(2, 1, 13, 7, 1),
(2, 1, 13, 8, 1),
(2, 1, 14, 1, 1),
(2, 1, 14, 2, 1),
(2, 1, 14, 3, 1),
(2, 1, 14, 4, 1),
(2, 1, 14, 5, 1),
(2, 1, 14, 6, 1),
(2, 1, 14, 7, 1),
(2, 1, 14, 8, 1);
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `session`
--
CREATE TABLE `session` (
`id` int(15) UNSIGNED NOT NULL,
`idfilm` int(15) UNSIGNED NOT NULL,
`idhall` int(15) UNSIGNED NOT NULL,
`idcinema` int(15) UNSIGNED NOT NULL,
`date` date NOT NULL,
`start_time` time NOT NULL,
`seat_price` float NOT NULL,
`format` varchar(20) NOT NULL,
`seats_full` int(3) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Volcado de datos para la tabla `session`
--
INSERT INTO `session` (`id`, `idfilm`, `idhall`, `idcinema`, `date`, `start_time`, `seat_price`, `format`, `seats_full`) VALUES
(19, 1, 2, 1, '2021-05-14', '19:00:00', 12, '2d', 0),
(20, 1, 2, 1, '2021-05-15', '19:00:00', 12, '2d', 0);
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `users`
--
CREATE TABLE `users` (
`id` int(15) UNSIGNED NOT NULL,
`username` varchar(10) NOT NULL,
`email` varchar(30) NOT NULL,
`passwd` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
`rol` varchar(7) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Usuarios';
--
-- Volcado de datos para la tabla `users`
--
INSERT INTO `users` (`id`, `username`, `email`, `passwd`, `rol`) VALUES
(0, 'admin', 'admin@complucine.sytes.net', 'shDBCKnEbWZFc', 'admin'),
(1, 'manager', 'manager@complucine.sytes.net', 'shTS9RK/eJPoQ', 'manager'),
(2, 'user', 'user@complucine.sytes.net', 'shO5etd.DYKWg', 'user'),
(7, 'fernando', 'fer@complucine.sytes.net', '$2y$10$/3yjEh4d7AOY3RyNjXIIkO5H2hg7/kiHiToJa92tCBPd7s3UPtB.G', 'user'),
(63, 'user2', 'user2@ucm.es', '$2y$10$Alopov4Z1HPW9i9PqQ/APedPoU.N/zc3XlRfIfSkwPCQCKI.qTp5u', 'user');
--
-- Índices para tablas volcadas
--
--
-- Indices de la tabla `admin`
--
ALTER TABLE `admin`
ADD KEY `PK_A_USER` (`id`);
--
-- Indices de la tabla `cinema`
--
ALTER TABLE `cinema`
ADD PRIMARY KEY (`id`);
--
-- Indices de la tabla `film`
--
ALTER TABLE `film`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `U_TITTLE_LANGUAGE` (`tittle`,`language`);
--
-- Indices de la tabla `hall`
--
ALTER TABLE `hall`
ADD PRIMARY KEY (`number`,`idcinema`),
ADD KEY `FK_CINEMA` (`idcinema`);
--
-- Indices de la tabla `manager`
--
ALTER TABLE `manager`
ADD KEY `PK_M_USER` (`id`),
ADD KEY `PK_M_CINEMA` (`idcinema`);
--
-- Indices de la tabla `promotion`
--
ALTER TABLE `promotion`
ADD PRIMARY KEY (`id`);
--
-- Indices de la tabla `purchase`
--
ALTER TABLE `purchase`
ADD KEY `PK_P_SEAT` (`idhall`,`numrow`,`numcolum`),
ADD KEY `FK_P_SESSION` (`idsession`),
ADD KEY `FK_P_USER` (`iduser`),
ADD KEY `FK_P_SEAT` (`idhall`,`idcinema`,`numrow`,`numcolum`);
--
-- Indices de la tabla `seat`
--
ALTER TABLE `seat`
ADD PRIMARY KEY (`idhall`,`numrow`,`numcolum`),
ADD KEY `FK_HALL` (`idhall`,`idcinema`);
--
-- Indices de la tabla `session`
--
ALTER TABLE `session`
ADD PRIMARY KEY (`id`),
ADD KEY `FK_FILM` (`idfilm`),
ADD KEY `FK_HALL_` (`idhall`,`idcinema`);
--
-- Indices de la tabla `users`
--
ALTER TABLE `users`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `email` (`email`),
ADD UNIQUE KEY `username_2` (`username`),
ADD KEY `username` (`username`);
--
-- AUTO_INCREMENT de las tablas volcadas
--
--
-- AUTO_INCREMENT de la tabla `cinema`
--
ALTER TABLE `cinema`
MODIFY `id` int(15) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
--
-- AUTO_INCREMENT de la tabla `film`
--
ALTER TABLE `film`
MODIFY `id` int(15) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=15;
--
-- AUTO_INCREMENT de la tabla `hall`
--
ALTER TABLE `hall`
MODIFY `number` int(15) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
--
-- AUTO_INCREMENT de la tabla `promotion`
--
ALTER TABLE `promotion`
MODIFY `id` int(15) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
--
-- AUTO_INCREMENT de la tabla `session`
--
ALTER TABLE `session`
MODIFY `id` int(15) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=21;
--
-- AUTO_INCREMENT de la tabla `users`
--
ALTER TABLE `users`
MODIFY `id` int(15) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=65;
--
-- Restricciones para tablas volcadas
--
--
-- Filtros para la tabla `admin`
--
ALTER TABLE `admin`
ADD CONSTRAINT `PK_A_USER` FOREIGN KEY (`id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
--
-- Filtros para la tabla `hall`
--
ALTER TABLE `hall`
ADD CONSTRAINT `FK_CINEMA` FOREIGN KEY (`idcinema`) REFERENCES `cinema` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
--
-- Filtros para la tabla `manager`
--
ALTER TABLE `manager`
ADD CONSTRAINT `PK_M_CINEMA` FOREIGN KEY (`idcinema`) REFERENCES `cinema` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `PK_M_USER` FOREIGN KEY (`id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
--
-- Filtros para la tabla `purchase`
--
ALTER TABLE `purchase`
ADD CONSTRAINT `FK_P_SEAT` FOREIGN KEY (`idhall`,`idcinema`,`numrow`,`numcolum`) REFERENCES `seat` (`idhall`, `idcinema`, `numrow`, `numcolum`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `FK_P_SESSION` FOREIGN KEY (`idsession`) REFERENCES `session` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `FK_P_USER` FOREIGN KEY (`iduser`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
--
-- Filtros para la tabla `seat`
--
ALTER TABLE `seat`
ADD CONSTRAINT `FK_HALL` FOREIGN KEY (`idhall`,`idcinema`) REFERENCES `hall` (`number`, `idcinema`) ON DELETE CASCADE ON UPDATE CASCADE;
--
-- Filtros para la tabla `session`
--
ALTER TABLE `session`
ADD CONSTRAINT `FK_FILM` FOREIGN KEY (`idfilm`) REFERENCES `film` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `FK_HALL_` FOREIGN KEY (`idhall`,`idcinema`) REFERENCES `hall` (`number`, `idcinema`) ON DELETE CASCADE ON UPDATE CASCADE;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

View File

@ -0,0 +1 @@
CREATE DATABASE IF NOT EXISTS complucine DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

View File

@ -0,0 +1,39 @@
<!--
Práctica - Sistemas Web | Grupo D
CompluCine - FDI-cines
-->
<!DOCTYPE HTML>
<html lang="es">
<!-- Head -->
<?php
$template->print_head();
?>
<body>
<!-- Header -->
<?php
$template->print_header();
?>
<!-- Main -->
<?php
if(!isset($content)) $content = "";
$template->print_main($content);
?>
<!-- Section -->
<?php
$template->print_section($section);
?>
<!-- Footer -->
<?php
$template->print_footer();
?>
<!-- Scripts -->
<?php
$template->print_scripts();
?>
</body>
</html>

138
assets/php/aplication.php Normal file
View File

@ -0,0 +1,138 @@
<?php
require_once('config.php');
/**
* Clase que mantiene el estado global de la aplicación.
*/
class Aplicacion {
private static $instancia;
/**
* Permite obtener una instancia de <code>Aplicacion</code>.
*
* @return Applicacion Obtiene la única instancia de la <code>Aplicacion</code>
*/
public static function getSingleton() {
if ( !self::$instancia instanceof self) {
self::$instancia = new self;
}
return self::$instancia;
}
/**
* @var array Almacena los datos de configuración de la BD
*/
private $bdDatosConexion;
/**
* Almacena si la Aplicacion ya ha sido inicializada.
*
* @var boolean
*/
private $inicializada = false;
/**
* @var \mysqli Conexión de BD.
*/
private $conn;
/**
* Evita que se pueda instanciar la clase directamente.
*/
private function __construct() {}
/**
* Evita que se pueda utilizar el operador clone.
*/
public function __clone() {
throw new \Exception('No tiene sentido el clonado.');
}
/**
* Evita que se pueda utilizar serialize().
*/
public function __sleep() {
throw new \Exception('No tiene sentido el serializar el objeto.');
}
/**
* Evita que se pueda utilizar unserialize().
*/
public function __wakeup() {
throw new \Exception('No tiene sentido el deserializar el objeto.');
}
/**
* Inicializa la aplicación.
*
* @param array $bdDatosConexion datos de configuración de la BD
*/
public function init($bdDatosConexion) {
if ( ! $this->inicializada ) {
$this->bdDatosConexion = $bdDatosConexion;
if ( $this->is_session_started() === FALSE ) session_start();
$this->inicializada = true;
}
}
/**
* Inicia la sesión, si esta no se había iniciado.
*/
protected function is_session_started(){
if ( php_sapi_name() !== 'cli' ) {
if ( version_compare(phpversion(), '5.4.0', '>=') ) {
return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE;
} else {
return session_id() === '' ? FALSE : TRUE;
}
}
return FALSE;
}
/**
* Cierre de la aplicación.
*/
public function shutdown() {
$this->compruebaInstanciaInicializada();
if ($this->conn !== null) {
$this->conn->close();
}
}
/**
* Comprueba si la aplicación está inicializada. Si no lo está muestra un mensaje y termina la ejecución.
*/
private function compruebaInstanciaInicializada() {
if (! $this->inicializada ) {
echo "ERROR 403: app_not_configured.";
exit();
}
}
/**
* Devuelve una conexión a la BD. Se encarga de que exista como mucho una conexión a la BD por petición.
*
* @return \mysqli Conexión a MySQL.
*/
public function conexionBd() {
$this->compruebaInstanciaInicializada();
if (! $this->conn ) {
$bdHost = $this->bdDatosConexion['host'];
$bdUser = $this->bdDatosConexion['user'];
$bdPass = $this->bdDatosConexion['pass'];
$bd = $this->bdDatosConexion['bd'];
$this->conn = new \mysqli($bdHost, $bdUser, $bdPass, $bd);
if ( $this->conn->connect_errno ) {
echo "Error de conexión a la BD: (" . $this->conn->connect_errno . ") " . utf8_encode($this->conn->connect_error);
exit();
}
if ( ! $this->conn->set_charset("utf8mb4")) {
echo "Error al configurar la codificación de la BD: (" . $this->conn->errno . ") " . utf8_encode($this->conn->error);
exit();
}
}
return $this->conn;
}
}

View File

@ -0,0 +1,15 @@
<?php
include('../../../assets/php/config.php');
include('../includes/user_dao.php');
$bd = new UserDAO('complucine');
if($bd){
$user = $bd->selectUserEmail(strtolower($_GET["email"]));
if ($user->data_seek(0)) {
echo "!avaliable";
}
else{
echo "avaliable";
}
}
?>

View File

@ -0,0 +1,15 @@
<?php
include('../../../assets/php/config.php');
include('../includes/user_dao.php');
$bd = new UserDAO('complucine');
if($bd){
$user = $bd->selectUserName(strtolower($_GET["user"]));
if ($user->data_seek(0)) {
echo "!avaliable";
}
else{
echo "avaliable";
}
}
?>

View File

@ -0,0 +1,126 @@
<?php
require_once('../assets/php/form.php');
class FormUploadFiles extends Form {
//Constants:
const HTML5_EMAIL_REGEXP = '^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$';
public function __construct() {
$options = array('enctype' => 'multipart/form-data');
parent::__construct('formUploadFiles', $options);
}
protected function generaCamposFormulario($datos, $errores = array()) {
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorFile = self::createMensajeError($errores, 'archivo', 'span', array('class' => 'error'));
foreach($datos as $key => $value){
$dats = $key." ".$value." ";
}
// Se genera el HTML asociado a los campos del formulario y los mensajes de error.
$html = '
<div class="file">
<label for="file">Imagen:</label><input type="file" name="file" id="file" /><pre>'.$htmlErroresGlobales.'</pre>
</div>
<input type="submit" id="submit" value="Subir" class="primary" /><pre>'.$errorFile.'</pre>
';
return $html;
}
protected function procesaFormulario($datos) {
// Solo se pueden definir arrays como constantes en PHP >= 5.6
global $ALLOWED_EXTENSIONS;
$result = array();
$ok = count($_FILES) == 1 && $_FILES['archivo']['error'] == UPLOAD_ERR_OK;
if ( $ok ) {
$archivo = $_FILES['archivo'];
$nombre = $_FILES['archivo']['name'];
/* 1.a) Valida el nombre del archivo */
$ok = $this->check_file_uploaded_name($nombre) && $this->check_file_uploaded_length($nombre) ;
/* 1.b) Sanitiza el nombre del archivo
$ok = sanitize_file_uploaded_name($nombre);
*/
/* 1.c) Utilizar un id de la base de datos como nombre de archivo */
/* 2. comprueba si la extensión está permitida*/
$ok = $ok && in_array(pathinfo($nombre, PATHINFO_EXTENSION), $ALLOWED_EXTENSIONS);
/* 3. comprueba el tipo mime del archivo correspode a una imagen image/* */
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $_FILES['archivo']['tmp_name']);
$ok = preg_match('/image\/*./', $mimeType);
finfo_close($finfo);
if ( $ok ) {
$tmp_name = $_FILES['archivo']['tmp_name'];
if ( !move_uploaded_file($tmp_name, FILMS_DIR.$nombre) ) {
$result[] = 'Error al mover el archivo';
}
// 4. Si fuese necesario guardar en la base de datos la ruta relativa $nombre del archivo
//return "index.php#img=".urlencode('img/'.$nombre);
} else {
$result["errorFile"] = 'El archivo tiene un nombre o tipo no soportado';
}
} else {
$result[] = 'Error al subir el archivo.';
}
return $result;
}
/**
* Check $_FILES[][name]
*
* @param (string) $filename - Uploaded file name.
* @author Yousef Ismaeil Cliprz
* @See http://php.net/manual/es/function.move-uploaded-file.php#111412
*/
protected function check_file_uploaded_name ($filename) {
return (bool) ((mb_ereg_match('/^[0-9A-Z-_\.]+$/i',$filename) === 1) ? true : false );
}
/**
* Sanitize $_FILES[][name]. Remove anything which isn't a word, whitespace, number
* or any of the following caracters -_~,;[]().
*
* If you don't need to handle multi-byte characters you can use preg_replace
* rather than mb_ereg_replace.
*
* @param (string) $filename - Uploaded file name.
* @author Sean Vieira
* @see http://stackoverflow.com/a/2021729
*/
protected function sanitize_file_uploaded_name($filename) {
/* Remove anything which isn't a word, whitespace, number
* or any of the following caracters -_~,;[]().
* If you don't need to handle multi-byte characters
* you can use preg_replace rather than mb_ereg_replace
* Thanks @Łukasz Rysiak!
*/
$newName = mb_ereg_replace("([^\w\s\d\-_~,;\[\]\(\).])", '', $filename);
// Remove any runs of periods (thanks falstro!)
$newName = mb_ereg_replace("([\.]{2,})", '', $newName);
return $newName;
}
/**
* Check $_FILES[][name] length.
*
* @param (string) $filename - Uploaded file name.
* @author Yousef Ismaeil Cliprz.
* @See http://php.net/manual/es/function.move-uploaded-file.php#111412
*/
protected function check_file_uploaded_length ($filename) {
return (bool) ((mb_strlen($filename,'UTF-8') < 250) ? true : false);
}
}
?>

View File

@ -0,0 +1,12 @@
<?php
include('../config.php');
function reRol(){
if(isset($_SESSION["lastRol"])){
$_SESSION["rol"] = $_SESSION["lastRol"];
unset($_SESSION["lastRol"]);
}
}
reRol();
$redirect = ROUTE_APP.'panel_'.$_SESSION['rol'];
header("Location: {$redirect}");
?>

61
assets/php/config.php Normal file
View File

@ -0,0 +1,61 @@
<?php
/**
* Connection parameters to the DB.
*/
define('BD_HOST', 'localhost');
define('BD_NAME', 'complucine');
define('BD_USER', 'sw');
define('BD_PASS', '_admin_');
/*
* Configuration parameters used to generate URLs and file paths in the application
*/
define('ROUTE_APP', '/'); //Change if it´s necessary.
define('RAIZ_APP', __DIR__);
/**
* Image files directory.
*/
define('FILMS_DIR', dirname(RAIZ_APP).'/img/films/tmp/');
define('FILMS_DIR_PROTECTED', RAIZ_APP.'/img/films/tmp/');
define('USER_PICS', dirname(ROUTE_APP).'img/users/');
/**
* Allowed extensions for image files.
*/
$ALLOWED_EXTENSIONS = array('gif','jpg','jpe','jpeg','png');
/**
* Utf-8 support settings, location (language and country) and time zone.
*/
ini_set('default_charset', 'UTF-8');
setLocale(LC_ALL, 'es_ES.UTF.8');
date_default_timezone_set('Europe/Madrid');
//Start session:
session_start();
//HTML template:
require_once('template.php');
$template = new Template();
$prefix = $template->get_prefix();
/**
* Initialize the application:
*/
include_once($prefix.'assets/php/dao.php');
require_once('aplication.php');
$app = Aplicacion::getSingleton();
$app->init(array('host'=>BD_HOST, 'bd'=>BD_NAME, 'user'=>BD_USER, 'pass'=>BD_PASS));
/**
* @see http://php.net/manual/en/function.register-shutdown-function.php
* @see http://php.net/manual/en/language.types.callable.php
*/
register_shutdown_function(array($app, 'shutdown'));
//Depuración (BORRAR):
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
?>

24
assets/php/dao.php Normal file
View File

@ -0,0 +1,24 @@
<?php
class DAO {
//Atributes:
public $mysqli;
//Constructor:
public function __construct($bd_name){
if($bd_name != BD_NAME) {
echo "Está intentando acceder a una base de datos que no existe, puede que la aplicación no funcione correctamente.";
}
$app = Aplicacion::getSingleton();
$this->mysqli = $app->conexionBd();
}
//Destructor (Ya no es necesdario):
/*
public function __destruct(){
$this->mysqli->close();
}
*/
}
?>

387
assets/php/form.php Normal file
View File

@ -0,0 +1,387 @@
<?php
/**
* Clase base para la gestión de formularios.
*
* Gestión de token CSRF está basada en: https://www.owasp.org/index.php/PHP_CSRF_Guard
*/
abstract class Form {
/**
* @var string Sufijo para el nombre del parámetro de la sesión del usuario donde se almacena el token CSRF.
*/
const CSRF_PARAM = 'csrf';
/**
* @var string Identificador utilizado para construir el atributo "id" de la etiqueta &lt;form&gt; como <code>$tipoFormulario.$formId</code>.
*/
private $formId;
/**
* @var string Valor del parámetro enctype del formulario.
*/
private $enctype;
/**
* @var string Valor del atributo "class" de la etiqueta &lt;form&gt; asociada al formulario. Si este parámetro incluye la cadena "nocsrf" no se generá el token CSRF para este formulario.
*/
private $classAtt;
/**
* @var string Parámetro de la petición utilizado para comprobar que el usuario ha enviado el formulario..
*/
private $tipoFormulario;
/**
* @var string URL asociada al atributo "action" de la etiqueta &lt;form&gt; del fomrulario y que procesará el
* envío del formulario.
*/
private $action;
private $printed;
/**
* @var bool Almacena si la interacción con el formulario va a realizarse a través de AJAX <code>true</code> o
* <code>false</code> en otro caso.
*/
private $ajax;
/**
* Crea un nuevo formulario.
*
* Posibles opciones:
* <table>
* <thead>
* <tr>
* <th>Opción</th>
* <th>Valor por defecto</th>
* <th>Descripción</th>
* </tr>
* </thead>
* <tbody>
* <tr>
* <td>action</td>
* <td><code>$_SERVER['PHP_SELF']</code></td>
* <td>URL asociada al atributo "action" de la etiqueta &lt;form&gt; del fomrulario y que procesará el envío del formulario.</td>
* </tr>
* <tr>
* <td>class</td>
* <td>""</td>
* <td>Valor del atributo "class" de la etiqueta &lt;form&gt; asociada al formulario. Si este parámetro incluye la cadena
* "nocsrf" no se generá el token CSRF para este formulario.</td>
* </tr>
* <tr>
* <td>enctype</td>
* <td>""</td>
* <td>Valor del parámetro enctype del formulario.</td>
* </tr>
* <tr>
* <td>ajax</td>
* <td><code>false</code></td>
* <td>Configura si el formulario se gestionará a través de AJAX.</td>
* </tr>
* </tbody>
* </table>
* @param string $tipoFormulario Parámetro de la petición utilizado para comprobar que el usuario ha enviado el formulario.
* @param string $formId (opcional) Identificador utilizado para construir el atributo "id" de la etiqueta &lt;form&gt; como <code>$tipoFormulario.$formId</code>.
*
* @param array $opciones (ver más arriba).
*/
public function __construct($tipoFormulario, $opciones = array(), $formId = 1)
{
$this->tipoFormulario = $tipoFormulario;
$this->formId = $tipoFormulario.$formId;
$opcionesPorDefecto = array( 'ajax' => false, 'action' => null, 'class' => null, 'enctype' => null );
$opciones = array_merge($opcionesPorDefecto, $opciones);
$this->ajax = $opciones['ajax'];
$this->action = $opciones['action'];
$this->classAtt = $opciones['class'];
$this->enctype = $opciones['enctype'];
if ( !$this->action ) {
// Cambiar por << $this->action = htmlentities($_SERVER['REQUEST_URI']); >> para mantener los parámetros de la URL.
$this->action = htmlentities($_SERVER['PHP_SELF']);
}
}
/**
* Se encarga de orquestar todo el proceso de gestión de un formulario.
*
* El proceso es el siguiente:
* <ul>
* <li>O bien se quiere mostrar el formulario (petición GET)</li>
* <li>O bien hay que procesar el formulario (petición POST) y hay dos situaciones:
* <ul>
* <li>El formulario se ha procesado correctamente y se devuelve un <code>string</code> en {@see Form::procesaFormulario()}
* que será la URL a la que se rederigirá al usuario. Se redirige al usuario y se termina la ejecución del script.</li>
* <li>El formulario NO se ha procesado correctamente (errores en los datos, datos incorrectos, etc.) y se devuelve
* un <code>array</code> con entradas (campo, mensaje) con errores específicos para un campo o (entero, mensaje) si el mensaje
* es un mensaje que afecta globalmente al formulario. Se vuelve a generar el formulario pasándole el array de errores.</li>
* </ul>
* </li>
* </ul>
*/
public function gestiona()
{
if ( ! $this->formularioEnviado($_POST) ) {
return $this->generaFormulario();
} else {
// Valida el token CSRF si es necesario (hay un token en la sesión asociada al formulario)
$tokenRecibido = $_POST['CSRFToken'] ?? FALSE;
$errores = $this->csrfguard_ValidateToken($this->tipoFormulario, $tokenRecibido);
// limpia los tokens CSRF que no han sido utilizados en esta petición
self::limpiaCsrfTokens();
// Sin AJAX.
/**
* $result = $this->procesaFormulario($_POST);
* if ( is_array($result) ) {
* return $this->generaFormulario($_POST, $result);
* } else {
* header('Location: '.$result);
* exit();
* }
*/
// Con AJAX.
if ( $errores !== TRUE ) {
if ( ! $this->ajax ) {
return $this->generaFormulario($_POST, $errores);
} else {
return $this->generaHtmlErrores($errores);
}
} else {
$result = $this->procesaFormulario($_POST);
if ( is_array($result) ) {
// Error al procesar el formulario, volvemos a mostrarlo
if ( ! $this->ajax ) {
return $this->generaFormulario($_POST, $result);
} else {
return $this->generaHtmlErrores($result);
}
} else {
if ( ! $this->ajax ) {
header('Location: '.$result);
exit();
} else {
return $result;
}
}
}
}
}
/**
* Genera el HTML necesario para presentar los campos del formulario.
*
* Si el formulario ya ha sido enviado y hay errores en {@see Form::procesaFormulario()} se llama a este método
* nuevamente con los datos que ha introducido el usuario en <code>$datosIniciales</code> y los errores al procesar
* el formulario en <code>$errores</code>
*
* @param string[] $datosIniciales Datos iniciales para los campos del formulario (normalmente <code>$_POST</code>).
*
* @param string[] $errores (opcional)Lista / Tabla asociativa de errores asociados al formulario.
*
* @return string HTML asociado a los campos del formulario.
*/
protected function generaCamposFormulario($datosIniciales, $errores = array())
{
return '';
}
/**
* Procesa los datos del formulario.
*
* @param string[] $datos Datos enviado por el usuario (normalmente <code>$_POST</code>).
*
* @return string|string[] Devuelve el resultado del procesamiento del formulario, normalmente una URL a la que
* se desea que se redirija al usuario, o un array con los errores que ha habido durante el procesamiento del formulario.
*/
protected function procesaFormulario($datos)
{
return array();
}
/**
* Función que verifica si el usuario ha enviado el formulario.
*
* Comprueba si existe el parámetro <code>$formId</code> en <code>$params</code>.
*
* @param string[] $params Array que contiene los datos recibidos en el envío formulario.
*
* @return boolean Devuelve <code>true</code> si <code>$formId</code> existe como clave en <code>$params</code>
*/
private function formularioEnviado(&$params)
{
return isset($params['action']) && $params['action'] == $this->tipoFormulario;
}
/**
* Función que genera el HTML necesario para el formulario.
*
* @param string[] $datos (opcional) Array con los valores por defecto de los campos del formulario.
*
* @param string[] $errores (opcional) Array con los mensajes de error de validación y/o procesamiento del formulario.
*
* @return string HTML asociado al formulario.
*/
private function generaFormulario(&$datos = array(), &$errores = array())
{
$htmlCamposFormularios = $this->generaCamposFormulario($datos, $errores);
$classAtt='';
if ( $this->classAtt ) {
$classAtt = " class=\"{$this->classAtt}\"";
}
$enctypeAtt='';
if ( $this->enctype ) {
$enctypeAtt = " enctype=\"{$this->enctype}\"";
}
// Se genera el token CSRF si el usuario no solicita explícitamente lo contrario.
$tokenCSRF = '';
if ( ! $this->classAtt || strpos($this->classAtt, 'nocsrf') === false ) {
$tokenValue = $this->csrfguard_GenerateToken($this->tipoFormulario);
$tokenCSRF = "<input type='hidden' name='CSRFToken' value='$tokenValue' />";
}
/* <<< Permite definir cadena en múltiples líneas.
* Revisa https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc
*/
$htmlForm = "<form method='POST' action='{$this->action}' id='{$this->formId}'{$classAtt}{$enctypeAtt} >
<input type='hidden' name='action' value='{$this->tipoFormulario}' />
".$tokenCSRF.$htmlCamposFormularios."
</form>";
return $htmlForm;
}
/**
* Genera la lista de mensajes de errores globales (no asociada a un campo) a incluir en el formulario.
*
* @param string[] $errores (opcional) Array con los mensajes de error de validación y/o procesamiento del formulario.
*
* @param string $classAtt (opcional) Valor del atributo class de la lista de errores.
*
* @return string El HTML asociado a los mensajes de error.
*/
protected static function generaListaErroresGlobales($errores = array(), $classAtt='')
{
$html='';
$clavesErroresGenerales = array_filter(array_keys($errores), function ($elem) {
return is_numeric($elem);
});
$numErrores = count($clavesErroresGenerales);
if ($numErrores > 0) {
$html = "<ul class=\"$classAtt\">";
if ( $numErrores == 1 ) {
$html .= "<li>$errores[0]</li>";
} else {
foreach($clavesErroresGenerales as $clave) {
$html .= "<li>$errores[$clave]</li>";
}
$html .= "</li>";
}
$html .= '</ul>';
}
return $html;
}
/**
* Crea una etiqueta para mostrar un mensaje de error. Sólo creará el mensaje de error
* si existe una clave <code>$idError</code> dentro del array <code>$errores</code>.
*
* @param string[] $errores (opcional) Array con los mensajes de error de validación y/o procesamiento del formulario.
* @param string $idError (opcional) Clave dentro de <code>$errores</code> del error a mostrar.
* @param string $htmlElement (opcional) Etiqueta HTML a crear para mostrar el error.
* @param array $atts (opcional) Tabla asociativa con los atributos a añadir a la etiqueta que mostrará el error.
*/
protected static function createMensajeError($errores=array(), $idError='', $htmlElement='span', $atts = array())
{
$html = '';
if (isset($errores[$idError])) {
$att = '';
foreach($atts as $key => $value) {
$att .= "$key=$value";
}
$html = " <$htmlElement $att>{$errores[$idError]}</$htmlElement>";
}
return $html;
}
/**
* Método para eliminar los tokens CSRF almecenados en la petición anterior que no hayan sido utilizados en la actual.
*/
public static function limpiaCsrfTokens()
{
foreach(array_keys($_SESSION) as $key) {
if (strpos($key, self::CSRF_PARAM) === 0) {
unset($_SESSION[$key]);
}
}
}
private function csrfguard_GenerateToken($formParameter)
{
if ( ! session_id() ) {
throw new \Exception('La sesión del usuario no está definida.');
}
$paramSession = self::CSRF_PARAM.'_'.$formParameter;
if (isset($_SESSION[$paramSession])) {
$token = $_SESSION[$paramSession];
} else {
if ( function_exists('hash_algos') && in_array('sha512', hash_algos()) ) {
$token = hash('sha512', mt_rand(0, mt_getrandmax()));
} else {
$token=' ';
for ($i=0;$i<128;++$i) {
$r=mt_rand(0,35);
if ($r<26){
$c=chr(ord('a')+$r);
} else{
$c=chr(ord('0')+$r-26);
}
$token.=$c;
}
}
$_SESSION[$paramSession]=$token;
}
return $token;
}
private function csrfguard_ValidateToken($formParameter, $tokenRecibido)
{
if ( ! session_id() ) {
throw new \Exception('La sesión del usuario no está definida.');
}
$result = TRUE;
$paramSession = self::CSRF_PARAM.'_'.$formParameter;
if ( isset($_SESSION[$paramSession]) ) {
if ( $_SESSION[$paramSession] !== $tokenRecibido ) {
$result = array();
$result[] = 'Has enviado el formulario dos veces';
}
$_SESSION[$paramSession] = ' ';
unset($_SESSION[$paramSession]);
} else {
$result = array();
$result[] = 'Formulario no válido';
}
return $result;
}
//Test some form input.
protected function test_input($input){
return htmlspecialchars(trim(strip_tags($input)));
}
}

View File

@ -0,0 +1,32 @@
<?php
class Cinema{
//Attributes:
private $_id; //Cinema ID.
private $_name; //Cinema name.
private $_direction; //Cinema direction.
private $_phone; //Cinema phone.
//Constructor:
function __construct($id, $name, $direction, $phone){
$this->_id = $id;
$this->_name = $name;
$this->_direction = $direction;
$this->_phone = $phone;
}
//Methods:
//Getters && Setters:
public function setId($id){ $this->_id = $id; }
public function getId(){ return $this->_id; }
public function setName($name){ $this->_name = $name; }
public function getName(){ return $this->_name; }
public function setDirection($direction){ $this->_direction = $direction; }
public function getDirection(){ return $this->_direction; }
public function setPhone($phone){$this->_phone = $phone; }
public function getPhone(){ return $this->_phone; }
}
?>

View File

@ -0,0 +1,102 @@
<?php
include_once('cinema.php');
class Cinema_DAO extends DAO {
//Constructor:
function __construct($bd_name){
parent::__construct($bd_name);
}
//Methods:
//Create a new Session.
public function createCinema($id, $name, $direction, $phone){
$sql = sprintf( "INSERT INTO `cinema`( `id`, `name`, `direction`, `phone`)
VALUES ( '%d', '%s', '%s', '%s')",
$id, $name, $direction, $phone);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Returns a query to get All the films.
public function allCinemaData(){
$sql = sprintf( "SELECT * FROM cinema ");
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
while($fila=$resul->fetch_assoc()){
$films[] = $this->loadCinema($fila["id"], $fila["name"], $fila["direction"], $fila["phone"]);
}
$resul->free();
return $films;
}
//Returns a film data .
public function GetCinema($name,$direction){
$sql = sprintf( "SELECT * FROM cinema WHERE cinema.name = '%s'AND cinema.direction='%s'", $name,$direction );
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Returns a film data .
public function cinemaData($id){
$sql = sprintf( "SELECT * FROM cinema WHERE cinema.id = '%d'", $id);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
$cinema = null;
while($fila=$resul->fetch_assoc()){
$cinema = $this->loadCinema($fila["id"], $fila["name"], $fila["direction"], $fila["phone"]);
}
$resul->free();
return $cinema;
}
//Deleted film by "id".
public function deleteCinema($id){
$sql = sprintf( "DELETE FROM cinema WHERE cinema.id = '%d' ;",$id);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Edit a film.
public function editCinema($id, $name, $direction, $phone){
$sql = sprintf( "UPDATE cinema SET name = '%s' , direction = '%s', phone ='%s'
WHERE cinema.id = '%d';",
$name, $direction, $phone, $id);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Get sessions associated with a cinema.
public function getSessions($id){
include_once('session_dao.php');
$session = new SessionDAO("complucine");
$sql = sprintf( " SELECT DISTINCT * FROM session WHERE session.id in
(SELECT session.id FROM session JOIN cinema ON session.idcinema = cinema.id WHERE cinema.id = '%d'); ", $id);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
$sessions = null;
while($fila = $resul->fetch_assoc()){
$sessions[] = $session->loadSession($fila["id"], $fila["idfilm"], $fila["idhall"], $fila["idcinema"], $fila["date"], $fila["start_time"], $fila["seat_price"], $fila["format"], $fila["seats_full"]);
}
$resul->free();
return $sessions;
}
//Create a new film Data Transfer Object.
public function loadCinema($id, $name, $direction, $phone){
return new Cinema($id, $name, $direction, $phone);
}
}
?>

View File

@ -0,0 +1,39 @@
<?php
class Film{
//Attributes:
private $_id; //Film ID.
private $_tittle; //Film tittle.
private $_duration; //Film duration.
private $_language; //Film language.
private $_description; //Film description.
private $_img;
//Constructor:
function __construct($id, $tittle, $duration, $language, $description, $img){
$this->_id = $id;
$this->_tittle = $tittle;
$this->_duration = $duration;
$this->_language = $language;
$this->_description = $description;
$this->_img = $img;
}
//Methods:
//Getters && Setters:
public function setId($id){ $this->_id = $id; }
public function getId(){ return $this->_id; }
public function setTittle($tittle) {$this->_tittle = $tittle; }
public function getTittle(){return $this->_tittle;}
public function setDuration($duration){$this->_duration = $duration; }
public function getDuration() {return $this->_duration;}
public function setLanguage($language) {$this->_language = $language; }
public function getLanguage(){return $this->_language;}
public function setDescription($description){ $this->_description = $description;}
public function getDescription(){return $this->_description;}
public function setImg($img){ $this->_img = $img;}
public function getImg(){return $this->_img;}
}
?>

View File

@ -0,0 +1,131 @@
<?php
include_once('film.php');
class Film_DAO extends DAO {
//Constructor:
function __construct($bd_name){
parent::__construct($bd_name);
}
//Methods:
//Create a new Session.
public function createFilm($id, $tittle, $duration, $language, $description, $img){
$sql = sprintf( "INSERT INTO `film`( `id`, `tittle`, `duration`, `language`,`description`, `img`)
VALUES ( '%d', '%s', '%d', '%s','%s', '%s')",
$id, $tittle, $duration, $language, $description, $img);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Returns a film data .
public function GetFilm($tittle,$language){
$sql = sprintf( "SELECT * FROM film WHERE film.tittle = '%s'AND film.language='%s'", $tittle,$language );
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Returns the film's data by ID.
public function FilmData($id){
$id = $this->mysqli->real_escape_string($id);
$sql = sprintf( "SELECT * FROM film WHERE id = '%d'", $id );
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
$resul->data_seek(0);
$film = null;
while ($fila = $resul->fetch_assoc()) {
if($id === $fila['id']){
$film = $this->loadFilm($fila["id"], $fila["tittle"], $fila["duration"], $fila["language"], $fila["description"], $fila["img"]);
}
}
//mysqli_free_result($selectUser);
$resul->free();
return $film;
}
//Returns a query to get All the films.
public function allFilmData(){
$sql = sprintf( "SELECT * FROM film ");
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
while($fila=$resul->fetch_assoc()){
$films[] = $this->loadFilm($fila["id"], $fila["tittle"], $fila["duration"], $fila["language"], $fila["description"], $fila["img"]);
}
$resul->free();
return $films;
}
//Returns a query to get all films tittles.
public function tittleFilmData(){
$sql = sprintf( "SELECT DISTINCT tittle FROM film ");
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Returns a query to get all films descriptions.
public function descriptionFilmData(){
$sql = sprintf( "SELECT description FROM film ");
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
/*
public function addFilm($films) {
$resul = mysqli_query($this->mysqli, $this->createFilm($film.getId(), $film.getTittle(), $film.getDuration(), $film.getLanguage(), $film.getDescription())) or die ('Error into query database');
return $resul;
}
*/
//Deleted film by "id".
public function deleteFilm($id){
$sql = sprintf( "DELETE FROM film WHERE film.id = '%d' ;",$id);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Edit a film.
public function editFilm($id, $tittle, $duration, $language,$description,$img){
$sql = sprintf( "UPDATE film SET tittle = '%s' , duration = '%d', language ='%s' , description ='%s', img ='%s'
WHERE film.id = '%d';",
$tittle, $duration, $language, $description, $img, $id);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Get cinemas associated with a movie.
public function getCinemas($id){
include_once('cinema_dao.php');
$cinema = new Cinema_DAO("complucine");
$sql = sprintf( " SELECT DISTINCT * FROM cinema WHERE cinema.id in
(SELECT session.idcinema FROM session JOIN film ON session.idfilm = film.id WHERE film.id = '%d'); ", $id);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
$cinemas = null;
while($fila = $resul->fetch_assoc()){
$cinemas[] = $cinema->loadCinema($fila["id"], $fila["name"], $fila["direction"], $fila["phone"]);
}
$resul->free();
return $cinemas;
}
//Create a new film Data Transfer Object.
public function loadFilm($id, $tittle, $duration, $language,$description, $img){
return new Film( $id, $tittle, $duration, $language,$description, $img);
}
}
?>

View File

@ -0,0 +1,109 @@
<?php
include_once('hall_dao.php');
include_once('seat_dao.php');
class Hall{
//Attributes:
private $_number; //Room number.
private $_idcinema; //Cinema Id
private $_numRows; //Num rows.
private $_numCol; //Num columns.
private $_total_seats;
private $_seats_map;
//Constructor:
function __construct($number, $idcinema, $numRows, $numCol, $total_seats, $seats_map){
$this->_number = $number;
$this->_idcinema = $idcinema;
$this->_numRows = $numRows;
$this->_numCol = $numCol;
$this->_total_seats = $total_seats;
$_seats_map = array();
$_seats_map = $seats_map;
}
//Methods:
public static function getListHalls($cinema){
$bd = new HallDAO('complucine');
if($bd )
return $bd->getAllHalls($cinema);
}
public static function create_hall($number, $cinema, $rows, $cols, $seats, $seats_map){
$bd = new HallDAO('complucine');
if($bd ){
if(!$bd->searchHall($number, $cinema)){
$bd->createHall($number, $cinema, $rows, $cols, $seats, $seats_map);
Seat::createSeats($number, $cinema, $rows, $cols, $seats_map);
return "Se ha creado la sala con exito";
} else {
return "Esta sala ya existe";
}
} else { return "Error al conectarse a la base de datos"; }
}
public static function edit_hall($number, $cinema, $rows, $cols, $seats, $seats_map, $og_number){
$bd = new HallDAO('complucine');
if($bd ){
if($bd->searchHall($og_number, $cinema)){
if($og_number == $number){
Seat::deleteAllSeats($number, $cinema);
$bd->editHall($number, $cinema, $rows, $cols, $seats, $og_number);
Seat::createSeats($number, $cinema, $rows, $cols, $seats_map);
return "Se ha editado la sala con exito";
}else{
if(!$bd->searchHall($number, $cinema)){
Seat::deleteAllSeats($og_number, $cinema);
$bd->editHall($number, $cinema, $rows, $cols, $seats, $og_number);
Seat::createSeats($number, $cinema, $rows, $cols, $seats_map);
return "Se ha editado la sala con exito";
}else
return "El nuevo numero de sala ya existe en otra sala";
}
} else {
return "La sala a editar no existe";
}
} else { return "Error al conectarse a la base de datos"; }
}
public static function delete_hall($number, $cinema, $rows, $cols, $seats, $seats_map, $og_number){
$bd = new HallDAO('complucine');
if($bd ){
if($bd->searchHall($og_number, $cinema)){
$bd->deleteHall($og_number, $cinema);
Seat::deleteAllSeats($og_number, $cinema);
return "La sala se ha eliminado correctamente";
} else {
return "La sala a borrar no existe";
}
} else { return "Error al conectarse a la base de datos"; }
}
public static function search_hall($number,$cinema){
$bd = new HallDAO('complucine');
if($bd )
return $bd->searchHall($number,$cinema);;
}
//Getters && Setters:
public function setNumber($number){ $this->_number = $number; }
public function getNumber(){ return $this->_number; }
public function setIdcinema($idcinema){ $this->_idcinema = $idcinema; }
public function getIdcinema(){ return $this->_idcinema; }
public function setNumRows($numRows){ $this->_numRows = $numRows; }
public function getNumRows(){ return $this->_numRows; }
public function setNumCol($numCol){ $this->_numCol = $numCol; }
public function getNumCol(){ return $this->_numCol; }
public function setTotalSeats($totalSeat){ $this->_total_seats = $totalSeat; }
public function getTotalSeats(){ return $this->_total_seats; }
public function setSeatsmap($seats_map){ $this->_seats_map = $seats_map; }
public function getSeatsmap(){ return $this->_seats_map; }
}
?>

View File

@ -0,0 +1,96 @@
<?php
include_once('hall.php');
class HallDAO extends DAO {
//Constructor:
function __construct($bd_name){
parent::__construct($bd_name);
}
//Methods:
//Create a new Hall.
public function createHall($number, $cinema, $rows, $cols, $seats, $seats_map){
$sql = sprintf( "INSERT INTO `hall`( `number`, `idcinema`, `numrows`, `numcolumns`, `total_seats`)
VALUES ( '%d', '%d', '%d', '%d', '%d')",
$number, $cinema, $rows, $cols, $seats );
$resul = mysqli_query($this->mysqli, $sql) or die ('Error BD createhall');
return $sql;
}
//Returns a query to get the halls data.
public function getAllHalls($cinema){
$sql = sprintf( "SELECT * FROM hall WHERE
idcinema = '%s'",
$cinema);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
$hall = null;
while($fila=mysqli_fetch_array($resul)){
$hall[] = $this->loadHall($fila["number"], $fila["idcinema"], $fila["numrows"], $fila["numcolumns"], $fila["total_seats"], null);
}
mysqli_free_result($resul);
return $hall;
}
public function searchHall($number, $cinema){
$sql = sprintf( "SELECT * FROM hall WHERE
number = '%s' AND idcinema = '%s'",
$number, $cinema);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
$hall = false;
if($resul){
if($resul->num_rows == 1){
$fila = $resul->fetch_assoc();
$hall = $this->loadHall($fila["number"], $fila["idcinema"], $fila["numrows"], $fila["numcolumns"], $fila["total_seats"], null);
}
$resul->free();
}
return $hall;
}
//Create a new Hall Data Transfer Object.
public function loadHall($number, $idcinema, $numrows, $numcolumns, $total_seats, $seats_map){
return new Hall($number, $idcinema, $numrows, $numcolumns, $total_seats, $seats_map);
}
//Edit Hall.
public function editHall($number, $cinema, $rows, $cols, $seats, $og_number){
$sql = sprintf( "UPDATE `hall`
SET `number` = '%d' ,`numrows` = '%d' , `numcolumns` = '%d' , `total_seats` = %d
WHERE `hall`.`number` = '%d' AND `hall`.`idcinema` = '%d';",
$number, $rows, $cols, $seats, $og_number, $cinema );
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Delete Hall.
public function deleteHall($number, $cinema){
$sql = sprintf( "DELETE FROM `hall` WHERE `hall`.`number` = '%d' AND `hall`.`idcinema` = '%d';",$number, $cinema);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
}
?>

View File

@ -0,0 +1,35 @@
<?php
class Manager{
//Attributes:
private $_id; //Manager ID.
private $_username; //Manager username.
private $_email; //Email.
private $_roll; //Roll
//Constructor:
function __construct($id, $idcinema, $username, $email, $roll){
$this->_id = $id;
$this->_idcinema = $idcinema;
$this->_username = $username;
$this->_email = $email;
$this->_roll = $roll;
}
//Methods:
//Getters && Setters:
public function setId($id){ $this->_id = $id; }
public function getId(){ return $this->_id; }
public function setIdcinema($idcinema){ $this->_idcinema = $idcinema; }
public function getIdcinema(){ return $this->_idcinema; }
public function setUsername($username){$this->_username = $username; }
public function getUsername(){ return $this->_username;}
public function setEmail($email){$this->_email = $email;}
public function getEmail(){return $this->_email;}
public function setRoll($roll){$this->_roll = $roll;}
public function getRoll(){return $this->_roll;}
}
?>

View File

@ -0,0 +1,77 @@
<?php
include_once('manager.php');
class Manager_DAO extends DAO {
//Constructor:
function __construct($bd_name){
parent::__construct($bd_name);
}
//Methods:
//Returns a query to get All the managers.
public function allManagersData(){
$sql = sprintf( "SELECT * FROM `users` JOIN `manager` ON manager.id = users.id");
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
while($fila=$resul->fetch_assoc()){
$managers[] = $this->loadManager($fila["id"], $fila["idcinema"], $fila["username"], $fila["email"], $fila["rol"]);
}
$resul->free();
return $managers;
}
//Returns a manager data .
public function GetManager($id){
$sql = sprintf( "SELECT * FROM `manager` WHERE manager.id = '%d'", $id );
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Returns a manager data .
public function GetManagerCinema($id, $idcinema){
$sql = sprintf( "SELECT * FROM `manager` WHERE manager.id = '%d' AND manager.idcinema ='%d'", $id, $idcinema );
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Create a new Session.
public function createManager($id, $idcinema){
$sql = sprintf( "INSERT INTO `manager`( `id`, `idcinema`)
VALUES ( '%d', '%d')",
$id, $idcinema);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Deleted manager by "id".
public function deleteManager($id){
$sql = sprintf( "DELETE FROM `manager` WHERE manager.id = '%d' ;",$id);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Edit manager.
public function editManager($id, $idcinema){
$sql = sprintf( "UPDATE `manager` SET manager.idcinema = '%d'
WHERE manager.id = '%d';",
$idcinema, $id);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Create a new Manager Data Transfer Object.
public function loadManager($id, $idcinema, $username, $email, $rol){
return new Manager($id, $idcinema, $username, $email, $rol);
}
}
?>

View File

@ -0,0 +1,36 @@
<?php
class Promotion{
//Attributes:
private $_id; //Promotion ID.
private $_tittle; //Promotions name.
private $_description; //Promotion description.
private $_code; //Promotion code.
private $_active; //Promotion is active?
//Constructor:
function __construct($id, $tittle, $description, $code, $active){
$this->_id = $id;
$this->_tittle = $tittle;
$this->_description = $description;
$this->_code = $code;
$this->_active = $active;
}
//Methods:
//Getters && Setters:
public function setId($id){ $this->_id = $id; }
public function getId(){ return $this->_id; }
public function setTittle($tittle){ $this->_tittle = $tittle; }
public function getTittle(){ return $this->_tittle; }
public function setDescription($description){ $this->_description = $description;}
public function getDescription(){return $this->_description;}
public function setCode($code){ $this->_code = $code;}
public function getCode(){return $this->_code;}
public function setActive($active){ $this->_active = $active;}
public function getActive(){return $this->_active;}
}
?>

View File

@ -0,0 +1,77 @@
<?php
include_once('promotion.php');
class Promotion_DAO extends DAO {
//Constructor:
function __construct($bd_name){
parent::__construct($bd_name);
}
//Methods:
//Create a new Session.
public function createPromotion($id, $tittle, $description, $code, $active){
$sql = sprintf( "INSERT INTO `promotion`( `id`, `tittle`, `description`, `code`, `active`)
VALUES ( '%d', '%s', '%s', '%s', '%s')",
$id, $tittle, $description, $code, $active);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Returns a query to get All the films.
public function allPromotionData(){
$sql = sprintf( "SELECT * FROM promotion ");
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
while($fila=$resul->fetch_assoc()){
$promotions[] = $this->loadPromotion($fila["id"], $fila["tittle"], $fila["description"], $fila["code"], $fila["active"]);
}
$resul->free();
return $promotions;
}
//Returns a film data .
public function GetPromotion($code){
$sql = sprintf( "SELECT * FROM promotion WHERE promotion.code = '%s'", $code );
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Returns a film data .
public function promotionData($id){
$sql = sprintf( "SELECT * FROM promotion WHERE promotion.id = '%d'", $id);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Deleted film by "id".
public function deletePromotion($id){
$sql = sprintf( "DELETE FROM promotion WHERE promotion.id = '%d' ;",$id);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Edit a film.
public function editPromotion($id, $tittle, $description, $code, $active){
$sql = sprintf( "UPDATE promotion SET tittle = '%s' , description = '%s', code ='%s' , active ='%s'
WHERE promotion.id = '%d';",
$tittle, $description, $code, $active, $id);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Create a new film Data Transfer Object.
public function loadPromotion($id, $tittle, $description, $code, $active){
return new Promotion($id, $tittle, $description, $code, $active);
}
}
?>

View File

@ -0,0 +1,63 @@
<?php
include_once($prefix.'assets/php/includes/seat_dao.php');
class Seat{
//Attributes:
private $_idhall;
private $_idcinema;
private $_numRow;
private $_numCol;
private $_state;
//Constructor:
function __construct($idhall, $idcinema, $numRow, $numCol, $state){
$this->_number = $idhall;
$this->_idcinema = $idcinema;
$this->_numRow = $numRow;
$this->_numCol = $numCol;
$this->_state = $state;
}
static public function createSeats($hall, $cinema, $rows, $cols, $seats_map){
$bd = new SeatDAO('complucine');
for($i = 1;$i <= $rows;$i++){
for($j = 1; $j <= $cols;$j++){
$bd->createSeat($hall, $cinema, $i, $j, $seats_map[$i][$j]);
}
}
}
static public function getSeatsMap($number, $cinema){
$bd = new SeatDAO('complucine');
if($bd )
return $bd->getAllSeats($number, $cinema);
}
static public function deleteAllSeats($number, $cinema){
$bd = new SeatDAO('complucine');
if($bd)
return $bd->deletemapSeats($number, $cinema);
}
//Getters && Setters:
public function setNumber($number){ $this->_number = $number; }
public function getNumber(){ return $this->_number; }
public function setIdcinema($idcinema){ $this->_idcinema = $idcinema; }
public function getIdcinema(){ return $this->_idcinema; }
public function setNumRows($numRow){ $this->_numRow = $numRow; }
public function getNumRows(){ return $this->_numRow; }
public function setNumCol($numCol){ $this->_numCol = $numCol; }
public function getNumCol(){ return $this->_numCol; }
public function setState($state){ $this->_state = $state; }
public function getState(){ return $this->_state; }
}
?>

View File

@ -0,0 +1,58 @@
<?php
include_once('seat.php');
class SeatDAO extends DAO {
//Constructor:
function __construct($bd_name){
parent::__construct($bd_name);
}
//Methods:
//Create a new Hall.
public function createSeat($hall, $cinema, $row, $col, $state){
$sql = sprintf( "INSERT INTO `seat`( `idhall`, `idcinema`, `numrow`, `numcolum`, `active`)
VALUES ( '%d', '%d', '%d', '%d', '%d')",
$hall, $cinema, $row, $col, $state);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error BD createSeat');
return $sql;
}
public function getAllSeats($number, $cinema){
$sql = sprintf( "SELECT * FROM seat WHERE
idhall = '%s' AND idcinema = '%s'",
$number, $cinema);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
$seat_map = null;
while($fila=mysqli_fetch_array($resul)){
$seat_map[] = $this->loadSeat($fila["idhall"], $fila["idcinema"], $fila["numrow"], $fila["numcolum"], $fila["active"]);
}
mysqli_free_result($resul);
return $seat_map;
}
public function deletemapSeats($hall, $cinema){
$sql = sprintf( "DELETE FROM `seat` WHERE
idcinema = '%s' AND idhall = '%s'",
$cinema, $hall);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
public function loadSeat($idhall, $idcinema, $numRow, $numCol, $state){
return new Seat($idhall, $idcinema, $numRow, $numCol, $state);
}
}
?>

View File

@ -0,0 +1,124 @@
<?php
include_once($prefix.'assets/php/includes/session_dao.php');
class Session{
private $_id;
private $_idfilm;
private $_idhall;
private $_idcinema;
private $_date;
private $_startTime;
private $_seatPrice;
private $_format;
private $_seats_full;
function __construct($id, $idfilm, $idhall, $idcinema, $date, $startTime, $seatPrice, $format, $seats_full){
$this->_id = $id;
$this->_idfilm = $idfilm;
$this->_idhall = $idhall;
$this->_idcinema = $idcinema;
$this->_date = $date;
$this->_startTime = $startTime;
$this->_seatPrice = $seatPrice;
$this->_format = $format;
$this->_seats_full = $seats_full;
}
public static function getListSessions($hall,$cinema,$date){
$bd = new SessionDAO('complucine');
if($bd ) {
return $bd->getAllSessions($hall, $cinema, $date);
}
}
public static function create_session($cinema, $hall, $start, $date, $film, $price, $format,$repeat){
$bd = new SessionDAO('complucine');
if($bd ){
if(!$bd->searchSession($cinema, $hall, $start, $date)){
$bd->createSession(null,$film, $hall, $cinema, $date, $start, $price, $format);
if($repeat > "0") {
$repeats = $repeat;
$repeat = $repeat - 1;
$date = date('Y-m-d', strtotime( $date . ' +1 day') );
self::create_session($cinema, $hall, $start, $date, $film, $price, $format,$repeat);
return "Se han creado las ".$repeat ." sesiones con exito";
}
else
return "Se ha creado la session con exito";
} else
return "Esta session ya existe";
} else return "Error al conectarse a la base de datos";
}
public static function edit_session($cinema, $or_hall, $or_date, $or_start, $hall, $start, $date, $film, $price, $format){
$bd = new SessionDAO('complucine');
if($bd ){
if($bd->searchSession($cinema, $or_hall, $or_start, $or_date)){
if(!$bd->searchSession($cinema,$hall,$start,$date)){
$origin = array("cinema" => $cinema,"hall" => $or_hall,"start" => $or_start,"date" => $or_date);
$bd->editSession($film, $hall, $cinema, $date, $start, $price, $format,$origin);
return "Se ha editado la session con exito";
}else if($or_hall == $hall && $or_start == $start && $or_date == $date){
$origin = array("cinema" => $cinema,"hall" => $or_hall,"start" => $or_start,"date" => $or_date);
$bd->editSession($film, $hall, $cinema, $date, $start, $price, $format, $origin);
return "Se ha editado la session con exito";
}else{
return "Ya existe una sesion con los parametros nuevos";
}
} else
return "La session a editar no existe";
} else return "Error al conectarse a la base de datos";
}
public static function delete_session($cinema, $hall, $start, $date){
$bd = new SessionDAO('complucine');
if($bd ){
if($bd->searchSession($cinema, $hall, $start, $date)){
$bd->deleteSession($hall, $cinema, $date, $start);
return "Se ha eliminado la session con exito";
} else
return "Esta session no existe";
} else return "Error al conectarse a la base de datos";
}
//Esto deberia estar en film.php? seguramente
public static function getThisSessionFilm($idfilm){
$bd = new SessionDAO('complucine');
if($bd ) {
return $bd->filmTittle($idfilm);
}
}
public function setId($id){ $this->_id = $id; }
public function getId(){ return $this->_id; }
public function setIdfilm($idfilm){ $this->_idfilm = $idfilm; }
public function getIdfilm(){ return $this->_idfilm; }
public function setIdhall($idhall){ $this->_idhall = $idhall; }
public function getIdhall(){ return $this->_idhall; }
public function setIdcinema($cinema){ $this->_idcinema = $idcinema; }
public function getIdcinema(){ return $this->_idcinema; }
public function setDate($date){ $this->_date = $date; }
public function getDate(){ return $this->_date; }
public function setStartTime($startTime){ $this->_startTime = $startTime; }
public function getStartTime(){ return $this->_startTime; }
public function setSeatPrice($seatPrice){ $this->_seatPrice = $seatPrice; }
public function getSeatPrice(){ return $this->_seatPrice; }
public function setFormat($format){ $this->_format = $format; }
public function getFormat(){ return $this->_format; }
}
?>

View File

@ -0,0 +1,131 @@
<?php
include_once('session.php');
class SessionDAO extends DAO {
//Constructor:
function __construct($bd_name){
parent::__construct($bd_name);
}
//Methods:
public function createSession($id, $idfilm, $idhall, $idcinema, $date, $startTime, $seatPrice, $format){
$format = $this->mysqli->real_escape_string($format);
$date = date('Y-m-d', strtotime( $date ) );
$startTime = date('H:i:s', strtotime( $startTime ) );
$sql = sprintf( "INSERT INTO `session` (`id`, `idfilm`, `idhall`, `idcinema`, `date`, `start_time`, `seat_price`, `format`, `seats_full`)
VALUES ('%d', '%d', '%d', '%d', '%s', '%s', '%d', '%s', '%d')",
$id, $idfilm, $idhall, $idcinema, $date, $startTime, $seatPrice, $format, "0");
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $sql;
}
//Returns a query to get the session's data.
public function sessionData($id){
$sql = sprintf( "SELECT * FROM `session` WHERE id = '%d'", $id );
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database en sessionData con la id '. $id);
while($fila=$resul->fetch_assoc()){
$session = $this->loadSession($fila["id"], $fila["idfilm"], $fila["idhall"], $fila["idcinema"], $fila["date"], $fila["start_time"], $fila["seat_price"], $fila["format"], $fila["seats_full"]);
}
$resul->free();
return $session;
}
public function filmTittle($idfilm){
$sql = sprintf("SELECT * FROM film JOIN session ON film.id = session.idfilm WHERE session.idfilm = '%d' ", $idfilm );
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database en sessionData con la id '. $idfilm);
$resul = mysqli_fetch_array($resul);
return $resul;
}
//Returns a session
public function searchSession($cinema, $hall, $startTime, $date){
$date = date('Y-m-d', strtotime( $date ) );
$startTime = date('H:i:s', strtotime( $startTime ) );
$sql = sprintf( "SELECT * FROM session WHERE
idcinema = '%s' AND idhall = '%s' AND date = '%s' AND start_time = '%s'",
$cinema, $hall, $date, $startTime);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
$session = mysqli_fetch_array($resul);
mysqli_free_result($resul);
return $session;
}
//Returns a query to get all the session's data.
public function getAllSessions($hall, $cinema, $date){
$date = date('Y-m-d', strtotime( $date ) );
$sql = sprintf( "SELECT * FROM session WHERE
idcinema = '%s' AND idhall = '%s' AND date = '%s' ORDER BY start_time ASC;",
$cinema, $hall, $date);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
$sessions = null;
while($fila=mysqli_fetch_array($resul)){
$sessions[] = $this->loadSession($fila["id"], $fila["idfilm"], $fila["idhall"], $fila["idcinema"], $fila["date"], $fila["start_time"], $fila["seat_price"], $fila["format"], $fila["seats_full"]);
}
mysqli_free_result($resul);
return $sessions;
}
public function getSessions_Film_Cinema($idFiml, $idCinema){
$sql = sprintf( "SELECT * FROM session WHERE session.idfilm = '%d' AND session.idcinema = '%d' ", $idFiml, $idCinema);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
$sessions = null;
while($fila = $resul->fetch_assoc()){
$sessions[] = $this->loadSession($fila["id"], $fila["idfilm"], $fila["idhall"], $fila["idcinema"], $fila["date"], $fila["start_time"], $fila["seat_price"], $fila["format"], $fila["seats_full"]);
}
$resul->free();
return $sessions;
}
public function editSession($idfilm, $idhall, $idcinema, $date, $startTime, $seatPrice, $format, $origin){
$format = $this->mysqli->real_escape_string($format);
$date = date('Y-m-d', strtotime( $date ) );
$startTime = date('H:i:s', strtotime( $startTime ) );
$sql = sprintf( "UPDATE `session`
SET `idfilm` = '%d' , `idhall` = '%d', `idcinema` = '%d', `date` = '%s',
`start_time` = '%s', `seat_price` = '%d', `format` = '%s'
WHERE
idcinema = '%s' AND idhall = '%s' AND date = '%s' AND start_time = '%s'",
$idfilm, $idhall, $idcinema, $date, $startTime, $seatPrice, $format, $origin["cinema"],$origin["hall"],$origin["date"],$origin["start"]);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
public function deleteSession($hall, $cinema, $date, $startTime){
$sql = sprintf( "DELETE FROM `session` WHERE
idcinema = '%s' AND idhall = '%s' AND date = '%s' AND start_time = '%s'",
$cinema, $hall, $date, $startTime);
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Create a new Session Data Transfer Object.
public function loadSession( $id, $idfilm, $idhall, $idcinema, $date, $startTime, $seatPrice, $format, $seats_full){
return new Session( $id, $idfilm, $idhall, $idcinema, $date, $startTime, $seatPrice, $format, $seats_full);
}
}
?>

View File

@ -0,0 +1,36 @@
<?php
class User {
//Attributes:
private $_id; //User Id.
private $_username; //User name.
private $_email; //User email.
private $_password; //User password.
private $_rol; //Type of user: user | manager | admin. --> Será eliminado en la siguiente práctica para usar el modelo relacional de nuestra BD.
//Constructor:
function __construct($id, $username, $email, $password, $rol){
$this->_id = $id;
$this->_username = $username;
$this->_email = $email;
$this->_password = $password;
$this->_rol = $rol;
}
//Methods:
//Getters && Setters:
public function setId($id){ $this->_id = $id; }
public function getId(){ return $this->_id; }
public function setName($username){ $this->_username = $username; }
public function getName(){ return $this->_username; }
public function setEmail($email){ $this->_email = $email; }
public function getEmail(){ return $this->_email; }
public function setPass($passwd){ $this->_password = $passwd; }
public function getPass(){ return $this->_password; }
public function setRol($rol){ $this->_rol = $rol; }
public function getRol(){ return $this->_rol; }
}
?>

View File

@ -0,0 +1,165 @@
<?php
include_once('user.php');
class UserDAO extends DAO {
//Constants:
private const _USER = "user";
private const _MANAGER = "manager";
private const _ADMIN = "admin";
//Attributes:
//Constructor:
function __construct($bd_name){
parent::__construct($bd_name);
}
//Methods:
//Encrypt password with SHA254.
private function encryptPass($password){
//$password = hash('sha256', $password);
$password = password_hash($password, PASSWORD_DEFAULT);
return $password;
}
//Returns true if the password and hash match, or false otherwise.
public function verifyPass($password, $passwd){
return password_verify($password, $passwd);
}
//All users
public function allUsersNotM(){
$sql = sprintf( "SELECT * FROM `users` WHERE users.id NOT IN (SELECT id FROM `manager`)");
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
while($fila=$resul->fetch_assoc()){
$users[] = $this->loadUser($fila['id'], $fila['username'], $fila['email'], $fila['passwd'], $fila['rol']);
}
$resul->free();
return $users;
}
//Create a new User.
public function createUser($id, $username, $email, $password, $rol){
$password = $this->encryptPass($password);
$sql = sprintf( "INSERT INTO users( id, username, email, passwd, rol)
VALUES ( '%s', '%s', '%s', '%s', '%s')",
$id, $username, $email, $password, $rol );
$resul = mysqli_query($this->mysqli, $sql);
return $resul;
}
//Returns a query to check if the user name exists.
public function selectUser($username, $password){
$username = $this->mysqli->real_escape_string($username);
$password = $this->mysqli->real_escape_string($password);
$sql = sprintf( "SELECT * FROM users WHERE username = '%s'", $username );
$resul = mysqli_query($this->mysqli, $sql);
$resul->data_seek(0);
$user = null;
while ($fila = $resul->fetch_assoc()) {
if($username === $fila['username'] && $this->verifyPass($password, $fila['passwd'])){
$user = $this->loadUser($fila['id'], $fila['username'], $fila['email'], $fila['passwd'], $fila['rol']);
}
}
//mysqli_free_result($selectUser);
$resul->free();
return $user;
}
//Returns a query to get the user's data.
public function userData($id){
$id = $this->mysqli->real_escape_string($id);
$sql = sprintf( "SELECT * FROM users WHERE id = '%d'", $id );
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Search a user by name.
public function selectUserName($username){
$username = $this->mysqli->real_escape_string($username);
$sql = sprintf( "SELECT * FROM users WHERE username = '%s'", $username );
$resul = mysqli_query($this->mysqli, $sql);
return $resul;
}
//Search a user by email.
public function selectUserEmail($email){
$email = $this->mysqli->real_escape_string($email);
$sql = sprintf( "SELECT * FROM users WHERE email = '%s'", $email );
$resul = mysqli_query($this->mysqli, $sql);
return $resul;
}
//Change username by id.
public function changeUserName($id, $username){
$id = $this->mysqli->real_escape_string($id);
$username = $this->mysqli->real_escape_string($username);
$sql = sprintf( "UPDATE users SET username = '%s' WHERE id = '%d'", $username, $id );
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Change userpass by id.
public function changeUserPass($id, $password){
$id = $this->mysqli->real_escape_string($id);
$password = $this->mysqli->real_escape_string($password);
$password = $this->encryptPass($password);
$sql = sprintf( "UPDATE users SET passwd = '%s' WHERE id = '%d'", $password, $id );
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Change user email by id.
public function changeUserEmail($id, $email){
$id = $this->mysqli->real_escape_string($id);
$email = $this->mysqli->real_escape_string($email);
$sql = sprintf( "UPDATE users SET email = '%s' WHERE id = '%d'", $email, $id );
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Delete user account by id.
public function deleteUserAccount($id){
$id = $this->mysqli->real_escape_string($id);
$sql = sprintf( "DELETE FROM users WHERE id = '%d'", $id );
$resul = mysqli_query($this->mysqli, $sql) or die ('Error into query database');
return $resul;
}
//Create a new User Data Transfer Object.
public function loadUser($id, $username, $email, $password, $rol){
return new User($id, $username, $email, $password, $rol);
}
}
?>

697
assets/php/template.php Normal file
View File

@ -0,0 +1,697 @@
<?php
class Template {
//Constants:
//private const _NUMPAGES = 10; //Constant to page results.
//Attributes:
private $page; //Page Name.
private $prefix; //Page prefix.
private $session; //"Iniciar Sesión" (if user isn´t logged in), "Cerrar Sesión" (otherwise).
private $session_route; //"login/" (if user isn´t logged in), "logout/" (otherwise).
private $panel; //Button to access the user's dashboard (only displayed if logged in).
private $user_route; //Route of the panel (depends on the type of user).
private $sessionButtonClass; //Type of button to login or logout.
//Constructor:
function __construct(){
$this->page = $_SERVER['PHP_SELF']; //Page that instantiates the template.
$this->prefix = '../'; //Default prefix.
$this->set_page_prefix(); //Assigns the name and prefix of the page.
$this->session = 'Iniciar Sesión'; //Default, the session has not started.
$this->session_route = 'login/'; //Default, the session has not started.
$this->panel = ''; //Default, the session has not started.
$this->user_route = 'panel_user/'; //Default, the type of client is user.
$this->sessionButtonClass = ''; //Default, normal button.
}
//Methods:
//Assigns the name and prefix of the page:
private function set_page_prefix() {
switch(true){
case strpos($this->page, 'panel_user'): $this->page = 'Panel de Usuario'; break;
case strpos($this->page, 'panel_manager'): $this->page = 'Panel de Gerente'; break;
case strpos($this->page, 'panel_admin'): $this->page = 'Panel de Administrador'; break;
case strpos($this->page, 'login'): $this->page = 'Acceso'; break;
case strpos($this->page, 'logout'): $this->page = 'Cerrar Sesión'; break;
case strpos($this->page, 'register'): $this->page = 'Registro de Usuario'; break;
case strpos($this->page, 'showtimes'): $this->page = 'Cartelera'; break;
case strpos($this->page, 'purchase'): $this->page = 'Comprar Entrada'; break;
case strpos($this->page, 'promotions'): $this->page = 'Promociones'; break;
case strpos($this->page, 'cinemas'): $this->page = 'Nuestros Cines'; break;
case strpos($this->page, 'about_us'): $this->page = 'Sobre FDI-Cines'; $this->prefix = '../../'; break;
case strpos($this->page, 'terms'): $this->page = 'Términos y Condiciones'; $this->prefix = '../../'; break;
case strpos($this->page, 'detalles'): $this->page = 'Detalles'; $this->prefix = '../../'; break;
case strpos($this->page, 'bocetos'): $this->page = 'Bocetos'; $this->prefix = '../../'; break;
case strpos($this->page, 'miembros'): $this->page = 'Miembros'; $this->prefix = '../../'; break;
case strpos($this->page, 'planificacion'): $this->page = 'Planificación'; $this->prefix = '../../'; break;
case strpos($this->page, 'contacto'): $this->page = 'Contacto'; break;
case strpos($this->page, 'assets'): $this->prefix = '../../../'; break;
default: $this->page = 'FDI-Cines'; $this->prefix = './'; break;
}
}
//Returns page name:
function get_page(){
return $this->page;
}
//Returns page prefix:
function get_prefix(){
return $this->prefix;
}
//Print generic Head:
function print_head(){
$page = $this->page;
$prefix = $this->prefix;
echo"<head>
<title>CompluCine | {$page}</title>
<meta charset='utf-8' />
<link id='estilo' rel='stylesheet' type='text/css' href='{$prefix}assets/css/main.css'>
<noscript><h1>Esta página requiere JavaScript para su correcto funcionamiento.
Compruebe si JavaScript está deshabilitado en su navegador.</h1></noscript>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<link rel='icon' href='{$prefix}img/favicon.png' />
</head>\n";
}
//Print generic Header:
function print_header(){
$page = $this->page;
$prefix = $this->prefix;
$session = $this->session;
$sessionButtonClass = $this->sessionButtonClass;
$session_route = $this->session_route;
$user_route = $this->user_route;
$panel =$this->panel;
if(isset($_SESSION["rol"])){
if($_SESSION["rol"] === "admin") $user_route = 'panel_admin/';
else if($_SESSION["rol"] === "manager") $user_route = 'panel_manager/';
$panel = "<a href='{$prefix}{$user_route}'><li>Mi Panel</li></a>";
$session = 'Cerrar Sesión';
$sessionButtonClass = 'danger';
$session_route = 'logout/';
}
if(isset($_SESSION["lastRol"]) && ($_SESSION["lastRol"] === "admin" || $_SESSION["lastRol"] === "manager" )){
$changeRol = "<a href='{$prefix}assets/php/common/resetRol.php'><li class='danger'>Volver a {$_SESSION["lastRol"]}</li></a>";
} else {
$changeRol = null;
}
echo"<div class='header'>
<a href='{$prefix}'><img src='{$prefix}img/favicon2.png' alt='favicon' /> CompluCine</a> | {$page}
<div class='menu'>
<nav>{$changeRol}
<a href='{$prefix}{$session_route}'><li class={$sessionButtonClass}>{$session}</li></a>
{$panel}
<li>Menú
<ul>
<a href='{$prefix}'><li>Inicio</li></a>
<a href='{$prefix}showtimes/'><li>Cartelera</li></a>
<a href='{$prefix}promotions/'><li>Promociones</li></a>
<a href='{$prefix}cinemas/'><li>Nuestros Cines</li></a>
<a href='{$prefix}fdicines/miembros/'><li>Quiénes somos</li></a>
<a href='{$prefix}contacto/'><li>Contacto</li></a>
</ul>
</li>
</nav>
</div>
</div>\n";
}
//Print generic subHeader:
function print_subheader(){
//$page = $this->page;
$prefix = $this->prefix;
echo"<div class='header sub'>
<div class='menu'>
<nav>
<a href='{$prefix}fdicines/about_us/'><li>Sobre FDI-Cines</li></a>
<a href='{$prefix}fdicines/detalles/'><li>Detalles</li></a>
<a href='{$prefix}fdicines/bocetos/'><li>Bocetos</li></a>
<a href='{$prefix}fdicines/miembros/'><li>Miembros</li></a>
<a href='{$prefix}fdicines/planificacion/'><li>Planificación</li></a>
</nav>
</div>
</div>\n";
}
//Print generic Main:
function print_main($content = ""){
$page = $this->page;
$prefix = $this->prefix;
/* SubHeader on Main */
$sub_header = '';
if(strpos($_SERVER['PHP_SELF'], 'fdicines')){
$sub_header = "<!-- Sub Header -->
<div class='header sub'>
<div class='menu'>
<nav>
<a href='{$prefix}fdicines/about_us/'><li>Sobre FDI-Cines</li></a>
<a href='{$prefix}fdicines/detalles/'><li>Detalles</li></a>
<a href='{$prefix}fdicines/bocetos/'><li>Bocetos</li></a>
<a href='{$prefix}fdicines/miembros/'><li>Miembros</li></a>
<a href='{$prefix}fdicines/planificacion/'><li>Planificación</li></a>
</nav>
</div>
</div>\n";
}
/* MAIN */
if($prefix === "./"){
if(isset($_SESSION["nombre"])){
$tittle = "<h1>Bienvenido {$_SESSION["nombre"]}</h1>\n";
} else {
$tittle = "<h1>Bienvenido a CompluCine</h1>\n";
}
} else {
$tittle = "<h1>{$page}</h1>\n";
}
echo"<main>
<div class='image'><a href='{$prefix}'><img src='{$prefix}img/logo_trasparente.png' alt='logo_FDI-Cines' /></a></div>
{$sub_header}
{$tittle}{$content}
<hr />
</main>\n";
}
//Print panel menu:
function print_panelMenu($panel){
if($_SESSION["login"]){
$prefix = $this->prefix;
$menus = array("<a href='./'><li>Panel Principal</li></a>");
switch($panel){
case "admin": array_push($menus, "<li>Ver como...
<ul>
<a href='./?state=un'><li>Usuario</li></a>
<a href='./?state=ur'><li>Usuario registrado</li></a>
<a href='./?state=ag'><li>Gerente</li></a>
</ul>
</li>");
array_push($menus, "<li>Modificar
<ul>
<a href='./?state=mc'><li>Cines</li></a>
<a href='./?state=mf'><li>Películas</li></a>
<a href='./?state=mp'><li>Promociones</li></a>
<a href='./?state=mg'><li>Gerentes</li></a>
</ul>
</li>");
break;
case "manager": array_push($menus, "<li>Ver como...
<ul>
<a href='./?state=view_user'><li>Usuario</li></a>
<a href='./?state=view_ruser'><li>Usuario registrado</li></a>
</ul>
</li>");
array_push($menus, "<li>Modificar
<ul>
<a href='./?state=manage_halls'><li>Salas</li></a>
<a href='./?state=manage_sessions'><li>Sesiones</li></a>
</ul>
</li>");
break;
case "user": array_push($menus, "<a href='./?option=purchases'><li>Historial Compras</li></a>");
array_push($menus, "<a href='./?option=payment'><li>Datos Pago</li></a>");
array_push($menus, "<a href='./?option=delete_user'><li>Eliminar Usuario</li></a>");
break;
default: $menus = array(); break;
}
if($_SESSION["rol"] === $panel){
echo"<div class='header sub'>
<div class='menu'>
<nav>";
foreach($menus as $value){
echo $value;
}
echo"</nav>
</div>
</div>
";
}
}
}
//Print specific page content:
function print_section($section){
/* Panel menu */
$sub_header = '';
if(strpos($_SERVER['PHP_SELF'], 'panel')){
echo "<!-- Panel Menu -->
";
$this->print_panelMenu($_SESSION["rol"]);
$this->print_msg();
}
echo $section;
}
//Print Films Cards:
function print_fimls(){
$reply = "";
//List of the movies:
require_once(__DIR__.'/includes/film_dao.php');
$prefix= $this->get_prefix();
$films = new Film_DAO("complucine");
$films_array = $films->allFilmData();
$ids = array();
$tittles = array();
$descriptions = array();
$times = array();
$languages = array();
foreach($films_array as $key => $value){
$ids[$key] = $value->getId();
$tittles[$key] = $value->getTittle();
$descriptions[$key] = $value->getDescription();
$times[$key] = $value->getDuration();
$languages[$key] = $value->getLanguage();
}
switch($this->page){
case "Cartelera":
for($i = 0; $i < count($films_array); $i++){
$tittle = str_replace('_', ' ', $tittles[$i]);
if($i%2 === 0){
if($i != 0) $reply .= "</div>
";
$reply .= "<div class='column side'>
";
}
else{
if($i != 0) $reply .= "</div>
";
$reply .= "<div class='column middle'>
";
}
$reply .= "<section id='".$tittles[$i]."'>
<div class='zoom'>
<a href='".$prefix."purchase?film=".$ids[$i]."'>
<div class='code showtimes'>
<div class='image'><img src='".$prefix."img/films/".$tittles[$i].".jpg' alt='".$tittles[$i]."' /></div>
<h2>".$tittle."</h2>
<hr />
<div class='blockquote'>
<p>".$descriptions[$i]."</p>
</div>
<li>Duración: ".$times[$i]." minutos</li>
<li>Lenguaje: ".$languages[$i]."</li>
</div>
</a>
</div>
</section>
";
}
$reply .= "</div>\n";
break;
case "Panel de Administrador":
$reply .= "<div class='column'>";
for($i = 0; $i < count($films_array); $i++){
$tittle = str_replace('_', ' ', $tittles[$i]);
if($i%2 === 0){
if($i != 0) $reply .= "</div>
";
$reply .= "<div class='column side'>
";
}
else{
if($i != 0) $reply .= "</div>
";
$reply .= "<div class='column middle'>
";
}
$reply .= "<section id='".$tittles[$i]."'>
<div class='zoom'>
<div class='code showtimes'>
<div class='image'><img src='".$prefix."img/films/".$tittles[$i].".jpg' alt='".$tittles[$i]."' /></div>
<h2>".$tittle."</h2>
<hr />
<form method='post' action='./index.php?state=mf'>
<input name='id' type='hidden' value='".$ids[$i]."'>
<input name='tittle' type='hidden' value='".$tittles[$i]."'>
<input name='duration' type='hidden' value='".$times[$i]."'>
<input name='language' type='hidden' value='".$languages[$i]."'>
<input name='description' type='hidden' value='".$descriptions[$i]."'>
<input type='submit' id='submit' value='Editar' name='edit_film' class='primary' />
</form>
<form method='post' action='./index.php?state=mf'>
<input name='id' type='hidden' value='".$ids[$i]."'>
<input name='tittle' type='hidden' value='".$tittles[$i]."'>
<input name='duration' type='hidden' value='".$times[$i]."'>
<input name='language' type='hidden' value='".$languages[$i]."'>
<input name='description' type='hidden' value='".$descriptions[$i]."'>
<input type='submit' id='submit' value='Eliminar' name='delete_film' class='primary' />
</form>
</div>
</div>
</section>
";
}
$reply .= "</div>\n";
break;
case "Panel de Gerente":
$reply .= "<div class='column'>";
for($i = 0; $i < count($films_array); $i++){
$tittle = str_replace('_', ' ', $tittles[$i]);
if($i%2 === 0){
if($i != 0) $reply .= "</div>
";
$reply .= "<div class='column side'>
";
}
else{
if($i != 0) $reply .= "</div>
";
$reply .= "<div class='column middle'>
";
}
$reply .= "<section id='".$tittles[$i]."'>
<div class='zoom'>
<div class='code showtimes'>
<div class='image'><img src='".$prefix."img/films/".$tittles[$i].".jpg' alt='".$tittles[$i]."' /></div>
<h2>".$tittle."</h2>
<hr />
<li>Duración: ".$times[$i]." minutos</li>
<li>Lenguaje: ".$languages[$i]."</li>
<form method='post' action='./?state=".$_SESSION["option"]."'>
<input name='film' type='hidden' value='".$ids[$i]."'>
<input name='tittle' type='hidden' value='".$tittles[$i]."'>
<input name='duration' type='hidden' value='".$times[$i]."'>
<input name='language' type='hidden' value='".$languages[$i]."'>
<input name='description' type='hidden' value='".$descriptions[$i]."'>
<input name='hall' type='hidden' value='".$_POST["hall"]."'>
<input name='date' type='hidden' value='".$_POST["date"]."'>
<input name='start' type='hidden' value='".$_POST["start"]."'>
<input name='price' type='hidden' value='".$_POST["price"]."'>
<input name='format' type='hidden' value='".$_POST["format"]."'>
<input name='or_hall' type='hidden' value='".$_POST["or_hall"]."'>
<input name='or_date' type='hidden' value='".$_POST["or_date"]."'>
<input name='or_start' type='hidden' value='".$_POST["or_start"]."'>
<input type='submit' id='submit' value='Seleccionar' name='select_film' class='primary' />
</form>
</div>
</div>
</section>
";
}
$reply .= "</div>\n";
break;
default:
$reply .='<div class="column left">
<div class="galery">
<h1>Últimos Estrenos</h1><hr />';
$count = 0;
for($i = count($tittles)-4; $i < count($tittles); $i++){
if($count%2===0){
if($count != 0) $reply .= "
</div>";
$reply .= "
<div class='fila'>";
}
$reply .= "
<div class='zoom'>
<div class='columna'>
<a href='".$prefix."showtimes/#".$tittles[$i]."'><div class='image'><img src='img/films/".$tittles[$i].".jpg' alt='".$tittles[$i]."' /></div></a>
</div>
</div>";
$count++;
}
$reply .= "
</div>
</div>
</div>
<div class='column right'>
<div class='galery'>";
$count = rand(0, count($tittles)-1);
$title = str_replace('_', ' ', $tittles[$count]);
$reply .= "
<h1>{$title}</h1><hr />
<div class='zoom'>
<a href='".$prefix."showtimes/#".$tittles[$count]."'><div class='image main'><img src='img/films/".$tittles[$count].".jpg' alt='".$tittles[$count]."' /></div></a>
</div>
</div>
</div>\n";
break;
}
return $reply;
}
//Print Cinemas info:
function print_cinemas(){
$reply = "";
//List of the cinemas:
require_once(__DIR__.'/includes/cinema_dao.php');
$prefix= $this->get_prefix();
$cine = new Cinema_DAO("complucine");
$cinemas = $cine->allCinemaData();
$ids = array();
$names = array();
$directions = array();
$phones = array();
if(is_array($cinemas)){
foreach($cinemas as $key => $value){
$ids[$key] = $value->getId();
$names[$key] = $value->getName();
$directions[$key] = $value->getDirection();
$phones[$key] = $value->getPhone();
}
}
switch($this->page){
case "Nuestros Cines":
for($i = 0; $i < count($cinemas); $i++){
if($i%2 === 0){
if($i != 0) $reply .= "</div>
";
$reply .= "<div class='column side'>
";
}
else{
if($i != 0) $reply .= "</div>
";
$reply .= "<div class='column middle'>
";
}
$reply .= "<section id='".$names[$i]."'>
<div class='zoom'>
<a href='".$prefix."purchase?cinema=".$ids[$i]."'>
<div class='code cinemas'>
<h2>".$names[$i]."</h2>
<hr />
<li>Dirección: ".$directions[$i]."</li>
<li>Teléfono: ".$phones[$i]."</li>
</div>
</a>
</div>
</section>
";
}
$reply .= "</div>\n";
break;
case "Panel de Administrador":
$reply .= "<div class='row'>
<div class='column side'></div>
<div class='column middle'>
<table class='alt'>
<thead>
<tr>
<th>Id</th>
<th>Nombre</th>
<th>Direccion</th>
<th>Telefono</th>
</tr>
</thead>
<tbody>
";
if(is_array($cinemas)){
for($i = 0; $i < count($cinemas); $i++){
$reply .= '<tr>
<td>'. $ids[$i] .'</td>
<td>'. $names[$i] .'</td>
<td>'. $directions[$i] .'</td>
<td>'. $phones[$i] .'</td>
<td>
<form method="post" action="index.php?state=mc">
<input name="id" type="hidden" value="'.$ids[$i].'">
<input name="name" type="hidden" value="'.$names[$i].'">
<input name="direction" type="hidden" value="'.$directions[$i].'">
<input name="phone" type="hidden" value="'.$phones[$i].'">
<input type="submit" id="submit" value="Editar" name="edit_cinema" class="primary" />
</form>
</td>
<td>
<form method="post" action="index.php?state=mc">
<input name="id" type="hidden" value="'.$ids[$i].'">
<input name="name" type="hidden" value="'.$names[$i].'">
<input name="direction" type="hidden" value="'.$directions[$i].'">
<input name="phone" type="hidden" value="'.$phones[$i].'">
<input type="submit" id="submit" value="Eliminar" name="delete_cinema" class="primary" />
</form>
</td>
</tr>
';
}
}
$reply .='</tbody>
</table>
</div>
<div class="column side"></div>
';
break;
default:
break;
}
return $reply;
}
function print_promotions(){
$reply = "";
//List of the cinemas:
require_once(__DIR__.'/includes/promotion_dao.php');
$prefix= $this->get_prefix();
$promotion = new Promotion_DAO("complucine");
$promotions = $promotion->allPromotionData();
$ids = array();
$tittles = array();
$descriptions = array();
$codes = array();
$isActive = array();
if(is_array($promotions)){
foreach($promotions as $key => $value){
$ids[$key] = $value->getId();
$tittles[$key] = $value->getTittle();
$descriptions[$key] = $value->getDescription();
$codes[$key] = $value->getCode();
if($value->getActive()){
$isActives[$key] = "ACTIVA";
} else {
$isActives[$key] = "CADUCADA";
}
}
}
switch($this->page){
case "Promociones":
for($i = 0; $i < count($promotions); $i++){
if($i%2 === 0){
if($i != 0) $reply .= "</div>
";
$reply .= "<div class='column side'>
";
}
else{
if($i != 0) $reply .= "</div>
";
$reply .= "<div class='column middle'>
";
}
$reply .= "<section id='".$tittles[$i]."'>
<div class='zoom'>
<div class='code promo'>
<div class='image'><img src='".$prefix."img/promos/".str_replace(' ', '_', strtolower($tittles[$i])).".jpg' alt='".$tittles[$i]."' /></div>
<h2>".$tittles[$i]."</h2>
<hr />
<div class='blockquote'>
<p>".$descriptions[$i]."</p>
</div>
<li>Código: ".$codes[$i]."</li>
<li>Estado: ".$isActives[$i]."</li>
</div>
</div>
</section>
";
}
$reply .= "</div>\n";
break;
default:
break;
}
return $reply;
}
//Print session MSG:
function print_msg() {
if(isset($_SESSION['message'])){
echo "<div>".$_SESSION['message']."</div>";
unset($_SESSION['message']);
}
}
//Print generic Footer:
function print_footer(){
$prefix = $this->prefix;
$page = $this->page;
/* TODO */
if(!isset($_SESSION["css"]) || $_SESSION["css"] === "assets/css/main.css"){
$css = "{$prefix}assets/css/highContrast.css";
$nameCSS = "Alto Contraste";
} else {
$css = "{$prefix}assets/css/main.css";
$nameCSS = "Contraste Normal";
}
/****/
echo"<footer>
<div class='footer'>
<p>© Práctica Final | Sistemas Web 2021 </p>
</div>
<a href='#'>▲Subir</a> |
<a href='{$prefix}fdicines/about_us/'>Sobre FDI-Cines</a> |
<a href='{$prefix}fdicines/terms_conditions/'>Términos de uso</a> |
<a href='{$prefix}cinemas/'>Nuestros cines</a> |
<a href='{$prefix}contacto/'>Contacto</a> |
<button id='css' onclick=\"cambiarCSS('$css');\">$nameCSS</button>
</footer>\n";
}
//Print JS scripts:
function print_scripts(){
$prefix = $this->prefix;
$page = $this->page;
echo"<script type='text/javascript' src='{$prefix}assets/js/jquery-3.2.1.min.js'></script>
<script type='text/javascript' src='{$prefix}assets/js/cambiarCSS.js'></script>
<script type='text/javascript' src='{$prefix}assets/js/checkForms.js'></script>
";
if($page === "FDI-Cines") echo"<script type='text/javascript' src='{$prefix}assets/js/promotions.js' ></script>\n";
if($page === "Panel de Usuario") echo"<script type='text/javascript' src='{$prefix}assets/js/deleteConfirm.js' ></script>\n";
}
}
?>

16
promotions/index.php Normal file
View File

@ -0,0 +1,16 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Specific page content:
$section = '<!-- Promotions -->
<section class="row">
<section id="promociones">
'.$template->print_promotions().'
</section>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

21
purchase/confirm.php Normal file
View File

@ -0,0 +1,21 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//echo $_POST["session_id"];
//Purchase form:
require_once('includes/formPurchase.php');
$form = new FormPurchase();
$formHTML = $form->gestiona();
//Page-specific content:
$section = '<div class="code">
<h2>Completar la Compra</h2><hr />
<!-- Purchase Form -->
'.$formHTML.'
</div>';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>

View File

@ -0,0 +1,121 @@
<?php
include_once($prefix.'assets/php/form.php');
include_once($prefix.'assets/php/includes/session_dao.php');
include_once($prefix.'assets/php/includes/session.php');
include_once($prefix.'assets/php/includes/film_dao.php');
include_once($prefix.'assets/php/includes/film.php');
include_once($prefix.'assets/php/includes/cinema_dao.php');
include_once($prefix.'assets/php/includes/cinema.php');
class FormPurchase extends Form {
//Atributes:
private $session; // Session of the film to be purchased.
private $cinema; // Cinema of the film to be purchased.
private $film; // Film to be purchased.
private $years; // Actual year.
private $months; // Months of the year.
public function __construct() {
parent::__construct('formPurchase');
$sessionDAO = new SessionDAO("complucine");
$this->session = $sessionDAO->sessionData($_POST["session_id"]);
$filmDAO = new Film_DAO("complucine");
$this->film = $filmDAO->FilmData($this->session->getIdfilm());
$cinemaDAO = new Cinema_DAO("complucine");
$this->cinema = $cinemaDAO->cinemaData($this->session->getIdcinema());
$TODAY = getdate();
$year = "$TODAY[year]";
$this->years = array();
for($i = $year; $i < $year+10; $i++) array_push($this->years, $i);
$this->months = array();
for($i = 1; $i <= 12; $i++) array_push($this->months, $i);
}
protected function generaCamposFormulario($datos, $errores = array()){
// Se generan los mensajes de error si existen.
$htmlErroresGlobales = self::generaListaErroresGlobales($errores);
$errorNombre = self::createMensajeError($errores, 'name', 'span', array('class' => 'error'));
$errorPassword = self::createMensajeError($errores, 'pass', 'span', array('class' => 'error'));
$monthsHTML = "";
foreach($this->months as $value){
$monthsHTML .= "<option>".$value."</option>";
}
$yearsHTML = "";
foreach($this->years as $value){
$yearsHTML .= "<option>".$value."</option>";
}
$html = "<div class='row'>
<fieldset id='datos_entrada'>
<legend>Resumen de la Compra</legend>
<p>Película: ".str_replace('_', ' ', strtoupper($this->film->getTittle()))."</p>
<p>Cine: ".$this->cinema->getName()."</p>
<p>Sala: ".$this->session->getIdhall()."</p>
<p>Fecha: ".date_format(date_create($this->session->getDate()), 'd-m-Y')."</p>
<p>Hora: ".$this->session->getStartTime()."</p>
<p>Precio: ".$this->session->getSeatPrice()."</p>
</fieldset>
<fieldset id='pagar_entrada'><pre>".$htmlErroresGlobales."</pre>
<legend>Datos Bancarios</legend>
<label for='card-holder'>Titular de la Tarjeta:</label><br />
<input type='text' id='card-holder' class='card-holder' required />
<br />
<label for='card-number'>Número de Tarjeta: </label><br />
<input type='num' id='card-number-0' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<input type='num' id='card-number-1' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<input type='num' id='card-number-2' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<input type='num' id='card-number-3' class='input-cart-number' placeholder='XXXX' maxlength='4' required />
<label for='card-cvv'>CVV: </label>
<input type='text' id='card-cvv' class='fieldset-cvv' maxlength='3' placeholder='XXX' required />
<br />
<label for='card-expiration'>Fecha de Expiración:</label><br />
<select id='card-expiration-month' required>
".$monthsHTML."
</select>
<select id='card-expiration-year' required>
".$yearsHTML."
</select>
</fieldset>
<div class='actions'>
<input type='submit' id='submit' value='Pagar' class='primary' />
<input type='reset' id='reset' value='Borrar' />
</div>
</div>";
return $html;
}
protected function procesaFormulario($datos){
$result = array();
//$nombre = $this->test_input($datos['name']) ?? null;
$nombre = $datos['name'] ?? null;
$nombre = strtolower($nombre);
if ( empty($nombre) || mb_strlen($nombre) < 3 || mb_strlen($nombre) > 15 ) {
$result['name'] = "El nombre tiene que tener\n una longitud de al menos\n 3 caracteres\n y menos de 15 caracteres.";
}
//$password = $this->test_input($datos['pass']) ?? null;
$password = $datos['pass'] ?? null;
if ( empty($password) || mb_strlen($password) < 4 ) {
$result['pass'] = "El password tiene que tener\n una longitud de al menos\n 4 caracteres.";
}
if (count($result) === 0) {
$result[] = "La compra aun está en desarrollo. Vuelva en unos días.";
}
return $result;
}
}
?>

150
purchase/index.php Normal file
View File

@ -0,0 +1,150 @@
<?php
//General Config File:
require_once('../assets/php/config.php');
//Get Film to purchase:
include_once($prefix.'assets/php/includes/film_dao.php');
include_once($prefix.'assets/php/includes/film.php');
include_once($prefix.'assets/php/includes/cinema_dao.php');
include_once($prefix.'assets/php/includes/cinema.php');
include_once($prefix.'assets/php/includes/session_dao.php');
include_once($prefix.'assets/php/includes/session.php');
$TODAY = getdate();
$TODAY = "$TODAY[mday]"."-"."$TODAY[mon]"."-"."$TODAY[year]";
$pay = true;
$film = null;
$cinemas = [];
$sessions = [];
if(isset($_GET["film"])){
$filmDAO = new Film_DAO("complucine");
$film = $filmDAO->FilmData($_GET["film"]);
if($film){
$tittle = $film->getTittle();
$cinemas = $filmDAO->getCinemas($_GET["film"]);
if(!empty($cinemas)){
$cinemasNames = new ArrayIterator(array());
$cinemasIDs = new ArrayIterator(array());
foreach($cinemas as $key=>$value){
$cinemasIDs[$key] = $value->getId();
$cinemasNames[$key] = $value->getName();
}
$cinemasIT = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$cinemasIT->attachIterator($cinemasIDs, "cID");
$cinemasIT->attachIterator($cinemasNames, "NAME");
$cinemasListHTML = '<select name="cinemas">';
foreach($cinemasIT as $value){
if($value == reset($cinemasIT)){
$cinemasListHTML .= '<option value="'.$value["cID"].'" selected>'.$value["NAME"].'</option>';
} else {
$cinemasListHTML .='<option value="'.$value["cID"].'">'.$value["NAME"].'</option>';
}
}
$cinemasListHTML .= '</select>';
} else {
$cinemasListHTML = '<select name="cinemas"><option value="" selected>No hay cines disponibles para esta película.</option></select>';
}
$fiml_id = $film->getId();
$cinema_id = $value["cID"];
$sessionsDAO = new SessionDAO("complucine");
$sessions = $sessionsDAO->getSessions_Film_Cinema($fiml_id, $cinema_id);
//print_r($sessions);
if(!empty($sessions)){
$sessionsDates = new ArrayIterator(array());
$sessionsStarts = new ArrayIterator(array());
$sessionsHalls = new ArrayIterator(array());
$sessionsIDs = new ArrayIterator(array());
foreach($sessions as $key=>$value){
$sessionsIDs[$key] = $value->getId();
$sessionsDates[$key] = date_format(date_create($value->getDate()), 'j-n-Y');
$sessionsHalls[$key] = $value->getIdhall();
$sessionsStarts[$key] = $value->getStartTime();
}
$sessionsIT = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$sessionsIT->attachIterator($sessionsIDs, "sID");
$sessionsIT->attachIterator($sessionsDates, "DATE");
$sessionsIT->attachIterator($sessionsHalls, "HALL");
$sessionsIT->attachIterator($sessionsStarts, "HOUR");
$sessionsListHTML = '<select name="sessions">';
foreach ($sessionsIT as $value) {
if($TODAY <= $value["DATE"]){
if($value === reset($sessionsIT)){
$sessionsListHTML .= '<option value="'.$value["sID"].'" selected>Fecha: '.$value["DATE"].' || Hora: '.$value["HOUR"].' || Sala: '.$value["HALL"].'</option>';
} else {
$sessionsListHTML .='<option value="'.$value["sID"].'">Fecha: '.$value["DATE"].' || Hora:'.$value["HOUR"].' || Sala: '.$value["HALL"].'</option>';
}
}
}
$sessionsListHTML .= '</select>';
} else {
$sessionsListHTML = '<select name="sessions"><option value="" selected>No hay sesiones disponibles para esta película.</option></select>';
}
$session_id = $value["sID"];
$hall_id = $value["HALL"];
$date_ = $value["DATE"];
$hour_ = $value["HOUR"];
//Reply: Depends on whether the purchase is to be made from a selected movie or a cinema.
$reply = '<div class="column left">
<h2>Película seleccionada: '.str_replace('_', ' ', $tittle).'</h2><hr />
<div class="image"><img src="'.$prefix.'img/films/'.$tittle.'.jpg" alt="'.$tittle.'" /></div>
<p>Duración: '.$film->getDuration().' minutos</p>
<p>Idioma: '.$film->getLanguage().'</p>
</div>
<div class="column right">
<h2>Seleccione un Cine y una Sesión</h2><hr />
<h3>Cines</h3>
'.$cinemasListHTML.'
<h3>Sesiones</h3>
'.$sessionsListHTML.'
</div>
';
} else {
$reply = '<h1>No existe la película.</h1>';
$pay = false;
}
} else if(isset($_GET["cinema"])) {
$reply = '<h1>ESTAMOS TRABAJANDO EN ELLO</h1>';
$pay = false;
} else {
$reply = '<h1>No se ha encontrado película ni cine.</h1>';
$pay = false;
}
//Pay button:
if($pay){
$pay = '<form action="confirm.php" method="post">
<input type="hidden" name="film_id" id="film_id" value='.$fiml_id.' />
<input type="hidden" name="cinema_id" id="cinema_id" value='.$cinema_id.' />
<input type="hidden" name="session_id" id="session_id" value='.$session_id.' />
<input type="hidden" name="hall_id" id="hall_id" value='.$hall_id.' />
<input type="hidden" name="date_" id="date_" value='.$date_.' />
<input type="hidden" name="hour_" id="hour_" value='.$hour_.' />
<input type="submit" id="submit" value="Pagar" />
</form>';
}
//Page-specific content:
$section = '<!-- Purchase -->
<section id="purchase">
<div class="row">
<section class="code purchase">
'.$reply.'
</section>
<section class="code purchase">
'.$pay.'
</section>
</div>
</section>
';
//General page content:
require RAIZ_APP.'/HTMLtemplate.php';
?>