untracked files on master: 086ba968 Einige Tickes, kleine Anpassungen, bis 08-2023

This commit is contained in:
git stash 2026-05-28 08:00:24 +00:00
commit 0122185119
14 changed files with 1548 additions and 0 deletions

View file

@ -0,0 +1,95 @@
{% form_theme search_form 'default/form/theme.html.twig' %}
<section class="section fullscreen background start-slider dev-start-slider">
<div class="absolute-section">
<div class="container-fluid">
<div class="row">
<div class="col-md-12 col-xs-12">
<div class="home-message text-center">
<div class="home-info-box">
<div id="eKomiSeal_default" class="eKomi-header" style="padding-top: 5px;padding-left: 2px;">
<img class="lozad" border="0" src="{{ asset('images/dummy.png') }}" data-src="{{ asset('images/logo-qualitaet.png') }}" alt="Top Kundenservice" height="78">
</div>
<ul class="c4">
<li>Spezialist für Kulturreisen</li>
<li>Reiseexperte seit 1998</li>
<li>Beratung für individuelle Reisen</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="myCarousel" class="carousel slide">
<div class="carousel-inner">
<div class="item active">
<div class="fill lozad" style="background-image:url(images/placeholder-image.png)" data-background-image="{{ image('bundles/app/images/travel/slider_aegypten.jpg') }}"></div>
<noscript>
<div class="fill" style="background-image:url({{ image('bundles/app/images/travel/slider_aegypten.jpg').cropResize(1024).guess(70) }})"></div>
</noscript>
</div>
</div>
</div>
</section>
<section class="nopadding">
<div class="container-full absolute">
<div class="container-fluid container-form">
<div class="home-form">
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="tab_01">
<form class="bookform form-inline row st-search-form" style="margin-right: -5px; margin-left: -5px;" action="/suche" method="get">
<div class="form-group col-lg-2 col-md-2 col-sm-3 col-xs-6" style="padding-right: 5px;padding-left: 5px;">
{{ form_field_pho(search_form.b, 'Anreise am') }}
</div>
<div class="form-group col-lg-2 col-md-2 col-sm-3 col-xs-6" style="padding-right: 5px;padding-left: 5px;">
{{ form_field_pho(search_form.e, 'Abreise am') }}
</div>
<div class="form-group col-lg-2 col-md-3 col-sm-3 col-xs-6" style="padding-right: 5px;padding-left: 5px;">
{{ form_field_pho(search_form.c) }}
</div>
<div class="form-group col-lg-2 col-md-3 col-sm-3 col-xs-6" style="padding-right: 5px;padding-left: 5px;">
<label class="sr-only" for="departure">Abfahrtsort</label>
<div class="dropdown form-bottom">
<select id="departure" class="selectpicker" data-style="btn-white" data-dropup-auto="false">
<option>Abfahrtsort beliebig</option>
<option>Basel</option>
<option>Berlin</option>
<option>Berlin Schönefeld</option>
<option>Berlin Tegel</option>
<option>Bonn</option>
<option>Bremen</option>
<option>Dresden</option>
<option>Düsseldorf</option>
<option>Eigenanreise</option>
<option>Erfurt</option>
<option>Frankfurt</option>
<option>Friedrichshafen</option>
<option>Genf</option>
<option>Graz</option>
<option>Hamburg</option>
<option>Hannover</option>
<option>Köln</option>
<option>Leipzig</option>
<option>Linz</option>
<option>München</option>
<option>Nürnberg</option>
<option>Saarbrücken</option>
<option>Salzburg</option>
<option>Stuttgart</option>
<option>Wien</option>
<option>Zürich</option>
</select>
</div>
</div>
<div class="form-group col-lg-4 col-md-2 col-sm-12 col-xs-12" style="padding-right: 5px;padding-left: 5px;">
<button type="submit" class="btn btn-primary btn-block text-center"><i class="fa fa-search" style="font-size: 1.1em"></i> &nbsp;<span class="hidden-md">Kulturreisen</span> suchen</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</section>

View file

@ -0,0 +1,35 @@
{% if pages is not empty %}
<div class="widget clearfix hidden-xs">
<div class="widget-title">
<a class="collapse-widget collapsed" href="#{{ target_widget }}" data-toggle="collapse" aria-expanded="true">{{ slider_title }}</a>
</div><!-- end title -->
<div class="boxwidget collapse" id="{{ target_widget }}" aria-expanded="true">
<div class="box-slider">
{% for page in pages %}
<div class="travel-wrapper slide{{ loop.first ? ' active' }}">
<a href="{{ page.urlPath|default('javascript:void(0);') }}" class="item text-center">
<div class="item-img">
{% include 'default/components/pageBoxImage.html.twig' %}
</div>
<div class="box_mid">
<div class="hl5">{{ page.title }} </div>
<p>{{ page.description }}</p>
<p class="text-muted text-center">{{ page.date|date('d.m.Y') }}</p>
</div>
</a>
</div><!-- end travel-wrapper -->
{% endfor %}
<div class="item-switch clearfix">
<a href="javascript:void(0);" class="item-button-prev">zurück</a>
<a href="javascript:void(0);" class="item-button-next">weiter</a>
</div>
</div>
</div>
</div><!-- end widget -->
{% endif %}

View file

@ -0,0 +1,2 @@
{{ render(controller('AppBundle:Component:newsSidebarWidget', {title:widget.name})) }}

View file

