Compare commits
6 Commits
e502b63f83
...
9b4d6f1037
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9b4d6f1037 | ||
|
|
8434d950dd | ||
|
|
c76dd44f16 | ||
|
|
b888634fd7 | ||
|
|
e32cd8f6ed | ||
|
|
ec79686a7d |
10
.env.example
Normal file
@@ -0,0 +1,10 @@
|
||||
# Copy to .env for local development. Local test values only, never use in production.
|
||||
APP_PORT=8080
|
||||
DB_NAME=qloapps
|
||||
DB_USER=qloapps
|
||||
DB_PASSWORD=qlo_local_dev
|
||||
DB_ROOT_PASSWORD=qlo_local_root
|
||||
|
||||
# Local admin created by the CLI installer (test values only)
|
||||
ADMIN_EMAIL=admin@hotel.test
|
||||
ADMIN_PASSWORD=change-me
|
||||
4
.gitignore
vendored
@@ -255,4 +255,6 @@ admin/themes/default/css/screen.css
|
||||
# MISC
|
||||
|
||||
**sitemap.xml
|
||||
robots.txt
|
||||
robots.txt
|
||||
# Local docker environment
|
||||
.env
|
||||
|
||||
14
.impeccable/config.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"detector": {
|
||||
"ignoreRules": [],
|
||||
"ignoreFiles": [],
|
||||
"ignoreValues": [
|
||||
{
|
||||
"rule": "overused-font",
|
||||
"value": "open sans",
|
||||
"createdAt": "2026-11-10T23:17:21.694Z",
|
||||
"reason": "Brand font: www.zum-alten-wasserrad.de renders its h1/h2 in Open Sans (checked via computed styles); the skin mirrors that site"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -3374,6 +3374,10 @@ exit;
|
||||
protected static $is_addons_up = true;
|
||||
public static function addonsRequest($request, $params = array())
|
||||
{
|
||||
if (defined('_QLO_DISABLE_PHONE_HOME_') && _QLO_DISABLE_PHONE_HOME_) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!self::$is_addons_up) {
|
||||
return false;
|
||||
}
|
||||
@@ -3485,6 +3489,10 @@ exit;
|
||||
*/
|
||||
public static function refresh($file_to_refresh, $external_file)
|
||||
{
|
||||
if (defined('_QLO_DISABLE_PHONE_HOME_') && _QLO_DISABLE_PHONE_HOME_) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (self::$is_addons_up && $content = Tools::file_get_contents($external_file)) {
|
||||
return (bool)file_put_contents(_PS_ROOT_DIR_.$file_to_refresh, $content);
|
||||
}
|
||||
|
||||
@@ -84,6 +84,13 @@ define('_MODULE_DIR_', __PS_BASE_URI__.'modules/');
|
||||
Tools::safeDefine('_PS_API_DOMAIN_', 'api.prestashop.com');
|
||||
Tools::safeDefine('_PS_API_URL_', 'http://'._PS_API_DOMAIN_);
|
||||
Tools::safeDefine('_PS_CURRENCY_FEED_URL_', _PS_API_URL_.'/xml/currencies.xml');
|
||||
/*
|
||||
* Phone-home kill switch: when true, no data is sent to api.qloapps.com for
|
||||
* installation notification, upgrade checks, admin recommendations or module/theme catalogs.
|
||||
* On-demand language/localization pack downloads stay available.
|
||||
* Define it as false in config/defines.inc.php (before this file) to restore upstream behaviour.
|
||||
*/
|
||||
Tools::safeDefine('_QLO_DISABLE_PHONE_HOME_', true);
|
||||
Tools::safeDefine('_QLO_API_DOMAIN_', 'api.qloapps.com');
|
||||
Tools::safeDefine('_QLO_API_URL_', 'https://'._QLO_API_DOMAIN_);
|
||||
Tools::safeDefine('_QLO_TAB_MODULE_LIST_URL_', _QLO_API_URL_.'/xml/tab_modules_list.xml');
|
||||
|
||||
@@ -2049,7 +2049,11 @@ class AdminThemesControllerCore extends AdminController
|
||||
*/
|
||||
private function getNativeModule($type = 0)
|
||||
{
|
||||
$xml = false;
|
||||
$protocols = array('https://', 'http://');
|
||||
if (defined('_QLO_DISABLE_PHONE_HOME_') && _QLO_DISABLE_PHONE_HOME_) {
|
||||
$protocols = array();
|
||||
}
|
||||
foreach ($protocols as $protocol) {
|
||||
if($xml = @simplexml_load_string(Tools::file_get_contents($protocol._QLO_API_DOMAIN_.'/xml/'.str_replace('.', '', _QLOAPPS_VERSION_).'.xml'))) {
|
||||
break;
|
||||
|
||||
46
docker-compose.yml
Normal file
@@ -0,0 +1,46 @@
|
||||
# Local development setup for QloApps.
|
||||
# Start: docker compose up -d --build
|
||||
# Shop: http://localhost:8080
|
||||
# Admin: http://localhost:8080/admin-dev (login: ADMIN_EMAIL / ADMIN_PASSWORD from .env)
|
||||
# Values come from .env (copy .env.example to .env).
|
||||
#
|
||||
# Install (once, as www-data so file permissions stay correct; the web installer is blocked):
|
||||
# docker compose exec -u www-data app php install-dev/index_cli.php --language=de --country=de \
|
||||
# --timezone=Europe/Berlin --domain=localhost:8080 --db_server=db --db_user=qloapps \
|
||||
# --db_password=<DB_PASSWORD> --db_name=qloapps --email=<ADMIN_EMAIL> --password=<ADMIN_PASSWORD> \
|
||||
# --newsletter=0
|
||||
#
|
||||
# Then (as www-data): fill German front-office gaps and load the Wasserrad demo content:
|
||||
# docker compose exec -u www-data app php docker/apply-translations.php de
|
||||
# docker compose exec -u www-data app php docker/seed-wasserrad-demo.php
|
||||
|
||||
services:
|
||||
app:
|
||||
build: ./docker
|
||||
ports:
|
||||
- "${APP_PORT:-8080}:80"
|
||||
volumes:
|
||||
- ./:/var/www/html
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
restart: unless-stopped
|
||||
|
||||
db:
|
||||
image: mariadb:11.4
|
||||
environment:
|
||||
MARIADB_DATABASE: ${DB_NAME:-qloapps}
|
||||
MARIADB_USER: ${DB_USER:-qloapps}
|
||||
MARIADB_PASSWORD: ${DB_PASSWORD:?set DB_PASSWORD in .env}
|
||||
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:?set DB_ROOT_PASSWORD in .env}
|
||||
volumes:
|
||||
- db_data:/var/lib/mysql
|
||||
healthcheck:
|
||||
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 20
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
db_data:
|
||||
19
docker/Dockerfile
Normal file
@@ -0,0 +1,19 @@
|
||||
FROM php:8.3-apache
|
||||
|
||||
# PHP extensions required by QloApps (see README "Requirements")
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
libfreetype6-dev libjpeg62-turbo-dev libpng-dev libwebp-dev \
|
||||
libzip-dev libxml2-dev libicu-dev unzip \
|
||||
&& docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \
|
||||
&& docker-php-ext-install -j"$(nproc)" pdo_mysql mysqli gd zip soap intl opcache \
|
||||
&& a2enmod rewrite headers \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY php.ini /usr/local/etc/php/conf.d/qloapps.ini
|
||||
COPY apache-hardening.conf /etc/apache2/conf-enabled/zz-hardening.conf
|
||||
|
||||
# QloApps' .htaccess files need AllowOverride
|
||||
RUN sed -ri 's!AllowOverride None!AllowOverride All!g' /etc/apache2/apache2.conf
|
||||
|
||||
WORKDIR /var/www/html
|
||||
7
docker/apache-hardening.conf
Normal file
@@ -0,0 +1,7 @@
|
||||
# The repo is bind-mounted as web root: never serve dotfiles (.env, .git, ...) or docker files.
|
||||
RedirectMatch 404 "/\.(?!well-known/)"
|
||||
RedirectMatch 404 "^/(docker/|docker-compose\.yml)"
|
||||
# Installation is done via CLI (see docker-compose.yml); a web re-install would wipe the database.
|
||||
RedirectMatch 404 "^/install-dev"
|
||||
ServerTokens Prod
|
||||
ServerSignature Off
|
||||
74
docker/apply-translations.php
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
/**
|
||||
* Writes missing front-office translations into modules/<module>/translations/<iso>.php.
|
||||
* Usage: docker compose exec -u www-data app php docker/apply-translations.php [iso]
|
||||
* Reads the dictionary docker/translations-<iso>-front.php (English => target language)
|
||||
* and only fills keys that are missing; existing translations are never overwritten.
|
||||
*/
|
||||
if (PHP_SAPI !== 'cli') {
|
||||
exit;
|
||||
}
|
||||
$iso = isset($argv[1]) ? $argv[1] : 'de';
|
||||
$root = realpath(__DIR__.'/..');
|
||||
$dict = require __DIR__.'/translations-'.$iso.'-front.php';
|
||||
|
||||
$json = shell_exec('php '.escapeshellarg(__DIR__.'/find-missing-translations.php').' '.escapeshellarg($iso).' 2>/dev/null');
|
||||
$missing = json_decode($json, true);
|
||||
if (!is_array($missing)) {
|
||||
fwrite(STDERR, "Could not read missing translations\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
$added = 0;
|
||||
$untranslated = array();
|
||||
foreach ($missing['modules'] as $mod => $entries) {
|
||||
$lines = array();
|
||||
foreach ($entries as $key => $english) {
|
||||
if (!isset($dict[$english])) {
|
||||
$untranslated[$mod][] = $english;
|
||||
continue;
|
||||
}
|
||||
$lines[] = '$_MODULE['.var_export($key, true).'] = '.var_export($dict[$english], true).';';
|
||||
}
|
||||
if (!$lines) {
|
||||
continue;
|
||||
}
|
||||
$file = $root.'/modules/'.$mod.'/translations/'.$iso.'.php';
|
||||
if (!is_file($file)) {
|
||||
@mkdir(dirname($file), 0755, true);
|
||||
file_put_contents($file, "<?php\n\nglobal \$_MODULE;\n\$_MODULE = array();\n");
|
||||
}
|
||||
$content = rtrim(file_get_contents($file));
|
||||
if (substr($content, -2) === '?>') {
|
||||
$content = rtrim(substr($content, 0, -2));
|
||||
}
|
||||
// Some language-pack files end with "return $_MODULE;" - new lines must go before it.
|
||||
$hasReturn = (bool)preg_match('/\n\s*return \$_MODULE;\s*$/', $content);
|
||||
if ($hasReturn) {
|
||||
$content = rtrim(preg_replace('/\n\s*return \$_MODULE;\s*$/', '', $content));
|
||||
}
|
||||
$content .= "\n\n// Added by docker/apply-translations.php\n".implode("\n", $lines)."\n";
|
||||
if ($hasReturn) {
|
||||
$content .= "\nreturn \$_MODULE;\n";
|
||||
}
|
||||
file_put_contents($file, $content);
|
||||
$added += count($lines);
|
||||
echo sprintf(" %-26s +%d\n", $mod, count($lines));
|
||||
}
|
||||
// Theme strings the language pack "translates" with English text: replace those values.
|
||||
$themeFixes = isset($dict['__theme_value_fixes']) ? $dict['__theme_value_fixes'] : array();
|
||||
$themeFile = $root.'/themes/hotel-reservation-theme/lang/'.$iso.'.php';
|
||||
if ($themeFixes && is_file($themeFile)) {
|
||||
$c = file_get_contents($themeFile);
|
||||
$n = 0;
|
||||
foreach ($themeFixes as $from => $to) {
|
||||
$c = str_replace('= '.var_export($from, true).';', '= '.var_export($to, true).';', $c, $count);
|
||||
$n += $count;
|
||||
}
|
||||
file_put_contents($themeFile, $c);
|
||||
echo " theme lang fixes $n\n";
|
||||
}
|
||||
|
||||
echo "Added $added translations.\n";
|
||||
$skip = array_sum(array_map('count', $untranslated));
|
||||
echo "Not in dictionary: $skip (mostly back-office modules)\n";
|
||||
89
docker/find-missing-translations.php
Normal file
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
/**
|
||||
* Lists front-office strings without a translation for the given language.
|
||||
* Usage: docker compose exec -u www-data app php docker/find-missing-translations.php [iso] > missing.json
|
||||
* Scans theme templates and the front templates of active front modules.
|
||||
*/
|
||||
if (PHP_SAPI !== 'cli') {
|
||||
exit;
|
||||
}
|
||||
$iso = isset($argv[1]) ? $argv[1] : 'de';
|
||||
$root = realpath(__DIR__.'/..');
|
||||
$theme = $root.'/themes/hotel-reservation-theme';
|
||||
|
||||
$_LANG = array();
|
||||
include $theme.'/lang/'.$iso.'.php';
|
||||
$themeLang = $_LANG;
|
||||
|
||||
$re = '/\{l\s+s=(?:\'((?:[^\'\\\\]|\\\\.)*)\'|"((?:[^"\\\\]|\\\\.)*)")(?:\s+mod=[\'"]([\w-]+)[\'"])?[^}]*\}/';
|
||||
$out = array('theme' => array(), 'modules' => array());
|
||||
$moduleLangCache = array();
|
||||
|
||||
$moduleLang = function ($mod) use (&$moduleLangCache, $root, $theme, $iso) {
|
||||
if (!isset($moduleLangCache[$mod])) {
|
||||
$_MODULE = array();
|
||||
foreach (array($root.'/modules/'.$mod.'/translations/'.$iso.'.php', $theme.'/modules/'.$mod.'/translations/'.$iso.'.php') as $f) {
|
||||
if (is_file($f)) {
|
||||
include $f;
|
||||
}
|
||||
}
|
||||
$moduleLangCache[$mod] = $_MODULE;
|
||||
}
|
||||
return $moduleLangCache[$mod];
|
||||
};
|
||||
|
||||
$files = array();
|
||||
$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($theme, FilesystemIterator::SKIP_DOTS));
|
||||
foreach ($it as $f) {
|
||||
if (substr($f, -4) === '.tpl' && strpos($f, '/mobile/') === false && strpos($f, '/pdf/') === false) {
|
||||
$files[] = (string)$f;
|
||||
}
|
||||
}
|
||||
// older modules keep front templates in the module root
|
||||
foreach (glob($root.'/modules/*/*.tpl') as $f) {
|
||||
$files[] = $f;
|
||||
}
|
||||
foreach (glob($root.'/modules/*/views/templates/{hook,front}/*.tpl', GLOB_BRACE) as $f) {
|
||||
$files[] = $f;
|
||||
}
|
||||
foreach (glob($root.'/modules/*/views/templates/{hook,front}/*/*.tpl', GLOB_BRACE) as $f) {
|
||||
$files[] = $f;
|
||||
}
|
||||
|
||||
foreach ($files as $file) {
|
||||
$src = file_get_contents($file);
|
||||
if (!preg_match_all($re, $src, $m, PREG_SET_ORDER)) {
|
||||
continue;
|
||||
}
|
||||
$base = basename($file, '.tpl');
|
||||
foreach ($m as $match) {
|
||||
$string = $match[1] !== '' ? $match[1] : (isset($match[2]) ? $match[2] : '');
|
||||
$string = stripslashes($string);
|
||||
$mod = isset($match[3]) ? $match[3] : '';
|
||||
$md5 = md5(str_replace('\'', '\\\'', $string));
|
||||
if ($mod === '' && strpos($file, '/modules/') === false || $mod === '' && strpos($file, $theme) === 0 && strpos($file, $theme.'/modules/') === false) {
|
||||
$key = $base.'_'.$md5;
|
||||
if (empty($themeLang[$key])) {
|
||||
$out['theme'][$key] = $string;
|
||||
}
|
||||
} else {
|
||||
if ($mod === '') {
|
||||
preg_match('#/modules/([\w-]+)/#', $file, $mm);
|
||||
$mod = $mm[1];
|
||||
}
|
||||
$lang = $moduleLang($mod);
|
||||
$md5m = md5($string);
|
||||
$k1 = strtolower('<{'.$mod.'}hotel-reservation-theme>'.$base).'_'.$md5m;
|
||||
$k2 = strtolower('<{'.$mod.'}prestashop>'.$base).'_'.$md5m;
|
||||
if (empty($lang[$k1]) && empty($lang[$k2])) {
|
||||
$out['modules'][$mod][$k2] = $string;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$counts = array('theme' => count($out['theme']));
|
||||
foreach ($out['modules'] as $mod => $s) {
|
||||
$counts[$mod] = count($s);
|
||||
}
|
||||
fwrite(STDERR, json_encode($counts, JSON_PRETTY_PRINT).PHP_EOL);
|
||||
echo json_encode($out, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
12
docker/php.ini
Normal file
@@ -0,0 +1,12 @@
|
||||
memory_limit = 256M
|
||||
upload_max_filesize = 16M
|
||||
post_max_size = 20M
|
||||
max_execution_time = 500
|
||||
max_input_vars = 5000
|
||||
allow_url_fopen = On
|
||||
date.timezone = Europe/Berlin
|
||||
expose_php = Off
|
||||
|
||||
; Development: re-read changed PHP files immediately
|
||||
opcache.validate_timestamps = 1
|
||||
opcache.revalidate_freq = 0
|
||||
191
docker/seed-wasserrad-demo.php
Normal file
@@ -0,0 +1,191 @@
|
||||
<?php
|
||||
/**
|
||||
* Demo content "Zum alten Wasserrad – L'Antica Ruota" for a local QloApps install.
|
||||
* Replaces the "Hotel Prime" demo data: shop/hotel texts, room types and prices,
|
||||
* logo, header slides, room photos and interior gallery.
|
||||
*
|
||||
* Run (as www-data so generated files stay writable):
|
||||
* docker compose exec -u www-data app php docker/seed-wasserrad-demo.php
|
||||
*
|
||||
* Local demo only. Photos in docker/wasserrad-demo/ come from www.zum-alten-wasserrad.de.
|
||||
*/
|
||||
|
||||
if (PHP_SAPI !== 'cli') {
|
||||
exit("CLI only\n");
|
||||
}
|
||||
|
||||
define('_PS_ADMIN_DIR_', __DIR__);
|
||||
require __DIR__.'/../config/config.inc.php';
|
||||
require_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php';
|
||||
|
||||
$src = __DIR__.'/wasserrad-demo/';
|
||||
$langs = Language::getLanguages(false);
|
||||
$ml = function ($text) use ($langs) {
|
||||
$out = array();
|
||||
foreach ($langs as $l) {
|
||||
$out[(int)$l['id_lang']] = $text;
|
||||
}
|
||||
return $out;
|
||||
};
|
||||
$log = function ($msg) { echo ' - '.$msg.PHP_EOL; };
|
||||
|
||||
echo "Shop & header texts\n";
|
||||
Configuration::updateValue('PS_SHOP_NAME', 'Zum alten Wasserrad');
|
||||
Configuration::updateValue('PS_SHOP_EMAIL', 'info@hotel.test');
|
||||
Configuration::updateValue('WK_CUSTOMER_SUPPORT_EMAIL', 'info@hotel.test');
|
||||
Configuration::updateValue('PS_SHOP_ADDR1', 'Am Storchentor 8');
|
||||
Configuration::updateValue('PS_SHOP_CODE', '76855');
|
||||
Configuration::updateValue('PS_SHOP_CITY', 'Annweiler am Trifels');
|
||||
Configuration::updateValue('PS_SHOP_PHONE', '+49 6346 93344');
|
||||
Configuration::updateValue('WK_CUSTOMER_SUPPORT_PHONE_NUMBER', '+49 6346 93344');
|
||||
Configuration::updateValue('WK_TITLE_HEADER_BLOCK', "L'Antica Ruota");
|
||||
Configuration::updateValue('WK_CONTENT_HEADER_BLOCK', 'Familiengeführtes Hotel-Ristorante in der Altstadt von Annweiler, zu Füßen der Burg Trifels.');
|
||||
Configuration::updateValue('HOTEL_ROOM_DISPLAY_HEADING', $ml('Unsere Zimmer'));
|
||||
Configuration::updateValue('HOTEL_ROOM_DISPLAY_DESCRIPTION', $ml('Zehn liebevoll eingerichtete Zimmer mit Dusche/WC, Fön, Flatscreen-TV und WLAN – Frühstücksbuffet inklusive.'));
|
||||
Configuration::updateValue('HOTEL_INTERIOR_HEADING', $ml('Mediterranes Flair'));
|
||||
Configuration::updateValue('HOTEL_INTERIOR_DESCRIPTION', $ml('Warme Sandtöne, Holz und italienischer Marmor: die Toskana Deutschlands trifft auf italienische Gastfreundschaft.'));
|
||||
Configuration::updateValue('HOTEL_AMENITIES_HEADING', $ml('Rund um Ihren Aufenthalt'));
|
||||
Configuration::updateValue('HOTEL_AMENITIES_DESCRIPTION', $ml('Ristorante mit Gartenterrasse, Frühstücksbuffet und der Pfälzerwald direkt vor der Tür.'));
|
||||
$log('done');
|
||||
|
||||
echo "Logo\n";
|
||||
copy($src.'rad.png', _PS_IMG_DIR_.'wasserrad-logo.png');
|
||||
Configuration::updateValue('PS_LOGO', 'wasserrad-logo.png');
|
||||
list($w, $h) = getimagesize(_PS_IMG_DIR_.'wasserrad-logo.png');
|
||||
Configuration::updateValue('SHOP_LOGO_WIDTH', (int)$w);
|
||||
Configuration::updateValue('SHOP_LOGO_HEIGHT', (int)$h);
|
||||
$log("wasserrad-logo.png ({$w}x{$h})");
|
||||
|
||||
echo "Hotel\n";
|
||||
$hotel = new HotelBranchInformation(1);
|
||||
$hotel->email = 'info@hotel.test';
|
||||
$hotel->check_in = '15:00';
|
||||
$hotel->check_out = '11:00';
|
||||
$hotel->rating = 3;
|
||||
$hotel->hotel_name = $ml("L'Antica Ruota – Zum alten Wasserrad");
|
||||
$hotel->short_description = $ml("Familiengeführtes Hotel-Ristorante inmitten der Altstadt des Luftkurortes Annweiler, zu Füßen der Felsenburg Trifels.");
|
||||
$hotel->description = $ml(
|
||||
'<h4><strong>Benvenuti – Herzlich willkommen!</strong></h4>'
|
||||
.'<p>L’Antica Ruota ist ein familiengeführtes Hotel-Ristorante inmitten der Altstadt des Luftkurortes Annweiler, zu Füßen der Felsenburg Trifels. '
|
||||
.'Unser Haus eröffnete im März 1997 und bietet mit seinem mediterranen Flair eine ganz besondere Urlaubsatmosphäre, umgeben von den Wäldern des Biosphärenreservates Pfälzerwald.</p>'
|
||||
.'<p>Ob Aktiv-Urlaub, Kurztrip zum Auftanken, Familienfeier oder Ausflug zu zweit – bei uns lassen Sie den Alltag für eine Weile hinter sich.</p>'
|
||||
.'<p><em>Herzlichst, Ihre Familie Mirabile und Team</em></p>'
|
||||
);
|
||||
$hotel->policies = $ml(
|
||||
'<ul><li>Check-in ab 15:00 Uhr, Check-out bis 11:00 Uhr.</li>'
|
||||
.'<li>Alle Zimmerpreise inklusive Frühstücksbuffet.</li>'
|
||||
.'<li>Restaurant: Montag und Dienstag Ruhetag (08.11.2026 – 31.03.2027).</li></ul>'
|
||||
);
|
||||
$hotel->save();
|
||||
Db::getInstance()->update('address', array(
|
||||
'address1' => 'Am Storchentor 8',
|
||||
'postcode' => '76855',
|
||||
'city' => 'Annweiler am Trifels',
|
||||
'id_country' => (int)Country::getByIso('DE'),
|
||||
'id_state' => 0,
|
||||
'phone' => '+49 6346 93344',
|
||||
), 'id_hotel = 1');
|
||||
$log("L'Antica Ruota – Zum alten Wasserrad");
|
||||
|
||||
echo "Room types (gross incl. 7 % VAT, breakfast included)\n";
|
||||
$rooms = array(
|
||||
1 => array('Einzelzimmer', 115, 'Gemütliches Einzelzimmer mit Dusche/WC, Fön, Flatscreen-TV und WLAN. Inklusive Frühstücksbuffet.', array('zimmer62', 'bild3', 'terrasse', 'galerie1')),
|
||||
2 => array('Doppelzimmer', 145, 'Geräumiges Doppelzimmer mit Dusche/WC, Fön, Flatscreen-TV und WLAN. Inklusive Frühstücksbuffet.', array('zimmer71', 'gebaeude', 'galerie2', 'galerie3')),
|
||||
3 => array('Doppelzimmer 3. Etage', 125, 'Doppelzimmer unter dem Dach mit Blick über die Altstadt. Inklusive Frühstücksbuffet.', array('zimmer71', 'zimmer80', 'bild38', 'galerie4')),
|
||||
4 => array('Dreibettzimmer', 175, 'Ideal für Familien: Dreibettzimmer mit Dusche/WC, Flatscreen-TV und WLAN. Inklusive Frühstücksbuffet.', array('zimmer62', 'zimmer71', 'zimmer80', 'galerie6', 'galerie7')),
|
||||
);
|
||||
// Demo service products ("Zimmerwartungsgebühren" etc.) are auto-added to every night: switch them off.
|
||||
// Breakfast is already part of the room rate.
|
||||
$services = Db::getInstance()->executeS('SELECT id_product FROM '._DB_PREFIX_.'product WHERE booking_product = 0');
|
||||
foreach ($services as $s) {
|
||||
Db::getInstance()->update('product', array('active' => 0, 'auto_add_to_cart' => 0), 'id_product = '.(int)$s['id_product']);
|
||||
Db::getInstance()->update('product_shop', array('active' => 0, 'auto_add_to_cart' => 0), 'id_product = '.(int)$s['id_product']);
|
||||
}
|
||||
$log(count($services).' Demo-Zusatzleistungen deaktiviert');
|
||||
|
||||
$imageTypes = ImageType::getImagesTypes('products');
|
||||
foreach ($rooms as $idProduct => $r) {
|
||||
list($name, $gross, $desc, $photos) = $r;
|
||||
$p = new Product($idProduct);
|
||||
$p->name = $ml($name);
|
||||
$p->link_rewrite = $ml(Tools::str2url($name));
|
||||
$p->description_short = $ml('<p>'.$desc.'</p>');
|
||||
$p->id_tax_rules_group = 2; // DE Reduced Rate (7%)
|
||||
$p->price = round($gross / 1.07, 6);
|
||||
$p->save();
|
||||
|
||||
$images = Image::getImages((int)Configuration::get('PS_LANG_DEFAULT'), $idProduct);
|
||||
foreach ($images as $i => $row) {
|
||||
$file = $src.$photos[$i % count($photos)].'.jpg';
|
||||
$img = new Image((int)$row['id_image']);
|
||||
$base = $img->getPathForCreation();
|
||||
ImageManager::resize($file, $base.'.jpg');
|
||||
foreach ($imageTypes as $t) {
|
||||
ImageManager::resize($file, $base.'-'.stripslashes($t['name']).'.jpg', (int)$t['width'], (int)$t['height']);
|
||||
}
|
||||
}
|
||||
$log(sprintf('%s: %d € (%d Fotos)', $name, $gross, count($images)));
|
||||
}
|
||||
|
||||
echo "Header slides\n";
|
||||
$slides = array(
|
||||
array('drohne', "L'Antica Ruota", 'Hotel-Ristorante in der Altstadt von Annweiler am Trifels'),
|
||||
array('gebaeude', 'Benvenuti', 'Mediterranes Flair im Herzen der Pfalz'),
|
||||
array('terrasse', 'Gartenterrasse', 'Italienische Küche unter freiem Himmel'),
|
||||
);
|
||||
$dir = _PS_IMG_DIR_.'hotel_header_media/';
|
||||
$existing = Db::getInstance()->executeS('SELECT id_header_image FROM '._DB_PREFIX_.'htl_header_image ORDER BY position');
|
||||
foreach ($slides as $pos => $s) {
|
||||
$obj = isset($existing[$pos]) ? new HotelHeaderImage((int)$existing[$pos]['id_header_image']) : new HotelHeaderImage();
|
||||
$obj->name = 'wasserrad-'.$s[0].'.jpg';
|
||||
copy($src.$s[0].'.jpg', $dir.$obj->name);
|
||||
$obj->title = $ml($s[1]);
|
||||
$obj->description = $ml($s[2]);
|
||||
$obj->description_color = '#ffffff';
|
||||
$obj->description_font_size = 18;
|
||||
$obj->description_font_weight = '400';
|
||||
$obj->position = $pos;
|
||||
$obj->active = 1;
|
||||
$obj->save();
|
||||
$log($obj->name);
|
||||
}
|
||||
|
||||
echo "Interior gallery\n";
|
||||
$gallery = array('bild3', 'terrasse', 'galerie1', 'gebaeude', 'galerie2', 'bild38', 'galerie3', 'start1', 'galerie4', 'galerie5', 'galerie6', 'galerie7');
|
||||
$galleryDir = _PS_MODULE_DIR_.'wkabouthotelblock/views/img/hotel_interior/';
|
||||
foreach (Db::getInstance()->executeS('SELECT id_interior_image, name FROM '._DB_PREFIX_.'htl_interior_image ORDER BY position') as $i => $row) {
|
||||
$pick = $gallery[$i % count($gallery)];
|
||||
// copy as-is: ImageManager::resize would pad to 4:3 with white bars
|
||||
copy($src.$pick.'.jpg', $galleryDir.$row['name'].'.jpg');
|
||||
Db::getInstance()->update('htl_interior_image', array('display_name' => pSQL('L’Antica Ruota '.($i + 1))), 'id_interior_image = '.(int)$row['id_interior_image']);
|
||||
}
|
||||
$log(count($gallery).' Bilder');
|
||||
|
||||
echo "Unit labels and room features\n";
|
||||
// "Room"/"Rooms" etc. are DB labels inserted in English by the installer.
|
||||
$units = array(1 => array('Zimmer', 'Zimmer'), 2 => array('Bett', 'Betten'), 3 => array('Ferienwohnung', 'Ferienwohnungen'), 27 => array('Ferienhaus', 'Ferienhäuser'));
|
||||
foreach ($units as $id => $u) {
|
||||
Db::getInstance()->update('room_type_selling_object_lang', array('name' => pSQL($u[0]), 'plural_name' => pSQL($u[1])), 'id_room_type_selling_object = '.(int)$id);
|
||||
}
|
||||
// Demo features ("King", "600 sq ft", "Smart TV") are not this hotel's data: remove them from the rooms.
|
||||
Db::getInstance()->delete('feature_product', 'id_product IN ('.implode(',', array_map('intval', array_keys($rooms))).')');
|
||||
$log('Einheiten auf Deutsch, Demo-Ausstattungsmerkmale entfernt');
|
||||
|
||||
echo "Navigation\n";
|
||||
// Menu labels are stored in the DB in English. Single property: hide "Properties";
|
||||
// testimonials are hidden below, so hide that link too.
|
||||
$nav = array(1 => 'Startseite', 3 => 'Ambiente', 4 => 'Ausstattung', 5 => 'Zimmer', 12 => 'Kontakt');
|
||||
foreach ($nav as $id => $label) {
|
||||
Db::getInstance()->update('htl_custom_navigation_link_lang', array('name' => pSQL($label)), 'id_navigation_link = '.(int)$id);
|
||||
}
|
||||
Db::getInstance()->update('htl_custom_navigation_link', array('active' => 0), 'id_navigation_link IN (2, 6)');
|
||||
$log('Menü auf Deutsch, "Properties" und "Testimonials" ausgeblendet');
|
||||
|
||||
echo "Testimonials\n";
|
||||
// Demo reviews mention "Hotel Prime": hide them instead of showing invented guest quotes.
|
||||
Db::getInstance()->update('htl_testimonials_block_data', array('active' => 0));
|
||||
$log('Demo-Bewertungen ausgeblendet (echte Bewertungen im Backend unter Testimonials pflegen)');
|
||||
|
||||
Tools::clearSmartyCache();
|
||||
Tools::clearCache();
|
||||
echo "Fertig.\n";
|
||||
201
docker/translations-de-front.php
Normal file
@@ -0,0 +1,201 @@
|
||||
<?php
|
||||
/**
|
||||
* German translations for front-office strings that the official language pack leaves in English.
|
||||
* Applied by docker/apply-translations.php. English source string => German.
|
||||
*/
|
||||
return array(
|
||||
// shared
|
||||
'View Details' => 'Details ansehen',
|
||||
'Your' => 'Ihre',
|
||||
'bookings have' => 'Buchungen wurden',
|
||||
'booking has' => 'Buchung wurde',
|
||||
'been created successfully!' => 'erfolgreich angelegt!',
|
||||
"If the client chooses to pay by bank wire, the order's status will change to 'Waiting for Payment.'" => "Wählt der Gast Banküberweisung, wechselt der Status der Buchung auf „Zahlung ausstehend“.",
|
||||
"Please confirm your order by clicking 'I confirm my order'" => "Bitte bestätigen Sie Ihre Buchung mit „Ich bestätige meine Buchung“.",
|
||||
'I confirm my order' => 'Ich bestätige meine Buchung',
|
||||
"If the client chooses this payment method, the order status will change to 'Waiting for payment.'" => "Wählt der Gast diese Zahlungsart, wechselt der Status der Buchung auf „Zahlung ausstehend“.",
|
||||
|
||||
// blockcart
|
||||
'View my booking cart' => 'Meine Buchungsauswahl ansehen',
|
||||
'Cart' => 'Warenkorb',
|
||||
'Rooms' => 'Zimmer',
|
||||
'No products' => 'Keine Zimmer ausgewählt',
|
||||
'Delete' => 'Löschen',
|
||||
'To be determined' => 'Wird noch ermittelt',
|
||||
'Free shipping!' => 'Kostenloser Versand!',
|
||||
'Shipping' => 'Versand',
|
||||
'Wrapping' => 'Verpackung',
|
||||
'Room and Service Tax' => 'Steuern auf Zimmer und Leistungen',
|
||||
'Total Tourism Tax' => 'Kurtaxe gesamt',
|
||||
'Total Taxes' => 'Steuern gesamt',
|
||||
'Convenience Fees' => 'Servicegebühren',
|
||||
'Total' => 'Gesamt',
|
||||
'Prices are tax included' => 'Preise inkl. MwSt.',
|
||||
'Prices are tax excluded' => 'Preise zzgl. MwSt.',
|
||||
'Check out' => 'Zur Kasse',
|
||||
'Close window' => 'Fenster schließen',
|
||||
'Room successfully added to your cart' => 'Zimmer wurde zu Ihrer Buchung hinzugefügt',
|
||||
'Product successfully added to your cart' => 'Leistung wurde zu Ihrer Buchung hinzugefügt',
|
||||
'Time Duration' => 'Zeitraum',
|
||||
'Property Name' => 'Unterkunft',
|
||||
'Unit Price' => 'Einzelpreis',
|
||||
'Room occupancy' => 'Belegung',
|
||||
'Rooms quantity added' => 'Anzahl hinzugefügter Zimmer',
|
||||
'Quantity' => 'Menge',
|
||||
'Room type cost' => 'Zimmerpreis',
|
||||
'There are [1]%d[/1] item(s) in your cart.' => 'Ihre Buchung enthält [1]%d[/1] Positionen.',
|
||||
'1 item in your cart.' => 'Ihre Buchung enthält 1 Position.',
|
||||
'Total Rooms Cost in cart' => 'Zimmerpreis gesamt',
|
||||
'(tax excl.)' => '(zzgl. MwSt.)',
|
||||
'(tax incl.)' => '(inkl. MwSt.)',
|
||||
'Total Product Cost in cart' => 'Leistungen gesamt',
|
||||
'Total shipping' => 'Versand gesamt',
|
||||
'Continue browsing' => 'Weiter stöbern',
|
||||
'Proceed to checkout' => 'Zur Kasse',
|
||||
'Some Error occurred.Please try again.' => 'Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.',
|
||||
'Customization #' => 'Anpassung #',
|
||||
'remove this product from my cart' => 'diese Leistung aus meiner Buchung entfernen',
|
||||
'Free!' => 'Kostenlos!',
|
||||
'Adults' => 'Erwachsene',
|
||||
'Children' => 'Kinder',
|
||||
'Price' => 'Preis',
|
||||
'Total Qty.' => 'Menge gesamt',
|
||||
'Variant' => 'Variante',
|
||||
'Qty' => 'Menge',
|
||||
'Duration' => 'Dauer',
|
||||
'Capacity' => 'Kapazität',
|
||||
'Remove this room from my cart' => 'Dieses Zimmer aus meiner Buchung entfernen',
|
||||
'No internet. Please check your internet connection.' => 'Keine Internetverbindung. Bitte prüfen Sie Ihre Verbindung.',
|
||||
'Product detail' => 'Details',
|
||||
'Qty.' => 'Menge',
|
||||
'Remove' => 'Entfernen',
|
||||
'remove this room from my cart' => 'dieses Zimmer aus meiner Buchung entfernen',
|
||||
'Customization #%d:' => 'Anpassung #%d:',
|
||||
'Customers who bought this product also bought:' => 'Gäste buchten außerdem:',
|
||||
|
||||
// blockmyaccount / blockuserinfo
|
||||
'My account' => 'Mein Konto',
|
||||
'My orders' => 'Meine Buchungen',
|
||||
'My merchandise returns' => 'Meine Rücksendungen',
|
||||
'My credit slips' => 'Meine Gutschriften',
|
||||
'My personal info' => 'Meine persönlichen Daten',
|
||||
'My vouchers' => 'Meine Gutscheine',
|
||||
'Sign out' => 'Abmelden',
|
||||
'Accounts' => 'Konto',
|
||||
'Bookings' => 'Buchungen',
|
||||
'Logout' => 'Abmelden',
|
||||
'View my customer account' => 'Mein Kundenkonto ansehen',
|
||||
'Accounts Settings' => 'Kontoeinstellungen',
|
||||
'Log me out' => 'Abmelden',
|
||||
'Sign Out' => 'Abmelden',
|
||||
'Log in to your customer account' => 'Zu Ihrem Kundenkonto anmelden',
|
||||
'Sign in' => 'Anmelden',
|
||||
|
||||
// blocknewsletter
|
||||
'GET NOTIFICATIONS' => 'NEUIGKEITEN ERHALTEN',
|
||||
'Your email address' => 'Ihre E-Mail-Adresse',
|
||||
'Subscribe' => 'Anmelden',
|
||||
'No internet. Please try later.' => 'Keine Internetverbindung. Bitte versuchen Sie es später.',
|
||||
'You have unsubscribed successfully.' => 'Sie haben sich erfolgreich abgemeldet.',
|
||||
'You will be redirected to home page in ' => 'Sie werden weitergeleitet zur Startseite in ',
|
||||
'seconds.' => 'Sekunden.',
|
||||
'Home Page' => 'Startseite',
|
||||
'Thank you for subscribing to our newsletter.' => 'Vielen Dank für Ihre Anmeldung zu unserem Newsletter.',
|
||||
|
||||
// blocksocial / blocknavigationmenu / blockcurrencies
|
||||
'Follow us on' => 'Folgen Sie uns',
|
||||
'Explore' => 'Entdecken',
|
||||
'%s (%s)' => '%s (%s)',
|
||||
|
||||
// hotelreservationsystem
|
||||
'Cancelled' => 'Storniert',
|
||||
'Refunded' => 'Erstattet',
|
||||
'Denied' => 'Abgelehnt',
|
||||
'Refunded amount' => 'Erstatteter Betrag',
|
||||
'Payment mode' => 'Zahlungsart',
|
||||
'Transaction ID' => 'Transaktions-ID',
|
||||
'Voucher' => 'Gutschein',
|
||||
'Credit Slip' => 'Gutschrift',
|
||||
' All rights reserved. | Powered by' => ' Alle Rechte vorbehalten. | Betrieben mit',
|
||||
'All rights reserved' => 'Alle Rechte vorbehalten',
|
||||
'Call Us : ' => 'Telefon: ',
|
||||
'Email : ' => 'E-Mail: ',
|
||||
'Directions' => 'Anfahrt',
|
||||
|
||||
// qlohotelreview
|
||||
'Allowed formats are: .jpg, .jpeg, .png' => 'Erlaubte Formate: .jpg, .jpeg, .png',
|
||||
'Sum up your review' => 'Fassen Sie Ihre Bewertung zusammen',
|
||||
'Type here...' => 'Hier schreiben …',
|
||||
' people found it helpful.' => ' Personen fanden das hilfreich.',
|
||||
|
||||
// qlopaypalcommerce
|
||||
'Pay using Paypal payment options.' => 'Mit den Zahlungsarten von PayPal bezahlen.',
|
||||
'Pay using Paypal' => 'Mit PayPal bezahlen',
|
||||
'Please wait...' => 'Bitte warten …',
|
||||
'You have cancelled payment by PayPal. You can retry with PayPal or try a different payment method.' => 'Sie haben die Zahlung mit PayPal abgebrochen. Versuchen Sie es erneut oder wählen Sie eine andere Zahlungsart.',
|
||||
'Your order on %s is complete.' => 'Ihre Buchung bei %s ist abgeschlossen.',
|
||||
'Total Amount Paid' => 'Bezahlter Gesamtbetrag',
|
||||
'An email has been sent with this information.' => 'Sie erhalten diese Informationen auch per E-Mail.',
|
||||
'Your order will be sent as soon as possible.' => 'Ihre Buchung wird schnellstmöglich bearbeitet.',
|
||||
'If you have questions, comments or concerns, please contact our' => 'Bei Fragen, Anmerkungen oder Anliegen wenden Sie sich bitte an unser',
|
||||
'expert customer support team' => 'Service-Team',
|
||||
'We noticed a problem with your payment. Please contact our' => 'Bei Ihrer Zahlung ist ein Problem aufgetreten. Bitte wenden Sie sich an unser',
|
||||
'Your payment has been failed due to following reason:' => 'Ihre Zahlung ist aus folgendem Grund fehlgeschlagen:',
|
||||
'Error:' => 'Fehler:',
|
||||
'Error Description:' => 'Fehlerbeschreibung:',
|
||||
'Other payment methods' => 'Andere Zahlungsarten',
|
||||
|
||||
// home blocks
|
||||
'Interior' => 'Ambiente',
|
||||
'payment accepted' => 'Zahlungsarten',
|
||||
'Amenities' => 'Ausstattung',
|
||||
'Testimonials' => 'Gästestimmen',
|
||||
|
||||
// wkhotelfilterblock
|
||||
'Filters' => 'Filter',
|
||||
'Clear all' => 'Alle zurücksetzen',
|
||||
'Clear Filter' => 'Filter zurücksetzen',
|
||||
'Apply' => 'Anwenden',
|
||||
'Sort' => 'Sortieren',
|
||||
'Sort by' => 'Sortieren nach',
|
||||
'Filter' => 'Filter',
|
||||
'View More' => 'Mehr anzeigen',
|
||||
'Book Now' => 'Jetzt buchen',
|
||||
|
||||
// wkhotelroom
|
||||
'night' => 'Nacht',
|
||||
'Book now' => 'Jetzt buchen',
|
||||
'View' => 'Ansehen',
|
||||
'Our Rooms' => 'Unsere Zimmer',
|
||||
|
||||
// wkroomsearchblock
|
||||
'Searched results for' => 'Suchergebnisse für',
|
||||
'Days' => 'Tage',
|
||||
'Nights' => 'Nächte',
|
||||
'Night' => 'Nacht',
|
||||
'Search Rooms' => 'Zimmer suchen',
|
||||
'Make Booking' => 'Jetzt buchen',
|
||||
'Modify Search' => 'Suche ändern',
|
||||
'Property Location' => 'Ort',
|
||||
'Select Property' => 'Unterkunft wählen',
|
||||
'Check-in' => 'Anreise',
|
||||
'Check-out' => 'Abreise',
|
||||
'Check-in - Check-out' => 'Anreise – Abreise',
|
||||
'Adult' => 'Erwachsener',
|
||||
'Child' => 'Kind',
|
||||
'Room' => 'Zimmer',
|
||||
'1 Adult, 1 Room' => '1 Erwachsener, 1 Zimmer',
|
||||
'Below' => 'Unter',
|
||||
'years' => 'Jahre',
|
||||
'All Children' => 'Alle Kinder',
|
||||
'Select 1' => 'Alter wählen',
|
||||
'Under 1' => 'Unter 1',
|
||||
'Room - 1' => 'Zimmer – 1',
|
||||
'Add Room' => 'Zimmer hinzufügen',
|
||||
'Done' => 'Fertig',
|
||||
|
||||
// values in themes/hotel-reservation-theme/lang/de.php that the language pack left in English
|
||||
'__theme_value_fixes' => array(
|
||||
'Check-In - Check-Out' => 'Anreise – Abreise',
|
||||
),
|
||||
);
|
||||
BIN
docker/wasserrad-demo/bild3.jpg
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
docker/wasserrad-demo/bild38.jpg
Normal file
|
After Width: | Height: | Size: 380 KiB |
BIN
docker/wasserrad-demo/drohne.jpg
Normal file
|
After Width: | Height: | Size: 528 KiB |
BIN
docker/wasserrad-demo/galerie1.jpg
Normal file
|
After Width: | Height: | Size: 94 KiB |
BIN
docker/wasserrad-demo/galerie2.jpg
Normal file
|
After Width: | Height: | Size: 79 KiB |
BIN
docker/wasserrad-demo/galerie3.jpg
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
docker/wasserrad-demo/galerie4.jpg
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
docker/wasserrad-demo/galerie5.jpg
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
docker/wasserrad-demo/galerie6.jpg
Normal file
|
After Width: | Height: | Size: 95 KiB |
BIN
docker/wasserrad-demo/galerie7.jpg
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
docker/wasserrad-demo/gebaeude.jpg
Normal file
|
After Width: | Height: | Size: 165 KiB |
BIN
docker/wasserrad-demo/hintergrund.jpg
Normal file
|
After Width: | Height: | Size: 156 KiB |
BIN
docker/wasserrad-demo/maria-franco.jpg
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
docker/wasserrad-demo/rad.png
Normal file
|
After Width: | Height: | Size: 152 KiB |
BIN
docker/wasserrad-demo/start1.jpg
Normal file
|
After Width: | Height: | Size: 236 KiB |
BIN
docker/wasserrad-demo/sterne.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
docker/wasserrad-demo/terrasse.jpg
Normal file
|
After Width: | Height: | Size: 144 KiB |
BIN
docker/wasserrad-demo/zimmer62.jpg
Normal file
|
After Width: | Height: | Size: 310 KiB |
BIN
docker/wasserrad-demo/zimmer71.jpg
Normal file
|
After Width: | Height: | Size: 293 KiB |
BIN
docker/wasserrad-demo/zimmer80.jpg
Normal file
|
After Width: | Height: | Size: 232 KiB |
@@ -634,6 +634,11 @@ class InstallModelInstall extends InstallAbstractModel
|
||||
*/
|
||||
public function setNotification($installData)
|
||||
{
|
||||
// Do not send admin name, email, domain and country to api.qloapps.com
|
||||
if (defined('_QLO_DISABLE_PHONE_HOME_') && _QLO_DISABLE_PHONE_HOME_) {
|
||||
return true;
|
||||
}
|
||||
|
||||
Tools::addonsRequest('installation', array(
|
||||
'install_data' => $installData,
|
||||
'version' => _QLO_INSTALL_VERSION_,
|
||||
|
||||
@@ -59,3 +59,10 @@ $_MODULE['<{bankwire}prestashop>mail_template_text_6702a6e3bc2dce95c3e3b61fe578f
|
||||
$_MODULE['<{bankwire}prestashop>mail_template_text_21e4851289ecc91b65023c2563344aa7'] = 'Kontoinhaber:';
|
||||
$_MODULE['<{bankwire}prestashop>mail_template_text_20a650d87733bd5895c979de29864a73'] = 'Kontodetails:';
|
||||
$_MODULE['<{bankwire}prestashop>mail_template_text_312d898d92d8ba90499ef0dac27270be'] = 'Bankadresse:';
|
||||
|
||||
// Added by docker/apply-translations.php
|
||||
$_MODULE['<{bankwire}prestashop>payment_return_4ff70f7b2e5a74415de360150a6e59d3'] = 'Ihre';
|
||||
$_MODULE['<{bankwire}prestashop>payment_return_b020dd24318376f939f91f8fcb7266f6'] = 'Buchungen wurden';
|
||||
$_MODULE['<{bankwire}prestashop>payment_return_642b829e2ed9b9fece9b1d810bbc0f3b'] = 'Buchung wurde';
|
||||
$_MODULE['<{bankwire}prestashop>payment_return_659623af9479cd8813485e4e4a5a96c3'] = 'erfolgreich angelegt!';
|
||||
$_MODULE['<{bankwire}prestashop>infos_4b316ae03d310dab57ae13629736443b'] = 'Wählt der Gast Banküberweisung, wechselt der Status der Buchung auf „Zahlung ausstehend“.';
|
||||
|
||||
@@ -35,5 +35,7 @@ $_MODULE['<{blocksocial}prestashop>blocksocial_55f015a0c5605702f913536afe70cfb0'
|
||||
$_MODULE['<{blocksocial}prestashop>blocksocial_970cfba66b8380fb97b742e4571356c6'] = 'YouTube';
|
||||
$_MODULE['<{blocksocial}prestashop>blocksocial_dda8dc38128a8c843ba9f496d6ee7186'] = 'Google Plus';
|
||||
|
||||
// Added by docker/apply-translations.php
|
||||
$_MODULE['<{blocksocial}prestashop>blocksocial_738bc5faa88e6b0fa0e7e3385d7e4ee3'] = 'Folgen Sie uns';
|
||||
|
||||
return $_MODULE;
|
||||
|
||||
@@ -23,5 +23,18 @@ $_MODULE['<{blockuserinfo}prestashop>nav_c87aacf5673fada1108c9f809d354311'] = 'A
|
||||
$_MODULE['<{blockuserinfo}prestashop>nav_d4151a9a3959bdd43690735737034f27'] = 'Anmelden zu Ihrem Kundenbereich';
|
||||
$_MODULE['<{blockuserinfo}prestashop>nav_b6d4223e60986fa4c9af77ee5f7149c5'] = 'Anmelden';
|
||||
|
||||
// Added by docker/apply-translations.php
|
||||
$_MODULE['<{blockuserinfo}prestashop>nav_9b945efebb006547a94415eadaa12921'] = 'Konto';
|
||||
$_MODULE['<{blockuserinfo}prestashop>nav_a35529bfcfdfab2dc01946af64cd2ce4'] = 'Buchungen';
|
||||
$_MODULE['<{blockuserinfo}prestashop>nav_0323de4f66a1700e2173e9bcdce02715'] = 'Abmelden';
|
||||
|
||||
// Added by docker/apply-translations.php
|
||||
$_MODULE['<{blockuserinfo}prestashop>nav-xs_a35529bfcfdfab2dc01946af64cd2ce4'] = 'Buchungen';
|
||||
$_MODULE['<{blockuserinfo}prestashop>nav-xs_2cbfb6731610056e1d0aaacde07096c1'] = 'Mein Kundenkonto ansehen';
|
||||
$_MODULE['<{blockuserinfo}prestashop>nav-xs_802ae618edcbffbf50f9a0a69d358452'] = 'Kontoeinstellungen';
|
||||
$_MODULE['<{blockuserinfo}prestashop>nav-xs_4b877ba8588b19f1b278510bf2b57ebb'] = 'Abmelden';
|
||||
$_MODULE['<{blockuserinfo}prestashop>nav-xs_375e08625a2c38089b9e3a60f0e68325'] = 'Abmelden';
|
||||
$_MODULE['<{blockuserinfo}prestashop>nav-xs_d4151a9a3959bdd43690735737034f27'] = 'Zu Ihrem Kundenkonto anmelden';
|
||||
$_MODULE['<{blockuserinfo}prestashop>nav-xs_b6d4223e60986fa4c9af77ee5f7149c5'] = 'Anmelden';
|
||||
|
||||
return $_MODULE;
|
||||
|
||||
@@ -53,3 +53,12 @@ $_MODULE['<{cheque}prestashop>mail_template_text_b6592595266708e46d1d420ab715321
|
||||
$_MODULE['<{cheque}prestashop>mail_template_text_6702a6e3bc2dce95c3e3b61fe578f29c'] = 'Menge:';
|
||||
$_MODULE['<{cheque}prestashop>mail_template_text_1c3bd8f6bd066270354607c08f930baf'] = 'Zahlbar im Auftrag von:';
|
||||
$_MODULE['<{cheque}prestashop>mail_template_text_8f1fb2295c4289bae9fc26549b4b45f2'] = 'Bitte senden Sie Ihren Scheck an:';
|
||||
|
||||
// Added by docker/apply-translations.php
|
||||
$_MODULE['<{cheque}prestashop>payment_execution_648020a0c34e9e10c63d362fe3e69f34'] = 'Bitte bestätigen Sie Ihre Buchung mit „Ich bestätige meine Buchung“.';
|
||||
$_MODULE['<{cheque}prestashop>payment_execution_46b9e3665f187c739c55983f757ccda0'] = 'Ich bestätige meine Buchung';
|
||||
$_MODULE['<{cheque}prestashop>infos_f4d0e8e3f5ba72e95d69115dd9c899cc'] = 'Wählt der Gast diese Zahlungsart, wechselt der Status der Buchung auf „Zahlung ausstehend“.';
|
||||
$_MODULE['<{cheque}prestashop>payment_return_4ff70f7b2e5a74415de360150a6e59d3'] = 'Ihre';
|
||||
$_MODULE['<{cheque}prestashop>payment_return_b020dd24318376f939f91f8fcb7266f6'] = 'Buchungen wurden';
|
||||
$_MODULE['<{cheque}prestashop>payment_return_642b829e2ed9b9fece9b1d810bbc0f3b'] = 'Buchung wurde';
|
||||
$_MODULE['<{cheque}prestashop>payment_return_659623af9479cd8813485e4e4a5a96c3'] = 'erfolgreich angelegt!';
|
||||
|
||||
@@ -145,3 +145,9 @@ $_MODULE['<{qlohotelreview}prestashop>review_a0f942858344588234dda2fae9516ce9']
|
||||
$_MODULE['<{qlohotelreview}prestashop>review_4f887556bd5dd9354f971969048e9364'] = '%1$d Personen fanden es hilfreich.';
|
||||
$_MODULE['<{qlohotelreview}prestashop>review_28b3b1e564a00f572c5d4e21da986d49'] = 'Missbrauch melden';
|
||||
$_MODULE['<{qlohotelreview}prestashop>review_5337e185f4fe875860eb0258b7cf9b6f'] = 'hat geantwortet';
|
||||
|
||||
// Added by docker/apply-translations.php
|
||||
$_MODULE['<{qlohotelreview}prestashop>add-review-popup_c61874c892c6285f24df8c9f890e4689'] = 'Erlaubte Formate: .jpg, .jpeg, .png';
|
||||
$_MODULE['<{qlohotelreview}prestashop>add-review-popup_52678fb44b16d274aa055532744e6bdb'] = 'Fassen Sie Ihre Bewertung zusammen';
|
||||
$_MODULE['<{qlohotelreview}prestashop>add-review-popup_ab881e45810d878ec93fefe487708820'] = 'Hier schreiben …';
|
||||
$_MODULE['<{qlohotelreview}prestashop>review_0d2c413dc146dabfab6c7a796330ed50'] = ' Personen fanden das hilfreich.';
|
||||
|
||||
339
themes/hotel-reservation-theme/css/wasserrad.css
Normal file
@@ -0,0 +1,339 @@
|
||||
/*
|
||||
* "Zum alten Wasserrad – L'Antica Ruota" skin for hotel-reservation-theme.
|
||||
* Loaded last in header.tpl so it wins over theme and module styles.
|
||||
* Palette from www.zum-alten-wasserrad.de: wine red, terracotta orange, warm sand.
|
||||
* Fonts are self-hosted (no Google Fonts request, GDPR).
|
||||
*/
|
||||
|
||||
/* ---------- Fonts ---------- */
|
||||
@font-face { font-family: 'Lora'; font-style: normal; font-weight: 400; font-display: swap;
|
||||
src: url('../fonts/wasserrad/lora-latin-400-normal.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
|
||||
@font-face { font-family: 'Lora'; font-style: normal; font-weight: 400; font-display: swap;
|
||||
src: url('../fonts/wasserrad/lora-latin-ext-400-normal.woff2') format('woff2'); unicode-range: U+0100-02AF, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
|
||||
@font-face { font-family: 'Lora'; font-style: italic; font-weight: 400; font-display: swap;
|
||||
src: url('../fonts/wasserrad/lora-latin-400-italic.woff2') format('woff2'); unicode-range: U+0000-00FF, U+2000-206F, U+20AC; }
|
||||
@font-face { font-family: 'Lora'; font-style: italic; font-weight: 400; font-display: swap;
|
||||
src: url('../fonts/wasserrad/lora-latin-ext-400-italic.woff2') format('woff2'); unicode-range: U+0100-02AF, U+1E00-1EFF; }
|
||||
@font-face { font-family: 'Lora'; font-style: normal; font-weight: 600; font-display: swap;
|
||||
src: url('../fonts/wasserrad/lora-latin-600-normal.woff2') format('woff2'); unicode-range: U+0000-00FF, U+2000-206F, U+20AC; }
|
||||
@font-face { font-family: 'Lora'; font-style: normal; font-weight: 600; font-display: swap;
|
||||
src: url('../fonts/wasserrad/lora-latin-ext-600-normal.woff2') format('woff2'); unicode-range: U+0100-02AF, U+1E00-1EFF; }
|
||||
@font-face { font-family: 'Lora'; font-style: normal; font-weight: 700; font-display: swap;
|
||||
src: url('../fonts/wasserrad/lora-latin-700-normal.woff2') format('woff2'); unicode-range: U+0000-00FF, U+2000-206F, U+20AC; }
|
||||
@font-face { font-family: 'Lora'; font-style: normal; font-weight: 700; font-display: swap;
|
||||
src: url('../fonts/wasserrad/lora-latin-ext-700-normal.woff2') format('woff2'); unicode-range: U+0100-02AF, U+1E00-1EFF; }
|
||||
@font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 400; font-display: swap;
|
||||
src: url('../fonts/wasserrad/open-sans-latin-400-normal.woff2') format('woff2'); unicode-range: U+0000-00FF, U+2000-206F, U+20AC; }
|
||||
@font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 400; font-display: swap;
|
||||
src: url('../fonts/wasserrad/open-sans-latin-ext-400-normal.woff2') format('woff2'); unicode-range: U+0100-02AF, U+1E00-1EFF; }
|
||||
@font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 600; font-display: swap;
|
||||
src: url('../fonts/wasserrad/open-sans-latin-600-normal.woff2') format('woff2'); unicode-range: U+0000-00FF, U+2000-206F, U+20AC; }
|
||||
@font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 600; font-display: swap;
|
||||
src: url('../fonts/wasserrad/open-sans-latin-ext-600-normal.woff2') format('woff2'); unicode-range: U+0100-02AF, U+1E00-1EFF; }
|
||||
@font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 700; font-display: swap;
|
||||
src: url('../fonts/wasserrad/open-sans-latin-700-normal.woff2') format('woff2'); unicode-range: U+0000-00FF, U+2000-206F, U+20AC; }
|
||||
@font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 700; font-display: swap;
|
||||
src: url('../fonts/wasserrad/open-sans-latin-ext-700-normal.woff2') format('woff2'); unicode-range: U+0100-02AF, U+1E00-1EFF; }
|
||||
|
||||
/* ---------- Tokens ---------- */
|
||||
:root {
|
||||
--wr-wine: #780808;
|
||||
--wr-wine-dark: #4d0404;
|
||||
--wr-wine-deep: #2e0202;
|
||||
--wr-terra: #d3540f;
|
||||
--wr-terra-dark: #b0450b;
|
||||
--wr-sand: #f1e2a9;
|
||||
--wr-sand-soft: #f7efd2;
|
||||
--wr-paper: #fcf8ee;
|
||||
--wr-ink: #2b1d14;
|
||||
--wr-ink-soft: #5c4a3c;
|
||||
--wr-line: #e3d3a4;
|
||||
--wr-serif: 'Lora', Georgia, 'Times New Roman', serif;
|
||||
--wr-sans: 'Open Sans', 'Segoe UI', Arial, sans-serif;
|
||||
--wr-radius: 4px;
|
||||
--wr-shadow: 0 12px 30px -12px rgba(46, 2, 2, .35);
|
||||
}
|
||||
|
||||
/* ---------- Base ---------- */
|
||||
body,
|
||||
body .btn, body .button, body button, body input, body select, body textarea,
|
||||
body .form-control, body p, body a, body li, body td, body th, body span, body label, body div {
|
||||
font-family: var(--wr-sans);
|
||||
}
|
||||
body { background: var(--wr-paper); color: var(--wr-ink); }
|
||||
body a { color: var(--wr-wine); }
|
||||
body a:hover, body a:focus { color: var(--wr-terra); }
|
||||
|
||||
body h1, body h2, body h3, body h4, body h5,
|
||||
body .page-heading, body .page-subheading, body .title_block, body .product-name,
|
||||
body .home_block_heading, body .header-hotel-name {
|
||||
font-family: var(--wr-serif) !important;
|
||||
color: var(--wr-wine);
|
||||
letter-spacing: 0;
|
||||
}
|
||||
|
||||
::selection { background: var(--wr-sand); color: var(--wr-wine-deep); }
|
||||
|
||||
/* ---------- Buttons (replace QloApps blue) ---------- */
|
||||
body .btn-default.button, body .button.button-medium, body .button.button-small,
|
||||
body .button.exclusive, body .button.exclusive-medium, body .exclusive,
|
||||
body button.button, body .btn.button, body .btn-primary,
|
||||
body #search_room_submit, body .header-rmsearch-container .btn,
|
||||
body .nav_toggle, body .ajax_add_to_cart_button, body .book_now_submit,
|
||||
body .htlRoomTypeBookNow, body .btn.btn-book, body #booking_action_block .btn {
|
||||
background: var(--wr-terra) !important;
|
||||
background-image: none !important;
|
||||
border: 1px solid var(--wr-terra-dark) !important;
|
||||
color: #fff !important;
|
||||
border-radius: var(--wr-radius) !important;
|
||||
text-shadow: none !important;
|
||||
font-family: var(--wr-sans) !important;
|
||||
font-weight: 600 !important;
|
||||
letter-spacing: .04em;
|
||||
text-transform: uppercase;
|
||||
transition: background-color .2s ease, transform .2s ease, box-shadow .2s ease;
|
||||
}
|
||||
body .btn-default.button:hover, body .button.button-medium:hover, body .button.button-small:hover,
|
||||
body .button.exclusive:hover, body .exclusive:hover, body button.button:hover,
|
||||
body .btn.button:hover, body .btn-primary:hover, body #search_room_submit:hover,
|
||||
body .ajax_add_to_cart_button:hover, body .book_now_submit:hover,
|
||||
body .htlRoomTypeBookNow:hover, body .btn.btn-book:hover, body #booking_action_block .btn:hover {
|
||||
background: var(--wr-wine) !important;
|
||||
border-color: var(--wr-wine-dark) !important;
|
||||
box-shadow: var(--wr-shadow);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
body .button.exclusive-medium.continue, body span.continue.btn {
|
||||
background: transparent !important;
|
||||
color: var(--wr-wine) !important;
|
||||
border: 1px solid var(--wr-wine) !important;
|
||||
}
|
||||
body .btn:focus-visible, body a:focus-visible, body button:focus-visible, body input:focus-visible {
|
||||
outline: 2px solid var(--wr-terra);
|
||||
outline-offset: 2px;
|
||||
}
|
||||
|
||||
/* ---------- Header / hero ---------- */
|
||||
#header .header-top,
|
||||
#header .banner + .header-top,
|
||||
#header > .nav,
|
||||
#header nav {
|
||||
font-family: var(--wr-sans);
|
||||
}
|
||||
/* contact strip above the logo */
|
||||
#header #nav-main {
|
||||
background: var(--wr-wine-deep) !important;
|
||||
border-bottom: 1px solid rgba(241, 226, 169, .18);
|
||||
}
|
||||
#header #nav-main .contact-item,
|
||||
#header #nav-main .contact-item a,
|
||||
#header #nav-main .contact-item i { color: var(--wr-sand-soft) !important; font-size: 13px; letter-spacing: .03em; }
|
||||
#header #nav-main .contact-item a:hover { color: #fff !important; }
|
||||
|
||||
#header .header-top {
|
||||
background: transparent !important;
|
||||
border-bottom: 0;
|
||||
}
|
||||
/* soft wine veil: dark at the top for the menu, vignette in the middle for the title */
|
||||
#header .header-media-layer {
|
||||
background:
|
||||
radial-gradient(ellipse 60% 38% at 50% 52%, rgba(46, 2, 2, .42) 0%, rgba(46, 2, 2, 0) 100%),
|
||||
linear-gradient(180deg, rgba(46, 2, 2, .7) 0%, rgba(46, 2, 2, .18) 22%, rgba(46, 2, 2, .08) 55%, rgba(46, 2, 2, .6) 100%) !important;
|
||||
}
|
||||
#header_logo img.logo {
|
||||
max-height: 96px;
|
||||
width: auto;
|
||||
filter: drop-shadow(0 4px 10px rgba(0, 0, 0, .45));
|
||||
}
|
||||
#header .header-hotel-name {
|
||||
color: #fff !important;
|
||||
font-size: clamp(34px, 5.2vw, 64px) !important;
|
||||
font-weight: 600 !important;
|
||||
line-height: 1.1;
|
||||
text-shadow: 0 3px 18px rgba(0, 0, 0, .55);
|
||||
}
|
||||
#header .header-hotel-name::after {
|
||||
content: "Hotel · Ristorante · Annweiler am Trifels";
|
||||
display: block;
|
||||
margin-top: 14px;
|
||||
font-family: var(--wr-sans);
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
letter-spacing: .32em;
|
||||
text-transform: uppercase;
|
||||
color: var(--wr-sand);
|
||||
text-shadow: 0 2px 8px rgba(0, 0, 0, .6);
|
||||
}
|
||||
#header .header-hotel-desc {
|
||||
font-family: var(--wr-serif) !important;
|
||||
font-style: italic;
|
||||
font-size: 19px !important;
|
||||
color: #fff !important;
|
||||
text-shadow: 0 2px 10px rgba(0, 0, 0, .6);
|
||||
max-width: 720px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#header hr, #header .heasder-desc-hr-first, #header .heasder-desc-hr-second {
|
||||
border-color: rgba(241, 226, 169, .7) !important;
|
||||
}
|
||||
|
||||
/* Booking bar in the hero */
|
||||
#header .header-rmsearch-container .header-rmsearch-wrapper,
|
||||
#header .header-rmsearch-primary {
|
||||
background: rgba(252, 248, 238, .97);
|
||||
border-top: 4px solid var(--wr-terra);
|
||||
border-radius: 0 0 var(--wr-radius) var(--wr-radius);
|
||||
box-shadow: 0 24px 50px -20px rgba(0, 0, 0, .6);
|
||||
}
|
||||
#header .header-rmsearch-container .form-control,
|
||||
#header .header-rmsearch-container .header-rmsearch-input,
|
||||
#header #guest_occupancy {
|
||||
border: 1px solid var(--wr-line) !important;
|
||||
border-radius: var(--wr-radius) !important;
|
||||
background: #fff !important;
|
||||
color: var(--wr-ink) !important;
|
||||
}
|
||||
#header .header-rmsearch-container .form-control:focus { border-color: var(--wr-terra) !important; }
|
||||
|
||||
/* Top navigation */
|
||||
#menu_cont .navigation-link, .wk-nav-style a, #header .nav a {
|
||||
font-family: var(--wr-serif) !important;
|
||||
color: var(--wr-ink) !important;
|
||||
}
|
||||
#menu_cont .navigation-link:hover, .wk-nav-style a:hover { color: var(--wr-terra) !important; }
|
||||
#header .nav_toggle, #header .nav_toggle:hover { background: transparent !important; border: 0 !important; box-shadow: none; }
|
||||
#header .nav_toggle .icon-bar { background: #fff; }
|
||||
|
||||
body .badge_style, body .ajax_cart_quantity, body .badge.ajax_cart_no_product,
|
||||
body .close_navbar { background-color: var(--wr-terra) !important; color: #fff !important; }
|
||||
|
||||
/* ---------- Home sections ---------- */
|
||||
#columns.container { padding-top: 10px; }
|
||||
.home_block_container { padding-top: 70px; padding-bottom: 70px; }
|
||||
body .home_block_heading {
|
||||
font-size: clamp(30px, 3.4vw, 42px) !important;
|
||||
font-weight: 600 !important;
|
||||
position: relative;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
/* water-wheel ornament under every section heading */
|
||||
body .home_block_heading::after {
|
||||
content: "";
|
||||
display: block;
|
||||
width: 64px;
|
||||
height: 46px;
|
||||
margin: 14px auto 0;
|
||||
background: url('../img/wasserrad/rad.png') center / contain no-repeat;
|
||||
opacity: .9;
|
||||
}
|
||||
body .home_block_description {
|
||||
font-family: var(--wr-serif) !important;
|
||||
font-style: italic;
|
||||
color: var(--wr-ink-soft) !important;
|
||||
font-size: 18px !important;
|
||||
}
|
||||
body .home_block_desc_line, body hr.separator { border-color: var(--wr-terra) !important; background: var(--wr-terra) !important; }
|
||||
|
||||
/* Rooms */
|
||||
#hotelRoomsBlock .home_block_content > div > div,
|
||||
#hotelRoomsBlock .room_block, #hotelRoomsBlock .roomblock {
|
||||
background: #fff;
|
||||
border: 1px solid var(--wr-line);
|
||||
border-radius: var(--wr-radius);
|
||||
overflow: hidden;
|
||||
transition: box-shadow .25s ease, transform .25s ease;
|
||||
}
|
||||
#hotelRoomsBlock .home_block_content > div > div:hover { box-shadow: var(--wr-shadow); transform: translateY(-3px); }
|
||||
#hotelRoomsBlock img { transition: transform .6s ease; }
|
||||
#hotelRoomsBlock .home_block_content > div > div:hover img { transform: scale(1.04); }
|
||||
#hotelRoomsBlock .rm_name, #hotelRoomsBlock .room_name, #hotelRoomsBlock h4 {
|
||||
font-family: var(--wr-serif) !important; color: var(--wr-wine) !important; font-weight: 600;
|
||||
}
|
||||
#hotelRoomsBlock .rm_amt, #hotelRoomsBlock .price, #hotelRoomsBlock [class*=price] {
|
||||
color: var(--wr-terra) !important; font-family: var(--wr-serif) !important; font-weight: 700;
|
||||
}
|
||||
|
||||
/* Interior / gallery on sand */
|
||||
#hotelInteriorBlock {
|
||||
background: var(--wr-sand-soft);
|
||||
box-shadow: 0 0 0 100vmax var(--wr-sand-soft);
|
||||
clip-path: inset(0 -100vmax);
|
||||
}
|
||||
#hotelInteriorBlock img {
|
||||
border-radius: var(--wr-radius);
|
||||
width: 100%;
|
||||
aspect-ratio: 4 / 3;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
/* Amenities */
|
||||
#hotelAmenitiesBlock .home_block_heading, #hotelAmenitiesBlock h4 { color: var(--wr-wine); }
|
||||
#hotelAmenitiesBlock img { border-radius: var(--wr-radius); }
|
||||
#hotelAmenitiesBlock [class*=amenity] h4, #hotelAmenitiesBlock .amenity_heading {
|
||||
font-family: var(--wr-serif) !important;
|
||||
}
|
||||
|
||||
/* Testimonials on wine red */
|
||||
#hotelTestimonialBlock {
|
||||
background: var(--wr-wine);
|
||||
box-shadow: 0 0 0 100vmax var(--wr-wine);
|
||||
clip-path: inset(0 -100vmax);
|
||||
color: var(--wr-sand-soft);
|
||||
}
|
||||
#hotelTestimonialBlock .home_block_heading,
|
||||
#hotelTestimonialBlock .home_block_description,
|
||||
#hotelTestimonialBlock p, #hotelTestimonialBlock h4, #hotelTestimonialBlock span {
|
||||
color: var(--wr-sand-soft) !important;
|
||||
}
|
||||
#hotelTestimonialBlock .home_block_heading::after { filter: brightness(1.15); }
|
||||
#hotelTestimonialBlock .owl-dots .owl-dot span { background: rgba(241, 226, 169, .35) !important; }
|
||||
#hotelTestimonialBlock .owl-dots .owl-dot.active span { background: var(--wr-terra) !important; }
|
||||
|
||||
/* ---------- Footer ---------- */
|
||||
body .footer-container {
|
||||
background: var(--wr-wine-deep) !important;
|
||||
border-top: 6px solid var(--wr-terra);
|
||||
color: rgba(247, 239, 210, .75);
|
||||
}
|
||||
body .footer-container #footer a,
|
||||
body .footer-container #footer p,
|
||||
body .footer-container #footer li { color: rgba(247, 239, 210, .8) !important; }
|
||||
body .footer-container #footer a:hover { color: var(--wr-sand) !important; }
|
||||
body .footer-container #footer h4,
|
||||
body .footer-container #footer .h4,
|
||||
body .footer-container #footer .footer-explore-heading {
|
||||
font-family: var(--wr-serif) !important;
|
||||
color: var(--wr-sand) !important;
|
||||
text-transform: none;
|
||||
font-size: 20px;
|
||||
}
|
||||
body .footer-container #footer #social_block a,
|
||||
body .footer-container #footer .social_block a { background-color: var(--wr-wine) !important; color: var(--wr-sand) !important; }
|
||||
body .footer-container #footer .form-control { background: rgba(255, 255, 255, .08); border-color: rgba(241, 226, 169, .3); color: #fff; }
|
||||
|
||||
/* ---------- Inner pages ---------- */
|
||||
body:not(#index) #header {
|
||||
background: linear-gradient(180deg, var(--wr-wine-deep) 0%, var(--wr-wine) 100%) !important;
|
||||
border-bottom: 4px solid var(--wr-terra);
|
||||
}
|
||||
body:not(#index) .header-rmsearch-details-wrapper { background: var(--wr-sand-soft) !important; border-bottom: 1px solid var(--wr-line); }
|
||||
body .product_reviews_link, body a[href*="review"], body .open-review-form { color: var(--wr-wine) !important; }
|
||||
body .page-heading {
|
||||
border-bottom: 2px solid var(--wr-sand);
|
||||
color: var(--wr-wine) !important;
|
||||
}
|
||||
body .breadcrumb { background: var(--wr-sand-soft); border: 1px solid var(--wr-line); }
|
||||
body .breadcrumb a { color: var(--wr-wine); }
|
||||
body .price, body .our_price_display, body .room_type_price { color: var(--wr-terra) !important; }
|
||||
body .alert-info { background: var(--wr-sand-soft); border-color: var(--wr-line); color: var(--wr-ink); }
|
||||
body .nav-tabs > li.active > a, body .nav-tabs > li.active > a:hover { border-top: 3px solid var(--wr-terra); color: var(--wr-wine); }
|
||||
body .daterangepicker td.active, body .date-picker-wrapper .day.checked,
|
||||
body .date-picker-wrapper .day.real-today, body .ui-datepicker .ui-state-active,
|
||||
body .date-picker-wrapper .first-date-selected, body .date-picker-wrapper .last-date-selected {
|
||||
background-color: var(--wr-terra) !important; color: #fff !important;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
* { transition: none !important; }
|
||||
}
|
||||
35
themes/hotel-reservation-theme/fonts/wasserrad/index.php
Normal file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
/*
|
||||
* 2007-2017 PrestaShop
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Academic Free License (AFL 3.0)
|
||||
* that is bundled with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://opensource.org/licenses/afl-3.0.php
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to http://www.prestashop.com for more information.
|
||||
*
|
||||
* @author PrestaShop SA <contact@prestashop.com>
|
||||
* @copyright 2007-2017 PrestaShop SA
|
||||
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
||||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*/
|
||||
|
||||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
|
||||
|
||||
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||
header("Cache-Control: post-check=0, pre-check=0", false);
|
||||
header("Pragma: no-cache");
|
||||
|
||||
header("Location: ../");
|
||||
exit;
|
||||
@@ -75,7 +75,8 @@
|
||||
<!-- by webkul -->
|
||||
<!-- <link href='https://fonts.googleapis.com/css?family=Parisienne' rel='stylesheet' type='text/css'> -->
|
||||
<!-- <link href='https://fonts.googleapis.com/css?family=PT+Serif:400,400italic,700,700italic' rel='stylesheet' type='text/css'> -->
|
||||
<link href='//fonts.googleapis.com/css?family=Oxygen:400,300,700' rel='stylesheet' type='text/css'>
|
||||
{* Google Fonts removed (GDPR); Wasserrad skin self-hosts Lora and Open Sans and is loaded last *}
|
||||
<link rel="stylesheet" href="{$css_dir|escape:'html':'UTF-8'}wasserrad.css?v=6" type="text/css" media="all" />
|
||||
</head>
|
||||
<!-- Built with QloApps -->
|
||||
<body{if isset($page_name)} id="{$page_name|escape:'html':'UTF-8'}"{/if} class="qloapps {if isset($page_name)}{$page_name|escape:'html':'UTF-8'}{/if}{if isset($body_classes) && $body_classes|@count} {' '|implode:$body_classes}{/if}{if $hide_left_column} hide-left-column{else} show-left-column{/if}{if $hide_right_column} hide-right-column{else} hide-right-column{/if}{if isset($content_only) && $content_only} content_only{/if} lang_{$lang_iso}" style="{if $page_name == 'index'}height: 100%;{/if}">
|
||||
|
||||
35
themes/hotel-reservation-theme/img/wasserrad/index.php
Normal file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
/*
|
||||
* 2007-2017 PrestaShop
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Academic Free License (AFL 3.0)
|
||||
* that is bundled with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://opensource.org/licenses/afl-3.0.php
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to http://www.prestashop.com for more information.
|
||||
*
|
||||
* @author PrestaShop SA <contact@prestashop.com>
|
||||
* @copyright 2007-2017 PrestaShop SA
|
||||
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
||||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*/
|
||||
|
||||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
|
||||
|
||||
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||
header("Cache-Control: post-check=0, pre-check=0", false);
|
||||
header("Pragma: no-cache");
|
||||
|
||||
header("Location: ../");
|
||||
exit;
|
||||
BIN
themes/hotel-reservation-theme/img/wasserrad/rad.png
Normal file
|
After Width: | Height: | Size: 152 KiB |