The plugin automatically creates a Koha Page during installation that provides the room reservation interface.
After installation, the room reservations page is available at:
/cgi-bin/koha/opac-page.pl?code=lmscloud-roomreservations
The plugin uses Koha's built-in Pages feature (Additional Contents) to create an OPAC-accessible page. This approach:
- No Apache configuration required - Works immediately after plugin installation
- Integrated with Koha - Full access to Koha's OPAC theme, navigation, and authentication
- Easy to maintain - Page content is managed via the plugin's install/uninstall hooks
To make the room reservations page easily discoverable, you can add a link to it in various ways:
-
OpacNav System Preference: Add this HTML to the OpacNav system preference:
<li> <a href="/cgi-bin/koha/opac-page.pl?code=lmscloud-roomreservations" >Room Reservations</a > </li>
-
OpacMainUserBlock: Add a prominent link on the OPAC home page
-
Custom OPAC template: Modify your OPAC theme to include a navigation link
Note: The following Apache configuration is no longer required as of version 4.8.5. It is kept here for reference only.
Click to expand deprecated Apache configuration
The old approach used Apache ScriptAlias to directly access calendar.pl:
ScriptAlias /roomreservations "/var/lib/koha/INSTANCE/plugins/Koha/Plugin/Com/LMSCloud/RoomReservations/Opac/calendar.pl"
Alias /plugin "/var/lib/koha/INSTANCE/plugins"
<Directory /var/lib/koha/INSTANCE/plugins/>
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
This configuration is no longer necessary and can be removed.
This project uses Git submodules to share code across LMSCloud plugins:
Koha/Plugin/Com/LMSCloud/Util/- Shared utility modules (Pages, MigrationHelper, I18N)src/components/custom/LMSCalendar/- Shared calendar component
Important: After cloning this repository, initialize submodules with:
git submodule update --init --recursiveFor detailed information on working with submodules, see SUBMODULES.md.
- To use the build scripts in
package.jsonyou'll need package-kpz in your PATH.
For development and testing, you can seed the database with sample rooms, equipment, and open hours:
just seedThis will create:
- 5 sample rooms (Room 101, Room 202, Study Room A/B, Auditorium)
- 5 equipment items (Projector, Whiteboard, Video Conference, Laptop, Microphone)
- Equipment assignments for each room
- Open hours (Monday-Friday, 9am-5pm)
Note: This is for testing only and should not be used in production. The fixtures are located in testing/fixtures/ and are not included in the production build.
INSERT IGNORE INTO letter ( module, code, branchcode, name, is_html, title, message_transport_type, lang, content ) VALUES (
'members', 'ROOM_RESERVATION', '', 'Raumreservierungsbenachrichtigung', 1, 'Reservierung eines Raumes', 'email', 'default',
'<html>
<head>
<style>
h2 {
text-align: center;
font-size: 24px;
font-weight: bold;
margin-bottom: 20px;
}
h3 {
font-size: 18px;
font-weight: bold;
margin-bottom: 10px;
}
span {
font-size: 16px;
margin-bottom: 5px;
display: block;
}
.container {
width: max-content;
text-align: center;
margin: 0 auto;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
}
.card {
background-color: #fff;
border: 1px solid #ddd;
border-radius: 5px;
box-shadow: 0px 2px 10px 0px rgba(0,0,0,0.1);
padding: 20px;
margin-bottom: 20px;
}
.footer {
text-align: center;
font-size: 14px;
margin-top: 20px;
}
</style>
</head>
<body>
<div class="container">
<h2>Ihre Raumreservierung wurde bestätigt</h2>
<div class="card">
<h3>Ihre Angaben</h3>
<span>Name: [% user %]</span><br>
<span>Raum: [% room %]</span><br>
<span>Von: [% from %]</span><br>
<span>Bis: [% to %]</span>
</div>
<div class="card">
<h3>Ihre gebuchte Ausstattung</h3>
<span>[% booked_equipment %]</span>
</div>
<div class="card">
<h3>Zeitpunkt der Bestätigung</h3>
<span>[% confirmed_timestamp %]</span>
</div>
<div class="footer">
Mit freundlichen Grüßen,<br>
Ihre Bibliothek
</div>
</div>
</body>
</html>'
);INSERT IGNORE INTO letter ( module, code, branchcode, name, is_html, title, message_transport_type, lang, content ) VALUES (
'members', 'ROOM_CANCELLATION', '', 'Raumreservierungsstornierungsbenachrichtigung', 1, 'Stornierung der Reservierung eines Raumes', 'email', 'default',
'<html>
<head>
<style>
h2 {
text-align: center;
font-size: 24px;
font-weight: bold;
margin-bottom: 20px;
}
h3 {
font-size: 18px;
font-weight: bold;
margin-bottom: 10px;
}
p {
font-size: 16px;
margin-bottom: 20px;
}
span {
font-size: 16px;
margin-bottom: 5px;
display: block;
}
.container {
width: max-content;
text-align: center;
margin: 0 auto;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
}
.card {
background-color: #fff;
border: 1px solid #ddd;
border-radius: 5px;
box-shadow: 0px 2px 10px 0px rgba(0,0,0,0.1);
padding: 20px;
margin-bottom: 20px;
}
.footer {
text-align: center;
font-size: 14px;
margin-top: 20px;
}
</style>
</head>
<body>
<div class="container">
<h2>Ihre Raumreservierung wurde storniert</h2>
<p>Es tut uns Leid, Sie darüber informieren zu müssen, dass Ihre Reservierung storniert werden musste.</p>
<div class="card">
<h3>Ihre Angaben</h3>
<span>Raum: [% room %]</span><br>
<span>Von: [% from %]</span><br>
<div class="footer">
<span>Bis: [% to %]</span>
</div>
Mit freundlichen Grüßen,<br>
Ihre Bibliothek
</div>
</div>
</body>
</html>'
);