@ -0,0 +1,109 @@
{# @var booking_request \AppBundle\Entity\BookingRequest #}
=====================================================================================
Reisedaten:
=====================================================================================
Reiseprogramm: {{ travel_date.travelProgram.title }} ({{ travel_date.name }})
Kategorie: Standard
Reisezeitraum: {{ travel_date.start|date }} - {{ travel_date.end|date }}
Abfahrts-/Abflugort: {{ booking_request.departure.name }}
------------------------------------------------------------
{% for summary_entry in summary %}
{% if(summary_entry.value != "!") %}
{{ summary_entry.value|number_format(2) }} € : {{ summary_entry.label|striptags }}
{% else %}
{{ summary_entry.label|striptags }}
{% endif %}
{% endfor %}
------------------------------------------------------------
Gesamtpreis: {{ booking_price_info['total']|number_format(2) }} €
Anzahlung: {{ booking_price_info.deposit_total|number_format(2) }} € (ist sofort fällig)
{% if( booking_price_info.totalInsurance > 0) %}
Versicherung: {{ booking_price_info.totalInsurance|number_format(2) }} € (ist sofort fällig)
{% endif %}
{% if( booking_request.insuranceOffer == 1) %}
Versicherung: Nein, keine Reiseversicherung gewünscht
{% endif %}
{% if( booking_request.insuranceOffer == 2) %}
Versicherung: Ja, ich wünsche ein Reiseversicherungsangebot
{% endif %}
Restzahlung: {{ booking_price_info.final_payment|number_format(2) }} € (bis zum {{ booking_price_info.final_payment_date}})
=====================================================================================
Reiseleistungen:
=====================================================================================
Eingeschlossene Leistungen:
{% for travel_program_service in travel_date.travelProgram.included|split('\n') %}
[x] {{ travel_program_service|raw }}
{% endfor %}
Nicht eingeschlossene, zubuchbare Leistungen:
{% for travel_program_service in travel_date.travelProgram.excluded|split('\n') %}
[o] {{ travel_program_service|raw }}
{% endfor %}
=====================================================================================
{{ booking_request.salutationApplicant }}
=====================================================================================
Anrede: {{ booking_request.salutationName }}
Vorname: {{ booking_request.firstName }}
Nachname: {{ booking_request.lastName }}
Adresse: {{ booking_request.streetAddress }}
PLZ: {{ booking_request.zipCode }}
Ort: {{ booking_request.city }}
Telefonnummer: {{ booking_request.phone }}
Handynummer: {{ booking_request.mobile ?? 'keine Angabe' }}
E-Mail: {{ booking_request.email ?? 'keine Angabe' }}
=====================================================================================
Reiseteilnehmer:
Nr., Zimmertyp, Geschlecht, Vorname, Nachname, Geburtsdatum
=====================================================================================
{% set travelerIndex = 0 %}
{% set travelerCollection = booking_request.travelers|slice(0, (booking_request.travelerCount + booking_request.childrenCount)) %}
{% for room in booking_request.occupiedRooms %}
{% if room.type == 1 %}
{{ loop.index }}. Einzelzimmer Erwachsener, {{ travelerCollection[travelerIndex].sexName }}, {{ travelerCollection[travelerIndex].firstName }}, {{ travelerCollection[travelerIndex].lastName }}, {{ travelerCollection[travelerIndex].birthDate }}, {{ travelerCollection[travelerIndex].nationalityName(nationalities) }}
{% set travelerIndex = travelerIndex + 1 %}
{% if room.child == true %}
{{ loop.index }}. Einzelzimmer Kind, {{ travelerCollection[travelerIndex].sexName }}, {{ travelerCollection[travelerIndex].firstName }}, {{ travelerCollection[travelerIndex].lastName }}, {{ travelerCollection[travelerIndex].birthDate }}, {{ travelerCollection[travelerIndex].(nationalities) }}
{% set travelerIndex = travelerIndex + 1 %}
{% endif %}
{% elseif (room.type == 2) %}
{{ loop.index }}. Doppelzimmer Erwachsener, {{ travelerCollection[travelerIndex].sexName }}, {{ travelerCollection[travelerIndex].firstName }}, {{ travelerCollection[travelerIndex].lastName }}, {{ travelerCollection[travelerIndex].birthDate }}, {{ travelerCollection[travelerIndex].nationalityName(nationalities) }}
{{ loop.index }}. Doppelzimmer Erwachsener, {{ travelerCollection[travelerIndex+1].sexName }}, {{ travelerCollection[travelerIndex+1].firstName }}, {{ travelerCollection[travelerIndex+1].lastName }}, {{ travelerCollection[travelerIndex+1].birthDate }}, {{ travelerCollection[travelerIndex].nationalityName(nationalities) }}
{% set travelerIndex = travelerIndex + 2 %}
{% if room.child == true %}
{{ loop.index }}. Doppelzimmer Kind, {{ travelerCollection[travelerIndex].sexName }}, {{ travelerCollection[travelerIndex].firstName }}, {{ travelerCollection[travelerIndex].lastName }}, {{ travelerCollection[travelerIndex].birthDate }}, {{ travelerCollection[travelerIndex].nationalityName(nationalities) }}
{% set travelerIndex = travelerIndex + 1 %}
{% endif %}
{% elseif (room.type == 3) %}
{{ loop.index }}. Dreibettzimmer Erwachsener, {{ travelerCollection[travelerIndex].sexName }}, {{ travelerCollection[travelerIndex].firstName }}, {{ travelerCollection[travelerIndex].lastName }}, {{ travelerCollection[travelerIndex].birthDate }}, {{ travelerCollection[travelerIndex].nationalityName(nationalities) }}
{{ loop.index }}. Dreibettzimmer Erwachsener, {{ travelerCollection[travelerIndex+1].sexName }}, {{ travelerCollection[travelerIndex+1].firstName }}, {{ travelerCollection[travelerIndex+1].lastName }}, {{ travelerCollection[travelerIndex+1].birthDate }}, {{ travelerCollection[travelerIndex].nationalityName(nationalities) }}
{{ loop.index }}. Dreibettzimmer Erwachsener, {{ travelerCollection[travelerIndex+2].sexName }}, {{ travelerCollection[travelerIndex+2].firstName }}, {{ travelerCollection[travelerIndex+2].lastName }}, {{ travelerCollection[travelerIndex+2].birthDate }}, {{ travelerCollection[travelerIndex].nationalityName(nationalities) }}
{% set travelerIndex = travelerIndex + 3 %}
{% if room.child == true %}
{{ loop.index }}. Dreibettzimmer Kind, {{ travelerCollection[travelerIndex].sexName }}, {{ travelerCollection[travelerIndex].firstName }}, {{ travelerCollection[travelerIndex].lastName }}, {{ travelerCollection[travelerIndex].birthDate }}, {{ travelerCollection[travelerIndex].nationalityName(nationalities) }}
{% set travelerIndex = travelerIndex + 1 %}
{% endif %}
{% endfor %}
=====================================================================================
Unverbindliche Anmerkungen:
=====================================================================================
{{ booking_request.notes ?? '-' }}

View file

@ -0,0 +1,436 @@
{% extends 'base.html.twig' %}
{% block meta_description %}
<meta name="description" content="STERN TOURS Reisebüro ist auch Spezialist für Ägypten Reisen, Israel Reisen, Jordanien Reisen und Oman Reisen.">
{% endblock %}
{% block meta_keywords %}
<meta name="keywords" content="STERN TOURS, Reisebüro, Spezialist, Reiseveranstalter, Ägypten Urlaub, Israel Reisen, Jordanien Reise, Pauschalreisen">
{% endblock %}
{% block header2 %}
{% include 'default/components/home/slider.html.twig' %}
{% endblock %}
{% block breadcrumb %}{% endblock %}
{% block body %}
<style>
section {
padding: 40px 0 10px 0;
}
.round-borders {
border-radius: 6px;
}
.padding-25px-all {
padding: 25px;
}
.padding-25px-x {
padding: 20px;
}
.section-heading {
margin-bottom: 50px;
text-align: center;
}
.section-heading h3 {
font-size: 1.6em;
}
.bg-light-gray {
background-color: #eee;
}
.feature-box-07 {
width: 100%;
float: left;
}
.feature-box-07 .img-box {
position: relative;
width: 100%;
z-index: 1;
overflow: hidden;
border-radius: 6px;
}
.feature-box-07 .feature-textbox {
position: relative;
width: 90%;
z-index: 2;
top: -50px;
left: 0;
transition: all 0.3s ease-out 0s;
right: 0;
margin: 0 auto;
}
.feature-box-07 .feature-textbox:after {
border-bottom: 5px solid transparent;
width: 0px;
content: "";
position: absolute;
bottom: 0;
left: 0;
transition: all 0.5s ease-out 0s;
}
.feature-box-07:hover .feature-textbox:after {
border-bottom: 5px solid #cb9030;
content: "";
width: 100%;
}
.feature-box-07 .feature-textbox:before {
border-top: 5px solid #648859;
content: "";
width: 100%;
position: absolute;
top: 0;
left: 0;
}
.feature-box-07:hover .feature-textbox:before {
width: 0;
transition: all 0.5s ease-out 0s;
}
.feature-box-07 .feature-textbox a {
color: #648859;
}
.feature-box-07 .img-box img {
transition: all 0.3s ease-out 0s;
}
.feature-box-07:hover .img-box img {
-moz-transform: scale(1.1);
-ms-transform: scale(1.1);
-webkit-transform: scale(1.1);
-o-transform: scale(1.1);
transform: scale(1.1);
}
.feature-box-07 .feature-textbox a.read-more {
color: #648859;
font-weight: 500;
margin-top: 8px;
display: block;
}
.feature-box-07 .feature-textbox a.read-more i {
color: #ffc926;
}
.contact-info-section {
padding: 0 0 15px 0;
margin-bottom: 0;
}
.contact-info-section i {
width: 25px;
height: 25px;
padding-top: 7px;
border-radius: 50%;
background: #648859;
color: #fff;
font-size: 12px;
margin-right: 5px;
line-height: 11px;
}
.contact-info-section h4 {
color: #232323;
font-size: 18px;
font-weight: 500;
margin-bottom: 15px;
line-height: normal; }
ul, ol, dl {
list-style-position: outside;
}
ul li {
list-style: none;
}
.list-style-1 li {
padding: 5px 0;
}
.list-style-1 li p {
margin-bottom: 5px;
}
.feature-box-07 .feature-textbox .feature-desc {
min-height: 6em;
}
@media (min-width:768px) and (max-width: 1199px) {
.feature-box-07 .feature-textbox .feature-desc {
min-height: 7em;
}
}
@media screen and (max-width: 991px) {
.feature-box-07 .feature-textbox {
width: 95%;
top: -30px;
}
}
</style>
<h1>Herzlich Willkommen bei Ihrem Spezialisten für Reisen in den Nahen Osten.</h1>
<section class="">
<div class="row">
<div class="col-sm-6 col-md-5 col-lg-5">
<img src="/docs/images/sterntours_top.jpg" alt="" class="img-responsive round-borders" style="margin-bottom: 10px;">
</div>
<div class="col-sm-6 col-md-7 col-lg-7">
<h4 class="">Seit 2007 begleite ich, Leoni Stern, den Reiseveranstalter STERN TOURS, der den Namen meines Mannes Thomas Stern trägt.</h4>
<p>Mit großer Freude haben wir unser Team von Zeit zu Zeit durch unsere Kolleginnen vergrößert und diese Kolleginnen bereichern STERN TOURS bis heute mit ihrem Engagement.</p>
<p>Sie sorgen dafür, dass unsere Reisegäste die Kulturen der Länder Ägypten, Jordanien, Oman, Israel, Palästina sowie Marokko und Usbekistan intensiv erfahren und kennenlernen können. Wir nehmen uns Zeit für jegliche Reiseplanung und schicken Sie auf Wunsch in einer kleinen Reisegruppe auf Tour oder organisieren eine Privatreise, bei der Sie mit Ihrem eigenen Guide, Fahrzeug und Fahrer vor Ort unterwegs sind. </p>
</div>
<div class="col-sm-6 col-md-7 col-lg-7">
<p>Weil wir finden, dass Reisen keinen negativen Einfluss auf Mensch, Natur und Umwelt haben darf, unternehmen wir kleine Schritte für Nachhaltigkeit auf Reisen, indem wir als Reiseveranstalter bei jeder Flugbuchung, die wir für Sie tätigen, für eine CO<sub>2</sub> Kompensation sorgen. </p>
</div>
<div class="col-sm-12 col-md-12 col-lg-12">
<p>Weil wir finden, dass Reisen keinen negativen Einfluss auf Mensch, Natur und Umwelt haben darf, unternehmen wir kleine Schritte für Nachhaltigkeit auf Reisen, indem wir als Reiseveranstalter bei jeder Flugbuchung, die wir für Sie tätigen, für eine CO<sub>2</sub> Kompensation sorgen. Weiter geplant sind in unserem Angebot speziell umweltfreundliche Reisen ausschließlich mit nachhaltig arbeitenden Unterkünften, Reisen mit dem Fahrrad und Wanderreisen in der Natur. </p>
<p>Um Sie bei Ihrer Reiseplanung zu unterstützen, nehmen Sie bitte Kontakt mit uns auf und lassen sich von unserem Spezialisten-Team beraten. Wir freuen uns auf Ihren Besuch oder Ihre Nachricht!</p>
<em>Viel Freude auf Ihren Reisen<br>
Ihr Team von STERN TOURS</em>
</div>
</div>
</section>
<section class="">
<div class="section-heading">
<h3>Ihr STERN TOURS Team</h3>
</div>
<div class="row">
<!--start item-->
<div class="col-sm-6">
<div class="feature-box-07">
<div class="img-box"><img src="/docs/images/team_Katrin_Siegel.jpg" class="img-responsive" alt=""></div>
<div class="feature-textbox padding-25px-all text-center bg-light-gray">
<h4 class="title">Katrin Siegel</h4>
<p class="feature-desc">... ist absolute Spezialistin im Nahen Osten. Fragen zu Ägypten, Israel und Jordanien kann sie bis ins Detail beantworten.</p>
<a class="read-more" href="tel:030 700 9410-24"><i class="fa fa-phone"></i> 030 700 9410-24</a>
<a class="read-more" href="mailto:katrin.siegel@stern-tours.de"><i class="fa fa-envelope"></i> katrin.siegel@stern-tours.de</a>
</div>
</div>
</div>
<!--end item-->
<!--start item-->
<div class="col-sm-6">
<div class="feature-box-07">
<div class="img-box"><img src="/docs/images/team_Peggy_Mattukat.jpg" class="img-responsive" alt=""></div>
<div class="feature-textbox padding-25px-all text-center bg-light-gray">
<h4 class="title">Peggy Mattukat</h4>
<p class="feature-desc">... kennt unsere Zielgebiete Oman, Jordanien, Ägypten und Israel ganz genau und stellt individuelle, außergewöhnliche Touren zusammen.</p>
<a class="read-more" href="tel:030 700 9410-14"><i class="fa fa-phone"></i> 030 700 9410-14</a>
<a class="read-more" href="mailto:peggy.mattukat@stern-tours.de"><i class="fa fa-envelope"></i> peggy.mattukat@stern-tours.de</a>
</div>
</div>
</div>
<!--end item-->
</div>
<div class="row">
<!--start item-->
<div class="col-sm-6">
<div class="feature-box-07">
<div class="img-box"><img src="/docs/images/team_Leoni_Stern.jpg" class="img-responsive" alt=""></div>
<div class="feature-textbox padding-25px-all text-center bg-light-gray">
<h4 class="title">Leoni Stern</h4>
<p class="feature-desc">... leitet den Reiseveranstalter und das Reisebüro STERN TOURS und heißt Sie mit dem gesamten Team jederzeit herzlich willkommen in unseren orientalischen Räumen.</p>
<a class="read-more" href="tel:030 700 9410-0"><i class="fa fa-phone"></i> 030 700 9410-0</a>
<a class="read-more" href="mailto:leoni.stern@stern-tours.de"><i class="fa fa-envelope"></i> leoni.stern@stern-tours.de</a>
</div>
</div>
</div>
<!--end item-->
<!--start item-->
<div class="col-sm-6">
<div class="feature-box-07">
<div class="img-box"><img src="/docs/images/team_Katrin_Nikolai.jpg" class="img-responsive" alt=""></div>
<div class="feature-textbox padding-25px-all text-center bg-light-gray">
<h4 class="title">Katrin Nikolai</h4>
<p class="feature-desc">... sorgt für alle Reisen um die Welt per Schiff, Flug, Bus und Bahn. Sie kennt sich bestens aus auf den Kanaren und in ganz Europa.</p>
<a class="read-more" href="tel:030 700 9410-22"><i class="fa fa-phone"></i> 030 700 9410-22</a>
<a class="read-more" href="mailto:katrin.nikolai@stern-tours.de"><i class="fa fa-envelope"></i> katrin.nikolai@stern-tours.de</a>
</div>
</div>
</div>
<!--end item-->
</div>
<div class="row">
<!--start item-->
<div class="col-sm-6">
<div class="feature-box-07">
<div class="img-box"><img src="/docs/images/team_Gerda_Fritsch.jpg" class="img-responsive" alt=""></div>
<div class="feature-textbox padding-25px-all text-center bg-light-gray">
<h4 class="title">Gerda Fritsch</h4>
<p class="feature-desc">... kümmert sich als unsere Managerin im Bereich der Ferienhäuser auf der Sonneninsel Usedom um Ihren Aufenthalt in Kölpinsee. </p>
<a class="read-more" href="tel:030 700 9410-21"><i class="fa fa-phone"></i> 030 700 9410-21</a>
<a class="read-more" href="mailto:gerda.fritsch@stern-tours.de"><i class="fa fa-envelope"></i> gerda.fritsch@stern-tours.de</a>
</div>
</div>
</div>
<!--end item-->
<!--start item-->
<div class="col-sm-6">
<div class="feature-box-07">
<div class="img-box"><img src="/docs/images/team_Maria_Bedel.jpg" class="img-responsive" alt=""></div>
<div class="feature-textbox padding-25px-all text-center bg-light-gray">
<h4 class="title">Maria Bedel</h4>
<p class="feature-desc">... hat ein umfangreiches Wissen rund um den fernen Osten und Afrika. In ihren Händen sind Sie bestens aufgehoben, wenn Sie sich für ein Fernreiseziel entscheiden. </p>
<a class="read-more" href="tel:030 700 9410-25"><i class="fa fa-phone"></i> 030 700 9410-25</a>
<a class="read-more" href="mailto:maria.bedel@stern-tours.de"><i class="fa fa-envelope"></i> maria.bedel@stern-tours.de</a>
</div>
</div>
</div>
<!--end item-->
</div>
</section>
<section class="bg-light-gray round-borders padding-25px-x">
<div class="section-heading">
<h3>Unser Reisebüro</h3>
</div>
<div class="row">
<!-- start contact form -->
<div class="col-lg-6">
<img src="/docs/images/sterntours-eingang.jpg" alt="" class="img-responsive round-borders" style="margin-bottom: 10px;">
</div>
<!-- end contact form -->
<!-- start contact detail -->
<div class="col-lg-6">
<div class="contact-info-box">
<div class="contact-info-section no-padding-top">
<p>
Unser einzigartig gestaltetes, orientalisches Reisebüro finden Sie in Berlin Wilmersdorf in direkter Nachbarschaft zum Güntzelkiez.
</p>
<h4>STERN TOURS GmbH</h4>
<ul class="list-style-1 no-margin-bottom">
<li>
<p><i class="fa fa-map-marker text-center"></i> Adresse: <strong>Emser Str. 3, 10719 Berlin</strong></p>
</li>
<li>
<p><i class="fa fa-phone text-center"></i> Tel.: <strong><a href="tel:03070094100">030 700 9410-0</a></strong></p>
</li>
<li>
<p><i class="fa fa-envelope text-center"></i> E-Mail: <strong><a href="mailto:stern@stern-tours.de">stern@stern-tours.de</a></strong></p>
</li>
<li>
<p><i class="fa fa-envelope-o text-center"></i> E-Mail: <strong><a href="https://www.sterntours.de/kontakt">Kontaktformular</a></strong></p>
</li>
</ul>
</div>
</div>
</div>
<!-- end contact detail -->
</div>
</section>
<div id="atmosfair" style="padding-top: 40px;"></div>
<section class="bg-light-gray round-borders padding-25px-x">
<div class="section-heading">
<h3>Unser Engagement für Klimaschutz mit atmosfair</h3>
</div>
<div class="row">
<!-- Logo und Bild -->
<div class="col-lg-4">
<div class="text-center">
<img src="/docs/images/logo_atmosfair_blue.png" alt="atmosfair Logo" class="img-responsive" style="max-width: 200px; margin: 0 auto 20px;">
</div>
</div>
<!-- Beschreibung und Download -->
<div class="col-lg-8">
<div class="contact-info-box">
<div class="contact-info-section no-padding-top">
<p>
Bei STERN TOURS übernehmen wir Verantwortung für die Umweltauswirkungen unserer Reisen. Deshalb arbeiten wir mit <strong>atmosfair</strong> zusammen, einer gemeinnützigen Organisation, die aktiven Klimaschutz betreibt.
</p>
<p>
Für jede Flugbuchung, die wir für Sie tätigen, sorgen wir für eine CO<sub>2</sub>-Kompensation. Die Beiträge fließen in zertifizierte Klimaschutzprojekte, die erneuerbare Energien fördern und CO<sub>2</sub>-Emissionen reduzieren.
</p>
<p>
Erfahren Sie mehr über unsere Klimaschutzmaßnahmen und wie atmosfair funktioniert:
</p>
<ul class="list-style-1 no-margin-bottom">
<li>
<p><i class="fa fa-file-pdf-o text-center"></i> <strong><a href="/docs/downloads/atmosfair_Zertifikat_sterntours_2025.pdf" target="_blank">Zertifikat zu unserer Klimaschutz-Initiative herunterladen</a></strong></p>
</li>
<li>
<p><i class="fa fa-globe text-center"></i> <strong><a href="https://www.atmosfair.de" target="_blank">Besuchen Sie die atmosfair-Website</a></strong></p>
</li>
</ul>
</div>
</div>
</div>
</div>
</section>
<section>
<div class="section-heading">
<h3>Medien und Stimmen TEST</h3>
</div>
<div class="contact-info-box">
<div class="contact-info-section no-padding-top">
<h4> Berlin Ick Liebe Dir</h4>
<ul class="list-style-1 no-margin-bottom">
<li>
<p>
<i class="fa fa-globe text-center"></i>
<strong>
<a target="_blank" href="https://berlin-ick-liebe-dir.de/stern-tours-aussergewoehnliches-reiseburo-berlin/" class=""> https://berlin-ick-liebe-dir.de/stern-tours-aussergewoehnliches-reiseburo-berlin/</a>
</strong>
</p>
</li>
</ul>
<hr>
<h4> Bewertungen zu uns</h4>
<ul class="list-style-1 no-margin-bottom">
<li>
<p>
<i class="fa fa-globe text-center"></i>
<strong>
<a target="_blank" href="https://www.ausgezeichnet.org/bewertungen-stern-tours.de-5H50SB" class=""> https://www.ausgezeichnet.org/bewertungen-stern-tours.de-5H50SB</a>
</strong>
</p>
</li>
</ul>
<hr>
<h4> Videos in unserem Youtube Kanal</h4>
<ul class="list-style-1 no-margin-bottom">
<li>
<p>
<i class="fa fa-globe text-center"></i>
<strong>
<a target="_blank" href="https://www.youtube.com/user/SternTours/videos" class=""> https://www.youtube.com/user/SternTours/videos</a>
</strong>
</p>
</li>
</ul>
</div>
</div>
</section>
{% endblock body %}

View file

@ -0,0 +1,120 @@
{% extends 'base.html.twig' %}
{% block meta_description %}
<meta name="description" content="STERN TOURS Testversion der Startseite fuer die Abstimmung.">
{% endblock %}
{% block meta_keywords %}
<meta name="keywords" content="STERN TOURS, Kulturreisen, Ferienwohnungen Usedom">
{% endblock %}
{% block meta_robots %}
<meta name="robots" content="noindex,nofollow" />
{% endblock %}
{% block canonical_tag %}{% endblock %}
{% block stylesheets %}
{{ parent() }}
<style>
.dev-home-note {
margin-bottom: 25px;
padding: 14px 18px;
border-left: 4px solid #648859;
background: #f4f7f2;
color: #3f4a3a;
}
.dev-usedom-teaser {
margin: 35px 0;
padding: 30px;
background: #f6f1e8;
border-radius: 4px;
}
.dev-usedom-teaser .lead {
margin-bottom: 20px;
}
.dev-usedom-teaser .btn {
margin-top: 5px;
}
</style>
{% endblock %}
{% block header2 %}
{% include 'default/components/home/dev_slider.html.twig' %}
{% endblock %}
{% block breadcrumb %}{% endblock %}
{% block body %}
<div id="section_orders">
<div class="dev-home-note">
<strong>Interne Abstimmungsversion:</strong>
Diese Startseite ist nur unter dem Testlink sichtbar und nicht fuer Suchmaschinen freigegeben.
</div>
<h1>Unsere beliebtesten Kulturreisen</h1>
<section id="dev-home-offers">
{% if homepage_offer_pages is not empty %}
{% include 'default/components/multiPageBoxCarousel.html.twig' with {pages: homepage_offer_pages} %}
{% else %}
<p>Aktuell konnten keine kuratierten Reiseangebote geladen werden.</p>
{% endif %}
</section>
<section class="clearfix dev-usedom-teaser" id="dev-home-usedom">
<div class="row">
<div class="col-md-8">
<h2 class="h3 h3l">Lieber näher zuhause? Ferienwohnungen auf Usedom</h2>
<p class="lead">
Neben unseren Kulturreisen bieten wir acht Ferienwohnungen in zwei Häusern auf Usedom.
Ideal für alle, die kurzfristig, individuell und nah an der Ostsee Urlaub machen möchten.
</p>
<a class="btn btn-primary" href="/ferienwohnungen" title="Ferienwohnungen auf Usedom ansehen">
Ferienwohnungen ansehen
</a>
</div>
<div class="col-md-4">
<p>
Der Block macht Usedom als zweites Standbein sichtbar, ohne die Kulturreisen zu verdrängen.
Bilder und Reihenfolge können nach Sichtung des vorhandenen Bildpools noch feinjustiert werden.
</p>
</div>
</div>
{% if fewo_lodgings is not empty %}
<div class="row">
{% for lodging in fewo_lodgings %}
{% include 'default/components/pageLodgingBox.html.twig' %}
{% endfor %}
</div>
{% endif %}
</section>
<section id="dev-home-countries">
<div class="clearfix">
<h2 class="h3 h3l">Alle Reisekategorien auf einen Blick</h2>
</div>
{% include 'default/components/multiPageBoxCarousel.html.twig' with {pages: country_pages} %}
</section>
<section class="clearfix" id="dev-home-copy">
<div class="content-copy">
<h1>STERN TOURS - Ihr Kulturreise-Spezialist aus Berlin</h1>
<p class="ft">
Herzlich willkommen bei STERN TOURS, Ihrem Reiseveranstalter für ausgewählte Kulturreisen.
In der aktuellen Startseitenfassung stehen besonders die Reiseziele im Vordergrund, die
derzeit gut planbar und verkaufbar sind: Ägypten, Marokko, Usbekistan und Oman.
</p>
<h2 class="h3 h3l">Kulturreisen mit Erfahrung und persönlicher Beratung</h2>
<p class="ft">
Seit 1998 beraten wir Reisende zu Kulturreisen in den Orient und angrenzende Regionen.
Die neue Frontseite soll Orientierung geben, buchbare Reisen sichtbar machen und zugleich
verantwortungsvoll mit Destinationen umgehen, bei denen die Lage eine vorsichtigere
Kommunikation erfordert.
</p>
</div>
</section>
</div>
{% endblock body %}

View file

@ -0,0 +1,395 @@
{% extends 'base.html.twig' %}
{% block meta_description %}
<meta name="description" content="STERN TOURS Reisebüro ist auch Spezialist für Ägypten Reisen, Israel Reisen, Jordanien Reisen und Oman Reisen.">
{% endblock %}
{% block meta_keywords %}
<meta name="keywords" content="STERN TOURS, Reisebüro, Spezialist, Reiseveranstalter, Ägypten Urlaub, Israel Reisen, Jordanien Reise, Pauschalreisen">
{% endblock %}
{% block header2 %}
{% include 'default/components/home/slider.html.twig' %}
{% endblock %}
{% block breadcrumb %}{% endblock %}
{% block body %}
<style>
section {
padding: 40px 0 10px 0;
}
.round-borders {
border-radius: 6px;
}
.padding-25px-all {
padding: 25px;
}
.padding-25px-x {
padding: 20px;
}
.section-heading {
margin-bottom: 50px;
text-align: center;
}
.section-heading h3 {
font-size: 1.6em;
}
.bg-light-gray {
background-color: #eee;
}
.feature-box-07 {
width: 100%;
float: left;
}
.feature-box-07 .img-box {
position: relative;
width: 100%;
z-index: 1;
overflow: hidden;
border-radius: 6px;
}
.feature-box-07 .feature-textbox {
position: relative;
width: 90%;
z-index: 2;
top: -50px;
left: 0;
transition: all 0.3s ease-out 0s;
right: 0;
margin: 0 auto;
}
.feature-box-07 .feature-textbox:after {
border-bottom: 5px solid transparent;
width: 0px;
content: "";
position: absolute;
bottom: 0;
left: 0;
transition: all 0.5s ease-out 0s;
}
.feature-box-07:hover .feature-textbox:after {
border-bottom: 5px solid #cb9030;
content: "";
width: 100%;
}
.feature-box-07 .feature-textbox:before {
border-top: 5px solid #648859;
content: "";
width: 100%;
position: absolute;
top: 0;
left: 0;
}
.feature-box-07:hover .feature-textbox:before {
width: 0;
transition: all 0.5s ease-out 0s;
}
.feature-box-07 .feature-textbox a {
color: #648859;
}
.feature-box-07 .img-box img {
transition: all 0.3s ease-out 0s;
}
.feature-box-07:hover .img-box img {
-moz-transform: scale(1.1);
-ms-transform: scale(1.1);
-webkit-transform: scale(1.1);
-o-transform: scale(1.1);
transform: scale(1.1);
}
.feature-box-07 .feature-textbox a.read-more {
color: #648859;
font-weight: 500;
margin-top: 8px;
display: block;
}
.feature-box-07 .feature-textbox a.read-more i {
color: #ffc926;
}
.contact-info-section {
padding: 0 0 15px 0;
margin-bottom: 0;
}
.contact-info-section i {
width: 25px;
height: 25px;
padding-top: 7px;
border-radius: 50%;
background: #648859;
color: #fff;
font-size: 12px;
margin-right: 5px;
line-height: 11px;
}
.contact-info-section h4 {
color: #232323;
font-size: 18px;
font-weight: 500;
margin-bottom: 15px;
line-height: normal; }
ul, ol, dl {
list-style-position: outside;
}
ul li {
list-style: none;
}
.list-style-1 li {
padding: 5px 0;
}
.list-style-1 li p {
margin-bottom: 5px;
}
.feature-box-07 .feature-textbox .feature-desc {
min-height: 6em;
}
@media (min-width:768px) and (max-width: 1199px) {
.feature-box-07 .feature-textbox .feature-desc {
min-height: 7em;
}
}
@media screen and (max-width: 991px) {
.feature-box-07 .feature-textbox {
width: 95%;
top: -30px;
}
}
</style>
<h1>Herzlich Willkommen bei Ihrem Spezialisten für Reisen in den Nahen Osten.</h1>
<section class="">
<div class="row">
<div class="col-sm-6 col-md-5 col-lg-5">
<img src="/docs/images/sterntours_top.jpg" alt="" class="img-responsive round-borders" style="margin-bottom: 10px;">
</div>
<div class="col-sm-6 col-md-7 col-lg-7">
<h4 class="">Seit 2007 begleite ich, Leoni Stern, den Reiseveranstalter STERN TOURS, der den Namen meines Mannes Thomas Stern trägt.</h4>
<p>Mit großer Freude haben wir unser Team von Zeit zu Zeit durch unsere Kolleginnen vergrößert und diese Kolleginnen bereichern STERN TOURS bis heute mit ihrem Engagement.</p>
<p>Sie sorgen dafür, dass unsere Reisegäste die Kulturen der Länder Ägypten, Jordanien, Oman, Israel, Palästina sowie Marokko und Usbekistan intensiv erfahren und kennenlernen können. Wir nehmen uns Zeit für jegliche Reiseplanung und schicken Sie auf Wunsch in einer kleinen Reisegruppe auf Tour oder organisieren eine Privatreise, bei der Sie mit Ihrem eigenen Guide, Fahrzeug und Fahrer vor Ort unterwegs sind. </p>
</div>
<div class="col-sm-6 col-md-7 col-lg-7">
<p>Weil wir finden, dass Reisen keinen negativen Einfluss auf Mensch, Natur und Umwelt haben darf, unternehmen wir kleine Schritte für Nachhaltigkeit auf Reisen, indem wir als Reiseveranstalter bei jeder Flugbuchung, die wir für Sie tätigen, für eine CO<sub>2</sub> Kompensation sorgen. </p>
</div>
<div class="col-sm-12 col-md-12 col-lg-12">
<p>Weil wir finden, dass Reisen keinen negativen Einfluss auf Mensch, Natur und Umwelt haben darf, unternehmen wir kleine Schritte für Nachhaltigkeit auf Reisen, indem wir als Reiseveranstalter bei jeder Flugbuchung, die wir für Sie tätigen, für eine CO<sub>2</sub> Kompensation sorgen. Weiter geplant sind in unserem Angebot speziell umweltfreundliche Reisen ausschließlich mit nachhaltig arbeitenden Unterkünften, Reisen mit dem Fahrrad und Wanderreisen in der Natur. </p>
<p>Um Sie bei Ihrer Reiseplanung zu unterstützen, nehmen Sie bitte Kontakt mit uns auf und lassen sich von unserem Spezialisten-Team beraten. Wir freuen uns auf Ihren Besuch oder Ihre Nachricht!</p>
<em>Viel Freude auf Ihren Reisen<br>
Ihr Team von STERN TOURS</em>
</div>
</div>
</section>
<section class="">
<div class="section-heading">
<h3>Ihr STERN TOURS Team</h3>
</div>
<div class="row">
<!--start item-->
<div class="col-sm-6">
<div class="feature-box-07">
<div class="img-box"><img src="/docs/images/team_Katrin_Siegel.jpg" class="img-responsive" alt=""></div>
<div class="feature-textbox padding-25px-all text-center bg-light-gray">
<h4 class="title">Katrin Siegel</h4>
<p class="feature-desc">... ist absolute Spezialistin im Nahen Osten. Fragen zu Ägypten, Israel und Jordanien kann sie bis ins Detail beantworten.</p>
<a class="read-more" href="tel:030 700 9410-24"><i class="fa fa-phone"></i> 030 700 9410-24</a>
<a class="read-more" href="mailto:katrin.siegel@stern-tours.de"><i class="fa fa-envelope"></i> katrin.siegel@stern-tours.de</a>
</div>
</div>
</div>
<!--end item-->
<!--start item-->
<div class="col-sm-6">
<div class="feature-box-07">
<div class="img-box"><img src="/docs/images/team_Peggy_Mattukat.jpg" class="img-responsive" alt=""></div>
<div class="feature-textbox padding-25px-all text-center bg-light-gray">
<h4 class="title">Peggy Mattukat</h4>
<p class="feature-desc">... kennt unsere Zielgebiete Oman, Jordanien, Ägypten und Israel ganz genau und stellt individuelle, außergewöhnliche Touren zusammen.</p>
<a class="read-more" href="tel:030 700 9410-14"><i class="fa fa-phone"></i> 030 700 9410-14</a>
<a class="read-more" href="mailto:peggy.mattukat@stern-tours.de"><i class="fa fa-envelope"></i> peggy.mattukat@stern-tours.de</a>
</div>
</div>
</div>
<!--end item-->
</div>
<div class="row">
<!--start item-->
<div class="col-sm-6">
<div class="feature-box-07">
<div class="img-box"><img src="/docs/images/team_Leoni_Stern.jpg" class="img-responsive" alt=""></div>
<div class="feature-textbox padding-25px-all text-center bg-light-gray">
<h4 class="title">Leoni Stern</h4>
<p class="feature-desc">... leitet den Reiseveranstalter und das Reisebüro STERN TOURS und heißt Sie mit dem gesamten Team jederzeit herzlich willkommen in unseren orientalischen Räumen.</p>
<a class="read-more" href="tel:030 700 9410-0"><i class="fa fa-phone"></i> 030 700 9410-0</a>
<a class="read-more" href="mailto:leoni.stern@stern-tours.de"><i class="fa fa-envelope"></i> leoni.stern@stern-tours.de</a>
</div>
</div>
</div>
<!--end item-->
<!--start item-->
<div class="col-sm-6">
<div class="feature-box-07">
<div class="img-box"><img src="/docs/images/team_Katrin_Nikolai.jpg" class="img-responsive" alt=""></div>
<div class="feature-textbox padding-25px-all text-center bg-light-gray">
<h4 class="title">Katrin Nikolai</h4>
<p class="feature-desc">... sorgt für alle Reisen um die Welt per Schiff, Flug, Bus und Bahn. Sie kennt sich bestens aus auf den Kanaren und in ganz Europa.</p>
<a class="read-more" href="tel:030 700 9410-22"><i class="fa fa-phone"></i> 030 700 9410-22</a>
<a class="read-more" href="mailto:katrin.nikolai@stern-tours.de"><i class="fa fa-envelope"></i> katrin.nikolai@stern-tours.de</a>
</div>
</div>
</div>
<!--end item-->
</div>
<div class="row">
<!--start item-->
<div class="col-sm-6">
<div class="feature-box-07">
<div class="img-box"><img src="/docs/images/team_Gerda_Fritsch.jpg" class="img-responsive" alt=""></div>
<div class="feature-textbox padding-25px-all text-center bg-light-gray">
<h4 class="title">Gerda Fritsch</h4>
<p class="feature-desc">... kümmert sich als unsere Managerin im Bereich der Ferienhäuser auf der Sonneninsel Usedom um Ihren Aufenthalt in Kölpinsee. </p>
<a class="read-more" href="tel:030 700 9410-21"><i class="fa fa-phone"></i> 030 700 9410-21</a>
<a class="read-more" href="mailto:gerda.fritsch@stern-tours.de"><i class="fa fa-envelope"></i> gerda.fritsch@stern-tours.de</a>
</div>
</div>
</div>
<!--end item-->
<!--start item-->
<div class="col-sm-6">
<div class="feature-box-07">
<div class="img-box"><img src="/docs/images/team_Maria_Bedel.jpg" class="img-responsive" alt=""></div>
<div class="feature-textbox padding-25px-all text-center bg-light-gray">
<h4 class="title">Maria Bedel</h4>
<p class="feature-desc">... hat ein umfangreiches Wissen rund um den fernen Osten und Afrika. In ihren Händen sind Sie bestens aufgehoben, wenn Sie sich für ein Fernreiseziel entscheiden. </p>
<a class="read-more" href="tel:030 700 9410-25"><i class="fa fa-phone"></i> 030 700 9410-25</a>
<a class="read-more" href="mailto:maria.bedel@stern-tours.de"><i class="fa fa-envelope"></i> maria.bedel@stern-tours.de</a>
</div>
</div>
</div>
<!--end item-->
</div>
</section>
<section class="bg-light-gray round-borders padding-25px-x">
<div class="section-heading">
<h3>Unser Reisebüro</h3>
</div>
<div class="row">
<!-- start contact form -->
<div class="col-lg-6">
<img src="/docs/images/sterntours-eingang.jpg" alt="" class="img-responsive round-borders" style="margin-bottom: 10px;">
</div>
<!-- end contact form -->
<!-- start contact detail -->
<div class="col-lg-6">
<div class="contact-info-box">
<div class="contact-info-section no-padding-top">
<p>
Unser einzigartig gestaltetes, orientalisches Reisebüro finden Sie in Berlin Wilmersdorf in direkter Nachbarschaft zum Güntzelkiez.
</p>
<h4>STERN TOURS GmbH</h4>
<ul class="list-style-1 no-margin-bottom">
<li>
<p><i class="fa fa-map-marker text-center"></i> Adresse: <strong>Emser Str. 3, 10719 Berlin</strong></p>
</li>
<li>
<p><i class="fa fa-phone text-center"></i> Tel.: <strong><a href="tel:03070094100">030 700 9410-0</a></strong></p>
</li>
<li>
<p><i class="fa fa-envelope text-center"></i> E-Mail: <strong><a href="mailto:stern@stern-tours.de">stern@stern-tours.de</a></strong></p>
</li>
<li>
<p><i class="fa fa-envelope-o text-center"></i> E-Mail: <strong><a href="https://www.sterntours.de/kontakt">Kontaktformular</a></strong></p>
</li>
</ul>
</div>
</div>
</div>
<!-- end contact detail -->
</div>
</section>
<section>
<div class="section-heading">
<h3>Medien und Stimmen</h3>
</div>
<div class="contact-info-box">
<div class="contact-info-section no-padding-top">
<h4> Berlin Ick Liebe Dir</h4>
<ul class="list-style-1 no-margin-bottom">
<li>
<p>
<i class="fa fa-globe text-center"></i>
<strong>
<a target="_blank" href="https://berlin-ick-liebe-dir.de/stern-tours-aussergewoehnliches-reiseburo-berlin/" class=""> https://berlin-ick-liebe-dir.de/stern-tours-aussergewoehnliches-reiseburo-berlin/</a>
</strong>
</p>
</li>
</ul>
<hr>
<h4> Bewertungen zu uns</h4>
<ul class="list-style-1 no-margin-bottom">
<li>
<p>
<i class="fa fa-globe text-center"></i>
<strong>
<a target="_blank" href="https://www.ausgezeichnet.org/bewertungen-stern-tours.de-5H50SB" class=""> https://www.ausgezeichnet.org/bewertungen-stern-tours.de-5H50SB</a>
</strong>
</p>
</li>
</ul>
<hr>
<h4> Videos in unserem Youtube Kanal</h4>
<ul class="list-style-1 no-margin-bottom">
<li>
<p>
<i class="fa fa-globe text-center"></i>
<strong>
<a target="_blank" href="https://www.youtube.com/user/SternTours/videos" class=""> https://www.youtube.com/user/SternTours/videos</a>
</strong>
</p>
</li>
</ul>
</div>
</div>
</section>
{% endblock body %}

47
dev/navigation.md Normal file
View file

@ -0,0 +1,47 @@
# Routing & Navigations-Logik (KernelControllerListener)
Die Klasse `src/AppBundle/Listener/KernelControllerListener.php` implementiert die zentrale Routing-Logik für das CMS. Sie greift ein, wenn der Symfony-Router den Request an `AppBundle\Controller\DefaultController::defaultAction` leitet.
## Funktionsweise
Der Listener analysiert den Request-Pfad (`pathInfo`) und entscheidet, welcher Controller tatsächlich ausgeführt werden soll.
### 1. API-Lookup (Priorität 1)
Zuerst wird geprüft, ob der Pfad über einen externen API-Call (`Util::loadFromApi('cms/search', ...)`) aufgelöst werden kann.
- **Ziel-Controller:** `AppBundle:Cms:iqTravelGuide`
- **Template:** `TravelGuide`
### 2. Datenbank-Suche (Page Entity)
Wenn die API nichts zurückgibt, wird in der lokalen Datenbank (`AppBundle:Page`) gesucht.
- **Methode A (Direkt):** Suche nach Übereinstimmung im Feld `realUrlPath`.
- **Methode B (Tree-Traversierung):** Der Pfad wird anhand der Slashes (`/`) zerlegt. Es wird versucht, den Pfad hierarchisch über `slug` und die Eltern-Kind-Beziehung (`parent`) aufzulösen. Die anfällige Nested-Set-Logik (`lft`/`rgt`, `lvl`) wird hier bewusst umgangen, um 404-Fehler bei inkonsistenten Trees zu vermeiden.
### 3. Redirects
- **Hardcoded:** Es gibt eine Liste fester 301-Weiterleitungen (z.B. alte Reiseführer-URLs).
- **Datenbank:** Tabelle `AppBundle:Redirect`. Wenn keine Page gefunden wird, wird hier geprüft.
### 4. Controller-Zuweisung
Sobald eine `Page`-Entität (`$node`) gefunden wurde, wird der Controller basierend auf dem Inhaltstyp bestimmt:
| Inhaltstyp | URL-Suffix | Controller | Action |
| ----------------- | ------------------------- | ----------------------- | ------------------------- |
| **TravelProgram** | `/buchen`, `/berechne...` | `AppBundle:Booking` | `index` |
| **TravelProgram** | `/pdf` | `AppBundle:Cms` | `pdf` |
| **TravelProgram** | _(keins)_ | `AppBundle:Cms` | `travelProgram` |
| **FewoLodging** | `/buchen` | `AppBundle:FewoBooking` | `index` |
| **FewoLodging** | _(keins)_ | `AppBundle:Cms` | `fewoLodging` |
| **Standard Page** | _(keins)_ | `AppBundle:Cms` | _Dyn. nach Template-Name_ |
**Fallback für Standard Pages:**
Wenn die Page ein Template (z.B. "About") definiert hat, versucht das System `AppBundle:Cms:About` aufzurufen. Existiert diese Action nicht, wird `AppBundle:Cms:Default` verwendet und der Template-Name als Parameter übergeben.
### 5. Fehlerbehandlung
- **404:** Wenn Pfad nicht gefunden und nicht in der Whitelist (`buchen`, `pdf` etc.) -> `HttpException(404)`.
- **Inaktiv:** Wenn Page-Status `0` ist -> `NotFoundHttpException`.

View file

@ -0,0 +1,253 @@
<?php
/**
* @author Ulrich Hecht <ulrich.hecht@hecht-software.de>
* @date 12/02/2016
*/
namespace AppBundle\Listener;
use AppBundle\AppBundle;
use AppBundle\Controller\DefaultController;
use AppBundle\Entity\Page;
use AppBundle\Util;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\PersistentCollection;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class KernelControllerListener
{
private $em;
private $controllerResolver;
public function __construct(EntityManager $entityManager, ControllerResolverInterface $controllerResolver)
{
$this->em = $entityManager;
$this->controllerResolver = $controllerResolver;
}
private function setSessionAttributeByTime($request, $key)
{
$session = $request->getSession();
$session->set('_open_side_about', '');
$session->set('_open_side_search', '');
if ($key === 'default') { //is default visit
if (!$session->get('default_visit')) { //first visit
$session->set('default_visit', true);
$session->set('_open_side_about', 'open');
$session->set('_open_side_search', 'open');
}
}
if ($key === 'api') { //is api = Reiseführer
if (!$session->get('api_visit')) { //first visit
$session->set('api_visit', true);
$session->set('_open_side_about', 'open');
}
}
}
public function onKernelController(FilterControllerEvent $event)
{
$request = $event->getRequest();
$session = $request->getSession();
Util::setMySession('search_request_b', $session->get('search_request_b'));
Util::setMySession('search_request_e', $session->get('search_request_e'));
Util::setMySession('search_request_c', $session->get('search_request_c'));
if ($request->get('_controller') === 'AppBundle\Controller\DefaultController::homeAction') {
$this->setSessionAttributeByTime($request, "default");
}
if ($request->get('_controller') == 'AppBundle\Controller\DefaultController::defaultAction') {
$repo = $this->em->getRepository('AppBundle:Page');
$path = preg_replace('/^\/?(.*?)\/?$/', '$1', $request->getPathInfo());
/** @var Page $node */
$node = null;
// Try to find by url path. It's possible that the path consists of two parts:
// - the beginning part represents a node
// - the ending part represents a handler
// e.g. /path/to/travel/program/buchen ("buchen" is the handler part)
$pathArray = explode('/', $path);
$restOfPath = '';
$curPath = $path;
//search for entry in new tree objects
$api = Util::loadFromApi('cms/search', ['url' => $curPath]);
while (!empty($pathArray)) {
if (!$api) {
$node = $repo->findOneBy(['realUrlPath' => '/' . $curPath]);
if ($node) {
break;
}
}
$restOfPath = '/' . array_pop($pathArray) . $restOfPath;
$curPath = implode('/', $pathArray);
}
//find and try 301
//find => to
$redirects = [
'/reisefuehrer/tuerkei' => 'tuerkei-reisen/reisefuehrer',
'/reisefuehrer/jordanien' => 'jordanien-reisen/reisefuehrer',
'/reisefuehrer/oman' => 'oman-reisen/reisefuehrer',
'/reisefuehrer/israel' => 'israel-reisen/israel-reisefuehrer',
'/reisefuehrer/aegypten' => 'aegypten-reisen/aegypten-reisefuehrer',
'/reisemagazin/tuerkei-reisemagazin' => 'tuerkei-reisen/tuerkei-reisemagazin',
'/reisemagazin/aegypten' => 'aegypten-reisen/aegypten-reisemagazin',
'/reisemagazin/israel' => 'israel-reisen/israel-reisemagazin',
'/reisemagazin/jordanien' => 'jordanien-reisen/jordanien-reisemagazin',
'/reisemagazin/marokko' => 'marokko-urlaub/marokko-reisemagazin'
];
//301
foreach ($redirects as $find => $to) {
if (strpos($restOfPath, $find) !== false) {
$restOfPath = str_replace($find, $to, $restOfPath);
$protocol = 'https';
if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === "off") {
$protocol = 'http';
}
header("Location: " . $protocol . "://" . $_SERVER["HTTP_HOST"] . "/" . $restOfPath, true, 301);
exit();
}
}
//load content from API, is found by cms/search
if ($api) {
$this->setSessionAttributeByTime($request, "api");
$request->attributes->set('_controller', 'AppBundle:Cms:iqTravelGuide');
$request->attributes->set('api', $api);
$request->attributes->set('template', 'TravelGuide');
try {
$controller = $this->controllerResolver->getController($request);
} catch (\LogicException $e) {
// If there is no controller action, call the default action and pass the template name
$request->attributes->set('_controller', 'AppBundle:Cms:Default');
$request->attributes->set('template', "Default");
}
$event->setController($controller ?? $this->controllerResolver->getController($request));
return;
}
$this->setSessionAttributeByTime($request, "default");
if (!$node) {
// Now try to find a page by tracing a page node path using the page nodes' slugs
$pathArray = explode('/', $path);
$i = 0;
while (!empty($pathArray)) {
$restOfPath = '/' . implode('/', $pathArray);
$slug = array_shift($pathArray);
$qb = $repo->createQueryBuilder('p');
$qb->where($qb->expr()->eq('p.lvl', $i));
$qb->andWhere($qb->expr()->eq('p.slug', ':slug'));
$qb->setParameter('slug', $slug);
if ($node != null) {
$qb->andWhere($qb->expr()->between('p.lft', $node->getLft(), $node->getRgt()));
}
$qb->setMaxResults(1);
$childNode = $qb->getQuery()->getOneOrNullResult();
if (!$childNode) {
$whitelist = [
'buchen',
'berechne-gesamtpreis',
'show_nationality_country_text',
'pdf',
];
if (!in_array($slug, $whitelist)) {
throw new HttpException(404, 'Seite nicht gefunden: ' . $slug);
}
break;
}
if ($node) {
// Avoid database calls to parent later
$childNode->setParent($node);
}
$node = $childNode;
++$i;
}
if ($node && $node->getRealUrlPath() && $node->getRealUrlPath() != '/' . $path) {
// If there realUrlPath is set and the slug path differs from realUrlPath, then the slug path is
// not a valid URL. Otherwise, there would be two different URLs representing the same page.
$event->setController(function () {
throw new NotFoundHttpException('Invalid URL');
});
return;
}
}
if (!$node) {
// Search for a redirect entry
$redirect = $this->em->getRepository('AppBundle:Redirect')->findOneBy(['sourceUrlPath' => '/' . $path]);
if ($redirect) {
$redirectUrl = $redirect->getPage()->getUrlPath();
$event->setController(function () use ($redirectUrl) {
return new RedirectResponse($redirectUrl, 301);
});
return;
}
}
if ($node) {
if ($node->getStatus() == 0) {
throw new NotFoundHttpException('Inactive page');
}
$request->attributes->set('page', $node);
if ($node->getTravelProgram() != null && (
$restOfPath == '/buchen' || $restOfPath == '/berechne-gesamtpreis' || $restOfPath == '/show_nationality_country_text')) {
// Special case: Booking actions
$request->attributes->set('travelProgramPage', $node);
$request->attributes->set('action', $restOfPath);
$request->attributes->set('_controller', 'AppBundle:Booking:index');
} elseif ($restOfPath && $node->getTravelProgram() !== null && (
$restOfPath === '/pdf')) {
$request->attributes->set('_controller', 'AppBundle:Cms:pdf');
} elseif ($node->getTravelProgram() !== null) {
if ($node->getTravelProgram()->getStatus() == 0) {
throw new \NotFoundHttpException('Inactive travel program');
}
$request->attributes->set('_controller', 'AppBundle:Cms:travelProgram');
} elseif (
$node->getFewoLodging() != null &&
($restOfPath === '/buchen' || $restOfPath === '/berechne-gesamtpreis')
) {
$request->attributes->set('fewoTravelProgramPage', $node);
$request->attributes->set('action', $restOfPath);
$request->attributes->set('_controller', 'AppBundle:FewoBooking:index');
} elseif ($node->getFewoLodging() !== null) {
$request->attributes->set('fewoLodgingPage', $node);
$request->attributes->set('action', $restOfPath);
$request->attributes->set('_controller', 'AppBundle:Cms:fewoLodging');
} else {
$handler = $node->getTemplate() ? ucfirst($node->getTemplate()) : 'Default';
$request->attributes->set('_controller', 'AppBundle:Cms:' . $handler);
if ($node->getTemplate()) {
try {
$controller = $this->controllerResolver->getController($request);
} catch (\LogicException $e) {
// If there is no controller action, call the default action and pass the template name
$request->attributes->set('_controller', 'AppBundle:Cms:Default');
$request->attributes->set('template', $node->getTemplate());
}
}
}
} else {
return;
}
$event->setController($controller ?? $this->controllerResolver->getController($request));
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

18
ss-sudan-readme.txt Normal file
View file

@ -0,0 +1,18 @@
deaktiviert
394
nilkreuzfahrt
437
owner 394
status 0 show_in_navi = 0
OLD = 0 nicht wieder aktivieren
nilschiff-ss-sudan
371
owner 437
status 0 show_in_navi = 0
OLD = 0 nicht wieder aktivieren
agatha-christie-suite-nilschiff-ss-sudan

View file

@ -0,0 +1,7 @@
{
"folders": [
{
"path": "."
}
]
}

31
web/clear_cache_dev.php Normal file
View file

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html>
<head>
<title>Update</title>
<meta charset="utf-8">
</head>
<body>
<pre><code>
<?php
function cmd($cmd)
{
$cmd .= ' 2>&1';
$printCmd = preg_replace('/(--password\s*)([^\s]+)(\s|$)/i', '$1****$3', $cmd);
echo "<b>". $printCmd ."</b>\n\n";
echo shell_exec($cmd);
echo "\n\n";
}
chdir(dirname(__FILE__).'/..');
//cmd('cp composer.lock composer.lock~');
//cmd('svn update --username redmine --password 89QQvQtf');
//cmd('cmp --silent composer.lock composer.lock~ || php composer.phar install');
//cmd( 'rm composer.lock~');
cmd('/Applications/MAMP/bin/php/php7.2.34/bin/php bin/console cache:clear');
//cmd('php bin/console assetic:dump --env=prod --no-debug');
?>
</code></pre>
</body>
</html>