{% if not editmode %}
{% do elements_head_title().setTitle( demi_seoTitleForAcco(accommodation,document), true ) %}
{% do elements_head_meta().setDescription( demi_seoDescriptionforAcco(accommodation), true ) %}
{% endif %}
{#{% set canonicalUrl = demi_demiUrl({#}
{# 'accommodation': accommodation#}
{#},'demi_acco_detail_page',true) %}#}
{% set canonicalUrl = linkGenerator().generate(accommodation, {canonical: true, relative: false, reset: true}) %}
{% do elements_canonical().checkAllParams(false).setDomain(canonicalUrl)|raw %}
{% do demi_paymentSetDefaultCurrency(accommodation) %}
{% if not canonicalUrl is same as(app.request.pathInfo) %}
{% do elements_robots().setNoIndex(true) %}
{% endif %}
{% set address = accommodation.getAddress() %}
{% set maxRatingValue = demi_core_configuration('getMaxRatingValue',[]) ?: 5 %}
{% set maxRatingNormalized = demi_core_configuration('getMaxRatingNormalized',[]) ?: 5 %}
{% set hasRatingWidget = demi_ratingGetHasRatingWidgetTrustYou(accommodation) %}
{% set resultSetPresent = false %}
{% if accommodationResultSet is defined and accommodationResultSet is not null and accommodationResultSet.getMinPriceProductSets is not empty and accommodationResultSet.getMinPriceProductSets()|length > 0 %}
{% set resultSetPresent = true %}
{% endif %}
{% set ajaxUrl = demi_demiUrl({
'accommodation': accommodation
},'demi_acco_ajax') %}
{% if '?' in ajaxUrl %}
{% set parts = ajaxUrl|split('?') %}
{% set ajaxUrl = parts[0] %}
{% endif %}
{% set liveDetailProductsUrl = ajaxUrl ~ "?ajaxRequestType=getLiveDetailProducts" %}
{% set corridorMatrixUrl = ajaxUrl ~ "?ajaxRequestType=getCorridorMatrix" %}
{% set productUrl = ajaxUrl ~ "?ajaxRequestType=getProductByIdAndMealcode" %}
{% set paymentInformationUrl = ajaxUrl ~ "?ajaxRequestType=getProductByIdAndMealcode" %}
{% set step1Url = demi_demiUrl({
'path': demi_core_configuration('getCheckoutPath',[]).getFullPath(),
'controller': 'cart',
'action': 'step1'
},'demi_checkout',true) %}
{% set addToCartUrl = step1Url %}
{% set anchors = {
'detail': '#details',
'picture': '#pictures',
'package': '#packages',
'rooms': '#rooms',
'rating': '#ratings'
} %}
{% if activeTab is defined and activeTab not in anchors %}
{% set activeTab = '#details' %}
{% else %}
{% do jsConfig('_initialState').add({'activeTab': activeTab}) %}
{% endif %}
{% if not availabilityIsChecked %}
{% set fromDate = null %}
{% else %}
{% set fromDate = demi_getSearchFrom() %}
{% endif %}
{% set imagesTypes = demi_getAccoImagesTypesAsArray(accommodation) %}
{% set imageList = accommodation.getImages(imagesTypes, fromDate, true) %}
{% set photoCount = imageList|length %}
{% set videoCount = impressionLinks["video"]|length %}
{% set panoCount = impressionLinks["pano"]|length %}
{% set classifications = accommodation.getClassifications() %}
{% set hasClassificationsWithIcons = false %}
{% for classification in classifications %}
{% set group = classification.getClassificationGroup() %}
{% if group is not empty and group.getIconSmall() %}
{% set hasClassificationsWithIcons = true %}
{% endif %}
{% endfor %}
{% if imageList is not empty %}
{% do elements_opengraph().addImage(imageList[0].getThumbnail('slider-main').getPath()) %}
{% endif %}
{% set jsonLdData = demi_getAccommodationJsonLdData(accommodation, options is defined ? options : [], packages is defined ? packages : null) %}
{% do jsonLd().add("accommodation", jsonLdData) %}
{% extends '@ElementsDemiFrontend/Layout/layout.html.twig' %}
{% block content %}
{# TODO @msteyrer breadcrumb helper bundle not in use atm
{% do breadcrumbHelper().set({
'parentId': document.getId(),
'url': accoUrlPlain,
'label': accommodation.getName()
}) %}
{{ include('@ElementsDemiFrontend/Navigation/breadcrumb.html.twig') }} #}
<script type="text/javascript" data-cookieconsent="ignore">
_config.viewType = "acco";
_config.historyController = true;
_config.roomSelection = true;
_config.searchData = true;
_config.detailResultUrl = '{{ liveDetailProductsUrl|raw }}';
_config.corridorSearchUrl = '{{ corridorMatrixUrl|raw }}';
_config.detailPaymentInfoUrl = '{{ paymentInformationUrl|raw }}';
_config.detailProductUrl = '{{ productUrl|raw }}';
_config.addToCartUrl = '{{ addToCartUrl|raw }}';
_config.cartWarningOnMultipleAccoProducts = {{ demi_core_configuration('getWarningOnMultipleAccoProducts',[]) ? 'true': 'false' }};
_config.cartInfoUrl = '{{ demi_checkoutUrl('cart','hasAccoInCart')|raw }}';
_config.roomList = true;
_config.paramTabs = true;
_config.trackingCountingClicksUrl='{{ countingClicksUriJs|raw }}';
_config.productData = {
id: {{ accommodation.getId() }},
name: "{{ demi_impressionName(accommodation) }}",
category: "{{ demi_impressionCategory(accommodation, null, searchParam) }}",
brand: "{{ demi_impressionBrand(accommodation) }}"
};
_config.acommodationMapHideBusinesses = {{ demi_core_configuration('getMapHideBusinesses',[]) ? 'true' : 'false' }};
{% set mealtypeId = searchParam.getMealTypeId() %}
{% if mealtypeId is not empty and mealtypeId[0] is not empty %}
_config.urlParams = _config.urlParams || [];
_config.urlParams.push( { name : "mealtype", value : "{{ mealtypeId[0] }}"} );
{% endif %}
{% if searchParam.getBookOnly() %}
_config.urlParams = _config.urlParams || [];
_config.urlParams.push( { name : "bookonly", value : "on"} );
{% endif %}
</script>
{{ include('@ElementsDemiFrontend/Includes/canonicalOverride.html.twig', {'object' : accommodation }) }}
{{ include('@ElementsDemiFrontend/Includes/tags/detail-acco.html.twig',
{
'isMobile': false,
'acco': accommodation,
'searchParam': searchParam,
'accoResultSet': accommodationResultSet,
'productResultSet': productResultSet,
'packages': packages is defined ? packages : null,
'sortedMarketingGroups': sortedMarketingGroups,
'sortedFacilities': sortedFacilities,
'sortedHealthMeasures':sortedHealthMeasures,
'hasHousePackages': hasHousePackages,
'photoCount': photoCount,
'videoCount': videoCount,
'panoCount': panoCount
}
) }}
<main id="main" role="main">
<div hidden>
{{ include('@ElementsDemiFrontend/Accommodation/lightboxTopbar.html.twig') }}
</div>
{% set headerName = "full" %}
{% set width = 0 %}
{% set forceMultiHeader = accommodation.getForceMultiHeader() %}
{% if accommodation.getFirstImage(null,fromDate) is not empty %}
{% set width = accommodation.getFirstImage(null, fromDate).getCustomSettings()["imageWidth"] %}
{% endif %}
{% if width < demi_core_configuration("getMinWidthForFullHeader",[]) or forceMultiHeader %}
{% set headerName = "multi-image" %}
{% endif %}
{% if imageList|length >= 3 or headerName=="full" %}
{% set heroImageAlt = accommodation.getName() ~ ' - Impression #1' %}
{{ include('@ElementsDemiFrontend/Accommodation/includes/acco-header-' ~ headerName ~'.desktop.html.twig',
{
'photoCount': photoCount,
'videoCount': videoCount,
'panoCount': panoCount,
'imageList': imageList,
'alt': heroImageAlt
}
) }}
{% endif %}
{{ include('@ElementsDemiFrontend/Includes/elements/search-info.desktop.html.twig', { "searchParam": searchParam, "availabilityIsChecked": availabilityIsChecked, "isSearch": false}) }}
<div class="container mt-5">
<div class="row">
<div class="col-xl-9 col-12">
<div class="row mb-5">
<div class="col">
{% if accommodation.getIsTesthotel() %}
<div class="demi-test-acco-notice mb-3 text-danger"><strong>Testbetrieb</strong> nur für Debug/aktive Pimcore User sichtbar</div>
{% endif %}
<h1 class="text-primary{{ hasClassificationsWithIcons ? ' mb-2' : ' mb-4' }}">{{ demi_getAccoNameWithStars(accommodation) }}</h1>
{% set i = 0 %}
{% set len = classifications|length %}
{% for classification in classifications %}
<div class="row{{ i == (len - 1) ? ' mb-4' : ' mb-2' }}">
<div class="col col-auto">
{% set count = classification.getClassificationGroupAmount() %}
{% if count is not empty and classification.getShowAsIcon() and classification.demiGetIcon() is not null %}
<span class="classification_holder hidden-xs" aria-label="{{ count }} {{ classification.getName() }}">
{% for c in 1..count %}
{% set thumbnail = classification.demiGetIcon().getThumbnail('demi-classification') %}
{{ thumbnail.getHTML()|raw }}
{% if classification.getIsSuperior() %}
<span class="classification-superior">S</span>
{% endif %}
{% endfor %}
</span>
{% endif %}
</div>
</div>
{% set i = i+1 %}
{% endfor %}
<div class="row mb-2">
<div class="col col-auto">
{{ accommodation.getCategoryNames(2) }}
</div>
<div class="col col-auto">
<div class="media text-muted">
<script>
_config.smoothScroll = true;
</script>
<a class="media text-muted js-smoothscroll__link" href="#acco-contact">
{% if accommodation.getTown() is not null and (accommodation.getTown().getNameLocalized(app.request.locale) or accommodation.getTown().getName()) %}
<div class="demi-icon demi-icon-marker mr-1 icon-in-text" title="{{ 'demi.list.town'|trans }}" aria-label="{{ 'demi.list.town'|trans }}"></div>
<div class="media-body">
{{ accommodation.getTown().getNameLocalized(app.request.locale) ?? accommodation.getTown().getName() }}
</div>
{% elseif accommodation.getDistrict() is not null and (accommodation.getDistrict().getNameLocalized(app.request.locale) or accommodation.getDistrict().getName())%}
<div class="demi-icon demi-icon-marker mr-1 icon-in-text" title="<?= $this->translate('demi.list.town') ?>" aria-label="<?= $this->translate('demi.list.town') ?>"></div>
<div class="media-body">
{{ accommodation.getDistrict().getNameLocalized(app.request.locale) ?? accommodation.getDistrict().getName() }}
</div>
{% elseif address and address.getTown() %}
<div class="demi-icon demi-icon-marker mr-1 icon-in-text" title="{{ 'demi.detail.town'|trans }} ?>" aria-label="{{ 'demi.detail.town'|trans }}"></div>
<div class="media-body">
{{ address.getTown() }}
</div>
{% endif %}
</a>
</div>
</div>
<div class="col col-auto">
{% if distance is defined %}
<div class="media text-muted">
<span class="badge badge-primary mr-1">{{ distance['value'] }}</span>
<div class="media-body">
<span class="text-primary">{{ distance['from'] }}</span>
</div>
</div>
{% endif %}
</div>
</div>
</div>
<div class="col col-auto">
<div class="mb-4">
{{ include('@ElementsDemiFrontend/Accommodation/includes/serviceprovider-logo.html.twig', {
"logo": accommodation.getImages([constant('Elements\\Demi\\Deskline\\Constant\\DocumentInterface::DOCUMENT_TYPE_SERVICE_PROVIDER_LOGO')])|first
}) }}
</div>
<div>
{% if accommodation.getRatingSystem()=="TrustYou" %}
{% set normalizedRating = demi_ratingGetNormalized(accommodation, maxRatingValue, maxRatingNormalized) %}
{% if normalizedRating is not empty %}
{{ include('@ElementsDemiFrontend/Accommodation/includes/rating-md.html.twig', {
"score": normalizedRating,
"text": accommodation.getRatingScoreDescription(),
"styleModifier": "mb-1",
"showReviewCount": true,
"ratingCount": accommodation.getRatingCountDirect(),
"isTextWhite" : false
}) }}
{% endif %}
{% endif %}
</div>
</div>
<div class="col col-auto">
<div class="row">
<div class="col col-auto d-xl-none d-md-block">
<div class="ml-3" aria-live="polite">
<div class="js-room-list__loading js-corridor__search-info-loading--compact" hidden>
<div class="text-center py-3">
{{ include('@ElementsDemiFrontend/Includes/elements/spinner/loading-spinner.html.twig') }}
</div>
</div>
<div class="js-room-list__content js-corridor__search-info-content--compact" data-list="searchInfoCompact">
{{ include('@ElementsDemiFrontend/Accommodation/searchInfoBoxCompact.desktop.html.twig', {
"accommodationResultSet": accommodationResultSet,
"productResultSet": productResultSet,
"accommodation": accommodation,
}) }}
</div>
</div>
</div>
</div>
</div>
</div>
<script data-cookieconsent="ignore">
_config.loadAccoImages = true;
</script>
<div class="mt-3">
<ul class="nav nav-border-tabs" role="tablist">
<li class="nav-item">
<a class="nav-link js-param-tab{{ activeTab == anchors['detail'] ? ' active' : '' }} js-tracking js-tracking--click"
href="{{ anchors['detail'] }}"
data-toggle="tab"
role="tab"
aria-expanded="{{ activeTab == anchors['detail'] ? 'true' : 'false' }}"
data-tracking-category="button"
data-tracking-action="detail"
data-tracking-label="{{ accommodation.getName()|escape }}">
{{ "demi.detail.tab.overview"|trans }}
</a>
</li>
{% if(hasRatingWidget) %}
<li class="nav-item">
<a class="nav-link js-param-tab{{ activeTab == anchors['rating'] ? ' active' : '' }} js-tracking js-tracking--click"
href="{{ anchors['rating'] }}"
data-toggle="tab"
role="tab"
aria-expanded="{{ activeTab == anchors['rating'] ? 'true' : 'false' }}"
data-tracking-category="button"
data-tracking-action="rating"
data-tracking-label="{{ accommodation.getName()|escape }}">
{{ "demi.detail.tab.ratings"|trans }}
</a>
</li>
{% endif %}
<li class="nav-item">
<a class="nav-link js-param-tab js-acco-images__tab{{ activeTab == anchors['picture'] ? ' active' : '' }} js-tracking js-tracking--click"
href="{{ anchors['picture'] }}"
data-toggle="tab"
role="tab"
aria-expanded="{{ activeTab == anchors['picture'] ? 'true' : 'false' }}"
data-tracking-category="button"
data-tracking-action="picture"
data-tracking-label="{{ accommodation.getName()|escape }}">
{% if videoCount == 0 %}
{{ "demi.detail.tab.photos"|trans }}
{% else %}
{{ "demi.detail.tab.photos-videos"|trans }}
{% endif %}
</a>
</li>
{% if hasHousePackages is not empty or (destinationPackages is not empty and destinationPackages|length>0 and demi_core_configuration('getShowDestinationPackagesOnAccoDetail',[])) %}
<li class="nav-item">
<a class="nav-link js-param-tab{{ activeTab == anchors['package'] ? ' active' : '' }} js-tracking js-tracking--click"
href="{{ anchors['package'] }}"
data-toggle="tab"
role="tab" aria-expanded="{{ activeTab == anchors['package'] ? 'true' : 'false' }}"
data-tracking-category="button"
data-tracking-action="package"
data-tracking-label="{{ accommodation.getName()|escape }}">
{{ "demi.detail.tab.packages"|trans }}
</a>
</li>
{% endif %}
{% if (accommodation.getAccommodations(false)|length)>0 %}
<li class="nav-item">
<a class="nav-link js-param-tab{{ activeTab == anchors['rooms'] ? ' active' : '' }} js-tracking js-tracking--click"
href="{{ anchors['rooms'] }}"
data-toggle="tab"
role="tab"
aria-expanded="{{ activeTab == anchors['rooms'] ? 'true' : 'false' }}"
data-tracking-category="button"
data-tracking-action="{{ demi_getRoomsTabTranslationKey(accommodation)|trans }} & {{ "demi.detail.tab.prices"|trans }}"
data-tracking-label="rooms">
{{ demi_getRoomsTabTranslationKey(accommodation)|trans }} & {{ "demi.detail.tab.prices"|trans }}
</a>
</li>
{% endif %}
</ul>
</div>
<div class="pb-4 pt-2">
<div class="tab-content">
<div class="tab-pane pt-2{{ activeTab == anchors['detail'] ? ' active' : '' }}" id="details" role="tabpanel">
{{ include("@ElementsDemiFrontend/Accommodation/includes/acco-details.desktop.html.twig" ,{
'package': false,
'address': address,
'photoCount': photoCount,
'availabilityIsChecked': availabilityIsChecked,
'fromDate': fromDate,
'accommdationResultSet': accommodationResultSet
}) }}
</div>
{% if hasRatingWidget %}
<div class="tab-pane pt-2{{ activeTab == anchors['rating'] ? ' active' : '' }}" id="ratings" role="tabpanel">
{{ include("@ElementsDemiFrontend/Accommodation/includes/acco-ratings.desktop.html.twig", {'hasRatingWidget': hasRatingWidget, 'package' : false}) }}
</div>
{% endif %}
<div class="tab-pane pt-2{{ activeTab == anchors['picture'] ? ' active' : '' }}" id="pictures" role="tabpanel">
{{ include("@ElementsDemiFrontend/Accommodation/includes/acco-pictures.desktop.html.twig", {
'photoCount': photoCount,
'videoCount': videoCount,
'panoCount': panoCount,
'impressionsLinks': impressionLinks,
'fromDate': fromDate,
'imageList': imageList,
'accoId': accommodation.getId(),
'package' : false
}) }}
</div>
{% if hasHousePackages or (destinationPackages is not empty and (destinationPackages|length)>0 and demi_core_configuration("getShowDestinationPackagesOnAccoDetail",[])) %}
<div class="tab-pane pt-2{{ activeTab == anchors['package'] ? ' active' : '' }}" id="packages" role="tabpanel">
{{ include('@ElementsDemiFrontend/Accommodation/includes/acco-packages.desktop.html.twig') }}
</div>
{% endif %}
{% if (accommodation.getAccommodations(false)|length)>0 %}
<div class="tab-pane pt-2{{ activeTab == anchors['rooms'] ? ' active' : '' }}" id="rooms" role="tabpanel">
{{ include('@ElementsDemiFrontend/Accommodation/includes/acco-rooms.html.twig', {
'availabilityIsChecked': availabilityIsChecked,
'resultSetPresent': resultSetPresent,
'package' : null,
'tvbPackage' : null,
'housePackageMaster' : null
}) }}
</div>
{% endif %}
</div>
</div>
</div>
{{ include("@ElementsDemiFrontend/Accommodation/includes/acco-sidebar.desktop.html.twig",{
'accommodationResultSet': accommodationResultSet,
'isPackage': false,
}) }}
</div>
</div>
</main>
{% if demi_core_configuration("getDisableEnquiry",[])!=true and accommodation.getAddress() is not empty and accommodation.getAddress().getEmail() is not empty %}
{{ include('@ElementsDemiFrontend/Includes/overlays/inquiry-overlay.html.twig', {
'accommodation': accommodation,
'searchParams': searchParam,
'user': user
}) }}
{% endif %}
{% if demi_core_configuration('getWarningOnMultipleAccoProducts',[]) %}
{{ include('@ElementsDemiFrontend/Includes/modals/warningOnMultipleAccoProductsModal.html.twig', {'cartUrl': step1Url}) }}
{% endif %}
{% endblock %}