ppound
4 years ago
commit
84eda95c2d
22 changed files with 8799 additions and 0 deletions
@ -0,0 +1,339 @@
|
||||
GNU GENERAL PUBLIC LICENSE |
||||
Version 2, June 1991 |
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc., |
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||
Everyone is permitted to copy and distribute verbatim copies |
||||
of this license document, but changing it is not allowed. |
||||
|
||||
Preamble |
||||
|
||||
The licenses for most software are designed to take away your |
||||
freedom to share and change it. By contrast, the GNU General Public |
||||
License is intended to guarantee your freedom to share and change free |
||||
software--to make sure the software is free for all its users. This |
||||
General Public License applies to most of the Free Software |
||||
Foundation's software and to any other program whose authors commit to |
||||
using it. (Some other Free Software Foundation software is covered by |
||||
the GNU Lesser General Public License instead.) You can apply it to |
||||
your programs, too. |
||||
|
||||
When we speak of free software, we are referring to freedom, not |
||||
price. Our General Public Licenses are designed to make sure that you |
||||
have the freedom to distribute copies of free software (and charge for |
||||
this service if you wish), that you receive source code or can get it |
||||
if you want it, that you can change the software or use pieces of it |
||||
in new free programs; and that you know you can do these things. |
||||
|
||||
To protect your rights, we need to make restrictions that forbid |
||||
anyone to deny you these rights or to ask you to surrender the rights. |
||||
These restrictions translate to certain responsibilities for you if you |
||||
distribute copies of the software, or if you modify it. |
||||
|
||||
For example, if you distribute copies of such a program, whether |
||||
gratis or for a fee, you must give the recipients all the rights that |
||||
you have. You must make sure that they, too, receive or can get the |
||||
source code. And you must show them these terms so they know their |
||||
rights. |
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and |
||||
(2) offer you this license which gives you legal permission to copy, |
||||
distribute and/or modify the software. |
||||
|
||||
Also, for each author's protection and ours, we want to make certain |
||||
that everyone understands that there is no warranty for this free |
||||
software. If the software is modified by someone else and passed on, we |
||||
want its recipients to know that what they have is not the original, so |
||||
that any problems introduced by others will not reflect on the original |
||||
authors' reputations. |
||||
|
||||
Finally, any free program is threatened constantly by software |
||||
patents. We wish to avoid the danger that redistributors of a free |
||||
program will individually obtain patent licenses, in effect making the |
||||
program proprietary. To prevent this, we have made it clear that any |
||||
patent must be licensed for everyone's free use or not licensed at all. |
||||
|
||||
The precise terms and conditions for copying, distribution and |
||||
modification follow. |
||||
|
||||
GNU GENERAL PUBLIC LICENSE |
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
||||
|
||||
0. This License applies to any program or other work which contains |
||||
a notice placed by the copyright holder saying it may be distributed |
||||
under the terms of this General Public License. The "Program", below, |
||||
refers to any such program or work, and a "work based on the Program" |
||||
means either the Program or any derivative work under copyright law: |
||||
that is to say, a work containing the Program or a portion of it, |
||||
either verbatim or with modifications and/or translated into another |
||||
language. (Hereinafter, translation is included without limitation in |
||||
the term "modification".) Each licensee is addressed as "you". |
||||
|
||||
Activities other than copying, distribution and modification are not |
||||
covered by this License; they are outside its scope. The act of |
||||
running the Program is not restricted, and the output from the Program |
||||
is covered only if its contents constitute a work based on the |
||||
Program (independent of having been made by running the Program). |
||||
Whether that is true depends on what the Program does. |
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's |
||||
source code as you receive it, in any medium, provided that you |
||||
conspicuously and appropriately publish on each copy an appropriate |
||||
copyright notice and disclaimer of warranty; keep intact all the |
||||
notices that refer to this License and to the absence of any warranty; |
||||
and give any other recipients of the Program a copy of this License |
||||
along with the Program. |
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and |
||||
you may at your option offer warranty protection in exchange for a fee. |
||||
|
||||
2. You may modify your copy or copies of the Program or any portion |
||||
of it, thus forming a work based on the Program, and copy and |
||||
distribute such modifications or work under the terms of Section 1 |
||||
above, provided that you also meet all of these conditions: |
||||
|
||||
a) You must cause the modified files to carry prominent notices |
||||
stating that you changed the files and the date of any change. |
||||
|
||||
b) You must cause any work that you distribute or publish, that in |
||||
whole or in part contains or is derived from the Program or any |
||||
part thereof, to be licensed as a whole at no charge to all third |
||||
parties under the terms of this License. |
||||
|
||||
c) If the modified program normally reads commands interactively |
||||
when run, you must cause it, when started running for such |
||||
interactive use in the most ordinary way, to print or display an |
||||
announcement including an appropriate copyright notice and a |
||||
notice that there is no warranty (or else, saying that you provide |
||||
a warranty) and that users may redistribute the program under |
||||
these conditions, and telling the user how to view a copy of this |
||||
License. (Exception: if the Program itself is interactive but |
||||
does not normally print such an announcement, your work based on |
||||
the Program is not required to print an announcement.) |
||||
|
||||
These requirements apply to the modified work as a whole. If |
||||
identifiable sections of that work are not derived from the Program, |
||||
and can be reasonably considered independent and separate works in |
||||
themselves, then this License, and its terms, do not apply to those |
||||
sections when you distribute them as separate works. But when you |
||||
distribute the same sections as part of a whole which is a work based |
||||
on the Program, the distribution of the whole must be on the terms of |
||||
this License, whose permissions for other licensees extend to the |
||||
entire whole, and thus to each and every part regardless of who wrote it. |
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest |
||||
your rights to work written entirely by you; rather, the intent is to |
||||
exercise the right to control the distribution of derivative or |
||||
collective works based on the Program. |
||||
|
||||
In addition, mere aggregation of another work not based on the Program |
||||
with the Program (or with a work based on the Program) on a volume of |
||||
a storage or distribution medium does not bring the other work under |
||||
the scope of this License. |
||||
|
||||
3. You may copy and distribute the Program (or a work based on it, |
||||
under Section 2) in object code or executable form under the terms of |
||||
Sections 1 and 2 above provided that you also do one of the following: |
||||
|
||||
a) Accompany it with the complete corresponding machine-readable |
||||
source code, which must be distributed under the terms of Sections |
||||
1 and 2 above on a medium customarily used for software interchange; or, |
||||
|
||||
b) Accompany it with a written offer, valid for at least three |
||||
years, to give any third party, for a charge no more than your |
||||
cost of physically performing source distribution, a complete |
||||
machine-readable copy of the corresponding source code, to be |
||||
distributed under the terms of Sections 1 and 2 above on a medium |
||||
customarily used for software interchange; or, |
||||
|
||||
c) Accompany it with the information you received as to the offer |
||||
to distribute corresponding source code. (This alternative is |
||||
allowed only for noncommercial distribution and only if you |
||||
received the program in object code or executable form with such |
||||
an offer, in accord with Subsection b above.) |
||||
|
||||
The source code for a work means the preferred form of the work for |
||||
making modifications to it. For an executable work, complete source |
||||
code means all the source code for all modules it contains, plus any |
||||
associated interface definition files, plus the scripts used to |
||||
control compilation and installation of the executable. However, as a |
||||
special exception, the source code distributed need not include |
||||
anything that is normally distributed (in either source or binary |
||||
form) with the major components (compiler, kernel, and so on) of the |
||||
operating system on which the executable runs, unless that component |
||||
itself accompanies the executable. |
||||
|
||||
If distribution of executable or object code is made by offering |
||||
access to copy from a designated place, then offering equivalent |
||||
access to copy the source code from the same place counts as |
||||
distribution of the source code, even though third parties are not |
||||
compelled to copy the source along with the object code. |
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program |
||||
except as expressly provided under this License. Any attempt |
||||
otherwise to copy, modify, sublicense or distribute the Program is |
||||
void, and will automatically terminate your rights under this License. |
||||
However, parties who have received copies, or rights, from you under |
||||
this License will not have their licenses terminated so long as such |
||||
parties remain in full compliance. |
||||
|
||||
5. You are not required to accept this License, since you have not |
||||
signed it. However, nothing else grants you permission to modify or |
||||
distribute the Program or its derivative works. These actions are |
||||
prohibited by law if you do not accept this License. Therefore, by |
||||
modifying or distributing the Program (or any work based on the |
||||
Program), you indicate your acceptance of this License to do so, and |
||||
all its terms and conditions for copying, distributing or modifying |
||||
the Program or works based on it. |
||||
|
||||
6. Each time you redistribute the Program (or any work based on the |
||||
Program), the recipient automatically receives a license from the |
||||
original licensor to copy, distribute or modify the Program subject to |
||||
these terms and conditions. You may not impose any further |
||||
restrictions on the recipients' exercise of the rights granted herein. |
||||
You are not responsible for enforcing compliance by third parties to |
||||
this License. |
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent |
||||
infringement or for any other reason (not limited to patent issues), |
||||
conditions are imposed on you (whether by court order, agreement or |
||||
otherwise) that contradict the conditions of this License, they do not |
||||
excuse you from the conditions of this License. If you cannot |
||||
distribute so as to satisfy simultaneously your obligations under this |
||||
License and any other pertinent obligations, then as a consequence you |
||||
may not distribute the Program at all. For example, if a patent |
||||
license would not permit royalty-free redistribution of the Program by |
||||
all those who receive copies directly or indirectly through you, then |
||||
the only way you could satisfy both it and this License would be to |
||||
refrain entirely from distribution of the Program. |
||||
|
||||
If any portion of this section is held invalid or unenforceable under |
||||
any particular circumstance, the balance of the section is intended to |
||||
apply and the section as a whole is intended to apply in other |
||||
circumstances. |
||||
|
||||
It is not the purpose of this section to induce you to infringe any |
||||
patents or other property right claims or to contest validity of any |
||||
such claims; this section has the sole purpose of protecting the |
||||
integrity of the free software distribution system, which is |
||||
implemented by public license practices. Many people have made |
||||
generous contributions to the wide range of software distributed |
||||
through that system in reliance on consistent application of that |
||||
system; it is up to the author/donor to decide if he or she is willing |
||||
to distribute software through any other system and a licensee cannot |
||||
impose that choice. |
||||
|
||||
This section is intended to make thoroughly clear what is believed to |
||||
be a consequence of the rest of this License. |
||||
|
||||
8. If the distribution and/or use of the Program is restricted in |
||||
certain countries either by patents or by copyrighted interfaces, the |
||||
original copyright holder who places the Program under this License |
||||
may add an explicit geographical distribution limitation excluding |
||||
those countries, so that distribution is permitted only in or among |
||||
countries not thus excluded. In such case, this License incorporates |
||||
the limitation as if written in the body of this License. |
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions |
||||
of the General Public License from time to time. Such new versions will |
||||
be similar in spirit to the present version, but may differ in detail to |
||||
address new problems or concerns. |
||||
|
||||
Each version is given a distinguishing version number. If the Program |
||||
specifies a version number of this License which applies to it and "any |
||||
later version", you have the option of following the terms and conditions |
||||
either of that version or of any later version published by the Free |
||||
Software Foundation. If the Program does not specify a version number of |
||||
this License, you may choose any version ever published by the Free Software |
||||
Foundation. |
||||
|
||||
10. If you wish to incorporate parts of the Program into other free |
||||
programs whose distribution conditions are different, write to the author |
||||
to ask for permission. For software which is copyrighted by the Free |
||||
Software Foundation, write to the Free Software Foundation; we sometimes |
||||
make exceptions for this. Our decision will be guided by the two goals |
||||
of preserving the free status of all derivatives of our free software and |
||||
of promoting the sharing and reuse of software generally. |
||||
|
||||
NO WARRANTY |
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
||||
REPAIR OR CORRECTION. |
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
||||
POSSIBILITY OF SUCH DAMAGES. |
||||
|
||||
END OF TERMS AND CONDITIONS |
||||
|
||||
How to Apply These Terms to Your New Programs |
||||
|
||||
If you develop a new program, and you want it to be of the greatest |
||||
possible use to the public, the best way to achieve this is to make it |
||||
free software which everyone can redistribute and change under these terms. |
||||
|
||||
To do so, attach the following notices to the program. It is safest |
||||
to attach them to the start of each source file to most effectively |
||||
convey the exclusion of warranty; and each file should have at least |
||||
the "copyright" line and a pointer to where the full notice is found. |
||||
|
||||
<one line to give the program's name and a brief idea of what it does.> |
||||
Copyright (C) <year> <name of author> |
||||
|
||||
This program is free software; you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation; either version 2 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License along |
||||
with this program; if not, write to the Free Software Foundation, Inc., |
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
||||
|
||||
Also add information on how to contact you by electronic and paper mail. |
||||
|
||||
If the program is interactive, make it output a short notice like this |
||||
when it starts in an interactive mode: |
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author |
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
||||
This is free software, and you are welcome to redistribute it |
||||
under certain conditions; type `show c' for details. |
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate |
||||
parts of the General Public License. Of course, the commands you use may |
||||
be called something other than `show w' and `show c'; they could even be |
||||
mouse-clicks or menu items--whatever suits your program. |
||||
|
||||
You should also get your employer (if you work as a programmer) or your |
||||
school, if any, to sign a "copyright disclaimer" for the program, if |
||||
necessary. Here is a sample; alter the names: |
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
||||
|
||||
<signature of Ty Coon>, 1 April 1989 |
||||
Ty Coon, President of Vice |
||||
|
||||
This General Public License does not permit incorporating your program into |
||||
proprietary programs. If your program is a subroutine library, you may |
||||
consider it more useful to permit linking proprietary applications with the |
||||
library. If this is what you want to do, use the GNU Lesser General |
||||
Public License instead of this License. |
@ -0,0 +1,45 @@
|
||||
|
||||
-- SUMMARY -- |
||||
|
||||
Room Reservations is an application for making and managing room reservations. |
||||
It enables users to view a calendar of reserved and open rooms by day, and to |
||||
make, modify, and cancel room reservations. Confirmation of reservations and |
||||
reminders can be sent to multiple parties by email and SMS text message. |
||||
|
||||
-- REQUIREMENTS -- |
||||
|
||||
Token module. |
||||
|
||||
-- INSTALLATION -- |
||||
|
||||
Install as usual, see http://drupal.org/node/70151 for further information. |
||||
|
||||
-- CONFIGURATION -- |
||||
|
||||
Administrators can configure the module to define the following items: |
||||
|
||||
* application name |
||||
* room categories |
||||
* rooms |
||||
* hours by day when reservations can be made |
||||
* reservation policies |
||||
* reservation instructions |
||||
* SMS wireless network information |
||||
* reservation confirmation messages |
||||
* reservation reminder messages |
||||
* time of day reminders are sent |
||||
|
||||
Detailed instructions for configuring the module can be found at |
||||
http://drupal.org/node/1853318. |
||||
|
||||
-- CONTACT -- |
||||
|
||||
Current maintainer: |
||||
* Bob Humphrey - http://drupal.org/user/560600 |
||||
|
||||
-- SPONSOR -- |
||||
|
||||
This project has been sponsored by: |
||||
William Madison Randall Library |
||||
University of North Carolina Wilmington |
||||
http://library.uncw.edu/ |
@ -0,0 +1,43 @@
|
||||
<?php |
||||
/** |
||||
* @file |
||||
* Miscellaneous controller functionality. |
||||
*/ |
||||
|
||||
/** |
||||
* Display a list of the user's current reservations. |
||||
* |
||||
* @global object $user |
||||
* Drupal user object. |
||||
* @global type $base_url |
||||
* The base URL of the Drupal installation. |
||||
* |
||||
* @return string |
||||
* A list of the user's reservations in HTML format. |
||||
*/ |
||||
function room_reservations_res_list() { |
||||
global $user; |
||||
global $base_url; |
||||
$user_reservations = NULL; |
||||
$count = 0; |
||||
if ($user->uid) { |
||||
// User is logged in. |
||||
$user_reservations = _room_reservations_user_reservations(); |
||||
$count = count($user_reservations); |
||||
} |
||||
$output .= theme('room_reservations_list', array('user' => $user, 'base_url' => $base_url, 'user_reservations' => $user_reservations, 'count' => $count)); |
||||
return $output; |
||||
} |
||||
|
||||
/** |
||||
* Display a page showing the reservation system policies. |
||||
* |
||||
* @return string |
||||
* The policies for the reservation system as entered by the administrator |
||||
* using the Display Text configuration page. |
||||
*/ |
||||
function room_reservations_policies() { |
||||
$output = check_markup(_room_reservations_get_variable('policies')); |
||||
return $output; |
||||
} |
||||
|
@ -0,0 +1,345 @@
|
||||
<?php |
||||
/** |
||||
* @file |
||||
* Calendar controller functionality. |
||||
*/ |
||||
|
||||
/** |
||||
* Display the reservation calendar. |
||||
* |
||||
* @param int $selected_month |
||||
* (optional) The month of the day selected by the user. |
||||
* @param int $selected_day |
||||
* (optional) The day of the month selected by the user. |
||||
* |
||||
* @return string |
||||
* The page display formatted as HTML. |
||||
*/ |
||||
function room_reservations($selected_month = NULL, $selected_day = NULL) { |
||||
// likely no need for this as not used anywhere else; but maybe for external modules |
||||
global $yyyymmdd; |
||||
|
||||
// dates are now keyed by Cat ID; but we only need anyone of these to build calendar but make sure its the one which starts earliest |
||||
$datesbycat = _room_reservations_dates($selected_month, $selected_day); |
||||
$categories = _room_reservations_categories(); |
||||
|
||||
// allow other modules to alter the categories |
||||
drupal_alter('room_reservations_categories', $categories); |
||||
|
||||
// if no Categories left; we should not bother with the rest of this |
||||
if (!count($categories)) { |
||||
drupal_set_message(t('There are no configured Room Categories. Please contact the System Administrator'), 'warning'); |
||||
drupal_goto(); |
||||
} |
||||
|
||||
$earliest = _room_reservations_earliest_category($categories); |
||||
|
||||
$dates = $datesbycat[$earliest]; |
||||
|
||||
// Determine which day has been selected by the user. If the user has entered a url that specifies a day outside of the |
||||
// allowable reservation window, then set the current day as the selected day. |
||||
$yyyymmdd = $dates[0]['yyyymmdd']; |
||||
foreach ($dates as $day) { |
||||
if ($day['selected']) { |
||||
$yyyymmdd = $day['yyyymmdd']; |
||||
} |
||||
} |
||||
if ($yyyymmdd == $dates[0]['yyyymmdd']) { |
||||
$dates[0]['selected'] = TRUE; |
||||
$dates[0]['today'] = TRUE; |
||||
} |
||||
|
||||
// a bit hacky; but we need to store what the calendar is using for its date so we can use this in theme functions later |
||||
//$_SESSION['reservations_current_day'] = $yyyymmdd; |
||||
|
||||
// If the day being displayed is today, only display time slots that are later than the current time minus two hours. |
||||
$today_displayed = FALSE; |
||||
foreach ($dates as $day) { |
||||
if (($day['selected']) && $day['today']) { |
||||
$today_displayed = TRUE; |
||||
} |
||||
} |
||||
if ($today_displayed) { |
||||
$hours = _room_reservations_hours('limited'); |
||||
} |
||||
else { |
||||
$hours = _room_reservations_hours(); |
||||
} |
||||
$_room_reservations_building_hours = _room_reservations_facility_hours(); |
||||
$display_hours = _room_reservations_hours(); |
||||
|
||||
// Determine the open hours (display version) for the date selected by the user. |
||||
$building_hours_day = $_room_reservations_building_hours[$yyyymmdd]; |
||||
$building_hours_display = $building_hours_day['display']; |
||||
|
||||
// For each time slot, determine if the rooms are open or closed. |
||||
$building_hours_day = $_room_reservations_building_hours[$yyyymmdd]; |
||||
$int_first_shift_open = intval($building_hours_day['first_shift_open']); |
||||
$int_first_shift_close = intval($building_hours_day['first_shift_close']); |
||||
$int_second_shift_open = intval($building_hours_day['second_shift_open']); |
||||
$int_second_shift_close = intval($building_hours_day['second_shift_close']); |
||||
$open_24 = $building_hours_day['open_24_hours']; |
||||
$x = 0; |
||||
$buffer = variable_get('room_reservations_before_after_hours', 3) * 100; |
||||
foreach ($hours as $time_slot) { |
||||
$int_time_slot_time = intval($time_slot['time']); |
||||
if ($building_hours_day['open_24_hours']) { |
||||
$time_slot['open'] = TRUE; |
||||
} |
||||
elseif ((($int_time_slot_time >= $int_first_shift_open) && ($int_time_slot_time < $int_first_shift_close)) || |
||||
(($int_time_slot_time >= $int_second_shift_open) && ($int_time_slot_time < $int_second_shift_close))) { |
||||
$time_slot['open'] = TRUE; |
||||
} |
||||
else { |
||||
$time_slot['open'] = FALSE; |
||||
} |
||||
|
||||
// if not open ALL day let's limit display to start just before first open shift (or 2nd if only one used) |
||||
// this assume you must have 1st shift defined and possible 2nd (i.e. can't define only 2nd shift) |
||||
if (!$open_24 && $buffer != 300) { |
||||
if ($int_first_shift_open < 9999 && ($hours[$x]['time'] < $int_first_shift_open - $buffer)) { |
||||
unset($hours[$x]); |
||||
} |
||||
else { |
||||
$hours[$x] = $time_slot; |
||||
} |
||||
// and do the same for closing |
||||
if (isset($hours[$x])) { |
||||
if ($int_second_shift_close < 9999) { |
||||
if ($hours[$x]['time'] >= $int_second_shift_close + $buffer) { |
||||
unset($hours[$x]); |
||||
} |
||||
} |
||||
elseif ($int_first_shift_close < 9999) { |
||||
if ($hours[$x]['time'] >= $int_first_shift_close + $buffer) { |
||||
unset($hours[$x]); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
else { |
||||
$hours[$x] = $time_slot; |
||||
} |
||||
$x++; |
||||
} |
||||
$all_hours = _room_reservations_hours(); |
||||
$times = _room_reservations_times(); |
||||
$rooms = _room_reservations_rooms(); |
||||
|
||||
// Initialize the $reservations array. |
||||
$reservations = array(); |
||||
foreach ($rooms as $room) { |
||||
$room_name = $room['name']; |
||||
foreach ($hours as $time_slot) { |
||||
$time = $time_slot['time']; |
||||
$reservations[$room['nid']][$time] = array( |
||||
'time' => $time, |
||||
'display' => $time_slot['display'], |
||||
'class' => $time_slot['class'], |
||||
'id' => '', |
||||
'booked' => FALSE, |
||||
'start' => FALSE, |
||||
'end' => FALSE, |
||||
'user' => '', |
||||
'name' => '', |
||||
); |
||||
} |
||||
} |
||||
|
||||
$query = new EntityFieldQuery(); |
||||
$query->entityCondition('entity_type', 'node') |
||||
->entityCondition('bundle', 'room_reservations_reservation') |
||||
->fieldCondition('reservation_date', 'value', $yyyymmdd . '%', 'like') |
||||
->fieldOrderBy('reservation_time', 'value', 'DESC') |
||||
// EFQ respects access so if user does not have access to view a reservation (most likely due to some access module then we will not return a |
||||
// reservation for this slot; this means it will not block this slot from being bookable - which is likely worse than being able to |
||||
// see the booking title (especially since we have a method to block the title if user really doesn't want anyone to see it) |
||||
// so, let's load the reservations as user 1 to make sure we get them all |
||||
->addMetaData('account', user_load(1)); |
||||
$result = $query->execute(); |
||||
if (isset($result['node'])) { |
||||
$result_nids = array_keys($result['node']); |
||||
$results = entity_load('node', $result_nids); |
||||
foreach ($results as $data) { |
||||
$id = $data->nid; |
||||
$time = $data->reservation_time[LANGUAGE_NONE][0]['value'];; |
||||
$rid = $data->reservation_room[LANGUAGE_NONE][0]['target_id']; |
||||
$name = $data->title; |
||||
$user_name = $data->name; |
||||
$reservations[$rid][$time]['booked'] = TRUE; |
||||
$reservations[$rid][$time]['class'] .= ' booked'; |
||||
$reservations[$rid][$time]['name'] = $name; |
||||
$reservations[$rid][$time]['user_name'] = $user_name; |
||||
$reservations[$rid][$time]['id'] = $id; |
||||
$reservations[$rid][$time]['series_id'] = isset($data->reservation_series_id[LANGUAGE_NONE][0]['value']) ? $data->reservation_series_id[LANGUAGE_NONE][0]['value'] : ''; |
||||
$reservations[$rid][$time]['user'] = $data->uid; |
||||
$reservations[$rid][$time]['blocked'] = isset($data->reservation_block_title[LANGUAGE_NONE][0]['value']) ? $data->reservation_block_title[LANGUAGE_NONE][0]['value'] : 0; |
||||
|
||||
// add rest of slots as booked for the length of this reservation |
||||
$length = $data->reservation_length[LANGUAGE_NONE][0]['value'];; |
||||
$time_slots = $length / 30; |
||||
$reservations[$rid][$time]['slots'] = $time_slots; |
||||
$remainder = $length % 30; |
||||
if ($remainder > 1) { |
||||
$time_slots++; |
||||
} |
||||
$key = array_search($time, $times); |
||||
$x = 2; |
||||
while ($x <= $time_slots) { |
||||
$key++; |
||||
$next_time = $times[$key]; |
||||
$reservations[$rid][$next_time]['booked'] = TRUE; |
||||
if(isset($reservations[$rid][$next_time]['class'])) { |
||||
$reservations[$rid][$next_time]['class'] = $reservations[$rid][$next_time]['class'] . ' booked'; |
||||
} |
||||
//$reservations[$rid][$next_time]['class'] .= ' booked'; |
||||
//$reservations[$rid][$next_time]['class'] = $reservations[$rid][$next_time]['class'] . ' booked'; |
||||
$x++; |
||||
// unclear how we handle wrapping a reservation to the next day; but reservation time slots can't go passed midnight; i.e. slot 47 |
||||
if ($key == 47) { |
||||
break; |
||||
} |
||||
} |
||||
|
||||
// add in pre/post buffer for setup/takedown (rev 7.x-1.3+) |
||||
// - if the slot is part of buffer we add "setup" to class |
||||
// - if we don't have admin rights; we also mark it as booked so no one can book in these slots |
||||
$category = $categories[$rooms[$rid]['reservations_room_category'][LANGUAGE_NONE][0]['target_id']]; |
||||
$preslots = $category['prebuffer'] / 30; |
||||
$postslots = $category['postbuffer'] / 30; |
||||
$startkey = array_search($reservations[$rid][$time]['time'], $times); |
||||
$endkey = $startkey + $time_slots; |
||||
$k = $startkey - $preslots; |
||||
while ($k < $startkey) { |
||||
if (!$reservations[$rid][$times[$k]]['booked']) { |
||||
$reservations[$rid][$times[$k]]['class'] .= ' setup'; |
||||
} |
||||
$reservations[$rid][$times[$k]]['booked'] = user_access('book over buffer') ? $reservations[$rid][$times[$k]]['booked'] : true; |
||||
$k++; |
||||
} |
||||
$k = $endkey; |
||||
while ($k < $endkey + $postslots) { |
||||
if (!$reservations[$rid][$times[$k]]['booked']) { |
||||
$reservations[$rid][$times[$k]]['class'] .= ' setup'; |
||||
} |
||||
$reservations[$rid][$times[$k]]['booked'] = user_access('book over buffer') ? $reservations[$rid][$times[$k]]['booked'] : true; |
||||
$k++; |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Get any room_reservation records for the previous day that might carry over into the selected day. |
||||
// Continue to update the $reservation array with that information. |
||||
$previous_day = date('Y-m-d', strtotime("$yyyymmdd -1 days")); |
||||
$max_length = user_access('create room reservations extended length') ? variable_get('room_reservations_max_length_extended', 120) : variable_get('room_reservations_max_length_standard', 120); |
||||
$lhours = _room_reservations_hours(); |
||||
$rhours = array_reverse($lhours); |
||||
$slots = ($max_length / 30) - 1; |
||||
$late_times = array(); |
||||
$search_times = array( |
||||
'9999', |
||||
'9999', |
||||
'9999', |
||||
'9999', |
||||
'9999', |
||||
'9999', |
||||
'9999', |
||||
); |
||||
for ($j = 0; $j < $slots; $j++) { |
||||
$hour = $rhours[$j]; |
||||
$late_times[] = $hour['time']; |
||||
$search_times[$j] = $hour['time']; |
||||
} |
||||
$late_times = array_reverse($late_times); |
||||
|
||||
$query = new EntityFieldQuery(); |
||||
$query->entityCondition('entity_type', 'node') |
||||
->entityCondition('bundle', 'room_reservations_reservation') |
||||
->fieldCondition('reservation_date', 'value', $previous_day . '%', 'like') |
||||
->fieldCondition('reservation_time', 'value', $search_times, 'in') |
||||
->fieldOrderBy('reservation_time', 'value', 'DESC') |
||||
// EFQ respects access so let's load the reservations as user 1 to make sure we get them all |
||||
->addMetaData('account', user_load(1)); |
||||
$result = $query->execute(); |
||||
if (isset($result['node'])) { |
||||
$result_nids = array_keys($result['node']); |
||||
$results = entity_load('node', $result_nids); |
||||
foreach ($results as $data) { |
||||
$id = $data->nid; |
||||
$time = $data->reservation_time[LANGUAGE_NONE][0]['value']; |
||||
$rid = $data->reservation_room[LANGUAGE_NONE][0]['target_id']; |
||||
$length = $data->reservation_length[LANGUAGE_NONE][0]['value']; |
||||
//$room_name = $data->room; |
||||
$name = $data->title; |
||||
$user_name = $data->name; |
||||
$time_slots = $length / 30; |
||||
$remainder = $length % 30; |
||||
if ($remainder > 1) { |
||||
$time_slots++; |
||||
} |
||||
for ($j = 0; $j < (($max_length / 30) - 1); $j++) { |
||||
if ($late_times[$j] == $time) { |
||||
$carry_over_time_slots = ($time_slots + $j - (($max_length / 30) - 1)); |
||||
break; |
||||
} |
||||
} |
||||
if ($carry_over_time_slots > 0) { |
||||
$reservations[$rid]['0000']['booked'] = TRUE; |
||||
$reservations[$rid]['0000']['name'] = $name; |
||||
$reservations[$rid]['0000']['user_name'] = $user_name; |
||||
$reservations[$rid]['0000']['id'] = $id; |
||||
$carry_over_time_slots--; |
||||
} |
||||
while ($carry_over_time_slots > 0) { |
||||
$next_time = $times[$carry_over_time_slots]; |
||||
$reservations[$rid][$next_time]['booked'] = TRUE; |
||||
$carry_over_time_slots--; |
||||
} |
||||
} |
||||
} |
||||
$user_reservations = _room_reservations_user_reservations(); |
||||
$output = ''; |
||||
$output .= theme('room_reservations', array( |
||||
'dates' => $dates, |
||||
'categories' => $categories, |
||||
'reservations' => $reservations, |
||||
'hours' => $hours, |
||||
'building_hours' => $_room_reservations_building_hours, |
||||
'building_hours_display' => $building_hours_display, |
||||
'rooms' => $rooms, |
||||
'user_reservations' => $user_reservations)); |
||||
return $output; |
||||
} |
||||
|
||||
function _room_reservations_earliest_category($categories) { |
||||
$earliest = 1000; |
||||
foreach ($categories as $cat) { |
||||
if ($cat['advmin'] < $earliest) { |
||||
$earliest = $cat['advmin']; |
||||
$result = $cat['nid']; |
||||
} |
||||
} |
||||
return $result; |
||||
} |
||||
|
||||
function _room_reservations_get_dates() { |
||||
// dates are now keyed by Cat ID; but we only need anyone of these to build calendar but make sure its the one which starts earliest |
||||
$datesbycat = _room_reservations_dates($selected_month, $selected_day); |
||||
$categories = _room_reservations_categories(); |
||||
$earliest = _room_reservations_earlist_category($categories); |
||||
$dates = $datesbycat[$earliest]; |
||||
|
||||
// Determine which day has been selected by the user. If the user has entered a url that specifies a day outside of the |
||||
// allowable reservation window, then set the current day as the selected day. |
||||
$yyyymmdd = $dates[0]['yyyymmdd']; |
||||
foreach ($dates as $day) { |
||||
if ($day['selected']) { |
||||
$yyyymmdd = $day['yyyymmdd']; |
||||
} |
||||
} |
||||
if ($yyyymmdd == $dates[0]['yyyymmdd']) { |
||||
$dates[0]['selected'] = TRUE; |
||||
$dates[0]['today'] = TRUE; |
||||
} |
||||
return $dates; |
||||
} |
@ -0,0 +1,405 @@
|
||||
<?php |
||||
/** |
||||
* @file |
||||
* Single reservation controller functionality. |
||||
*/ |
||||
|
||||
//module_load_include('inc', 'room_reservations', '/view/room_reservations_reservation.view'); |
||||
|
||||
/** |
||||
* Make a new reservation. |
||||
* |
||||
* Validates whether the user can make a |
||||
* reservation for the requested date, time, and room. |
||||
* |
||||
* @global object $user |
||||
* The Drupal user object. |
||||
* |
||||
* @param int $month_number |
||||
* The month for which the reservation is being made. |
||||
* @param int $xday |
||||
* The day for which the reservation is being made. |
||||
* @param string $time |
||||
* The time at which the reservation is beeing made. |
||||
* @param int $xroom |
||||
* The room that is being reserved. |
||||
* |
||||
* @return string |
||||
* A form that can be used for making a reservation. |
||||
*/ |
||||
function room_reservations_res_add($month_number, $xday, $time, $xroom) { |
||||
$res = new Reservation(); |
||||
$res->monthNumber = $month_number; |
||||
$res->day = $xday; |
||||
$res->time = $time; |
||||
$res->room = $xroom; |
||||
$parameter_errors = FALSE; |
||||
$output = ''; |
||||
global $user; |
||||
$logged_in = ($user->uid); |
||||
$res->userName = ($logged_in) ? $user->name : ""; |
||||
$res->emailAddresses = _room_reservations_default_email(); |
||||
if (!$logged_in) { |
||||
drupal_set_message(t("You must be logged in to make a reservation."), 'error'); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
// Validate date and get day of week, month name, and year. |
||||
$dates = _room_reservations_dates(); |
||||
$reservation_is_for_today = FALSE; |
||||
$day_found = FALSE; |
||||
foreach ($dates as $day) { |
||||
if (($res->monthNumber == $day['month-number']) && ($res->day == $day['day'])) { |
||||
$day_found = TRUE; |
||||
$month = $day['month']; |
||||
$res->year = $day['year']; |
||||
$day_of_week = $day['day-of-week']; |
||||
$res->displayDate = $day['display']; |
||||
$res->date = $day['yyyymmdd']; |
||||
$unix_timestamp = strtotime($res->date); |
||||
$res->displayDate = date("l, F j, Y", $unix_timestamp); |
||||
if ($day['today']) { |
||||
$reservation_is_for_today = TRUE; |
||||
} |
||||
break; |
||||
} |
||||
} |
||||
if (!$day_found) { |
||||
drupal_set_message(t("An invalid date has been entered."), 'error'); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
else { |
||||
// Determine if the building is open. |
||||
$_room_reservations_building_hours = _room_reservations_facility_hours(); |
||||
$building_hours_day = $_room_reservations_building_hours[$res->date]; |
||||
if (!$building_hours_day['open']) { |
||||
drupal_set_message(t("An invalid date has been entered."), 'error'); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
} |
||||
// Validate time. |
||||
$hours = _room_reservations_hours(); |
||||
$hour_found = FALSE; |
||||
foreach ($hours as $time_slot) { |
||||
if ($res->time == $time_slot['time']) { |
||||
$res->displayTime = $time_slot['display']; |
||||
$hour_found = TRUE; |
||||
break; |
||||
} |
||||
} |
||||
if (!$hour_found) { |
||||
drupal_set_message(t("An invalid time has been entered."), 'error'); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
// Determine if the building is open for the time selected. |
||||
if ($day_found) { |
||||
$building_is_open = FALSE; |
||||
$int_time_slot_time = intval($res->time); |
||||
$int_first_shift_open = intval($building_hours_day['first_shift_open']); |
||||
$int_first_shift_close = intval($building_hours_day['first_shift_close']); |
||||
$int_second_shift_open = intval($building_hours_day['second_shift_open']); |
||||
$int_second_shift_close = intval($building_hours_day['second_shift_close']); |
||||
$open_24 = $building_hours_day['open_24_hours']; |
||||
if ($open_24) { |
||||
$building_is_open = TRUE; |
||||
} |
||||
elseif ((($int_time_slot_time >= $int_first_shift_open) && |
||||
($int_time_slot_time < $int_first_shift_close)) || |
||||
(($int_time_slot_time >= $int_second_shift_open) && |
||||
($int_time_slot_time < $int_second_shift_close))) { |
||||
$building_is_open = TRUE; |
||||
} |
||||
else { |
||||
$building_is_open = FALSE; |
||||
} |
||||
if (!$building_is_open) { |
||||
drupal_set_message(t("An invalid time has been entered."), 'error'); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
} |
||||
// If the reservation is being made for the current date, it must be for a |
||||
// time that is later than the current time. |
||||
if (!$parameter_errors) { |
||||
$reservation_date_time = strtotime($res->date . ' ' . |
||||
drupal_substr($res->time, 0, 2) . ':' . |
||||
drupal_substr($res->time, 2) . ':00'); |
||||
$now = strtotime(date('Y-m-d H:i:s')); |
||||
if ($reservation_date_time < $now) { |
||||
drupal_set_message(t("A reservation cannot be made for a time that has already passed."), 'error'); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
} |
||||
// Validate room. |
||||
$rooms = _room_reservations_rooms(); |
||||
$room_found = FALSE; |
||||
foreach ($rooms as $room) { |
||||
if ($res->room == $room['name']) { |
||||
$res->roomCapacity = $room['capacity']; |
||||
$res->roomCategory = $room['category']; |
||||
$room_found = TRUE; |
||||
break; |
||||
} |
||||
} |
||||
if (!$room_found) { |
||||
drupal_set_message(t("An invalid room has been entered."), 'error'); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
|
||||
// Determine if the room and time conflicts with another reservation. |
||||
if (!$parameter_errors) { |
||||
$conflicts_found = _room_reservations_start_conflicts($res->room, $res->date, $res->time); |
||||
if ($conflicts_found) { |
||||
$hours = _room_reservations_hours(); |
||||
foreach ($hours as $individual_hour) { |
||||
if ($individual_hour['time'] == $time) { |
||||
$display_time = $individual_hour['display']; |
||||
break; |
||||
} |
||||
} |
||||
$unix_timestamp = strtotime($res->date); |
||||
$display_date = date("F j, Y", $unix_timestamp); |
||||
drupal_set_message(t('Room @room has already been reserved for !date at |
||||
!time.', array( |
||||
'@room' => $res->room, |
||||
'!date' => $display_date, |
||||
'!time' => $display_time, |
||||
)), 'error'); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
} |
||||
// Determine the valid lengths of time for this reservation. |
||||
if (!$parameter_errors) { |
||||
$res->validLengths = _room_reservations_valid_lengths($res->room, $res->date, $res->time); |
||||
} |
||||
// Limit the total number of active user reservations. |
||||
$user_reservations = _room_reservations_user_reservations(); |
||||
$count = count($user_reservations); |
||||
$max = variable_get('room_reservations_reservations_per_user', 4); |
||||
if ($max) { |
||||
if ($count >= $max) { |
||||
drupal_set_message(t("You have already made the allowable number of reservations."), 'error'); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
} |
||||
// Limit the daily number of user reservations. |
||||
if ($res->date) { |
||||
if (_room_reservations_daily_max_exceeded($res->date)) { |
||||
drupal_set_message(t('You have already made the allowable number of reservations for !date.', array('!date' => $res->displayDate)), 'error'); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
} |
||||
// Show either errors or form. |
||||
if ($parameter_errors) { |
||||
drupal_goto('room_reservations'); |
||||
} |
||||
else { |
||||
$res->length = 0; |
||||
$res->name = ''; |
||||
$res->groupSize = 0; |
||||
$res->id = 0; |
||||
$res->textmsg = 0; |
||||
$res->carrier = 0; |
||||
$res->phone = ''; |
||||
$output .= drupal_get_form('room_reservations_res_form', 'add', $res); |
||||
} |
||||
return $output; |
||||
} |
||||
|
||||
/** |
||||
* View an existing reservation. |
||||
* |
||||
* Determine if the current user has the right to view the requested |
||||
* reservation. |
||||
* |
||||
* @global object $user |
||||
* Drupal user object. |
||||
* |
||||
* @param int $id |
||||
* The record key of the requested reservation. |
||||
* |
||||
* @return string |
||||
* A form used for displaying the reservation. |
||||
*/ |
||||
function room_reservations_res_view($id) { |
||||
$parameter_errors = FALSE; |
||||
$output = ''; |
||||
// Current user. |
||||
global $user; |
||||
$logged_in = ($user->uid); |
||||
$user_login_name = ($logged_in) ? $user->name : ""; |
||||
if (!$logged_in) { |
||||
drupal_set_message(t("You must be logged in to view reservation details.", 'error')); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
// Get the reservation record. |
||||
$res = new Reservation($id); |
||||
if (!$res->id) { |
||||
drupal_set_message(t("A reservation with this record ID could not be found."), 'error'); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
// Format the display date and time; get room capacity. |
||||
if ($res->id) { |
||||
$res->displayTime = ''; |
||||
$res->roomCapacity = 0; |
||||
$unix_timestamp = strtotime($res->date); |
||||
$res->displayDate = date("l, F j, Y", $unix_timestamp); |
||||
$hours = _room_reservations_hours(); |
||||
foreach ($hours as $time_slot) { |
||||
if ($res->time == $time_slot['time']) { |
||||
$res->displayTime = $time_slot['display']; |
||||
break; |
||||
} |
||||
} |
||||
$rooms = _room_reservations_rooms(); |
||||
foreach ($rooms as $room) { |
||||
if ($res->room == $room['name']) { |
||||
$res->roomCapacity = $room['capacity']; |
||||
$res->roomCategory = $room['category']; |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
// Determine if the person requesting the record is either the one who made |
||||
// the reservation Or an employee that has access to the record. |
||||
$current_user_is_owner = FALSE; |
||||
if ($res->id) { |
||||
if ($res->userName == $user_login_name) { |
||||
$current_user_is_owner = TRUE; |
||||
} |
||||
elseif (_room_reservations_full_access()) { |
||||
// Valid user. |
||||
} |
||||
else { |
||||
drupal_set_message(t("You are not allowed to view this reservation record."), 'error'); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
} |
||||
// If the reservation is for a future date and/or time, it can be updated by |
||||
// the person who made the reservation. |
||||
$reservation_can_still_be_updated = FALSE; |
||||
if ($res->id) { |
||||
$reservation_date_time = strtotime($res->date . ' ' . drupal_substr($res->time, 0, 2) . ':' . drupal_substr($res->time, 2) . ':00'); |
||||
$now = strtotime(date('Y-m-d H:i:s')); |
||||
if ($reservation_date_time > $now) { |
||||
$reservation_can_still_be_updated = TRUE; |
||||
} |
||||
} |
||||
// Set the operation for the form to either 'view' or 'update'. |
||||
$operation = 'view'; |
||||
if ($res->id) { |
||||
if (($current_user_is_owner) && ($reservation_can_still_be_updated)) { |
||||
$operation = 'update'; |
||||
} |
||||
} |
||||
$res->validLengths = NULL; |
||||
if ((!$parameter_errors) && ($operation == 'update')) { |
||||
$res->validLengths = _room_reservations_valid_lengths($res->room, $res->date, $res->time, $res->id); |
||||
} |
||||
// Show either errors or form. |
||||
if ($parameter_errors) { |
||||
drupal_goto('room_reservations'); |
||||
} |
||||
else { |
||||
$res->monthNumber = drupal_substr($res->date, 5, 2); |
||||
$res->day = drupal_substr($res->date, 8); |
||||
$res->year = drupal_substr($res->date, 0, 4); |
||||
$res->textmsg = ($res->textmsg == 'Y') ? 1 : 0; |
||||
$output .= drupal_get_form('room_reservations_res_form', $operation, $res); |
||||
} |
||||
return $output; |
||||
} |
||||
|
||||
/** |
||||
* Delete a reservation. |
||||
* |
||||
* Determine if the current user has the right to delete the requested |
||||
* reservation. |
||||
* |
||||
* @global object $user |
||||
* Drupal user object. |
||||
* |
||||
* @param int $id |
||||
* The record key of the requested reservation. |
||||
* |
||||
* @return string |
||||
* A form used for deleting the reservation. |
||||
*/ |
||||
function room_reservations_res_delete($id) { |
||||
$parameter_errors = FALSE; |
||||
$output = ''; |
||||
// Current user. |
||||
global $user; |
||||
$logged_in = ($user->uid); |
||||
$user_login_name = ($logged_in) ? $user->name : ""; |
||||
if (!$logged_in) { |
||||
drupal_set_message(t("You must be logged in to cancel a reservation."), 'error'); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
// Get the reservation record. |
||||
$res = new Reservation($id); |
||||
if (!$res->id) { |
||||
drupal_set_message(t("A reservation with this record ID could not be found."), 'error'); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
// Format the display date and time; get room capacity. |
||||
if ($res->id) { |
||||
$res->displayTime = ''; |
||||
$res->roomCapacity = 0; |
||||
$unix_timestamp = strtotime($res->date); |
||||
$res->displayDate = date("l, F j, Y", $unix_timestamp); |
||||
$hours = _room_reservations_hours(); |
||||
foreach ($hours as $time_slot) { |
||||
if ($res->time == $time_slot['time']) { |
||||
$res->displayTime = $time_slot['display']; |
||||
break; |
||||
} |
||||
} |
||||
$rooms = _room_reservations_rooms(); |
||||
foreach ($rooms as $room) { |
||||
if ($res->room == $room['name']) { |
||||
$res->roomCapacity = $room['capacity']; |
||||
$res->roomCategory = $room['category']; |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
// Determine if the person requesting the record is either the one who made |
||||
// the reservation or an employee that has access to the record. |
||||
$current_user_is_owner = FALSE; |
||||
if ($res->id) { |
||||
if ($res->userName == $user_login_name) { |
||||
$current_user_is_owner = TRUE; |
||||
} |
||||
else { |
||||
drupal_set_message(t("This reservation can only be cancelled by the person who made it."), 'error'); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
} |
||||
// If the reservation is for a future date and/or time, it can be deleted by |
||||
// the person who made the reservation. |
||||
$reservation_can_still_be_updated = FALSE; |
||||
if ($res->id) { |
||||
$reservation_date_time = strtotime($res->date . ' ' . |
||||
drupal_substr($res->time, 0, 2) . ':' . |
||||
drupal_substr($res->time, 2) . ':00'); |
||||
$now = strtotime(date('Y-m-d H:i:s')); |
||||
if ($reservation_date_time > $now) { |
||||
$reservation_can_still_be_updated = TRUE; |
||||
} |
||||
else { |
||||
drupal_set_message(t("This reservation can no longer be cancelled."), 'error'); |
||||
$parameter_errors = TRUE; |
||||
} |
||||
} |
||||
|
||||
// Show either the validation errors or the form. |
||||
if ($parameter_errors) { |
||||
drupal_goto('room_reservations'); |
||||
} |
||||
else { |
||||
$res->monthNumber = drupal_substr($res->date, 5, 2); |
||||
$res->day = drupal_substr($res->date, 8); |
||||
$res->year = drupal_substr($res->date, 0, 4); |
||||
$output .= drupal_get_form('room_reservations_cancel_form', $res); |
||||
} |
||||
return $output; |
||||
} |
After Width: | Height: | Size: 8.8 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 2.8 KiB |
@ -0,0 +1,231 @@
|
||||
/* ----------------------------- ROOM RESERVATIONS ---------------------------- */ |
||||
|
||||
#rooms-calendar .slink { |
||||
margin-right: 40px; |
||||
} |
||||
|
||||
.reservations-block ul { |
||||
list-style-image: url(images/bullet.gif); |
||||
} |
||||
|
||||
.reservations-block #reservations { |
||||
margin-bottom: 5px; |
||||
} |
||||
|
||||
#rooms-calendar .room-tabs { |
||||
margin: 0 0 0 7px; |
||||
padding: 0; |
||||
} |
||||
|
||||
#rooms-calendar ul li, |
||||
#rooms-calendar ul.menu li, |
||||
#rooms-calendar .item-list ul li, |
||||
#rooms-calendar li.leaf { |
||||
background: none; |
||||
padding: 0 0.75em 0.2em 0.75em; |
||||
} |
||||
|
||||
#rooms-calendar .room-tabs li { |
||||
float: left; |
||||
list-style: none; |
||||
margin: 0 0 -3px 0; |
||||
padding: 2px 3px; |
||||
} |
||||
|
||||
#rooms-calendar .room-tabs li a { |
||||
background: #dddddd; |
||||
border: 1px solid #999999; |
||||
border-top-left-radius: 7px; |
||||
border-top-right-radius: 7px; |
||||
display: block; |
||||
-moz-border-radius-topleft: 7px; |
||||
-moz-border-radius-topright: 7px; |
||||
padding: 3px 5px; |
||||
text-decoration: none; |
||||
-webkit-border-top-left-radius: 7px; |
||||
-webkit-border-top-right-radius: 7px; |
||||
} |
||||
|
||||
#rooms-calendar .room-tabs li a.active { |
||||
background: #ffffff; |
||||
border-bottom: 1px solid #ffffff; |
||||
} |
||||
|
||||
#rooms-calendar .panelContainer { |
||||
border: 1px solid #999; |
||||
clear: left; |
||||
} |
||||
|
||||
#rooms-calendar .panelContainer:after { |
||||
content: " "; |
||||
display: table; |
||||
clear: both; |
||||
min-height: 20px; |
||||
} |
||||
|
||||
#rooms-calendar .panel { |
||||
padding: 0 10px; |
||||
} |
||||
|
||||
#rooms-calendar #tabbedPanels .date { |
||||
clear: both; |
||||
margin: 0; |
||||
text-align: center; |
||||
} |
||||
|
||||
#rooms-calendar #tabbedPanels .hours { |
||||
color: #666666; |
||||
font-weight: bold; |
||||
margin-bottom: 5px; |
||||
text-align: center; |
||||
} |
||||
|
||||
#rooms-calendar #date-change, |
||||
#tabbedPanels #info { |
||||
text-align: center; |
||||
} |
||||
|
||||
#rooms-calendar .panel .gcolumns .grid-column { |
||||
float: left; |
||||
} |
||||
|
||||
#rooms-calendar div.grid-column { |
||||
max-width: 115px; |
||||
} |
||||
|
||||
#rooms-calendar .panel .gcolumns ul { |
||||
padding: 0 1px; |
||||
} |
||||
|
||||
#rooms-calendar .panel .gcolumns li { |
||||
border: 1px solid #dddddd; |
||||
font-size: 85%; |
||||
height: 1.33em; |
||||
line-height: 15px; |
||||
list-style-type: none; |
||||
margin: -1px auto 0; |
||||
padding: 2px 0; |
||||
text-align: center; |
||||
} |
||||
|
||||
/*#rooms-calendar .panel .gcolumns li.odd { |
||||
border-top: 1px solid #999999; |
||||
} |
||||
*/ |
||||
#rooms-calendar .panel .gcolumns li.room-info { |
||||
border: none; |
||||
} |
||||
|
||||
#rooms-calendar .panel .gcolumns li.room-info-heading { |
||||
padding-bottom: 5px; |
||||
} |
||||
|
||||
#rooms-calendar .panel .gcolumns li.room-info-footer { |
||||
padding-top: 5px; |
||||
} |
||||
|
||||
#rooms-calendar .panel .gcolumns .hours-column li { |
||||
width: 120px; |
||||
} |
||||
|
||||
#rooms-calendar .panel .gcolumns .room-column li { |
||||
width: 115px; |
||||
} |
||||
|
||||
#rooms-calendar .panel .gcolumns li.timeslot { |
||||
background-color: #fff; |
||||
*height: 1.33em; |
||||
*margin-bottom: 2px; |
||||
} |
||||
|
||||
#rooms-calendar .panel .gcolumns li.reservable { |
||||
background-color: #fff; |
||||
} |
||||
|
||||
#rooms-calendar .panel .gcolumns li.open { |
||||
background-color: #fff; |
||||
} |
||||
|
||||
#rooms-calendar .panel .gcolumns li.booked { |
||||
background-color: #ddd; |
||||
} |
||||
|
||||
#rooms-calendar .gcolumns li.setup { |
||||
background-color: #eee; |
||||
} |
||||
|
||||
#rooms-calendar .panel .gcolumns li.closed { |
||||
background-color: #d1dfdf; |
||||
border: 1px solid #d1dfdf; |
||||
} |
||||
|
||||
#rooms-calendar .hide { |
||||
display: none; |
||||
} |
||||
|
||||
.page-room-reservations .form-item label { |
||||
display: inline; |
||||
} |
||||
|
||||
#txtmsg-fields { |
||||
display: none; |
||||
} |
||||
|
||||
#date-change { |
||||
margin-bottom:20px; |
||||
} |
||||
.clear {clear:both;} |
||||
|
||||
/* QTIP Overrides */ |
||||
|
||||
.qtip { |
||||
box-shadow: -2px 2px 8px rgba(0,0,0,0.3); |
||||
} |
||||
|
||||
.qtip canvas { |
||||
display: none; |
||||
width: 400px; |
||||
} |
||||
.qtip-link, .qtip-additional-element { |
||||
border-bottom: 1px dotted #999; |
||||
} |
||||
|
||||
.qtip h4 { |
||||
margin: 0px; |
||||
margin-top: 0.5em; |
||||
font-size: 12px; |
||||
color: #999; |
||||
font-family: 'AvenirNextLTW01-Regular', Arial; |
||||
} |
||||
|
||||
.qtip-tooltip { |
||||
font-family: 'AvenirNextLTW01-Regular', Arial; |
||||
font-size: 12px; |
||||
margin-bottom: 0.5em; |
||||
width: 400px; |
||||
} |
||||
|
||||
/*! Light tooltip style */ |
||||
.ui-tooltip-light .ui-tooltip-titlebar, |
||||
.ui-tooltip-light .ui-tooltip-content{ |
||||
border-color: transparent; |
||||
color: #333; |
||||
} |
||||
|
||||
.ui-tooltip-light .ui-tooltip-content { |
||||
background-color: white; |
||||
width: 270px !important; |
||||
} |
||||
|
||||
.ui-tooltip-light .ui-tooltip-titlebar { |
||||
width: 244px !important; |
||||
} |
||||
|
||||
#ui-datepicker-div { |
||||
z-index:2 !important; |
||||
} |
||||
|
||||
#rooms-calendar ul li.reservable:hover, #rooms-calendar ul li.open:hover { |
||||
background-color:#FFF; |
||||
} |
||||
|
@ -0,0 +1,27 @@
|
||||
name = Room Reservations |
||||
description = Room reservation booking system. |
||||
core = 7.x |
||||
package = Other |
||||
dependencies[] = token |
||||
dependencies[] = entityreference |
||||
dependencies[] = field |
||||
dependencies[] = views |
||||
;dependencies[] = qtip |
||||
dependencies[] = date |
||||
dependencies[] = date_popup |
||||
files[] = room_reservations.inc |
||||
|
||||
|
||||
; Information added by Drupal.org packaging script on 2015-01-13 |
||||
version = "7.x-1.2" |
||||
core = "7.x" |
||||
project = "room_reservations" |
||||
datestamp = "1421188081" |
||||
|
||||
|
||||
; Information added by Drupal.org packaging script on 2016-12-15 |
||||
version = "7.x-2.x-dev" |
||||
core = "7.x" |
||||
project = "room_reservations" |
||||
datestamp = "1481826785" |
||||
|
@ -0,0 +1,234 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* Implements hook_schema(). |
||||
* |
||||
* Required Nodes (TODO use Entities: |
||||
* - room category (possibly should be a taxonomy) |
||||
* - room |
||||
* - reservation |
||||
* |
||||
*/ |
||||
function room_reservations_schema() { |
||||
$schema['room_reservations_variables'] = array( |
||||
'description' => '', |
||||
'fields' => array( |
||||
'id' => array( |
||||
'description' => '', |
||||
'type' => 'serial', |
||||
'not null' => TRUE, |
||||
), |
||||
'name' => array( |
||||
'description' => '', |
||||
'type' => 'varchar', |
||||
'length' => '128', |
||||
'not null' => TRUE, |
||||
), |
||||
'value' => array( |
||||
'description' => '', |
||||
'type' => 'text', |
||||
'size' => 'big', |
||||
'not null' => TRUE, |
||||
), |
||||
), |
||||
'primary key' => array('id'), |
||||
'indexes' => array( |
||||
'name' => array('name'), |
||||
), |
||||
); |
||||
|
||||
return $schema; |
||||
} |
||||
|
||||
/** |
||||
* The information that the module should remove includes: |
||||
* |
||||
* variables that the module has set using variable_set() or system_settings_form() |
||||
* modifications to existing tables |
||||
* |
||||
* The module should not remove its entry from the {system} table. Database tables defined by hook_schema() will be removed automatically. |
||||
* |
||||
* NOTE - but our tables are node tables and not created via hook_schema so must be cleaned out here |
||||
* |
||||
*/ |
||||
function room_reservations_uninstall() { |
||||
/* |
||||
db_query("DELETE FROM {node_type} WHERE type LIKE 'room_reservations_%'"); |
||||
db_query("DELETE FROM {field_config} WHERE field_name LIKE 'rooms_%'"); |
||||
|
||||
db_query("DELETE FROM {field_config_instance} WHERE bundle LIKE 'room_reservations_category'"); |
||||
db_query("DELETE FROM {field_config_instance} WHERE bundle LIKE 'room_reservations_room'"); |
||||
|
||||
|
||||
|
||||
db_drop_table('{field_data_rooms_room_category}'); |
||||
db_drop_table('{field_data_rooms_room_capacity}'); |
||||
db_drop_table('{field_revision_rooms_room_category}'); |
||||
db_drop_table('{field_revision_rooms_room_capacity}'); |
||||
|
||||
db_drop_table('{field_data_reservation_room}'); |
||||
db_drop_table('{field_revision_reservation_room}'); */ |
||||
|
||||
// remove reservation type |
||||
db_query("DELETE FROM {node_type} WHERE type LIKE 'room_reservations_%'"); |
||||
db_query("DELETE FROM {field_config} WHERE field_name LIKE 'reservation%'"); |
||||
db_query("DELETE FROM {field_config} WHERE field_name IN ('room_category', 'room_capacity')"); |
||||
db_query("DELETE FROM {field_config_instance} WHERE bundle LIKE 'room_reservations_%'"); |
||||
|
||||
// remove our custom fields - this means all RR content will be removed including room nodes |
||||
$fields = array( |
||||
'reservation_block_title', |
||||
'reservation_date', |
||||
'reservation_length', |
||||
'reservation_repeat_type', |
||||
'reservation_repeat_until', |
||||
'reservation_room', |
||||
'reservation_series_id', |
||||
'reservation_time', |
||||
'reservations_display_order', |
||||
'room_capacity', |
||||
'room_category', |
||||
); |
||||
foreach ($fields as $field) { |
||||
db_drop_table('field_data_' . $field); |
||||
db_drop_table('field_revision_' . $field); |
||||
} |
||||
|
||||
} |
||||
|
||||
/** |
||||
* attempt to clean up the mess of field names |
||||
*/ |
||||
function room_reservations_update_7000() { |
||||
db_change_field('field_data_room_capacity', 'room_capacity_value', 'reservations_room_capacity_value', array( |
||||
'type' => 'int', |
||||
'length' => 11, |
||||
'description' => 'Number of people the room can accommodate.')); |
||||
db_change_field('field_revision_room_capacity', 'room_capacity_value', 'reservations_room_capacity_value', array( |
||||
'type' => 'int', |
||||
'length' => 11, |
||||
'description' => 'Number of people the room can accommodate.')); |
||||
db_change_field('field_data_room_category', 'room_category_target_id', 'reservations_room_category_target_id', array( |
||||
'type' => 'int', |
||||
'length' => 10, |
||||
'description' => 'Which category the room is in.')); |
||||
db_change_field('field_revision_room_category', 'room_category_target_id', 'reservations_room_category_target_id', array( |
||||
'type' => 'int', |
||||
'length' => 10, |
||||
'description' => 'Which category the room is in.')); |
||||
db_change_field('field_data_reservation_display_order', 'reservation_display_order_value', 'reservations_display_order_value', array( |
||||
'type' => 'int', |
||||
'length' => 11, |
||||
'description' => 'Order to display rooms and categories.')); |
||||
db_change_field('field_revision_reservation_display_order', 'reservation_display_order_value', 'reservations_display_order_value', array( |
||||
'type' => 'int', |
||||
'length' => 11, |
||||
'description' => 'Order to display rooms and categories.')); |
||||
db_rename_table('field_data_room_capacity', 'field_data_reservations_room_capacity'); |
||||
db_rename_table('field_data_room_category', 'field_data_reservations_room_category'); |
||||
db_rename_table('field_revision_room_capacity', 'field_revision_reservations_room_capacity'); |
||||
db_rename_table('field_revision_room_category', 'field_revision_reservations_room_category'); |
||||
db_rename_table('field_data_reservation_display_order', 'field_data_reservations_display_order'); |
||||
db_rename_table('field_revision_reservation_display_order', 'field_revision_reservations_display_order'); |
||||
|
||||
db_drop_table('field_data_room_reservations_room_capacity'); |
||||
db_drop_table('field_data_room_reservations_room_category'); |
||||
db_drop_table('field_data_rooms_room_capacity'); |
||||
db_drop_table('field_data_rooms_room_category'); |
||||
db_drop_table('field_revision_room_reservations_room_capacity'); |
||||
db_drop_table('field_revision_room_reservations_room_category'); |
||||
db_drop_table('field_revision_rooms_room_capacity'); |
||||
db_drop_table('field_revision_rooms_room_category'); |
||||
|
||||
db_drop_table('field_data_reservation_carrier'); |
||||
db_drop_table('field_data_reservation_email_addresses'); |
||||
db_drop_table('field_data_reservation_phone'); |
||||
db_drop_table('field_data_reservation_txtmsg'); |
||||
db_drop_table('field_revision_reservation_carrier'); |
||||
db_drop_table('field_revision_reservation_email_addresses'); |
||||
db_drop_table('field_revision_reservation_phone'); |
||||
db_drop_table('field_revision_reservation_txtmsg'); |
||||
|
||||
db_update('field_config') |
||||
->fields(array( |
||||
'field_name' => 'reservations_room_capacity', |
||||
)) |
||||
->condition('field_name', 'room_capacity', '=') |
||||
->execute(); |
||||
db_update('field_config') |
||||
->fields(array( |
||||
'field_name' => 'reservations_room_category', |
||||
)) |
||||
->condition('field_name', 'room_category', '=') |
||||
->execute(); |
||||
db_update('field_config') |
||||
->fields(array( |
||||
'field_name' => 'reservations_display_order', |
||||
)) |
||||
->condition('field_name', 'reservation_display_order', '=') |
||||
->execute(); |
||||
db_update('field_config_instance') |
||||
->fields(array( |
||||
'field_name' => 'reservations_room_capacity', |
||||
)) |
||||
->condition('field_name', 'room_capacity', '=') |
||||
->execute(); |
||||
db_update('field_config_instance') |
||||
->fields(array( |
||||
'field_name' => 'reservations_room_category', |
||||
)) |
||||
->condition('field_name', 'room_category', '=') |
||||
->execute(); |
||||
db_update('field_config_instance') |
||||
->fields(array( |
||||
'field_name' => 'reservations_display_order', |
||||
)) |
||||
->condition('field_name', 'reservation_display_order', '=') |
||||
->execute(); |
||||
} |
||||
|
||||
/** |
||||
* fix a couple of the Notices - due to incomplete node defs |
||||
*/ |
||||
function room_reservations_update_7001() { |
||||
foreach (_room_reservations_installed_fields_room() as $field) { |
||||
field_update_field($field); |
||||
} |
||||
foreach (_room_reservations_installed_instances_room() as $instance) { |
||||
$instance['entity_type'] = 'node'; |
||||
$instance['bundle'] = 'room_reservations_room'; |
||||
field_update_instance($instance); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Add Cateogry field Minimum Advanced Booking, |
||||
* Add Cateogry field Setup time, |
||||
* Add Cateogry field Takedown time |
||||
*/ |
||||
function room_reservations_update_7002() { |
||||
$existing = field_info_field_map(); |
||||
$create = array( |
||||
'reservations_minadvbooking', |
||||
'reservations_prebuffer', |
||||
'reservations_postbuffer', |
||||
); |
||||
foreach (_room_reservations_installed_fields_category() as $field) { |
||||
if (isset($existing[$field['field_name']])) { |
||||
continue; |
||||
} |
||||
if (in_array($field['field_name'], $create)) { |
||||
field_create_field($field); |
||||
} |
||||
} |
||||
foreach (_room_reservations_installed_instances_category() as $instance) { |
||||
if (isset($existing[$instance['field_name']])) { |
||||
continue; |
||||
} |
||||
$instance['entity_type'] = 'node'; |
||||
$instance['bundle'] = 'room_reservations_category'; |
||||
if (in_array($instance['field_name'], $create)) { |
||||
field_create_instance($instance); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,64 @@
|
||||
(function ($) { |
||||
|
||||
Drupal.behaviors.room_reservations = {}; |
||||
|
||||
Drupal.behaviors.room_reservations.attach = function(context) { |
||||
// set default Category tab if one is set in URL anchor
|
||||
var anchor = window.location.hash; |
||||
if (anchor) { |
||||
$('.room-tabs a.active').removeClass('active'); |
||||
$('.room-tabs li a[href=' + anchor + ']').addClass('active'); |
||||
$('.panel').hide(); |
||||
$(anchor).show(); |
||||
} |
||||
|
||||
// show the selected category panel
|
||||
$('.room-tabs a').click(function() { |
||||
$this = $(this); |
||||
$('.panel').hide(); |
||||
$('.room-tabs a.active').removeClass('active'); |
||||
$this.addClass('active').blur(); |
||||
var panel = $this.attr('href'); |
||||
$(panel).fadeIn(250); |
||||
return false; |
||||
}); |
||||
|
||||
// change calendar date displayed
|
||||
$('#edit-date-datepicker-popup-0').change(function() { |
||||
var datebits = $(this).val().split('/'); |
||||
var formatarr = Drupal.settings.room_reservations.dateformat.split('/'); |
||||
var dateobj = new Object(); |
||||
$.each(formatarr, function(index, value) { |
||||
dateobj[value] = datebits[index]; |
||||
}); |
||||
var val = dateobj.m + '/' + dateobj.d; |
||||
var path = window.location.href; |
||||
var loc = path.lastIndexOf('room_reservations'); |
||||
if (loc != -1) { |
||||
var end = loc + 17; |
||||
var newpath = path.substring(0, end).concat('/'); |
||||
} else { |
||||
var newpath = path.concat('room_reservations/'); |
||||
} |
||||
window.location.href = newpath.concat(val); |
||||
}); |
||||
|
||||
// show form fields for text message confirmation and reminder
|
||||
$('#edit-textmsg').each(function() { |
||||
if ($(this).attr('checked')) { |
||||
$('#txtmsg-fields').slideDown('fast'); |
||||
} |
||||
else { |
||||
$('#txtmsg-fields').slideUp('fast'); |
||||
} |
||||
}); |
||||
$('#edit-textmsg').click(function() { |
||||
if ($(this).attr('checked')) { |
||||
$('#txtmsg-fields').slideDown('fast'); |
||||
} |
||||
else { |
||||
$('#txtmsg-fields').slideUp('fast'); |
||||
} |
||||
}); |
||||
}; |
||||
}(jQuery)); |
@ -0,0 +1,872 @@
|
||||
<?php |
||||
/** |
||||
* @file |
||||
* This module creates a room reservation application. |
||||
* |
||||
* @author Bob Humphrey, Web and Applications Developer, UNCW Randall Library |
||||
*/ |
||||
|
||||
module_load_include('inc', 'room_reservations', 'room_reservations'); |
||||
module_load_include('inc', 'room_reservations', 'room_reservations.node'); |
||||
module_load_include('inc', 'room_reservations', 'room_reservations.views'); |
||||
module_load_include('inc', 'room_reservations', 'room_reservations.series'); |
||||
|
||||
/** |
||||
* Implements hook_views_api(). |
||||
*/ |
||||
function room_reservations_views_api($module, $api) { |
||||
if ($module == 'views' && $api == 'views_default') { |
||||
return array('version' => 2); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Implements hook_menu(). |
||||
*/ |
||||
function room_reservations_menu() { |
||||
$app_title = variable_get('room_reservations_title', 'Room Reservations'); |
||||
$items['admin/config/system/room_reservations'] = array( |
||||
'title' => $app_title, |
||||
'description' => 'Configure room reservation options', |
||||
'page callback' => 'drupal_get_form', |
||||
'page arguments' => array('room_reservations_admin_settings'), |
||||
'access arguments' => array('administer room reservations system'), |
||||
'type' => MENU_NORMAL_ITEM, |
||||
'file' => 'room_reservations.admin.inc', |
||||
'weight' => 0, |
||||
); |
||||
$items['admin/config/system/room_reservations/settings'] = array( |
||||
'title' => 'Settings', |
||||
'type' => MENU_DEFAULT_LOCAL_TASK, |
||||
'access arguments' => array('administer room reservations system'), |
||||
'weight' => 10, |
||||
); |
||||
$items['admin/config/system/room_reservations/settings/general'] = array( |
||||
'title' => 'General', |
||||
'type' => MENU_DEFAULT_LOCAL_TASK, |
||||
'access arguments' => array('administer room reservations system'), |
||||
'weight' => 10, |
||||
); |
||||
$items['admin/config/system/room_reservations/hours'] = array( |
||||
'title' => 'Hours', |
||||
'page callback' => 'drupal_get_form', |
||||
'page arguments' => array('room_reservations_admin_settings_default_hours'), |
||||
'access arguments' => array('administer room reservations system'), |
||||
'type' => MENU_LOCAL_TASK, |
||||
'file' => 'room_reservations.admin.inc', |
||||
'weight' => 20, |
||||
); |
||||
$items['admin/config/system/room_reservations/hours/default_hours'] = array( |
||||
'title' => 'Default Hours', |
||||
'type' => MENU_DEFAULT_LOCAL_TASK, |
||||
'access arguments' => array('administer room reservations system'), |
||||
'weight' => 10, |
||||
); |
||||
$items['admin/config/system/room_reservations/hours/daily_hours'] = array( |
||||
'title' => 'Daily Hours', |
||||
'page callback' => 'drupal_get_form', |
||||
'page arguments' => array('room_reservations_admin_settings_daily_hours'), |
||||
'access arguments' => array('administer room reservations system'), |
||||
'type' => MENU_LOCAL_TASK, |
||||
'file' => 'room_reservations.admin.inc', |
||||
'weight' => 20, |
||||
); |
||||
$items['admin/config/system/room_reservations/page'] = array( |
||||
'title' => 'Display Text', |
||||
'page callback' => 'drupal_get_form', |
||||
'page arguments' => array('room_reservations_admin_settings_page'), |
||||
'access arguments' => array('administer room reservations system'), |
||||
'type' => MENU_LOCAL_TASK, |
||||
'file' => 'room_reservations.admin.inc', |
||||
'weight' => 30, |
||||
); |
||||
/*$items['admin/config/system/room_reservations/sms'] = array( |
||||
'title' => 'SMS', |
||||
'page callback' => 'drupal_get_form', |
||||
'page arguments' => array('room_reservations_admin_settings_sms'), |
||||
'access arguments' => array('administer room reservations system'), |
||||
'type' => MENU_LOCAL_TASK, |
||||
'file' => 'room_reservations.admin.inc', |
||||
'weight' => 40, |
||||
); |
||||
$items['admin/config/system/room_reservations/sms/networks'] = array( |
||||
'title' => 'Wireless Carriers', |
||||
'type' => MENU_DEFAULT_LOCAL_TASK, |
||||
'access arguments' => array('administer room reservations system'), |
||||
'weight' => 10, |
||||
); |
||||
$items['admin/config/system/room_reservations/sms/add'] = array( |
||||
'title' => 'Add Carrier', |
||||
'page callback' => 'drupal_get_form', |
||||
'page arguments' => array('room_reservations_admin_settings_sms_add'), |
||||
'access arguments' => array('administer room reservations system'), |
||||
'type' => MENU_LOCAL_TASK, |
||||
'file' => 'room_reservations.admin.inc', |
||||
'weight' => 20, |
||||
); |
||||
$items['admin/config/system/room_reservations/sms/delete'] = array( |
||||
'title' => 'Delete Carrier', |
||||
'page callback' => 'drupal_get_form', |
||||
'page arguments' => array('room_reservations_admin_settings_sms_delete'), |
||||
'access arguments' => array('administer room reservations system'), |
||||
'type' => MENU_LOCAL_TASK, |
||||
'file' => 'room_reservations.admin.inc', |
||||
'weight' => 30, |
||||
); |
||||
$items['admin/config/system/room_reservations/messages'] = array( |
||||
'title' => 'Messages', |
||||
'page callback' => 'drupal_get_form', |
||||
'page arguments' => array('room_reservations_admin_settings_email'), |
||||
'access arguments' => array('administer room reservations system'), |
||||
'type' => MENU_LOCAL_TASK, |
||||
'file' => 'room_reservations.admin.inc', |
||||
'weight' => 50, |
||||
); |
||||
$items['admin/config/system/room_reservations/messages/email'] = array( |
||||
'title' => 'Email Messages', |
||||
'access arguments' => array('administer room reservations system'), |
||||
'type' => MENU_DEFAULT_LOCAL_TASK, |
||||
'weight' => 10, |
||||
); |
||||
$items['admin/config/system/room_reservations/messages/text'] = array( |
||||
'title' => 'SMS Messages', |
||||
'page callback' => 'drupal_get_form', |
||||
'page arguments' => array('room_reservations_admin_settings_text'), |
||||
'access arguments' => array('administer room reservations system'), |
||||
'type' => MENU_LOCAL_TASK, |
||||
'file' => 'room_reservations.admin.inc', |
||||
'weight' => 20, |
||||
); |
||||
*/ |
||||
|
||||
/* |
||||
$items['room_reservations/add'] = array( |
||||
'title' => 'Reservation Details', |
||||
'page callback' => 'room_reservations_res_add', |
||||
'access callback' => TRUE, |
||||
'type' => MENU_CALLBACK, |
||||
'file' => '/controller/room_reservations_reservation.controller.inc', |
||||
); |
||||
$items['room_reservations/view'] = array( |
||||
'title' => 'Reservation Details', |
||||
'page callback' => 'room_reservations_res_view', |
||||
'access callback' => TRUE, |
||||
'type' => MENU_CALLBACK, |
||||
'file' => '/controller/room_reservations_reservation.controller.inc', |
||||
); |
||||
$items['room_reservations/delete'] = array( |
||||
'title' => 'Reservation Details', |
||||
'page callback' => 'room_reservations_res_delete', |
||||
'access callback' => TRUE, |
||||
'type' => MENU_CALLBACK, |
||||
'file' => '/controller/room_reservations_reservation.controller.inc', |
||||
); */ |
||||
$items['room_reservations'] = array( |
||||
'title' => variable_get('room_reservations_title', 'Room Reservations'), |
||||
'page callback' => 'room_reservations', |
||||
'access arguments' => array('view room reservations calendar'), |
||||
'type' => MENU_NORMAL_ITEM, |
||||
'file' => '/controller/room_reservations_calendar.controller.inc', |
||||
); |
||||
$items['room_reservations/calendar'] = array( |
||||
'title' => 'Calendar', |
||||
'access arguments' => array('view room reservations calendar'), |
||||
'type' => MENU_DEFAULT_LOCAL_TASK, |
||||
'weight' => 10, |
||||
); |
||||
$items['room_reservations/policies'] = array( |
||||
'title' => 'Policies', |
||||
'page callback' => 'room_reservations_policies', |
||||
'access arguments' => array('view room reservations calendar'), |
||||
'type' => MENU_LOCAL_TASK, |
||||
'weight' => 30, |
||||
'file' => '/controller/room_reservations.controller.inc', |
||||
); |
||||
return $items; |
||||
} |
||||
|
||||
/** |
||||
* Implements hook_init(). |
||||
(). |
||||
*/ |
||||
function room_reservations_init() { |
||||
// Add javascript. |
||||
drupal_add_js(drupal_get_path('module', 'room_reservations') . '/room_reservations.js'); |
||||
// Add css. |
||||
drupal_add_css(drupal_get_path('module', 'room_reservations') . '/room_reservations.css'); |
||||
// Prevent this module from caching. |
||||
if ((drupal_match_path($_GET['q'], 'room_reservations')) || (drupal_match_path($_GET['q'], 'room_reservations/*'))) { |
||||
$GLOBALS['conf']['cache'] = FALSE; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Implements hook_permission(). |
||||
*/ |
||||
function room_reservations_permission() { |
||||
return array( |
||||
'administer room reservations system' => array( |
||||
'title' => t('Administer the room reservations system'), |
||||
'description' => t('Allows administration of room categories, rooms and reservations. Allows administering all system configuration settings.'), |
||||
), |
||||
'edit any room reservation' => array( |
||||
'title' => t('Edit any room reservation'), |
||||
'description' => t('Allows editing of all room reservations in the system.'), |
||||
), |
||||
'delete any room reservation' => array( |
||||
'title' => t('Delete any room reservation'), |
||||
'description' => t('Allows deleting of any room reservation in the system.'), |
||||
), |
||||
'create room reservations standard' => array( |
||||
'title' => t('Create room reservations as well as edit or cancel your own reservations. Book in advance standard limit.'), |
||||
'description' => t('Create room reservations as well as edit or cancel your own reservations'), |
||||
), |
||||
'create room reservations extended' => array( |
||||
'title' => t('Create room reservations as well as edit or cancel your own reservations. Book in advance extended limit.'), |
||||
'description' => t('Create room reservations as well as edit or cancel your own reservations'), |
||||
), |
||||
'bypass minimum advance booking' => array( |
||||
'title' => t('Bypass minimum advanced booking limit.'), |
||||
'description' => t('Bypass minimum advanced booking limit.'), |
||||
), |
||||
'bypass reservations limiters' => array( |
||||
'title' => t('Bypass number of reservations limiters.'), |
||||
'description' => t('Bypass open reservations per user and reservations per day limits.'), |
||||
), |
||||
'book over buffer' => array( |
||||
'title' => t('Allow booking over setup/takedown buffers.'), |
||||
'description' => t('Allow user to book over top of the setup/takedown buffer for an existing reservation.'), |
||||
), |
||||
'create room reservations extended length' => array( |
||||
'title' => t('Create extended maximum length room reservations.'), |
||||
'description' => t('Create extended length reservations.'), |
||||
), |
||||
'view room reservations calendar' => array( |
||||
'title' => t('View the room reservations calendar'), |
||||
'description' => t('Allowed to view the reservations calendar but does not allow creating new reservations.'), |
||||
), |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* Implements hook_validate(). |
||||
*/ |
||||
function room_reservations_validate($node, $form, &$form_state) { |
||||
// If this is not a room reservation or we are not actually creating a new |
||||
// node we don't need to check for max reservations so return TRUE. |
||||
if ($node->type != 'room_reservations_reservation' || |
||||
$form_state['values']['op'] == 'Cancel Reservation' || !empty($node->nid)) { |
||||
return TRUE; |
||||
} |
||||
// TODO pull into a function as this code is duplicated here and in the form function. |
||||
if ($nid = $form['nid']['#value']) { |
||||
$res = $form['#node']; |
||||
$d = $res->reservation_date['und'][0]['value']; |
||||
$yyyymmdd = date('Y-m-d', strtotime($d)); |
||||
} |
||||
|
||||
// Group name must be 25 characters or less. |
||||
if ($node->type == 'room_reservations_reservation' && strlen($node->title) > 25 |
||||
&& $form_state['values']['op'] == 'Save') { |
||||
form_error($form, t('Group name must be less than 25 characters.')); |
||||
} |
||||
|
||||
// CREATE NEW. |
||||
else { |
||||
// Determine if this year or next year. |
||||
$yearnow = date('Y'); |
||||
$absdaynow = date('z'); |
||||
$absdaydefault = date('z', mktime(0, 0, 0, arg(3), arg(4), $yearnow)); |
||||
if ($absdaynow > $absdaydefault) { |
||||
$year = $yearnow + 1; |
||||
} |
||||
else { |
||||
$year = $yearnow; |
||||
} |
||||
$yyyymmdd = date('Y-m-d', strtotime($year . '-' . arg(3) . '-' . arg(4))); |
||||
} |
||||
|
||||
|
||||
if (user_access('bypass reservations limiters')) { |
||||
return; |
||||
} |
||||
else { |
||||
if (_room_reservations_daily_max_exceeded($yyyymmdd)) { |
||||
form_error($form, t('You have exceeded your daily reservation limit.')); |
||||
} |
||||
if (_room_reservations_user_max_exceeded()) { |
||||
form_error($form, t('You have exceeded your total number of reservations allowed.')); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Implements hook_node_access() |
||||
* |
||||
* rev 1.3 - change all node access deny to node access ignore so that other modules may better integrate |
||||
* - i.e. if DENY is set no other module can override that |
||||
* |
||||
* NOTE - this hook is not called for user 1 |
||||
*/ |
||||
function room_reservations_node_access($nodetype_or_node, $op, $account) { |
||||
if (is_object($nodetype_or_node)) { |
||||
$nodetype = $nodetype_or_node->type; |
||||
} |
||||
else { |
||||
$nodetype = $nodetype_or_node; |
||||
} |
||||
switch ($nodetype) { |
||||
case 'room_reservations_category': |
||||
case 'room_reservations_room': |
||||
switch ($op) { |
||||
case 'create': |
||||
case 'update': |
||||
case 'delete': |
||||
return user_access('administer room reservations system') ? NODE_ACCESS_ALLOW : NODE_ACCESS_IGNORE; |
||||
} |
||||
break; |
||||
|
||||
case 'room_reservations_reservation': |
||||
global $user; |
||||
// if it is my reservation; do nothing (let Drupal handle as usual) |
||||
if ((is_object($nodetype_or_node) && $nodetype_or_node->uid == $user->uid)) { |
||||
return NODE_ACCESS_ALLOW; |
||||
} |
||||
else { |
||||
switch ($op) { |
||||
case 'create': |
||||
// if we are trying to create a reservation let's make sure user hasn't just entered dates via url |
||||
// since available lengths takes allowed dates into account; lets just use that |
||||
$yyyymmdd = _room_reservations_yyyymmdd(arg(3), arg(4)); |
||||
$lengths = _room_reservations_valid_lengths(arg(6), $yyyymmdd, arg(5)); |
||||
if (count($lengths)) { |
||||
foreach ($lengths as $length) { |
||||
if ($length['is_valid']) { |
||||
return (user_access('create room reservations standard') || user_access('create room reservations extended') |
||||
|| user_access('administer room reservations system')) ? NODE_ACCESS_ALLOW : NODE_ACCESS_IGNORE; |
||||
} |
||||
} |
||||
} |
||||
return NODE_ACCESS_DENY; |
||||
case 'update': |
||||
return (user_access('administer room reservations system') || user_access('edit any room reservation')) ? NODE_ACCESS_ALLOW : NODE_ACCESS_IGNORE; |
||||
case 'delete': |
||||
return (user_access('administer room reservations system') || user_access('delete any room reservation')) ? NODE_ACCESS_ALLOW : NODE_ACCESS_IGNORE; |
||||
case 'view': |
||||
return user_access('administer room reservations system') ? NODE_ACCESS_ALLOW : NODE_ACCESS_IGNORE; |
||||
} |
||||
} |
||||
break; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* remove std Node perms for all types associated with Room Reservations |
||||
* |
||||
* @param mixed $form |
||||
* @param mixed $form_state |
||||
* @param mixed $form_id |
||||
*/ |
||||
function room_reservations_form_user_admin_permissions_alter(&$form, &$form_state, $form_id) { |
||||
foreach ($form['permission'] as $perm => $value) { |
||||
if (stristr($perm, 'content') && stristr($perm, 'room_reservations_')) { |
||||
unset($form['permission'][$perm]); |
||||
} |
||||
} |
||||
|
||||
foreach ($form['checkboxes'] as $box => $settings) { |
||||
foreach ($settings['#options'] as $index => $option) { |
||||
if (stristr($index, 'content') && stristr($index, 'room_reservations_')) { |
||||
unset($form['checkboxes'][$box]['#options'][$index]); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Description. |
||||
* |
||||
* @param mixed $form |
||||
* $form |
||||
* @param mixed $form_state |
||||
* $form_state |
||||
* @param mixed $form_id |
||||
* $form_id |
||||
*/ |
||||
function room_reservations_form_room_reservations_reservation_node_form_alter(&$form, &$form_state, $form_id) { |
||||
// Params either passed in on url - CREATE or pulled from node - EDIT. |
||||
// EDIT. |
||||
if (user_access('administer site configuration') && isset($_GET['edit']) && $_GET['edit'] == 'standard') { |
||||
return; |
||||
} |
||||
|
||||
// EDIT |
||||
if ($nid = $form['nid']['#value']) { |
||||
$res = $form['#node']; |
||||
$rid = $res->reservation_room[LANGUAGE_NONE][0]['target_id']; |
||||
$d = $res->reservation_date[LANGUAGE_NONE][0]['value']; |
||||
$yyyymmdd = date('Y-m-d', strtotime($d)); |
||||
$t = $res->reservation_time[LANGUAGE_NONE][0]['value']; |
||||
} |
||||
|
||||
// CREATE NEW |
||||
else { |
||||
// if no parameters passed; lets redirect to calendar page |
||||
if (!arg(3) && !arg(4)) { |
||||
drupal_goto('room_reservations'); |
||||
} |
||||
// determine if this year or next year |
||||
$yearnow = date('Y'); |
||||
$absdaynow = date('z'); |
||||
$absdaydefault = date('z', mktime(0, 0, 0, arg(3), arg(4), $yearnow)); |
||||
if ($absdaynow > $absdaydefault) { |
||||
$year = $yearnow + 1; |
||||
} |
||||
else { |
||||
$year = $yearnow; |
||||
} |
||||
$rid = arg(6); |
||||
$yyyymmdd = date('Y-m-d', strtotime($year . '-' . arg(3) . '-' . arg(4))); |
||||
$d = $yyyymmdd . ' 00:00:00'; |
||||
$t = arg(5); |
||||
} |
||||
|
||||
$room = node_load($rid); |
||||
$date = date('l, M d, Y', strtotime($d)); |
||||
$time = _room_reservations_display_time($t); |
||||
|
||||
$form['reservation_heading']['#type'] = 'markup'; |
||||
$form['reservation_heading']['#markup'] = ' |
||||
<h2 class="reservation-h2">' . t('Reservation booking for') . ':</h2><div><strong>' . t('Room') . ': ' . $room->title . '</strong></div> |
||||
<div><strong>' . t('Date') . ': ' . $date . '</strong></div> |
||||
<div><strong>' . t('Time') . ': ' . $time . '</strong></div><br/>'; |
||||
|
||||
$form['reservation_room']['#access'] = 0; |
||||
$form['reservation_date']['#access'] = 0; |
||||
$form['reservation_time']['#access'] = 0; |
||||
$form['reservation_room'][LANGUAGE_NONE]['#default_value'] = $room->nid; |
||||
|
||||
// Date fields are a major pita, setting default does nothing here; |
||||
// we need to carry this forward to the node_presave hook |
||||
$form['#node']->date_default = $d; |
||||
$form['reservation_time'][LANGUAGE_NONE][0]['value']['#default_value'] = $t; |
||||
|
||||
// remove Preview - can likely do this in node def |
||||
unset($form['actions']['preview']); |
||||
|
||||
// hide Series ID field |
||||
$form['reservation_series_id']['#access'] = FALSE; |
||||
|
||||
// if we are editing; let's do some extra things: |
||||
// - disable Repeat options |
||||
// - (series) add msg that we are editing a series and link to edit just that entry |
||||
if ($nid) { |
||||
$form['reservation_repeat_type']['#disabled'] = TRUE; |
||||
$form['reservation_repeat_until']['#disabled'] = TRUE; |
||||
|
||||
// not sure why this was here; if req i don't think structure during edit is correct here |
||||
/* |
||||
if ($form['reservation_repeat_type'][LANGUAGE_NONE][0]['#value'] > 1) { |
||||
$form['reservation_repeat_until'][LANGUAGE_NONE][0]['#value'] = $form['reservation_repeat_until'][LANGUAGE_NONE][0]['#default_value']['value']; |
||||
} |
||||
*/ |
||||
|
||||
$form['reservation_repeat_until']['und'][0]['#value'] = $form['reservation_repeat_until']['und'][0]['#default_value']['value']; |
||||
|
||||
// Form alter is hit in/out of form so we alter only in so we don't show |
||||
// messages after form is submitted - !count($form_state['input']). |
||||
if ($form['reservation_series_id'][LANGUAGE_NONE][0]['value']['#default_value'] && !count($form_state['input'])) { |
||||
if (isset($_GET['single'])) { |
||||
$series_link = l(t('Click here'), "node/$nid/edit"); |
||||
drupal_set_message(t('NOTE: you are editing a SINLGE day in a SERIES of reservations. Any changes made here will impact only the reservation |
||||
for this day. !link if you want to edit the entire series.', array('!link' => $series_link)), 'warning'); |
||||
} |
||||
else { |
||||
$single_link = l(t('Click here'), "node/$nid/edit", array('query' => array('single' => 1))); |
||||
drupal_set_message(t('NOTE: you are editing a SERIES of reservations. Any changes made here will impact all reservations in this |
||||
series. !link if you only want to edit this specific day in this series.', array('!link' => $single_link)), 'warning'); |
||||
} |
||||
} |
||||
|
||||
// And then parts that have to be here on both passes. |
||||
if ($form['reservation_series_id'][LANGUAGE_NONE][0]['value']['#default_value']) { |
||||
if (isset($_GET['single'])) { |
||||
// Re-label Delete to Cancel Reservation. |
||||
$form['actions']['delete']['#value'] = t('Cancel Reservation for This Day'); |
||||
} |
||||
else { |
||||
// Remove single node delete and add Delete Series button. |
||||
unset($form['actions']['delete']); |
||||
$form['actions']['delete_series'] = array( |
||||
'#type' => 'submit', |
||||
'#value' => t('Cancel Entire Series Reservation'), |
||||
'#weight' => 20, |
||||
'#submit' => array('_room_reservations_series_delete'), |
||||
); |
||||
} |
||||
} |
||||
|
||||
// And if not part of a series; let's change DELETE button. |
||||
if (!$form['reservation_series_id'][LANGUAGE_NONE][0]['value']['#default_value']) { |
||||
$form['actions']['delete']['#value'] = t('Cancel Reservation'); |
||||
} |
||||
} |
||||
|
||||
// Only show repeat reservation controls to users with 'Bypass number of reservations limiters' permission. |
||||
if (!user_access('Bypass number of reservations limiters')) { |
||||
$form['reservation_repeat_type']['#disabled'] = TRUE; |
||||
$form['reservation_repeat_until']['#disabled'] = TRUE; |
||||
$form['reservation_repeat_type']['#type'] = 'hidden'; |
||||
$form['reservation_repeat_until']['#type'] = 'hidden'; |
||||
} |
||||
|
||||
// Always redirect back to reservations calendar page. |
||||
$form['actions']['submit']['#submit'][] = 'return_to_reservations_page'; |
||||
|
||||
// Limit valid lengths so we have no overlaps. |
||||
$validlengths = _room_reservations_valid_lengths($rid, $yyyymmdd, $t); |
||||
foreach ($validlengths as $length) { |
||||
if ($length['is_valid']) { |
||||
$lengths[] = $length['length']; |
||||
} |
||||
} |
||||
foreach ($form['reservation_length'][LANGUAGE_NONE]['#options'] as $slot => &$option) { |
||||
if (!in_array($slot, $lengths)) { |
||||
unset($form['reservation_length'][LANGUAGE_NONE]['#options'][$slot]); |
||||
} |
||||
} |
||||
|
||||
$form['reservation_repeat_type'][LANGUAGE_NONE]['#default_value'] = $form['reservation_repeat_type'][LANGUAGE_NONE]['#default_value'] ? $form['reservation_repeat_type'][LANGUAGE_NONE]['#default_value'] : 1; |
||||
$form['reservation_repeat_until']['#states'] = array( |
||||
'visible' => array( |
||||
':input[name="reservation_repeat_type[und]"]' => array('!value' => '1'), |
||||
), |
||||
); |
||||
|
||||
// CHANGE - empty return not needed. |
||||
// return; |
||||
} |
||||
|
||||
/** |
||||
* Description. |
||||
* |
||||
* @param mixed $form |
||||
* $form |
||||
* @param mixed $form_state |
||||
* $form_state |
||||
* @param mixed $form_id |
||||
* $form_id |
||||
*/ |
||||
function room_reservations_form_node_delete_confirm_alter(&$form, &$form_state, $form_id) { |
||||
if ($form['#node']->type == 'room_reservations_reservation') { |
||||
$form['#submit'][] = 'return_to_reservations_page'; |
||||
} |
||||
|
||||
// CHANGE - empty return statement not needed here. |
||||
// return; |
||||
} |
||||
|
||||
/** |
||||
* Description. |
||||
* |
||||
* @param mixed $node |
||||
* $node |
||||
*/ |
||||
function room_reservations_node_presave($node) { |
||||
switch ($node->type) { |
||||
case 'room_reservations_reservation': |
||||
if (isset($node->date_default)) { |
||||
$node->reservation_date[LANGUAGE_NONE][0]['value'] = $node->date_default; |
||||
} |
||||
break; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Description. |
||||
* |
||||
* @param mixed &$element |
||||
* $element |
||||
* @param mixed $form_state |
||||
* $form_state |
||||
* @param mixed &$context |
||||
* $context |
||||
*/ |
||||
function room_reservations_date_popup_process_alter(&$element, &$form_state, &$context) { |
||||
if (isset($element['#field']['field_name'])) { |
||||
switch ($element['#field']['field_name']) { |
||||
case "reservation_repeat_until": { |
||||
if (user_access('create room reservations extended')) { |
||||
$advancedays = variable_get('room_reservations_advance_extended', 180); |
||||
} |
||||
else { |
||||
$advancedays = variable_get('room_reservations_advance_standard', 14); |
||||
} |
||||
$element['#datepicker_options'] = array( |
||||
'minDate' => '+0d', |
||||
'maxDate' => $advancedays . 'D', |
||||
); |
||||
$element['date'] = date_popup_process_date_part($element); |
||||
} |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Description. |
||||
* |
||||
* @param mixed $form |
||||
* $form |
||||
* @param mixed $form_state |
||||
* $form_state |
||||
*/ |
||||
function return_to_reservations_page($form, &$form_state) { |
||||
// Can't set redirect here for DELETE function; |
||||
// see delete confirm form alter above |
||||
if ($form_state['clicked_button']['#id'] == 'edit-delete') { |
||||
return; |
||||
} |
||||
|
||||
if(isset($form_state['values']['reservation_room'][LANGUAGE_NONE][0]['target_id'])) { |
||||
$rid = $form_state['values']['reservation_room'][LANGUAGE_NONE][0]['target_id']; |
||||
$rooms = _room_reservations_rooms(); |
||||
$categories = _room_reservations_categories(); |
||||
$room = $rooms[$rid]; |
||||
$catid = $room['reservations_room_category'][LANGUAGE_NONE][0]['target_id']; |
||||
$category = $categories[$catid]; |
||||
$anchor = strtolower(preg_replace('/[^a-zA-Z0-9-]+/', '-', $category['title'])); |
||||
} |
||||
|
||||
// Need to handle both update and delete case. |
||||
$date = (empty($form_state['values']['reservation_date'][LANGUAGE_NONE][0]['value'])) ? NULL : $form['#node']->reservation_date[LANGUAGE_NONE][0]['value']; |
||||
if ($date) { |
||||
$return = date('n/d', strtotime($date)); |
||||
$form_state['redirect'] = array('room_reservations/' . $return, array('fragment' => $anchor)); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Implements hook_theme(). |
||||
*/ |
||||
function room_reservations_theme() { |
||||
return array( |
||||
'room_reservations' => array( |
||||
'variables' => array( |
||||
'dates', |
||||
'categories', |
||||
'hours', |
||||
'building_hours', |
||||
'building_hours_display', |
||||
'rooms', |
||||
'selected_category', |
||||
'user_reservations', |
||||
), |
||||
'file' => '/view/room_reservations_calendar.view.inc', |
||||
), |
||||
'room_reservations_descriptions' => array( |
||||
'variables' => array('categories, rooms'), |
||||
'file' => '/view/room_reservations.view.inc', |
||||
), |
||||
'room_reservations_list' => array( |
||||
'variables' => array('user, base_url, user_reservations, count'), |
||||
'file' => '/view/room_reservations.view.inc', |
||||
), |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* Implements hook_mail(). |
||||
*/ |
||||
function room_reservations_mail($key, &$message, $params) { |
||||
global $base_url; |
||||
$modified_base_url = str_replace('https', 'http', $base_url); |
||||
$headers = array( |
||||
'MIME-Version' => '1.0', |
||||
'Content-Type' => 'text/html; charset=UTF-8; format=flowed', |
||||
'Content-Transfer-Encoding' => '8Bit', |
||||
'X-Mailer' => 'Drupal', |
||||
); |
||||
switch ($key) { |
||||
case 'confirmation': |
||||
foreach ($headers as $key => $value) { |
||||
$message['headers'][$key] = $value; |
||||
} |
||||
$message['subject'] = _room_reservations_replace_tokens(check_plain( |
||||
_room_reservations_get_variable('confirmation_header_text')), $params); |
||||
$body = _room_reservations_replace_tokens(check_markup( |
||||
_room_reservations_get_variable('confirmation_owner_text')), $params); |
||||
$message['body'][] = '<html><body>' . $body . '</body></html>'; |
||||
break; |
||||
|
||||
case 'notification': |
||||
foreach ($headers as $key => $value) { |
||||
$message['headers'][$key] = $value; |
||||
} |
||||
$message['subject'] = _room_reservations_replace_tokens(check_plain( |
||||
_room_reservations_get_variable('confirmation_header_text')), $params); |
||||
$body = _room_reservations_replace_tokens(check_markup( |
||||
_room_reservations_get_variable('confirmation_group_text')), $params); |
||||
$message['body'][] = '<html><body>' . $body . '</body></html>'; |
||||
break; |
||||
|
||||
case 'owner reminder': |
||||
foreach ($headers as $key => $value) { |
||||
$message['headers'][$key] = $value; |
||||
} |
||||
$message['subject'] = _room_reservations_replace_tokens(check_plain( |
||||
_room_reservations_get_variable('reminder_header_text')), $params); |
||||
$body = _room_reservations_replace_tokens(check_markup( |
||||
_room_reservations_get_variable('reminder_owner_text')), $params); |
||||
$message['body'][] = '<html><body>' . $body . '</body></html>'; |
||||
break; |
||||
|
||||
case 'group reminder': |
||||
foreach ($headers as $key => $value) { |
||||
$message['headers'][$key] = $value; |
||||
} |
||||
$message['subject'] = _room_reservations_replace_tokens(check_plain( |
||||
_room_reservations_get_variable('reminder_header_text')), $params); |
||||
$body = _room_reservations_replace_tokens(check_markup( |
||||
_room_reservations_get_variable('reminder_group_text')), $params); |
||||
$message['body'][] = '<html><body>' . $body . '</body></html>'; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Implements hook_cron(). |
||||
*/ |
||||
function xxxroom_reservations_cron() { |
||||
// Send reservation reminders. |
||||
$send_reminders = _room_reservations_get_variable('send_reminders'); |
||||
$last_reminders_sent = _room_reservations_get_variable('last_reminders_sent'); |
||||
$reminder_time = (_room_reservations_get_variable('reminder_time') / 100); |
||||
$reminder_cutoff = (_room_reservations_get_variable('reminder_cutoff') / 100) . ':00:00'; |
||||
$reminders_sent_today = FALSE; |
||||
// Reminders are sent once a day. Have they been sent today? |
||||
if ($last_reminders_sent) { |
||||
if ($last_reminders_sent == date("Y-m-d")) { |
||||
$reminders_sent_today = TRUE; |
||||
} |
||||
} |
||||
$current_hour = date("G"); |
||||
if (($send_reminders) && (!$reminders_sent_today) && ($current_hour >= $reminder_time)) { |
||||
$today = date("Y-m-d"); |
||||
$cutoff = $today . ' ' . $reminder_cutoff; |
||||
$tomorrow = date('Y-m-d', strtotime("now +1 days")); |
||||
$no_reminder_sent = '0000-00-00 00:00:00'; |
||||
$not_deleted = 'N'; |
||||
$sql = " |
||||
SELECT * |
||||
FROM {room_reservations} |
||||
WHERE date = '%s' |
||||
AND reminder_date = '%s' |
||||
AND create_date < '%s' |
||||
AND deleted = '%s' |
||||
"; |
||||
$record_count = 0; |
||||
$hours = _room_reservations_hours(); |
||||
$result = db_query($sql, $tomorrow, $no_reminder_sent, $cutoff, $not_deleted); |
||||
if ($result) { |
||||
while ($data = db_fetch_object($result)) { |
||||
$id = $data->id; |
||||
$date = $data->date; |
||||
$time = $data->time; |
||||
$length = $data->length; |
||||
$room = $data->room; |
||||
$name = check_plain($data->name); |
||||
$group_size = $data->group_size; |
||||
$user_name = $data->user_name; |
||||
$email_addresses = check_plain($data->email_addresses); |
||||
$textmsg = $data->textmsg; |
||||
$carrier = $data->carrier; |
||||
$phone = check_plain($data->phone); |
||||
$record_count++; |
||||
$month_name = date("F", strtotime($date)); |
||||
$month_number = date("n", strtotime($date)); |
||||
$day = date("j", strtotime($date)); |
||||
$day_of_week = date("l", strtotime($date)); |
||||
foreach ($hours as $individual_hour) { |
||||
if ($individual_hour['time'] == $time) { |
||||
$display_time = $individual_hour['display']; |
||||
break; |
||||
} |
||||
} |
||||
// Send email reminders. |
||||
$params = array( |
||||
'room' => $room, |
||||
'month' => $month_name, |
||||
'month_number' => $month_number, |
||||
'day' => $day, |
||||
'day_of_week' => $day_of_week, |
||||
'time' => $display_time, |
||||
'minutes' => $length, |
||||
'name' => $name, |
||||
'id' => $id, |
||||
'carrier' => $carrier, |
||||
'phone' => $phone, |
||||
); |
||||
$from = check_plain(_room_reservations_get_variable('from_address')); |
||||
// Send an email to each person in the group. If the person is the one |
||||
// who made the reservation, send the owner reminder message. |
||||
// Otherwise, send the group reminder message. |
||||
if (drupal_strlen($email_addresses)) { |
||||
$to_addresses = explode(',', $email_addresses); |
||||
foreach ($to_addresses as $to_address) { |
||||
$to_address = trim($to_address); |
||||
$pos = strpos($to_address, $user_name); |
||||
if ($pos === FALSE) { |
||||
$key = 'group reminder'; |
||||
} |
||||
else { |
||||
$key = 'owner reminder'; |
||||
} |
||||
$response = drupal_mail('room_reservations', $key, $to_address, language_default(), $params, $from, TRUE); |
||||
} |
||||
} |
||||
// Send a text message if requested. |
||||
if ($textmsg == 'Y') { |
||||
_room_reservations_send_sms('reminder', $params); |
||||
} |
||||
// Update the reminder_date field in the db record. |
||||
$now = date("Y-m-d H:i"); |
||||
$sql2 = "UPDATE {room_reservations} SET reminder_date = '%s' WHERE id = %d"; |
||||
$result2 = db_query($sql2, $now, $id); |
||||
} |
||||
} |
||||
_room_reservations_set_variable('last_reminders_sent', $today); |
||||
} |
||||
// End code to send reminders. |
||||
// Update the building hours records. |
||||
$update_building_hours = FALSE; |
||||
$today = date("Y-m-d"); |
||||
$building_hours_update_date = _room_reservations_get_variable('building hours update'); |
||||
if ($building_hours_update_date) { |
||||
if ($building_hours_update_date < $today) { |
||||
$update_building_hours = TRUE; |
||||
} |
||||
} |
||||
if (!$building_hours_update_date) { |
||||
$update_building_hours = TRUE; |
||||
} |
||||
if ($update_building_hours) { |
||||
_room_reservations_set_variable('building hours update', $today); |
||||
$months = _room_reservations_current_months(); |
||||
$x = 0; |
||||
foreach ($months as $month) { |
||||
// Delete first month - previous month. |
||||
if (!$x) { |
||||
$result = _room_reservations_delete_variable('MONTHLY_HOURS_' . $month['YYYY_MM']); |
||||
$x++; |
||||
} |
||||
else { |
||||
// Create current three months if they don't exist. |
||||
$month_hours = _room_reservations_get_variable('MONTHLY_HOURS_' . $month['YYYY_MM']); |
||||
if (!$month_hours) { |
||||
_room_reservations_create_mo_hours($month['year'], $month['month'], $month['YYYY_MM']); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,191 @@
|
||||
<?php
|
||||
|
||||
/** |
||||
* Reservation CRUD |
||||
*/ |
||||
|
||||
/** |
||||
* Create REPEATING reservations |
||||
* |
||||
* @param mixed $node |
||||
*/ |
||||
function room_reservations_insert($node) { |
||||
if ($node->type != 'room_reservations_reservation') { |
||||
return; |
||||
} |
||||
|
||||
// when we do a node_save below; it will hit this hook; so if this routine just did the save lets bail |
||||
if (isset($node->saved)){ |
||||
return; |
||||
} |
||||
|
||||
$rtype = $node->reservation_repeat_type[LANGUAGE_NONE][0]['value']; |
||||
$start = $node->reservation_date[LANGUAGE_NONE][0]['value']; |
||||
$start_yyyy_mm_dd = date('Y-m-d', strtotime($start)); |
||||
$end = date('Y-m-d', strtotime($node->reservation_repeat_until[LANGUAGE_NONE][0]['value'])); |
||||
$time = $node->reservation_time[LANGUAGE_NONE][0]['value']; |
||||
$length = $node->reservation_length[LANGUAGE_NONE][0]['value']; |
||||
$rid = $node->reservation_room[LANGUAGE_NONE][0]['target_id']; |
||||
$day = date('l', strtotime($start)); |
||||
|
||||
$msg = ''; |
||||
switch ($rtype) { |
||||
// no repeats |
||||
case 1: |
||||
return; |
||||
|
||||
// every day until.... |
||||
case 2: |
||||
$skip = '+1 day'; |
||||
$back = '-1 day'; |
||||
$msg = t('You have booked every day from %start until %end', array('%start' => $start_yyyy_mm_dd, '%end' => $end)); |
||||
break; |
||||
|
||||
// this day of the week until.. |
||||
case 3: |
||||
$skip = '+7 day'; |
||||
$back = '-7 day'; |
||||
$msg = t('You have booked every %day from %start until %end', array('%day' => $day, '%start' => $start_yyyy_mm_dd, '%end' => $end)); |
||||
break; |
||||
} |
||||
|
||||
// set NID as Series ID for both the primary node and the repeat nodes |
||||
$node->reservation_series_id[LANGUAGE_NONE][0]['value'] = $node->nid; |
||||
|
||||
$tmp = clone($node); |
||||
unset($tmp->nid, $tmp->vid); |
||||
// and must unset default date that we just used in hook_node_presave for the initial node |
||||
unset($tmp->date_default); |
||||
$date = $start; |
||||
$booked = array(); |
||||
while (strtotime($date) <= strtotime($back, strtotime($end))) { |
||||
$date = date('Y-m-d', strtotime($skip, strtotime($date))); |
||||
|
||||
// must check to see if next booking is available |
||||
// the first one we don't check as we could not have picked it if it wasn't |
||||
if (_room_reservations_is_slot_free($rid, $date, $time, $length)) { |
||||
$new = clone($tmp); |
||||
$new->reservation_date[LANGUAGE_NONE][0]['value'] = $date . ' 00:00:00'; // added 12:00:00 to fix TZ issues; this is unlikely correct way to do this |
||||
$new->saved = true; |
||||
node_save($new); |
||||
} |
||||
else { |
||||
$booked[] = $date; |
||||
} |
||||
} |
||||
|
||||
// lets spit out some useful msgs |
||||
// first clear the msg stating we just created the reservation node |
||||
drupal_get_messages('status'); |
||||
drupal_set_message(t('Your reservation series has been booked.')); |
||||
drupal_set_message($msg); |
||||
if (count($booked)) { |
||||
$dates = '<br>' . implode('<br>', $booked); |
||||
drupal_set_message(t('The following dates were not booked due to scheduling conflicts: !dates', array('!dates' => $dates)), 'warning'); |
||||
} |
||||
} |
||||
|
||||
// to handle Series edits |
||||
function room_reservations_update($node) { |
||||
if ($node->type != 'room_reservations_reservation') { |
||||
return; |
||||
} |
||||
|
||||
// when we do a node_save below; it will hit this hook; so if this routine just did the save lets bail |
||||
if (isset($node->saved)){ |
||||
return; |
||||
} |
||||
|
||||
// if not part of a Series or special single only url; do nothing |
||||
if (!isset($node->reservation_series_id[LANGUAGE_NONE][0]) || !($sid = $node->reservation_series_id[LANGUAGE_NONE][0]['value']) || isset($_GET['single'])) { |
||||
return; |
||||
} |
||||
|
||||
// reservation details |
||||
$start = $node->reservation_date[LANGUAGE_NONE][0]['value']; |
||||
$end = date('Y-m-d', strtotime($node->reservation_repeat_until[LANGUAGE_NONE][0]['value'])); |
||||
$time = $node->reservation_time[LANGUAGE_NONE][0]['value']; |
||||
$length = $node->reservation_length[LANGUAGE_NONE][0]['value']; |
||||
$rid = $node->reservation_room[LANGUAGE_NONE][0]['target_id']; |
||||
$day = date('l', strtotime($start)); |
||||
|
||||
// grab all reservations in this series |
||||
$query = new EntityFieldQuery(); |
||||
$query->entityCondition('entity_type', 'node') |
||||
->entityCondition('bundle', 'room_reservations_reservation') |
||||
->fieldCondition('reservation_series_id', 'value', $sid, '='); |
||||
$result = $query->execute(); |
||||
$deleted = array(); |
||||
if (isset($result['node'])) { |
||||
$result_nids = array_keys($result['node']); |
||||
$results = entity_load('node', $result_nids); |
||||
foreach ($results as $data) { |
||||
// for now, only allow changing Title, Blocked title, Length |
||||
// first 2 are easy; but to change length we need to check if that period is available and if not delete entry from Series |
||||
$data->title = $node->title; |
||||
$data->reservation_block_title[LANGUAGE_NONE][0]['value'] = $node->reservation_block_title[LANGUAGE_NONE][0]['value']; |
||||
|
||||
$date = date('Y-m-d', strtotime($data->reservation_date[LANGUAGE_NONE][0]['value'])); |
||||
if (_room_reservations_is_slot_free($rid, $date, $time, $length)) { |
||||
$data->reservation_length[LANGUAGE_NONE][0]['value'] = $node->reservation_length[LANGUAGE_NONE][0]['value']; |
||||
$data->saved = true; |
||||
node_save($data); |
||||
} |
||||
// if slot is not available; delete that entry |
||||
else { |
||||
$deleted[] = $date; |
||||
node_delete($data->nid); |
||||
} |
||||
} |
||||
} |
||||
|
||||
// lets spit out some useful msgs |
||||
drupal_set_message(t('Your reservation series has been modified.')); |
||||
if (count($deleted)) { |
||||
$dates = '<br>' . implode('<br>', $deleted); |
||||
drupal_set_message(t('The following dates were deleted from the series due to scheduling conflicts: !dates', array('!dates' => $dates)), 'warning'); |
||||
} |
||||
} |
||||
|
||||
function _room_reservations_series_delete($form) { |
||||
$sid = $form['#node']->reservation_series_id[LANGUAGE_NONE][0]['value']; |
||||
// grab all reservations in this series |
||||
$query = new EntityFieldQuery(); |
||||
$query->entityCondition('entity_type', 'node') |
||||
->entityCondition('bundle', 'room_reservations_reservation') |
||||
->fieldCondition('reservation_series_id', 'value', $sid, '='); |
||||
$result = $query->execute(); |
||||
if (isset($result['node'])) { |
||||
$nids = array_keys($result['node']); |
||||
foreach ($nids as $nid) { |
||||
node_delete($nid); |
||||
} |
||||
} |
||||
$title = $form['#node']->title; |
||||
drupal_set_message(t('The reservation series @title was deleted.', array('@title' => $title))); |
||||
drupal_goto('room_reservations'); |
||||
} |
||||
|
||||
/** |
||||
* copy above function for API use only |
||||
* - pass SID |
||||
* |
||||
* @param mixed $sid |
||||
*/ |
||||
function room_reservations_series_delete($sid) { |
||||
// grab all reservations in this series |
||||
$query = new EntityFieldQuery(); |
||||
$query->entityCondition('entity_type', 'node') |
||||
->entityCondition('bundle', 'room_reservations_reservation') |
||||
->fieldCondition('reservation_series_id', 'value', $sid, '='); |
||||
$result = $query->execute(); |
||||
if (isset($result['node'])) { |
||||
$nids = array_keys($result['node']); |
||||
foreach ($nids as $nid) { |
||||
node_delete($nid); |
||||
} |
||||
} |
||||
$res = node_load($sid); |
||||
drupal_set_message(t('The reservation series @title was deleted.', array('@title' => $res->title))); |
||||
drupal_goto('room_reservations'); |
||||
} |
@ -0,0 +1,435 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* @file |
||||
* Bulk export of views_default objects generated by Bulk export module. |
||||
*/ |
||||
|
||||
/** |
||||
* Implements hook_views_default_views(). |
||||
*/ |
||||
function room_reservations_views_default_views() { |
||||
$views = array(); |
||||
|
||||
$view = new view(); |
||||
$view->name = 'room_reservations'; |
||||
$view->description = ''; |
||||
$view->tag = 'default'; |
||||
$view->base_table = 'node'; |
||||
$view->human_name = 'Room Reservations (default views)'; |
||||
$view->core = 7; |
||||
$view->api_version = '3.0'; |
||||
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ |
||||
|
||||
/* Display: Master */ |
||||
$handler = $view->new_display('default', 'Master', 'default'); |
||||
$handler->display->display_options['title'] = 'Room Reservations'; |
||||
$handler->display->display_options['use_more_always'] = FALSE; |
||||
$handler->display->display_options['access']['type'] = 'perm'; |
||||
$handler->display->display_options['cache']['type'] = 'none'; |
||||
$handler->display->display_options['query']['type'] = 'views_query'; |
||||
$handler->display->display_options['exposed_form']['type'] = 'basic'; |
||||
$handler->display->display_options['pager']['type'] = 'full'; |
||||
$handler->display->display_options['style_plugin'] = 'default'; |
||||
$handler->display->display_options['style_options']['grouping'] = array( |
||||
0 => array( |
||||
'field' => 'reservations_room_category', |
||||
'rendered' => 1, |
||||
'rendered_strip' => 0, |
||||
), |
||||
); |
||||
$handler->display->display_options['row_plugin'] = 'fields'; |
||||
/* Relationship: Entity Reference: Referenced Entity */ |
||||
$handler->display->display_options['relationships']['reservations_room_category_target_id']['id'] = 'reservations_room_category_target_id'; |
||||
$handler->display->display_options['relationships']['reservations_room_category_target_id']['table'] = 'field_data_reservations_room_category'; |
||||
$handler->display->display_options['relationships']['reservations_room_category_target_id']['field'] = 'reservations_room_category_target_id'; |
||||
$handler->display->display_options['relationships']['reservations_room_category_target_id']['label'] = 'category'; |
||||
/* Field: Content: Title */ |
||||
$handler->display->display_options['fields']['title']['id'] = 'title'; |
||||
$handler->display->display_options['fields']['title']['table'] = 'node'; |
||||
$handler->display->display_options['fields']['title']['field'] = 'title'; |
||||
$handler->display->display_options['fields']['title']['label'] = ''; |
||||
$handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE; |
||||
$handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE; |
||||
/* Field: Content: Body */ |
||||
$handler->display->display_options['fields']['body']['id'] = 'body'; |
||||
$handler->display->display_options['fields']['body']['table'] = 'field_data_body'; |
||||
$handler->display->display_options['fields']['body']['field'] = 'body'; |
||||
$handler->display->display_options['fields']['body']['label'] = ''; |
||||
$handler->display->display_options['fields']['body']['element_label_colon'] = FALSE; |
||||
/* Field: Content: Capacity */ |
||||
$handler->display->display_options['fields']['reservations_room_capacity']['id'] = 'reservations_room_capacity'; |
||||
$handler->display->display_options['fields']['reservations_room_capacity']['table'] = 'field_data_reservations_room_capacity'; |
||||
$handler->display->display_options['fields']['reservations_room_capacity']['field'] = 'reservations_room_capacity'; |
||||
$handler->display->display_options['fields']['reservations_room_capacity']['element_type'] = 'span'; |
||||
/* Field: Content: Category */ |
||||
$handler->display->display_options['fields']['reservations_room_category']['id'] = 'reservations_room_category'; |
||||
$handler->display->display_options['fields']['reservations_room_category']['table'] = 'field_data_reservations_room_category'; |
||||
$handler->display->display_options['fields']['reservations_room_category']['field'] = 'reservations_room_category'; |
||||
$handler->display->display_options['fields']['reservations_room_category']['label'] = ''; |
||||
$handler->display->display_options['fields']['reservations_room_category']['exclude'] = TRUE; |
||||
$handler->display->display_options['fields']['reservations_room_category']['element_label_colon'] = FALSE; |
||||
$handler->display->display_options['fields']['reservations_room_category']['settings'] = array( |
||||
'link' => 0, |
||||
); |
||||
/* Sort criterion: Content: Title */ |
||||
$handler->display->display_options['sorts']['title_1']['id'] = 'title_1'; |
||||
$handler->display->display_options['sorts']['title_1']['table'] = 'node'; |
||||
$handler->display->display_options['sorts']['title_1']['field'] = 'title'; |
||||
$handler->display->display_options['sorts']['title_1']['relationship'] = 'reservations_room_category_target_id'; |
||||
/* Sort criterion: Content: Title */ |
||||
$handler->display->display_options['sorts']['title']['id'] = 'title'; |
||||
$handler->display->display_options['sorts']['title']['table'] = 'node'; |
||||
$handler->display->display_options['sorts']['title']['field'] = 'title'; |
||||
/* Filter criterion: Content: Published */ |
||||
$handler->display->display_options['filters']['status']['id'] = 'status'; |
||||
$handler->display->display_options['filters']['status']['table'] = 'node'; |
||||
$handler->display->display_options['filters']['status']['field'] = 'status'; |
||||
$handler->display->display_options['filters']['status']['value'] = 1; |
||||
$handler->display->display_options['filters']['status']['group'] = 1; |
||||
$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE; |
||||
/* Filter criterion: Content: Type */ |
||||
$handler->display->display_options['filters']['type']['id'] = 'type'; |
||||
$handler->display->display_options['filters']['type']['table'] = 'node'; |
||||
$handler->display->display_options['filters']['type']['field'] = 'type'; |
||||
$handler->display->display_options['filters']['type']['value'] = array( |
||||
'room_reservations_room' => 'room_reservations_room', |
||||
); |
||||
|
||||
/* Display: Room Descriptions */ |
||||
$handler = $view->new_display('page', 'Room Descriptions', 'page_1'); |
||||
$handler->display->display_options['path'] = 'room_reservations/rooms'; |
||||
$handler->display->display_options['menu']['type'] = 'tab'; |
||||
$handler->display->display_options['menu']['title'] = 'Room Descriptions'; |
||||
$handler->display->display_options['menu']['weight'] = '20'; |
||||
$handler->display->display_options['menu']['context'] = 0; |
||||
$handler->display->display_options['menu']['context_only_inline'] = 0; |
||||
|
||||
/* Display: My Reservations */ |
||||
$handler = $view->new_display('page', 'My Reservations', 'page_2'); |
||||
$handler->display->display_options['defaults']['relationships'] = FALSE; |
||||
$handler->display->display_options['defaults']['fields'] = FALSE; |
||||
/* Field: Content: Nid */ |
||||
$handler->display->display_options['fields']['nid']['id'] = 'nid'; |
||||
$handler->display->display_options['fields']['nid']['table'] = 'node'; |
||||
$handler->display->display_options['fields']['nid']['field'] = 'nid'; |
||||
$handler->display->display_options['fields']['nid']['label'] = ''; |
||||
$handler->display->display_options['fields']['nid']['exclude'] = TRUE; |
||||
$handler->display->display_options['fields']['nid']['element_label_colon'] = FALSE; |
||||
/* Field: Content: Title */ |
||||
$handler->display->display_options['fields']['title']['id'] = 'title'; |
||||
$handler->display->display_options['fields']['title']['table'] = 'node'; |
||||
$handler->display->display_options['fields']['title']['field'] = 'title'; |
||||
$handler->display->display_options['fields']['title']['label'] = 'Group'; |
||||
$handler->display->display_options['fields']['title']['alter']['make_link'] = TRUE; |
||||
$handler->display->display_options['fields']['title']['alter']['path'] = 'node/[nid]/edit'; |
||||
$handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE; |
||||
$handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE; |
||||
$handler->display->display_options['fields']['title']['element_type'] = 'span'; |
||||
$handler->display->display_options['fields']['title']['link_to_node'] = FALSE; |
||||
/* Field: Content: Room */ |
||||
$handler->display->display_options['fields']['reservation_room']['id'] = 'reservation_room'; |
||||
$handler->display->display_options['fields']['reservation_room']['table'] = 'field_data_reservation_room'; |
||||
$handler->display->display_options['fields']['reservation_room']['field'] = 'reservation_room'; |
||||
$handler->display->display_options['fields']['reservation_room']['element_type'] = 'span'; |
||||
$handler->display->display_options['fields']['reservation_room']['settings'] = array( |
||||
'link' => 1, |
||||
); |
||||
/* Field: Content: Date */ |
||||
$handler->display->display_options['fields']['reservation_date']['id'] = 'reservation_date'; |
||||
$handler->display->display_options['fields']['reservation_date']['table'] = 'field_data_reservation_date'; |
||||
$handler->display->display_options['fields']['reservation_date']['field'] = 'reservation_date'; |
||||
$handler->display->display_options['fields']['reservation_date']['element_type'] = 'span'; |
||||
/* Field: Content: Time */ |
||||
$handler->display->display_options['fields']['reservation_time']['id'] = 'reservation_time'; |
||||
$handler->display->display_options['fields']['reservation_time']['table'] = 'field_data_reservation_time'; |
||||
$handler->display->display_options['fields']['reservation_time']['field'] = 'reservation_time'; |
||||
$handler->display->display_options['fields']['reservation_time']['element_type'] = 'span'; |
||||
$handler->display->display_options['fields']['reservation_time']['settings'] = array( |
||||
'thousand_separator' => '', |
||||
'prefix_suffix' => 0, |
||||
); |
||||
/* Field: Content: Length */ |
||||
$handler->display->display_options['fields']['reservation_length']['id'] = 'reservation_length'; |
||||
$handler->display->display_options['fields']['reservation_length']['table'] = 'field_data_reservation_length'; |
||||
$handler->display->display_options['fields']['reservation_length']['field'] = 'reservation_length'; |
||||
$handler->display->display_options['fields']['reservation_length']['label'] = 'Booked for'; |
||||
$handler->display->display_options['fields']['reservation_length']['element_type'] = 'span'; |
||||
$handler->display->display_options['defaults']['sorts'] = FALSE; |
||||
/* Sort criterion: Content: Date (reservation_date) */ |
||||
$handler->display->display_options['sorts']['reservation_date_value']['id'] = 'reservation_date_value'; |
||||
$handler->display->display_options['sorts']['reservation_date_value']['table'] = 'field_data_reservation_date'; |
||||
$handler->display->display_options['sorts']['reservation_date_value']['field'] = 'reservation_date_value'; |
||||
$handler->display->display_options['defaults']['arguments'] = FALSE; |
||||
/* Contextual filter: Content: Author uid */ |
||||
$handler->display->display_options['arguments']['uid']['id'] = 'uid'; |
||||
$handler->display->display_options['arguments']['uid']['table'] = 'node'; |
||||
$handler->display->display_options['arguments']['uid']['field'] = 'uid'; |
||||
$handler->display->display_options['arguments']['uid']['default_action'] = 'default'; |
||||
$handler->display->display_options['arguments']['uid']['default_argument_type'] = 'current_user'; |
||||
$handler->display->display_options['arguments']['uid']['summary']['number_of_records'] = '0'; |
||||
$handler->display->display_options['arguments']['uid']['summary']['format'] = 'default_summary'; |
||||
$handler->display->display_options['arguments']['uid']['summary_options']['items_per_page'] = '25'; |
||||
$handler->display->display_options['defaults']['filter_groups'] = FALSE; |
||||
$handler->display->display_options['defaults']['filters'] = FALSE; |
||||
/* Filter criterion: Content: Published */ |
||||
$handler->display->display_options['filters']['status']['id'] = 'status'; |
||||
$handler->display->display_options['filters']['status']['table'] = 'node'; |
||||
$handler->display->display_options['filters']['status']['field'] = 'status'; |
||||
$handler->display->display_options['filters']['status']['value'] = 1; |
||||
$handler->display->display_options['filters']['status']['group'] = 1; |
||||
$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE; |
||||
/* Filter criterion: Content: Type */ |
||||
$handler->display->display_options['filters']['type']['id'] = 'type'; |
||||
$handler->display->display_options['filters']['type']['table'] = 'node'; |
||||
$handler->display->display_options['filters']['type']['field'] = 'type'; |
||||
$handler->display->display_options['filters']['type']['value'] = array( |
||||
'room_reservations_reservation' => 'room_reservations_reservation', |
||||
); |
||||
/* Filter criterion: Content: Date (reservation_date) */ |
||||
$handler->display->display_options['filters']['reservation_date_value']['id'] = 'reservation_date_value'; |
||||
$handler->display->display_options['filters']['reservation_date_value']['table'] = 'field_data_reservation_date'; |
||||
$handler->display->display_options['filters']['reservation_date_value']['field'] = 'reservation_date_value'; |
||||
$handler->display->display_options['filters']['reservation_date_value']['operator'] = '>='; |
||||
$handler->display->display_options['filters']['reservation_date_value']['form_type'] = 'date_text'; |
||||
$handler->display->display_options['filters']['reservation_date_value']['default_date'] = 'now'; |
||||
$handler->display->display_options['path'] = 'room_reservations/list'; |
||||
$handler->display->display_options['menu']['type'] = 'tab'; |
||||
$handler->display->display_options['menu']['title'] = 'My Reservations'; |
||||
$handler->display->display_options['menu']['weight'] = '15'; |
||||
$handler->display->display_options['menu']['context'] = 0; |
||||
$handler->display->display_options['menu']['context_only_inline'] = 0; |
||||
|
||||
$views['room_reservations'] = $view; |
||||
|
||||
///////////////////////////////////////////// |
||||
|
||||
$view = new view(); |
||||
$view->name = 'manage_reservations'; |
||||
$view->description = ''; |
||||
$view->tag = 'default'; |
||||
$view->base_table = 'node'; |
||||
$view->human_name = 'Manage Reservations'; |
||||
$view->core = 7; |
||||
$view->api_version = '3.0'; |
||||
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ |
||||
|
||||
/* Display: Master */ |
||||
$handler = $view->new_display('default', 'Master', 'default'); |
||||
$handler->display->display_options['title'] = 'Manage Reservations'; |
||||
$handler->display->display_options['use_more_always'] = FALSE; |
||||
$handler->display->display_options['access']['type'] = 'perm'; |
||||
$handler->display->display_options['access']['perm'] = 'administer room reservations system'; |
||||
$handler->display->display_options['cache']['type'] = 'none'; |
||||
$handler->display->display_options['query']['type'] = 'views_query'; |
||||
$handler->display->display_options['exposed_form']['type'] = 'basic'; |
||||
$handler->display->display_options['pager']['type'] = 'full'; |
||||
$handler->display->display_options['pager']['options']['items_per_page'] = '40'; |
||||
$handler->display->display_options['style_plugin'] = 'table'; |
||||
$handler->display->display_options['style_options']['columns'] = array( |
||||
'title' => 'title', |
||||
'title_2' => 'title', |
||||
'title_1' => 'title', |
||||
'reservation_date' => 'reservation_date', |
||||
'reservation_time' => 'reservation_date', |
||||
'reservation_length' => 'reservation_date', |
||||
'name' => 'title', |
||||
'reservation_repeat_type' => 'reservation_repeat_type', |
||||
'reservation_repeat_until' => 'reservation_repeat_type', |
||||
); |
||||
$handler->display->display_options['style_options']['default'] = '-1'; |
||||
$handler->display->display_options['style_options']['info'] = array( |
||||
'title' => array( |
||||
'sortable' => 0, |
||||
'default_sort_order' => 'asc', |
||||
'align' => '', |
||||
'separator' => '<br>', |
||||
'empty_column' => 0, |
||||
), |
||||
'title_2' => array( |
||||
'sortable' => 0, |
||||
'default_sort_order' => 'asc', |
||||
'align' => '', |
||||
'separator' => '', |
||||
'empty_column' => 0, |
||||
), |
||||
'title_1' => array( |
||||
'sortable' => 0, |
||||
'default_sort_order' => 'asc', |
||||
'align' => '', |
||||
'separator' => '', |
||||
'empty_column' => 0, |
||||
), |
||||
'reservation_date' => array( |
||||
'sortable' => 1, |
||||
'default_sort_order' => 'asc', |
||||
'align' => '', |
||||
'separator' => '<br>', |
||||
'empty_column' => 0, |
||||
), |
||||
'reservation_time' => array( |
||||
'sortable' => 0, |
||||
'default_sort_order' => 'asc', |
||||
'align' => '', |
||||
'separator' => '', |
||||
'empty_column' => 0, |
||||
), |
||||
'reservation_length' => array( |
||||
'sortable' => 0, |
||||
'default_sort_order' => 'asc', |
||||
'align' => '', |
||||
'separator' => '', |
||||
'empty_column' => 0, |
||||
), |
||||
'name' => array( |
||||
'sortable' => 0, |
||||
'default_sort_order' => 'asc', |
||||
'align' => '', |
||||
'separator' => '', |
||||
'empty_column' => 0, |
||||
), |
||||
'reservation_repeat_type' => array( |
||||
'sortable' => 0, |
||||
'default_sort_order' => 'asc', |
||||
'align' => '', |
||||
'separator' => '<br>', |
||||
'empty_column' => 0, |
||||
), |
||||
'reservation_repeat_until' => array( |
||||
'sortable' => 0, |
||||
'default_sort_order' => 'asc', |
||||
'align' => '', |
||||
'separator' => '', |
||||
'empty_column' => 0, |
||||
), |
||||
); |
||||
/* Relationship: Content: Author */ |
||||
$handler->display->display_options['relationships']['uid']['id'] = 'uid'; |
||||
$handler->display->display_options['relationships']['uid']['table'] = 'node'; |
||||
$handler->display->display_options['relationships']['uid']['field'] = 'uid'; |
||||
/* Relationship: Entity Reference: Referenced Entity */ |
||||
$handler->display->display_options['relationships']['reservation_room_target_id']['id'] = 'reservation_room_target_id'; |
||||
$handler->display->display_options['relationships']['reservation_room_target_id']['table'] = 'field_data_reservation_room'; |
||||
$handler->display->display_options['relationships']['reservation_room_target_id']['field'] = 'reservation_room_target_id'; |
||||
$handler->display->display_options['relationships']['reservation_room_target_id']['label'] = 'room'; |
||||
/* Relationship: Entity Reference: Referencing entity */ |
||||
$handler->display->display_options['relationships']['reverse_reservations_room_category_node']['id'] = 'reverse_reservations_room_category_node'; |
||||
$handler->display->display_options['relationships']['reverse_reservations_room_category_node']['table'] = 'node'; |
||||
$handler->display->display_options['relationships']['reverse_reservations_room_category_node']['field'] = 'reverse_reservations_room_category_node'; |
||||
$handler->display->display_options['relationships']['reverse_reservations_room_category_node']['relationship'] = 'reservation_room_target_id'; |
||||
$handler->display->display_options['relationships']['reverse_reservations_room_category_node']['label'] = 'reservations_room_category'; |
||||
/* Field: Content: Title */ |
||||
$handler->display->display_options['fields']['title']['id'] = 'title'; |
||||
$handler->display->display_options['fields']['title']['table'] = 'node'; |
||||
$handler->display->display_options['fields']['title']['field'] = 'title'; |
||||
$handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE; |
||||
$handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE; |
||||
/* Field: Content: Title */ |
||||
$handler->display->display_options['fields']['title_2']['id'] = 'title_2'; |
||||
$handler->display->display_options['fields']['title_2']['table'] = 'node'; |
||||
$handler->display->display_options['fields']['title_2']['field'] = 'title'; |
||||
$handler->display->display_options['fields']['title_2']['relationship'] = 'reverse_reservations_room_category_node'; |
||||
$handler->display->display_options['fields']['title_2']['label'] = 'Room Category'; |
||||
/* Field: Content: Title */ |
||||
$handler->display->display_options['fields']['title_1']['id'] = 'title_1'; |
||||
$handler->display->display_options['fields']['title_1']['table'] = 'node'; |
||||
$handler->display->display_options['fields']['title_1']['field'] = 'title'; |
||||
$handler->display->display_options['fields']['title_1']['relationship'] = 'reservation_room_target_id'; |
||||
$handler->display->display_options['fields']['title_1']['label'] = 'Room'; |
||||
/* Field: Content: Date */ |
||||
$handler->display->display_options['fields']['reservation_date']['id'] = 'reservation_date'; |
||||
$handler->display->display_options['fields']['reservation_date']['table'] = 'field_data_reservation_date'; |
||||
$handler->display->display_options['fields']['reservation_date']['field'] = 'reservation_date'; |
||||
$handler->display->display_options['fields']['reservation_date']['label'] = 'Reservation Date'; |
||||
$handler->display->display_options['fields']['reservation_date']['settings'] = array( |
||||
'format_type' => 'date_year', |
||||
'fromto' => 'both', |
||||
'multiple_number' => '', |
||||
'multiple_from' => '', |
||||
'multiple_to' => '', |
||||
); |
||||
/* Field: Content: Time */ |
||||
$handler->display->display_options['fields']['reservation_time']['id'] = 'reservation_time'; |
||||
$handler->display->display_options['fields']['reservation_time']['table'] = 'field_data_reservation_time'; |
||||
$handler->display->display_options['fields']['reservation_time']['field'] = 'reservation_time'; |
||||
$handler->display->display_options['fields']['reservation_time']['label'] = 'Booking Time'; |
||||
/* Field: Content: Booking Length */ |
||||
$handler->display->display_options['fields']['reservation_length']['id'] = 'reservation_length'; |
||||
$handler->display->display_options['fields']['reservation_length']['table'] = 'field_data_reservation_length'; |
||||
$handler->display->display_options['fields']['reservation_length']['field'] = 'reservation_length'; |
||||
/* Field: User: Name */ |
||||
$handler->display->display_options['fields']['name']['id'] = 'name'; |
||||
$handler->display->display_options['fields']['name']['table'] = 'users'; |
||||
$handler->display->display_options['fields']['name']['field'] = 'name'; |
||||
$handler->display->display_options['fields']['name']['relationship'] = 'uid'; |
||||
$handler->display->display_options['fields']['name']['label'] = 'Booked by'; |
||||
/* Field: Content: Repeat Type */ |
||||
$handler->display->display_options['fields']['reservation_repeat_type']['id'] = 'reservation_repeat_type'; |
||||
$handler->display->display_options['fields']['reservation_repeat_type']['table'] = 'field_data_reservation_repeat_type'; |
||||
$handler->display->display_options['fields']['reservation_repeat_type']['field'] = 'reservation_repeat_type'; |
||||
/* Field: Content: Repeat reservation until */ |
||||
$handler->display->display_options['fields']['reservation_repeat_until']['id'] = 'reservation_repeat_until'; |
||||
$handler->display->display_options['fields']['reservation_repeat_until']['table'] = 'field_data_reservation_repeat_until'; |
||||
$handler->display->display_options['fields']['reservation_repeat_until']['field'] = 'reservation_repeat_until'; |
||||
$handler->display->display_options['fields']['reservation_repeat_until']['settings'] = array( |
||||
'format_type' => 'date_year', |
||||
'fromto' => 'both', |
||||
'multiple_number' => '', |
||||
'multiple_from' => '', |
||||
'multiple_to' => '', |
||||
); |
||||
/* Sort criterion: Content: Post date */ |
||||
$handler->display->display_options['sorts']['created']['id'] = 'created'; |
||||
$handler->display->display_options['sorts']['created']['table'] = 'node'; |
||||
$handler->display->display_options['sorts']['created']['field'] = 'created'; |
||||
$handler->display->display_options['sorts']['created']['order'] = 'DESC'; |
||||
/* Filter criterion: Content: Published */ |
||||
$handler->display->display_options['filters']['status']['id'] = 'status'; |
||||
$handler->display->display_options['filters']['status']['table'] = 'node'; |
||||
$handler->display->display_options['filters']['status']['field'] = 'status'; |
||||
$handler->display->display_options['filters']['status']['value'] = 1; |
||||
$handler->display->display_options['filters']['status']['group'] = 1; |
||||
$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE; |
||||
/* Filter criterion: Content: Type */ |
||||
$handler->display->display_options['filters']['type']['id'] = 'type'; |
||||
$handler->display->display_options['filters']['type']['table'] = 'node'; |
||||
$handler->display->display_options['filters']['type']['field'] = 'type'; |
||||
$handler->display->display_options['filters']['type']['value'] = array( |
||||
'room_reservations_reservation' => 'room_reservations_reservation', |
||||
); |
||||
/* Filter criterion: Content: Date (reservation_date) */ |
||||
$handler->display->display_options['filters']['reservation_date_value']['id'] = 'reservation_date_value'; |
||||
$handler->display->display_options['filters']['reservation_date_value']['table'] = 'field_data_reservation_date'; |
||||
$handler->display->display_options['filters']['reservation_date_value']['field'] = 'reservation_date_value'; |
||||
$handler->display->display_options['filters']['reservation_date_value']['exposed'] = TRUE; |
||||
$handler->display->display_options['filters']['reservation_date_value']['expose']['operator_id'] = 'reservation_date_value_op'; |
||||
$handler->display->display_options['filters']['reservation_date_value']['expose']['label'] = 'Reservation Date'; |
||||
$handler->display->display_options['filters']['reservation_date_value']['expose']['operator'] = 'reservation_date_value_op'; |
||||
$handler->display->display_options['filters']['reservation_date_value']['expose']['identifier'] = 'reservation_date_value'; |
||||
$handler->display->display_options['filters']['reservation_date_value']['expose']['remember_roles'] = array( |
||||
2 => '2', |
||||
1 => 0, |
||||
3 => 0, |
||||
4 => 0, |
||||
5 => 0, |
||||
6 => 0, |
||||
8 => 0, |
||||
9 => 0, |
||||
10 => 0, |
||||
11 => 0, |
||||
); |
||||
$handler->display->display_options['filters']['reservation_date_value']['form_type'] = 'date_popup'; |
||||
|
||||
/* Display: Page */ |
||||
$handler = $view->new_display('page', 'Page', 'page'); |
||||
$handler->display->display_options['path'] = 'admin/content/manage-reservations'; |
||||
$handler->display->display_options['menu']['type'] = 'tab'; |
||||
$handler->display->display_options['menu']['title'] = 'Manage Reservations'; |
||||
$handler->display->display_options['menu']['weight'] = '0'; |
||||
$handler->display->display_options['menu']['context'] = 0; |
||||
$handler->display->display_options['menu']['context_only_inline'] = 0; |
||||
|
||||
$views['manage_reservations'] = $view; |
||||
|
||||
return $views; |
||||
} |
@ -0,0 +1,97 @@
|
||||
<?php |
||||
/** |
||||
* @file |
||||
* Miscellaneous view functionality. |
||||
*/ |
||||
|
||||
/** |
||||
* Change date form. |
||||
* |
||||
* Constructor for the small form that appears just above the reservation |
||||
* calendar and allows the user to change the date for which reservations |
||||
* are displayed on the calendar. |
||||
* |
||||
* @param array $building_hours |
||||
* Contains hrs information for each day for which a reservation can be made. |
||||
* @param array $dates |
||||
* An array containing information about all the possible days for which a |
||||
* reservtion can be made. |
||||
* @param array $rooms |
||||
* An array representing all of the rooms that can be reserved. |
||||
* @param array $categories |
||||
* An array of all the room categories. |
||||
* @param string $selected_category |
||||
* The current category the user has selected, if any. |
||||
*/ |
||||
function room_reservations_select_room_date_form(&$form_state, $building_hours, $dates, $rooms, $categories, $selected_category) { |
||||
// Select box options. |
||||
$date_options = array(); |
||||
foreach ($dates as $day) { |
||||
$building_hours_day = $building_hours[$day['yyyymmdd']]; |
||||
if ($building_hours_day['open']) { |
||||
$date_options[$day['month-number'] . "/" . $day['day']] = t($day['display']); |
||||
} |
||||
} |
||||
$first = TRUE; |
||||
foreach ($rooms as $room) { |
||||
$name = $room['name']; |
||||
$key = 'room ' . $name; |
||||
$capacity = $room['capacity']; |
||||
$room_category = $room['category']; |
||||
$value = t('@room (capacity: !capacity persons)', array('@room' => $name, '!capacity' => $capacity)); |
||||
$room_options[$key] = $value; |
||||
if ($first) { |
||||
$room_default = $key; |
||||
$first = FALSE; |
||||
} |
||||
} |
||||
ksort($room_options); |
||||
// Defaults. |
||||
if ($selected_category) { |
||||
$room_default = 'room ' . $selected_category; |
||||
} |
||||
foreach ($dates as $day) { |
||||
if ($day['selected']) { |
||||
$date_default = $day['month-number'] . '/' . $day['day']; |
||||
break; |
||||
} |
||||
} |
||||
// Form. |
||||
$form['date'] = array( |
||||
'#title' => t('View a Different Day'), |
||||
'#type' => 'select', |
||||
'#options' => $date_options, |
||||
'#default_value' => $date_default, |
||||
'#weight' => 10, |
||||
); |
||||
$form['room'] = array( |
||||
'#title' => t('View a Different Room'), |
||||
'#type' => 'select', |
||||
'#options' => $room_options, |
||||
'#default_value' => $room_default, |
||||
'#weight' => 20, |
||||
); |
||||
$form['submit'] = array( |
||||
'#type' => 'submit', |
||||
'#value' => t('Change Day or Room'), |
||||
'#weight' => 30, |
||||
); |
||||
return $form; |
||||
} |
||||
|
||||
/** |
||||
* Form submission for the change date form. |
||||
* |
||||
* @param string $form_id |
||||
* Drupal form id. |
||||
* @param array $form_state |
||||
* Drupal form state object. |
||||
*/ |
||||
function room_reservations_select_room_date_form_submit($form_id, &$form_state) { |
||||
$date = $form_state['values']['date']; |
||||
$room = drupal_substr($form_state['values']['room'], 5); |
||||
$redirect = "room_reservations/" . $date . "/" . $room; |
||||
$form_state['redirect'] = $redirect; |
||||
} |
||||
|
||||
|
@ -0,0 +1,387 @@
|
||||
<?php |
||||
/** |
||||
* @file |
||||
* Calendar view functionality. |
||||
*/ |
||||
|
||||
module_load_include('inc', 'room_reservations', '/view/room_reservations.view'); |
||||
|
||||
/** |
||||
* Theme the room reservation calendar page. |
||||
* |
||||
* @global object $user |
||||
* Drupal user object. |
||||
* @global type $base_url |
||||
* Application base url. |
||||
* |
||||
* @param array $dates |
||||
* An array containing information about all the possible days for which a |
||||
* reservtion can be made. |
||||
* @param array $categories |
||||
* An array of all the room categories. |
||||
* @param array $reservations |
||||
* An array representing all the reservations that have been made for the |
||||
* day that is being displayed on the calendar. |
||||
* @param array $hours |
||||
* An array representing every half hour time slot in a single day. |
||||
* @param array $building_hours |
||||
* A two dimensional array, with the first dimension representing a single |
||||
* day for which a reservation can be made, and the second dimension |
||||
* representing information about the facility's open hours for that day, such |
||||
* as whether the facility is open that day, the number of open shifts, |
||||
* open and close hours, and a string that can be used to display the hours |
||||
* in a user friendly way. |
||||
* @param string $building_hours_display |
||||
* A user friendly string of the open hours for the day being displayed |
||||
* on the calendar. |
||||
* @param array $rooms |
||||
* An array representing all of the rooms that can be reserved. |
||||
* @param string $selected_category |
||||
* The current category the user has selected, if any. |
||||
* @param array $user_reservations |
||||
* An array representing the current user's reservations for the allowable |
||||
* reservation period. |
||||
* |
||||
* @return string |
||||
* The html for displaying the page. |
||||
*/ |
||||
function theme_room_reservations($variables) { |
||||
global $user; |
||||
global $base_url; |
||||
|
||||
// to support minimum adv booking per category; let's get available dates per cat |
||||
$datespercat = _room_reservations_dates(null, null, true); |
||||
|
||||
// pass date format to JS |
||||
$format = strtolower(variable_get('room_reservations_picker_format', 'y/m/d')); |
||||
drupal_add_js(array('room_reservations' => array('dateformat' => $format)), 'setting'); |
||||
|
||||
extract($variables); |
||||
|
||||
// $selected_category inside $variables isn't formed right to be pulled out as is with extract() |
||||
$selected_category = NULL; |
||||
|
||||
// User information. |
||||
$full_access = FALSE; |
||||
$user_login_name = NULL; |
||||
if ($user->uid) { |
||||
$user_login_name = $user->name; |
||||
$full_access = user_access('administer room reservations system') || user_access('edit any room reservation'); |
||||
} |
||||
|
||||
// Determine which date has been selected by the user. |
||||
foreach ($dates as $day) { |
||||
if ($day['selected'] == TRUE) { |
||||
$day_of_week = $day['day-of-week']; |
||||
$month_number = $day['month-number']; |
||||
$month = $day['month']; |
||||
$xday = $day['day']; |
||||
$year = $day['year']; |
||||
$yyyymmdd = $day['yyyymmdd']; |
||||
} |
||||
} |
||||
|
||||
$calendar_text = check_markup(_room_reservations_get_variable('calendar_text')); |
||||
$reserve_room_instructions_text = check_markup(_room_reservations_get_variable('reserve_instructions')); |
||||
if (!$reserve_room_instructions_text) { |
||||
$reserve_room_instructions_text = t('To reserve a room, click on the desired time/day in the calendar below. You will be asked to login.'); |
||||
} |
||||
// Room reservations container. |
||||
$output = "<div id='rooms-calendar'>"; |
||||
$output .= "<div id='tabbedPanels'>"; |
||||
|
||||
// Info box - user reservations, maps, link to policies. |
||||
$output .= "<div id='info'><div>$calendar_text</div> |
||||
<div><img id='arrow' src='" . base_path() . drupal_get_path('module', 'room_reservations') . "/images/007354-blue-jelly-icon-arrows-arrow-sparkle.png' /> |
||||
<span id='start'>" . $reserve_room_instructions_text . '</span></div></div>'; |
||||
|
||||
// Calendar date. |
||||
$date = format_date(strtotime($month . ' ' . $xday . ', ' . $year), 'custom', 'l, F d, Y'); |
||||
$output .= '<h3 class="date">' . t('Reservation Calendar') . '</h3>' . |
||||
'<div class="hours">' . $date . ' ' . $building_hours_display . '</div>'; |
||||
|
||||
// add new Day Selector as popup calendar since we now allow going out up to 6 months rather than 15 days. |
||||
$form = drupal_get_form('room_reservations_admin_date_picker', $yyyymmdd); |
||||
$output .= '<div id="date-change">' . drupal_render($form) . '</div>'; |
||||
|
||||
// Reservation calendar grid: |
||||
// |
||||
// Each block on the grid is assigned one (or more) of the following classes: |
||||
// |
||||
// closed - the building is closed; |
||||
// booked - the building is open and the time slot has been reserved; |
||||
// open - the building is open, the time slot has not been reserved, but the user must login to reserve the time slot; |
||||
// reservable - the building is open, the time slot has not been reserved and the user is able to reserve the time slot. |
||||
// setup - buffer zones added before/after bookings to allow for setup/takedown (per category) |
||||
// |
||||
|
||||
// Tabs. |
||||
$output .= "<ul class='room-tabs'>"; |
||||
$i = 0; |
||||
foreach ($categories as $category) { |
||||
// Set the first tab as active |
||||
// @todo: use JS to set active based on anchor |
||||
$active = ($i == 0) ? " class='active'" : ""; |
||||
$i++; |
||||
$id = strtolower(preg_replace('/[^a-zA-Z0-9-]+/', '-', $category['title'])); |
||||
$output .= '<li><a' . $active . " href='#" . $id . "'>" . $category['title'] . '</a></li>'; |
||||
} |
||||
|
||||
// Panel container. |
||||
$output .= "</ul><div class='panelContainer'>"; |
||||
// If the user is logged in, the class for each unbooked time slot is 'reservable'. If the user is not logged in, the class is 'open'. |
||||
// Only logged in users can click a block of time to open the reservation form. |
||||
$unbooked_class = ($user->uid) ? 'reservable' : 'open'; |
||||
|
||||
// Create a tab for each room category. Each tab contains a grid of time slots and rooms. |
||||
$i = 0; |
||||
foreach ($categories as $category) { |
||||
$table = array(); |
||||
// Show the first tab and hide all others. |
||||
if (!$selected_category) { |
||||
$show = ($i == 0) ? 'show' : 'hide'; |
||||
$i++; |
||||
} |
||||
else { |
||||
$show = ($category['title'] == $selected_category) ? 'show' : 'hide'; |
||||
} |
||||
$id = strtolower(preg_replace('/[^a-zA-Z0-9-]+/', '-', $category['title'])); |
||||
$r = 0; $c = 0; |
||||
|
||||
// Date and building hours. |
||||
$flipped = variable_get('room_reservations_calendar_flipped', 0); |
||||
$orientclass = $flipped ? 'orient-horiz' : 'orient-vert'; |
||||
|
||||
// this is the main DIV wrapper for the "table" within each Category |
||||
$output .= '<div id="' . $id . '" class="panel ' . $show . '"><div class="gcolumns' . ' ' . $orientclass . '">'; |
||||
|
||||
$table[$r][$c] = "<li class='room-info'>" . t('Room') . '</li>'; |
||||
$r++; |
||||
$table[$r][$c] = "<li class='room-info room-info-heading'>" . t('Capacity') . '</li>'; |
||||
$r++; |
||||
|
||||
// Available hours column. |
||||
foreach ($hours as $time_slot) { |
||||
$time_display = ($time_slot['class'] == 'odd') ? t($time_slot['display']) : ""; |
||||
$table[$r][$c] = "<li class='" . $time_slot['class'] . " timeslot' time='" . $time_slot['time'] . "' " . '>' . $time_display . '</li>'; |
||||
$r++; |
||||
} |
||||
$table[$r][$c] = "<li class='room-info room-info-footer'>" . t('Room') . '</li>'; |
||||
$r++; |
||||
$table[$r][$c] = "<li class='room-info'>" . t('Capacity') . '</li>'; |
||||
$r++; |
||||
// Count the number of rooms in the selected category. |
||||
$rooms_per_category = 0; |
||||
foreach ($rooms as $room) { |
||||
$rid = $room['nid']; |
||||
if ($room['reservations_room_category'][LANGUAGE_NONE][0]['target_id'] == $category['nid']) { |
||||
$rooms_per_category++; |
||||
} |
||||
} |
||||
|
||||
// Column for each room in the category. |
||||
foreach ($rooms as $room) { |
||||
$rid = $room['nid']; |
||||
$room_name = $room['title']; |
||||
$room_link = l($room_name, 'node/' . $rid); |
||||
$room_desc = $room['body'] ? $room['body'][LANGUAGE_NONE][0]['safe_value'] : ""; |
||||
|
||||
// use qtip if we have it |
||||
if (module_exists('qtip')) { |
||||
$room_info = '<span class="qtip-link"><span class="qtip-tooltip">' . $room_desc . '</span>' . $room_link . '</span>'; |
||||
} |
||||
else { |
||||
$room_info = $room_link; |
||||
} |
||||
|
||||
if ($room['reservations_room_category'][LANGUAGE_NONE][0]['target_id'] == $category['nid']) { |
||||
$c++; $r = 0; |
||||
// Room name, capacity. |
||||
//$output .= '<div class="grid-column room-column"><ul>'; |
||||
//$output .= '<li class="room-info">' . $room_info . '</li>'; |
||||
$table[$r][$c] = '<li class="room-info">' . $room_info . '</li>'; |
||||
$r++; |
||||
$table[$r][$c] = "<li class='room-info room-info-heading'>" . $room['reservations_room_capacity'][LANGUAGE_NONE][0]['value'] . '</li>'; |
||||
// Populate each time slot. |
||||
foreach ($hours as $time_slot) { |
||||
$r++; |
||||
$time = $time_slot['time']; |
||||
$open = $time_slot['open']; |
||||
|
||||
// lets use slot class from reservation if it is set |
||||
$slotclass = isset($reservations[$rid][$time_slot['time']]['class']) ? $reservations[$rid][$time_slot['time']]['class'] : $time_slot['class']; |
||||
|
||||
// to support min adv booking per cat; let's simply mark all slots as closed for dates not availble to this user for this cat |
||||
if (!isset($datespercat[$category['nid']][$yyyymmdd])) { |
||||
$open = false; |
||||
} |
||||
|
||||
// Determine if the building is open or closed for this time slot. |
||||
if ($open) { |
||||
//$booked_class = ($reservations[$rid][$time]['booked']) ? 'booked' : $unbooked_class; |
||||
$booked_class = ($reservations[$rid][$time]['booked']) ? '' : $unbooked_class; |
||||
} |
||||
else { |
||||
$booked_class = 'closed'; |
||||
} |
||||
// The time slot can be reserved by the current user. |
||||
$viewable_class = ''; |
||||
$widthclass = ''; |
||||
if ($booked_class == 'reservable' && |
||||
(user_access('create room reservations standard') || user_access('create room reservations extended') || user_access('administer room reservations system'))) { |
||||
$link = l( |
||||
'<img src="' . base_path() . drupal_get_path('module', 'room_reservations') . '/images/clear.png" />', |
||||
'node/add/room-reservations-reservation/' . $month_number . '/' . $xday . '/' . $time_slot['time'] . '/' . $rid, |
||||
array('html' => true) |
||||
); |
||||
$viewable = ''; |
||||
} |
||||
// The time slot can be reserved by the current user, but the user must login first. |
||||
elseif ($booked_class == 'open') { |
||||
$link = "<a href='" . $base_url . "/user/login?destination=node/add/room-reservations-reservation/" . $month_number . "/" . $xday . "/" . |
||||
$time_slot['time'] . "/" . $rid . "'><img src='" . base_path() . drupal_get_path('module', 'room_reservations') . |
||||
"/images/clear.png' /></a>"; |
||||
$viewable = ''; |
||||
} |
||||
elseif ($booked_class == 'closed') { |
||||
$link = ''; |
||||
} |
||||
else { |
||||
// The time slot has a reservation that can be edited by the current user. |
||||
$reservation = node_load($reservations[$rid][$time]['id']); |
||||
$viewable_class = node_access('update', $reservation) ? 'viewable' : ''; |
||||
//$viewable_class = (($full_access) || ($reservations[$rid][$time]['user'] == $user->uid)) ? 'viewable' : ''; |
||||
if ($viewable_class == 'viewable') { |
||||
$id = $reservations[$rid][$time]['id']; |
||||
$link = $id ? l($reservations[$rid][$time]['name'], 'node/' . $id . '/edit', |
||||
array('attributes' => array( |
||||
'title' => $reservations[$rid][$time]['name'], |
||||
'class' => 'booking-span') |
||||
) |
||||
) : ''; |
||||
} |
||||
// The time slot has a reservation that cannot be viewed by the current user. and we are NOT allowed to see the Title |
||||
else if (isset($reservations[$rid][$time]['blocked']) && $reservations[$rid][$time]['blocked']) { |
||||
$link = t('Booked'); |
||||
} |
||||
// The time slot has a reservation that cannot be edited by the current user. but we are allowed to see the Title |
||||
else { |
||||
$link = $reservations[$rid][$time]['name']; |
||||
} |
||||
$slots = isset($reservations[$rid][$time]['slots']) ? $reservations[$rid][$time]['slots'] : ''; |
||||
$widthclass = $slots ? 'colspan' . $reservations[$rid][$time]['slots'] : ''; |
||||
} |
||||
|
||||
// allow other modules to modify the $link |
||||
drupal_alter('room_reservations_link', $link, $reservations[$rid][$time]); |
||||
|
||||
// allow other modules adding a custom class to slots |
||||
$custom_class = ''; |
||||
drupal_alter('room_reservations_custom_class', $custom_class, $reservations[$rid][$time]); |
||||
|
||||
// add div wrapper to display better |
||||
$link = $link ? '<div class="booking-span">' . $link . '</div>' : ''; |
||||
|
||||
// we used book class to determine if linked or not; which we needed for pre/post slots as well as actual reservation slots |
||||
// but we don't want to show booked class now for the slots which are just buffer slots |
||||
if (stristr($slotclass, 'setup')) { |
||||
$booked_class = ''; |
||||
} |
||||
$table[$r][$c] = "<li class='" . $slotclass . ' ' . $booked_class . ' ' . $custom_class . ' ' . $viewable_class . ' ' . $widthclass. "'>" . $link . "</li>"; |
||||
} |
||||
// Room name and capacity. |
||||
$r++; |
||||
$table[$r][$c] = '<li class="room-info">' . $room_info . '</li>'; |
||||
$r++; |
||||
$table[$r][$c] = '<li class="room-info">' . $room['reservations_room_capacity'][LANGUAGE_NONE][0]['value'] . '</li>'; |
||||
} |
||||
} |
||||
|
||||
// remove extra table labels based on admin setting |
||||
$compressed = false; |
||||
if (variable_get('room_reservations_compressed_labels', 0)) { |
||||
$compressed = true; |
||||
} |
||||
|
||||
// dump our table contents in std or flipped orientation |
||||
if ($flipped) { |
||||
$table = _room_reservations_transpose($table); |
||||
$m = $r; |
||||
$n = $c; |
||||
} |
||||
else { |
||||
$m = $c; |
||||
$n = $r; |
||||
} |
||||
for ($x = 0; $x <= $m; $x++){ |
||||
if ($flipped && $compressed && ($x == 1 || $x == $m || $x == $m - 1)) continue; |
||||
$output .= "<div class='grid-column hours-column'><ul>"; |
||||
for ($y = 0; $y <= $n; $y++) { |
||||
if (!$flipped && $compressed && ($y == 1 || $y == $n || $y == $n - 1)) continue; |
||||
$output .= $table[$y][$x]; |
||||
} |
||||
$output .= '</ul></div>'; |
||||
} |
||||
|
||||
// end of main DIV wrapper for "table" |
||||
$output .= '</div></div>'; |
||||
} |
||||
|
||||
// end of panelContainer that holds all tables for all Categories |
||||
$output .= '</div>'; |
||||
|
||||
$output .= '<div class="clear"></div></div>'; |
||||
$output .= '</div>'; |
||||
|
||||
return $output; |
||||
} |
||||
|
||||
function room_reservations_admin_date_picker($form, &$form_state) { |
||||
$yyyymmdd = $form_state['build_info']['args'][0]; |
||||
$parts = explode('-', $yyyymmdd); |
||||
if (user_access('create room reservations extended')) { |
||||
$advancedays = variable_get('room_reservations_advance_extended', 180); |
||||
} |
||||
else { |
||||
$advancedays = variable_get('room_reservations_advance_standard', 14); |
||||
} |
||||
$yearnow = date('Y'); |
||||
$absdaynow = date('z'); |
||||
$absdaydefault = date('z', mktime(0, 0, 0, $parts[1], $parts[2], $yearnow)); |
||||
if ($absdaynow > $absdaydefault) { |
||||
$yeardefault = $yearnow + 1; |
||||
} |
||||
else { |
||||
$yeardefault = $yearnow; |
||||
} |
||||
|
||||
$format = str_replace('y', 'Y', strtolower(variable_get('room_reservations_picker_format', 'y/m/d'))); |
||||
$form['date'] = array( |
||||
'#type' => 'date_popup', |
||||
'#default_value' => $yeardefault . '-' . $parts[1] . '-' . $parts[2] . ' 00:00:00', |
||||
'#date_type' => DATE_DATETIME, |
||||
'#date_timezone' => date_default_timezone(), |
||||
'#date_format' => $format, |
||||
'#date_increment' => 1, |
||||
'#date_year_range' => '-0:+1', |
||||
'#datepicker_options' => array( |
||||
'minDate' => '+0d', |
||||
'maxDate' => $advancedays -1 . 'D', |
||||
) |
||||
); |
||||
|
||||
$form['#after_build'][] = '_room_reservations_admin_date_picker_afterbuild'; |
||||
return $form; |
||||
} |
||||
|
||||
function _room_reservations_admin_date_picker_afterbuild($form, &$form_state) { |
||||
$form['date']['date']['#title'] = ''; |
||||
$form['date']['date']['#description'] = t('click in box to select date'); |
||||
return $form; |
||||
} |
||||
|
||||
function _room_reservations_transpose($array) { |
||||
array_unshift($array, null); |
||||
return call_user_func_array('array_map', $array); |
||||
} |
||||
|
@ -0,0 +1,594 @@
|
||||
<?php |
||||
/** |
||||
* @file |
||||
* Single reservation view functionality. |
||||
*/ |
||||
|
||||
/** |
||||
* Form constructor for the reservation form. |
||||
* |
||||
* @param string $operation |
||||
* The operation being performed using the form: add, update, view. |
||||
* @param Reservation $res |
||||
* A reservation object that contains all the details related to the |
||||
* reservation being made, updated, or viewed. |
||||
*/ |
||||
function room_reservations_res_form(&$form_state, $operation, $res) { |
||||
$reserve_form_instructions_text = check_markup(_room_reservations_get_variable('reserve_form_instructions')); |
||||
$room_reservations_group_size = variable_get('room_reservations_group_size', 0); |
||||
$sms_option = _room_reservations_get_variable('sms_option'); |
||||
if (($operation == 'add') || ($operation == 'update')) { |
||||
// Options for number of persons in group, from 2 to room capacity. |
||||
$number_persons_options = array(); |
||||
for ($x = 2; $x <= $res->roomCapacity; $x++) { |
||||
$number_persons_options[$x] = $x; |
||||
} |
||||
// Valid lengths of time. |
||||
$length_options = array(); |
||||
foreach ($res->validLengths as $valid_length) { |
||||
if ($valid_length['is_valid']) { |
||||
$length_option = $valid_length['length']; |
||||
$length_options[$length_option] = $length_option . ' ' . t('minutes'); |
||||
} |
||||
} |
||||
} |
||||
if (drupal_strlen($res->phone) == 10) { |
||||
$display_phone = drupal_substr($res->phone, 0, 3) . '-' . |
||||
drupal_substr($res->phone, 3, 3) . '-' . |
||||
drupal_substr($res->phone, 6); |
||||
} |
||||
else { |
||||
$display_phone = ''; |
||||
} |
||||
// Form definition. |
||||
if ($operation === 'add') { |
||||
$form['instructions'] = array( |
||||
'#title' => t('Patron'), |
||||
'#value' => t($reserve_form_instructions_text), |
||||
'#weight' => 0, |
||||
); |
||||
} |
||||
if ($operation === 'update') { |
||||
$form['delete_top'] = array( |
||||
'#type' => 'submit', |
||||
'#value' => t('Cancel My Reservation'), |
||||
'#weight' => 4, |
||||
); |
||||
} |
||||
$form['details'] = array( |
||||
'#title' => t('Details'), |
||||
'#type' => 'fieldset', |
||||
'#weight' => 5, |
||||
); |
||||
$form['details']['room'] = array( |
||||
'#title' => t('Room'), |
||||
'#type' => 'item', |
||||
'#value' => t('@room (capacity: !capacity persons)', |
||||
array('@room' => $res->room, '!capacity' => $res->roomCapacity)), |
||||
'#weight' => 20, |
||||
); |
||||
$form['details']['display_date'] = array( |
||||
'#title' => t('Date'), |
||||
'#type' => 'item', |
||||
'#value' => t($res->displayDate), |
||||
'#weight' => 25, |
||||
); |
||||
$form['details']['time'] = array( |
||||
'#title' => t('Time'), |
||||
'#type' => 'item', |
||||
'#value' => t($res->displayTime), |
||||
'#weight' => 30, |
||||
); |
||||
if ($operation == 'add') { |
||||
$form['details']['length'] = array( |
||||
'#title' => t('Length'), |
||||
'#type' => 'radios', |
||||
'#options' => $length_options, |
||||
'#required' => TRUE, |
||||
'#weight' => 35, |
||||
); |
||||
} |
||||
elseif ($operation == 'update') { |
||||
$form['details']['length'] = array( |
||||
'#title' => t('Length'), |
||||
'#type' => 'radios', |
||||
'#options' => $length_options, |
||||
'#default_value' => $res->length, |
||||
'#required' => TRUE, |
||||
'#weight' => 35, |
||||
); |
||||
} |
||||
else { |
||||
$form['details']['length'] = array( |
||||
'#title' => t('Length'), |
||||
'#type' => 'item', |
||||
'#value' => $res->length, |
||||
'#weight' => 35, |
||||
); |
||||
} |
||||
if (($operation == 'add') || ($operation == 'update')) { |
||||
$form['details']['group_name'] = array( |
||||
'#title' => t('Group name'), |
||||
'#type' => 'textfield', |
||||
'#description' => t('Identifies your group on the reservation calendar. |
||||
14 character limit.'), |
||||
'#default_value' => $res->name, |
||||
'#maxlength' => 14, |
||||
'#size' => 14, |
||||
'#required' => TRUE, |
||||
'#weight' => 40, |
||||
); |
||||
} |
||||
else { |
||||
$form['details']['group_name'] = array( |
||||
'#title' => t('Group name'), |
||||
'#type' => 'item', |
||||
'#value' => $res->name, |
||||
'#weight' => 40, |
||||
); |
||||
} |
||||
if ($room_reservations_group_size) { |
||||
if ($operation == 'add') { |
||||
$form['details']['group_size'] = array( |
||||
'#title' => t('Size of the group'), |
||||
'#type' => 'radios', |
||||
'#options' => $number_persons_options, |
||||
'#required' => TRUE, |
||||
'#weight' => 45, |
||||
); |
||||
} |
||||
elseif ($operation == 'update') { |
||||
$form['details']['group_size'] = array( |
||||
'#title' => t('Size of the group'), |
||||
'#type' => 'radios', |
||||
'#options' => $number_persons_options, |
||||
'#default_value' => $res->groupSize, |
||||
'#required' => TRUE, |
||||
'#weight' => 45, |
||||
); |
||||
} |
||||
else { |
||||
$form['details']['group_size'] = array( |
||||
'#title' => t('Size of the group'), |
||||
'#type' => 'item', |
||||
'#value' => $res->groupSize, |
||||
'#weight' => 45, |
||||
); |
||||
} |
||||
} |
||||
if (_room_reservations_full_access()) { |
||||
$form['details']['user_name'] = array( |
||||
'#title' => t('User name'), |
||||
'#type' => 'item', |
||||
'#value' => $res->userName, |
||||
'#weight' => 55, |
||||
); |
||||
} |
||||
$form['reminders'] = array( |
||||
'#title' => t('Reminders'), |
||||
'#type' => 'fieldset', |
||||
'#weight' => 60, |
||||
); |
||||
if ($sms_option) { |
||||
if (($operation == 'add') || ($operation == 'update')) { |
||||
$form['reminders']['textmsg'] = array( |
||||
'#title' => t('I want to receive my confirmation and reminder as a text |
||||
message.'), |
||||
'#type' => 'checkbox', |
||||
'#return_value' => 1, |
||||
'#default_value' => $res->textmsg, |
||||
'#weight' => 65, |
||||
); |
||||
$form['reminders']['textmsg_fields_start'] = array( |
||||
'#value' => '<div id="txtmsg-fields">', |
||||
'#weight' => 66, |
||||
); |
||||
$form['reminders']['phone'] = array( |
||||
'#title' => t('Phone number'), |
||||
'#type' => 'textfield', |
||||
'#maxlength' => 15, |
||||
'#size' => 15, |
||||
'#default_value' => $display_phone, |
||||
'#weight' => 70, |
||||
); |
||||
$carriers = _room_reservations_carriers(); |
||||
$form['reminders']['carrier'] = array( |
||||
'#title' => t('Carrier'), |
||||
'#type' => 'select', |
||||
'#options' => $carriers, |
||||
'#default_value' => $res->carrier, |
||||
'#weight' => 75, |
||||
); |
||||
$form['reminders']['charges'] = array( |
||||
'#value' => '<div class="form-item">' . |
||||
t('NOTE: Carrier charges may apply if your cell phone service |
||||
plan does not include free text messaging.') . '</div>', |
||||
'#weight' => 80, |
||||
); |
||||
$form['reminders']['testmsg_fields_end'] = array( |
||||
'#value' => '</div>', |
||||
'#weight' => 85, |
||||
); |
||||
} |
||||
} |
||||
$reminder_columns = 60; |
||||
if (($operation == 'add') || ($operation == 'update')) { |
||||
$form['reminders']['email_addresses'] = array( |
||||
'#title' => t('Email Addresses'), |
||||
'#type' => 'textarea', |
||||
'#default_value' => $res->emailAddresses, |
||||
'#description' => t('Reservation confirmation and reminder will be sent |
||||
to any email addresses entered here. Separate addresses with a |
||||
comma.'), |
||||
'#cols' => $reminder_columns, |
||||
'#rows' => 1, |
||||
'#weight' => 90, |
||||
); |
||||
} |
||||
else { |
||||
$form['reminders']['email_addresses'] = array( |
||||
'#title' => t('Email Addresses'), |
||||
'#type' => 'item', |
||||
'#value' => $res->emailAddresses, |
||||
'#weight' => 90, |
||||
); |
||||
} |
||||
if ($operation == 'add') { |
||||
$form['add'] = array( |
||||
'#type' => 'submit', |
||||
'#value' => t('Save My Reservation'), |
||||
'#weight' => 100, |
||||
); |
||||
} |
||||
elseif ($operation == 'update') { |
||||
$form['update'] = array( |
||||
'#type' => 'submit', |
||||
'#value' => t('Update My Reservation'), |
||||
'#weight' => 100, |
||||
); |
||||
$form['delete'] = array( |
||||
'#type' => 'submit', |
||||
'#value' => t('Cancel My Reservation'), |
||||
'#weight' => 101, |
||||
); |
||||
} |
||||
$form['id'] = array( |
||||
'#type' => 'value', |
||||
'#value' => $res->id, |
||||
); |
||||
$form['month_number'] = array( |
||||
'#type' => 'value', |
||||
'#value' => $res->monthNumber, |
||||
); |
||||
$form['day'] = array( |
||||
'#type' => 'value', |
||||
'#value' => $res->day, |
||||
); |
||||
$form['year'] = array( |
||||
'#type' => 'value', |
||||
'#value' => $res->year, |
||||
); |
||||
$form['time_number'] = array( |
||||
'#type' => 'value', |
||||
'#value' => $res->time, |
||||
); |
||||
$form['room_name'] = array( |
||||
'#type' => 'value', |
||||
'#value' => $res->room, |
||||
); |
||||
$form['category'] = array( |
||||
'#type' => 'value', |
||||
'#value' => $res->category, |
||||
); |
||||
$form['yyyymmdd'] = array( |
||||
'#type' => 'value', |
||||
'#value' => $res->date, |
||||
); |
||||
$form['user_name_hold'] = array( |
||||
'#type' => 'value', |
||||
'#value' => $res->userName, |
||||
); |
||||
return $form; |
||||
} |
||||
|
||||
/** |
||||
* Form validation for the reservation form. |
||||
* |
||||
* @param string $form_id |
||||
* Drupal form id. |
||||
* @param array $form_state |
||||
* Drupal form state object. |
||||
*/ |
||||
function room_reservations_res_form_validate($form_id, &$form_state) { |
||||
// When a user is filling out the form to reserve a room, it is possible that |
||||
// before she can submit the form, someone else will complete a reservation |
||||
// for that same room, same date, and at least part of the same time period. |
||||
// If that should occur, and the user has requested a length of time that |
||||
// is no longer available, Drupal automatically creates the following error: |
||||
// 'An illegal choice has been detected. Please contact the site |
||||
// administrator.' Since this message is somewhat alarming to the user and |
||||
// not very informative, it is replaced in this function with a more |
||||
// descriptive message. |
||||
$errors = drupal_get_messages(); |
||||
foreach ($errors as $type => $id) { |
||||
foreach ($id as $message) { |
||||
// Loop through individual messages, looking for ones to remove or |
||||
// replace. |
||||
if (room_reservations_rewrite_error($message) === FALSE) { |
||||
drupal_set_message($message, $type); |
||||
} |
||||
elseif (room_reservations_rewrite_error($message) !== TRUE) { |
||||
drupal_set_message(room_reservations_rewrite_error($message), $type); |
||||
} |
||||
} |
||||
} |
||||
// Validate email addresses. |
||||
$email_addresses = trim($form_state['values']['email_addresses']); |
||||
if (drupal_strlen($email_addresses)) { |
||||
$valid_addresses = TRUE; |
||||
$list_items = explode(',', $email_addresses); |
||||
foreach ($list_items as $address) { |
||||
if (!valid_email_address(trim($address))) { |
||||
$valid_addresses = FALSE; |
||||
} |
||||
} |
||||
if (!$valid_addresses) { |
||||
form_set_error('email_addresses', t('Email Addresses contains an invalid |
||||
email address.')); |
||||
} |
||||
} |
||||
if ((!drupal_strlen($email_addresses)) && |
||||
(!$form_state['values']['textmsg'])) { |
||||
$default_sms_option = _room_reservations_get_variable('sms_option'); |
||||
if ($default_sms_option) { |
||||
form_set_error('email_addresses', t('Your email address or phone number is |
||||
required.')); |
||||
} |
||||
else { |
||||
form_set_error('email_addresses', t('Your email address is |
||||
required.')); |
||||
} |
||||
} |
||||
|
||||
// Text message information. |
||||
if ($form_state['values']['textmsg']) { |
||||
$phone = $form_state['values']['phone']; |
||||
$phone_number = preg_replace('/[^\d]/', '', $phone); |
||||
if (drupal_strlen($phone_number) <> 10) { |
||||
form_set_error('phone', t('Ten digit phone number is required |
||||
when receiving confirmation by text message.')); |
||||
} |
||||
if (!$form_state['values']['carrier']) { |
||||
form_set_error('carrier', t('Carrier is required |
||||
when receiving confirmation by text message.')); |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
/** |
||||
* Form submission for the reservation form. |
||||
* |
||||
* @param string $form_id |
||||
* Drupal form id. |
||||
* @param array $form_state |
||||
* Drupal form state object. |
||||
*/ |
||||
function room_reservations_res_form_submit($form_id, &$form_state) { |
||||
$id = $form_state['values']['id']; |
||||
$month_number = $form_state['values']['month_number']; |
||||
$day = $form_state['values']['day']; |
||||
$year = $form_state['values']['year']; |
||||
$time = $form_state['values']['time_number']; |
||||
$length = $form_state['values']['length']; |
||||
$room = $form_state['values']['room_name']; |
||||
$group_name = $form_state['values']['group_name']; |
||||
$group_size = $form_state['values']['group_size']; |
||||
$user_name = $form_state['values']['user_name_hold']; |
||||
$category = $form_state['values']['category']; |
||||
$yyyymmdd = $form_state['values']['yyyymmdd']; |
||||
$email_addresses = trim($form_state['values']['email_addresses']); |
||||
$textmsg_checkbox = $form_state['values']['textmsg']; |
||||
$carrier = $form_state['values']['carrier']; |
||||
$phone_full = $form_state['values']['phone']; |
||||
$phone = preg_replace('/[^\d]/', '', $phone_full); |
||||
if ($textmsg_checkbox) { |
||||
$textmsg = 'Y'; |
||||
} |
||||
else { |
||||
$textmsg = 'N'; |
||||
$carrier = 0; |
||||
$phone = ''; |
||||
} |
||||
if ($time < 1000) { |
||||
$time = str_pad($time, 4, '0', STR_PAD_LEFT); |
||||
} |
||||
$hours = _room_reservations_hours(); |
||||
foreach ($hours as $individual_hour) { |
||||
if ($individual_hour['time'] == $time) { |
||||
$display_hour = $individual_hour['display']; |
||||
break; |
||||
} |
||||
} |
||||
$day_of_week = date("l", strtotime($yyyymmdd)); |
||||
$month_name = date("F", strtotime($yyyymmdd)); |
||||
// Add. |
||||
if ($form_state['clicked_button']['#value'] == t('Save My Reservation')) { |
||||
$result = db_query("INSERT INTO {room_reservations} (date, time, length, room, name, group_size, user_name, email_addresses, create_date, textmsg, carrier, phone ) |
||||
VALUES ('%s', '%s', %d, '%s', '%s', %d, '%s', '%s', '%s', '%s', %d, '%s')", |
||||
$yyyymmdd, $time, $length, $room, $group_name, $group_size, $user_name, $email_addresses, date('Y-m-d H:i:s', REQUEST_TIME), $textmsg, $carrier, $phone); |
||||
// Send a confirmation email or text message. |
||||
$id = db_last_insert_id('room_reservations', 'id'); |
||||
$params = array( |
||||
'room' => $room, |
||||
'month' => $month_name, |
||||
'month_number' => $month_number, |
||||
'day' => $day, |
||||
'day_of_week' => $day_of_week, |
||||
'time' => $display_hour, |
||||
'minutes' => $length, |
||||
'name' => $group_name, |
||||
'id' => $id, |
||||
'carrier' => $carrier, |
||||
'phone' => $phone, |
||||
); |
||||
$from = _room_reservations_get_variable('from_address'); |
||||
if ($result) { |
||||
drupal_set_message(t('Your group study room reservation has been made.')); |
||||
// Send an email to each person in the group. If the person is the one |
||||
// who made the reservation, send the confirmation message. Otherwise, |
||||
// send the notification message. |
||||
if (drupal_strlen($email_addresses)) { |
||||
$to_addresses = explode(',', $email_addresses); |
||||
foreach ($to_addresses as $to_address) { |
||||
$to_address = trim($to_address); |
||||
$pos = strpos($to_address, $user_name); |
||||
if ($pos === FALSE) { |
||||
$key = 'notification'; |
||||
} |
||||
else { |
||||
$key = 'confirmation'; |
||||
} |
||||
$response = drupal_mail( |
||||
'room_reservations', $key, $to_address, language_default(), |
||||
$params, $from, TRUE); |
||||
} |
||||
} |
||||
// If requested, send a text message confirmation to the person who made |
||||
// the reservation. |
||||
if ($textmsg == 'Y') { |
||||
_room_reservations_send_sms('confirmation', $params); |
||||
} |
||||
} |
||||
else { |
||||
drupal_set_message(t('Your group study room reservation could not be |
||||
made.'), 'error'); |
||||
} |
||||
$redirect = "room_reservations/" . $month_number . "/" . $day . "/" . $category; |
||||
$form_state['redirect'] = $redirect; |
||||
} |
||||
// Update. |
||||
elseif ($form_state['clicked_button']['#value'] == |
||||
t('Update My Reservation')) { |
||||
$result = db_query(" |
||||
UPDATE {room_reservations} |
||||
SET length = %d, |
||||
name = '%s', |
||||
group_size = %d, |
||||
email_addresses = '%s', |
||||
update_date = '%s', |
||||
textmsg = '%s', |
||||
carrier = %d, |
||||
phone = '%s' |
||||
WHERE id = %d", $length, $group_name, $group_size, $email_addresses, date('Y-m-d H:i:s', REQUEST_TIME), $textmsg, $carrier, $phone, $id); |
||||
if ($result) { |
||||
drupal_set_message(t('Your group study room reservation has been |
||||
updated.')); |
||||
} |
||||
else { |
||||
drupal_set_message(t('Your group study room reservation could not be |
||||
updated.'), 'error'); |
||||
} |
||||
$redirect = "room_reservations/" . $month_number . "/" . $day . "/" . $category; |
||||
$form_state['redirect'] = $redirect; |
||||
} |
||||
elseif ($form_state['clicked_button']['#value'] == t('Cancel My Reservation')) { |
||||
$redirect = "room_reservations/delete/" . $id; |
||||
$form_state['redirect'] = $redirect; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Form constructor for the delete reservation form. |
||||
* |
||||
* @param Reservation $res |
||||
* A reservation object that contains all the details related to the |
||||
* reservation being deleted. |
||||
*/ |
||||
function room_reservations_cancel_form(&$form_state, $res) { |
||||
$room_capacity = $res->roomCapacity; |
||||
// Form definition. |
||||
$form['room'] = array( |
||||
'#title' => t('Room'), |
||||
'#type' => 'item', |
||||
'#value' => t('@room (capacity: !capacity persons)', array('@room' => $res->room, '!capacity' => $room_capacity)), |
||||
'#weight' => 10, |
||||
); |
||||
$form['display_date'] = array( |
||||
'#title' => t('Date'), |
||||
'#type' => 'item', |
||||
'#value' => t($res->displayDate), |
||||
'#weight' => 20, |
||||
); |
||||
$form['time'] = array( |
||||
'#title' => t('Time'), |
||||
'#type' => 'item', |
||||
'#value' => t($res->displayTime), |
||||
'#weight' => 30, |
||||
); |
||||
$form['length'] = array( |
||||
'#title' => t('Length'), |
||||
'#type' => 'item', |
||||
'#value' => t('!length minutes', array('!length' => $res->length)), |
||||
'#weight' => 40, |
||||
); |
||||
$form['group_name'] = array( |
||||
'#title' => t('Group name'), |
||||
'#type' => 'item', |
||||
'#value' => $res->name, |
||||
'#weight' => 50, |
||||
); |
||||
$form['id'] = array( |
||||
'#type' => 'value', |
||||
'#value' => $res->id, |
||||
); |
||||
$form['month_number'] = array( |
||||
'#type' => 'value', |
||||
'#value' => $res->monthNumber, |
||||
); |
||||
$form['day'] = array( |
||||
'#type' => 'value', |
||||
'#value' => $res->day, |
||||
); |
||||
$form['category'] = array( |
||||
'#type' => 'value', |
||||
'#value' => $res->roomCategory, |
||||
); |
||||
$form['user_name_hold'] = array( |
||||
'#type' => 'value', |
||||
'#value' => $res->userName, |
||||
); |
||||
return confirm_form($form, |
||||
t('Cancel'), 'room_reservations/' . $res->monthNumber . '/' . $res->day . '/' . $res->roomCategory, |
||||
t('Are you sure you want to cancel this reservation? This action cannot be undone.'), |
||||
t('Cancel My Reservation'), |
||||
t("Don't Cancel My Reservation") |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* Form submission for the delete reservation form. |
||||
* |
||||
* @param string $form_id |
||||
* Drupal form id. |
||||
* @param array $form_state |
||||
* Drupal form state object. |
||||
*/ |
||||
function room_reservations_cancel_form_submit($form_id, &$form_state) { |
||||
$id = $form_state['values']['id']; |
||||
$month_number = $form_state['values']['month_number']; |
||||
$day = $form_state['values']['day']; |
||||
$category = $form_state['values']['category']; |
||||
// Delete. |
||||
if ($form_state['clicked_button']['#value'] == t('Cancel My Reservation')) { |
||||
$result = db_query("UPDATE {room_reservations} SET deleted = '%s', update_date = '%s' WHERE id = %d", 'Y', date('Y-m-d H:i:s', REQUEST_TIME), $id); |
||||
if ($result) { |
||||
drupal_set_message(t('Your group study room reservation has been cancelled.')); |
||||
} |
||||
else { |
||||
drupal_set_message(t('Your group study room reservation could not be cancelled.'), 'error'); |
||||
} |
||||
} |
||||
$redirect = "room_reservations/" . $month_number . "/" . $day . "/" . $category; |
||||
$form_state['redirect'] = $redirect; |
||||
} |
Loading…
Reference in new issue