Ext: sg_seo

License: GNU GPL, Version 2

Repository: https://gitlab.sgalinski.de/typo3/sg_seo

Please report bugs here: https://gitlab.sgalinski.de/typo3/sg_seo

About

This extension provides a Google sitemap implementation with additional features like:

  • ignoring pages with canonical links to other pages
  • respecting noindex & nofollow options
  • ignoring shortcuts and status pages

Scheduler

There are two scheduler tasks for this extension

  1. A scheduler task to generate a sitemap for each language
  2. A scheduler task to generate webp versions of the processed files

Sitemap generation

This scheduler task can be activated to create static sitemaps of each language, which then can be delivered instead of a dynamic process which could take a long time.

The task takes 3 arguments:

  1. relativePathToSitemap: Describes where to save the generated sitemap files in the file system. This defaults to the project root.
  2. siteRootId: The id of the site root, where the sitemap will start
  3. enableFilter: Switch to add hidden pages (does not affect "NOT_IN_MENU") to the sitemap

WebP generation

This scheduler task can generate webp versions of the images in processed folders. It uses the PHP builtin function imagewebp and thus relies on the gd-extension to be installed (default requirement of TYPO3).

The task takes 5 arguments:

  1. storageUid: The uid of the file storage to process. Defaults to 1 which usually is the fileadmin
  2. savingPercentage: Define the minimum percentage of filesize savings the process has to achieve. By default, it is set to 10
  3. imageQuality: Define the image quality. This is set to 80 by default.
  4. batchSize: The number of files to process in one go (Note: The task will not stop after the amount of files, but fetch the amount of files, then process them before fetching the next batch. If it crashes, the task can be executed again, and it will continue with the batch it last worked on.) Defaults to 500.
  5. processGif: Include gif images in the processing, defaults to 0, which means no

Apache .htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_ACCEPT} image/webp
    RewriteCond %{DOCUMENT_ROOT}/$1.$2.webp -f
    RewriteRule ^(fileadmin/.+)\.(png|jpe?g)$ $1.$2.webp [L]
</IfModule>

<IfModule mod_headers.c>
    Header append Vary Accept env=REDIRECT_accept
</IfModule>

AddType image/webp .webp

nginx

Add a map directive in your global nginx configuration:

map $http_accept $webp_suffix {
    default   "";
    "~*webp"  ".webp";
}

and add these rules to your server configuration:

location ~* ^/fileadmin/.+\.(png|jpg|jpeg)$ {
        add_header Vary Accept;
        try_files $uri$webp_suffix $uri =404;
}
location ~* ^/other-storage/.+\.(png|jpg|jpeg)$ {
        add_header Vary Accept;
        try_files $uri$webp_suffix $uri =404;
}

Make sure that there are no other rules that already apply to the specified image formats and prevent further execution!

Extensions - SeoAccessPageListEventListener

You can hook into the process to extend the sitemap easily.

Example: Services.yaml

services:
    MyExt\Event\Listener\SeoAccessPageListEventListener:
        tags:
            -   name: event.listener
                identifier: 'accessPageListEvent'
                event: SGalinski\SgSeo\Events\AccessPageListEvent

EventListener class:

class SeoAccessPageListEventListener {
    public function __invoke(\SGalinski\SgSeo\Events\AccessPageListEvent $event) {
        $pageList = $event->getPageList();
        // ... do something with the list and write it back to the event
        $pageList[] = [
            'url' => 'MY FURTHER URL',
            'title' => ''
        ];
        $event->setPageList($pageList);
    }
}

More Events

Additionally there are new Events with sg_seo 5.3:

OverrideSitemapRendererEvent

allows to set a different Renderer for the final output

ShouldIncludePageInSitemapEvent

given an array of $pageInfo and a $language, you can decide not to use a page in normal pageRendering

Extensions - XmlSitemapDataProviders

We also support the official XmlSitemapDataProviders API of TYPO3. You can see more here https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/XmlSitemap/Index.html .

When we generate the sitemap, we generate every sitemap type to a new index. The default xmlSitemap type is being merged into our sitemap.xml. Please bear in mind, that we ignore any additional data providers for the pages unique key, as this is the default TYPO3 unique key and we don't want any duplicates. Use another unique key for your extension.

The other sitemap types are generated into their own respective sitemap indices.

Example (News extension):

plugin.tx_seo {
    config {
        xmlSitemap { // new entries to the default sitemap.xml
            sitemaps {
                news {
                    provider = GeorgRinger\News\Seo\NewsXmlSitemapDataProvider
                    config {
                        ...
                    }
                }
            }
        }
        googleNewsSitemap { // a completely new googlenewssitemap.xml
            sitemaps {
                news {
                    provider = GeorgRinger\News\Seo\NewsXmlSitemapDataProvider
                    config {
                        googleNews = 1
                        ...
                        template = GoogleNewsXmlSitemap.html
                    }
                }
            }
        }
    }
}

This example will result into the news unique key data provider entries being added into the default sitemap (xmlSitemap). The googleNewsSitemap entry will fetch the entries from this dataprovider and create a brand new sitemap index.

Changing the values of your tags like , <description> etc.</h2> <p>Overrinding the values of <title> etc. is not trivial, as TYPO3's PageRenderer is sometimes called after caching the HTML output for output for the <head> <link rel="alternate" hreflang="en" href="https://www.sgalinski.de/en/open-source/sg-seo/" /> <link rel="alternate" hreflang="de" href="https://www.sgalinski.de/open-source/sg-seo/" /> <link rel="alternate" hreflang="x-default" href="https://www.sgalinski.de/open-source/sg-seo/" /> <link rel="canonical" href="https://www.sgalinski.de/en/open-source/sg-seo/" />. For this purpose we introduced the HeadTagService that you can call in your Controllers. It comes handy when you have plugins with database driven models and you want their metadata to be used for the page metadata. Check out this example with jobs:</p> <pre><code>$headTagService = GeneralUtility::makeInstance( HeadTagService::class, TRUE, $job->getTitle(), $job->getDescription(), '&tx_sgjobs_jobapplication[jobId]=' . $jobId ); $headTagService->execute(); </code></pre> <p>The 2nd parameter is very important - TRUE/FALSE describes whether the ControllerAction from which you are calling is cachable or not. This way the service decides what is the proper way to override the values of the next arguments:</p> <ul> <li>title</li> <li>description</li> <li>GET arguments that must be appended to the router for the generation of the canonical and hreflang tags</li> </ul> </div> </div> <!--TYPO3SEARCH_end--> </main> <a href="#top" title="Back to top" class="m-to-top"> <span class="sr-only"> Back to top </span> </a> <div class="cookie-alert closed" id="cookie-alert"> <div class="container"> <div class="row"> <div class="col-sm-11"> </div> <div class="col-sm-1"> <a href="#" class="btn btn-warning btn-md">OK</a> </div> </div> </div> </div> <footer class="footer"> <div class="container"> <div class="row default-content-element "> <div class="col-md-6 col-sm-4 col-xs-6 col-xxs-12 "> <div id="c13020" class="default-content-element"> <div class="ce-textpic ce-left ce-above"> <div class="ce-bodytext"> <p><span class="lead">Sitemap</span></p><ul class="default-list"> <li><a href="/en/">Digital Agency for TYPO3, Custom Software, Mobile Apps & Shopware </a></li> <li><a href="/en/typo3-agency/">The TYPO3 agency from Munich</a></li> <li><a href="/en/shopware-agency/">The agency for online shops with Shopware from Munich</a></li> <li><a href="/en/mobile-app-agency/">Agency for mobile Android and iOS apps from Munich</a></li> <li><a href="/en/custom-software-symfony-agency/">Symfony Agency from Munich – Custom Software Development</a></li> <li><a href="/en/typo3-products-web-development/">Web development Products for TYPO3 and Intellij IDEs</a></li> <li><a href="/en/company/">The Digital Agency from Munich</a></li> </ul><p>Products</p><ul class="default-list"> <li><a href="/en/typo3-products-web-development/typo3-fluid-phpstorm-intellij/">The Fluid plug-in for IntelliJ IDEs like PhpStorm</a></li> <li><a href="/en/typo3-products-web-development/typoscript-phpstorm-webstorm-intellij/">The TypoScript plug-in for IntelliJ IDEs like PhpStorm</a></li> <li><a href="/en/typo3-products-web-development/cookie-optin-for-typo3/">DSGVO & ePrivacy Cookie Consent Extension for TYPO3</a></li> <li><a href="/en/typo3-products-web-development/seo-redirects/">SEO Redirects and Error 404 Handling via TYPO3-Extension</a></li> </ul><p>From our expert topics blog</p><ul class="default-list"> <li><a href="/en/typo3-agency/technology/how-to-create-a-basic-rest-api-in-symfony/">How to create a basic REST API in Symfony?</a></li> <li><a href="/en/typo3-agency/technology/gitlab-merge-requests-easily-explained/">GitLab merge requests easily explained</a></li> <li><a href="/en/typo3-agency/technology/how-to-work-with-doctrine-migrations-in-symfony/">How to work with Doctrine Migrations in Symfony?</a></li> <li><a href="/en/typo3-agency/technology/top-2022-07-18-upgrade-to-typo3-v11-lts-why-a-typo3-upgrade-is-worthwhile/">Upgrade to TYPO3 v11 LTS – Why a TYPO3 upgrade is worthwhile</a></li> <li><a href="/en/typo3-agency/technology/install-typo3-on-an-apache-web-server/">Install TYPO3 on an Apache web server</a></li> </ul> </div> </div> </div> <div id="c15082" class="default-content-element"><a id="c24454" class="ce-id-anchor"></a><article class="default-content-element sgjobs-job-offers-teaser"><h4><span class="sgjobs-job-offers-teaser-number"> 4 </span> Open vacancies </h4><ul class="sgjobs-job-offers-teaser-list"><li><a href="/en/company/jobs/application/apply/frontend-engineer-m-f-d/"> Frontend Engineer (m/f/d) </a></li><li><a href="/en/company/jobs/application/apply/web-developer-typo3-m-f-d/"> Web Developer TYPO3 (m/f/d) </a></li><li><a href="/en/company/jobs/application/apply/working-student-web-developer-m-f-d-2021/"> Working Student Web Development (m/f/d) </a></li></ul><a href="/en/company/jobs/" class="cta-link sgjobs-job-offers-teaser-more"> All vacancies </a></article></div> </div> <div class="col-md-3 col-sm-4 col-xs-6 col-xxs-12 "> <div id="c1225" class="default-content-element"> <div class="ce-textpic ce-left ce-above"> <div class="ce-bodytext"> <p><span class="lead">Technology partner of</span></p> </div> </div> </div> <div id="c1540" class="default-content-element"> <div class="ce-textpic ce-center ce-above"> <div class="ce-gallery" data-ce-columns="1" data-ce-images="1"> <div class="ce-outer"> <div class="ce-inner"> <div class="ce-row"> <div class="ce-column"> <figure class="image"> <a href="https://typo3.org/project/association" target="_blank" rel="noreferrer"> <picture> <img class="image-embed-item " width="210" height="105" alt="TYPO3 Gold Membership" src="https://cdn.sgalinski.de/fileadmin/media/footer/typo3-gold-membership.svg" loading="lazy" /> </picture> </a> </figure> </div> </div> </div> </div> </div> </div> </div> <div class="row default-content-element "> <div class="col-md-6 col-sm-6 col-xs-12 "> <div id="c13604" class="default-content-element"> <div class="ce-textpic ce-left ce-above"> <div class="ce-gallery" data-ce-columns="1" data-ce-images="1"> <div class="ce-row"> <div class="ce-column"> <figure class="image"> <a href="https://typo3.org/project/technology-supporters/" target="_blank" rel="noreferrer"> <picture> <img class="image-embed-item " width="115" height="151" alt="Technology Supporter of TYPO3" src="https://cdn.sgalinski.de/fileadmin/media/footer/Typo3Supporter4.svg" loading="lazy" /> </picture> </a> </figure> </div> </div> </div> </div> </div> </div> <div class="col-md-6 col-sm-6 col-xs-12 "> <div id="c13605" class="default-content-element"> <div class="ce-textpic ce-left ce-above"> <div class="ce-gallery" data-ce-columns="1" data-ce-images="1"> <div class="ce-row"> <div class="ce-column"> <figure class="image"> <a href="https://www.typo3-solr.com/en/sponsors/our-sponsors/" target="_blank" rel="noreferrer"> <picture> <img class="image-embed-item " width="170" height="235" alt="Solr for TYPO3 Partner" src="https://cdn.sgalinski.de/fileadmin/media/footer/badges-solr_fuer_typo3_2020.svg" loading="lazy" /> </picture> </a> </figure> </div> </div> </div> </div> </div> </div> </div> <div id="c1548" class="default-content-element"> <div class="ce-textpic ce-left ce-above"> <div class="ce-bodytext"> <p><span class="lead">We are partners of</span></p> </div> </div> </div> <div id="c1549" class="default-content-element"> <div class="ce-textpic ce-left ce-above"> <div class="ce-gallery" data-ce-columns="1" data-ce-images="1"> <div class="ce-row"> <div class="ce-column"> <figure class="image"> <a href="https://www.muenchen.de/" target="_blank" rel="noreferrer"> <picture> <img class="image-embed-item " width="625" height="117" alt="Partner of München.de" src="https://cdn.sgalinski.de/fileadmin/media/footer/logo-muenchende_01.svg" loading="lazy" /> </picture> </a> </figure> </div> </div> </div> </div> </div> <div id="c12968" class="default-content-element"> <div class="ce-textpic ce-left ce-below"> <div class="ce-bodytext"> <p><span class="lead">We are certified</span></p> </div> <div class="ce-gallery" data-ce-columns="1" data-ce-images="1"> <div class="ce-row"> <div class="ce-column"> <figure class="image"> <a href="https://de.ryte.com/" target="_blank" rel="noreferrer"> <picture> <source media="(max-width: 480px)" srcset="https://cdn.sgalinski.de/fileadmin/_processed_/4/d/csm_ryte_expert_badge_e1c74516ba.png" /> <img class="image-embed-item image-no-svg" width="838" height="283" alt="RYTE Expert Badge" src="https://cdn.sgalinski.de/fileadmin/media/footer/ryte_expert_badge.png" loading="lazy" /> </picture> </a> </figure> </div> </div> </div> </div> </div> </div> <div class="col-md-3 col-sm-4 col-xs-6 col-xxs-12 "> <div id="c1541" class="default-content-element"> <div class="ce-textpic ce-left ce-above"> <div class="ce-bodytext"> <p><span class="lead">Contact</span></p> <p> <a href="tel:004936076209504">+49 (0) 36076 209504</a><br> <a href="tel:004915121240734"> +49 (0) 151 21240734</a><br> <a href="javascript:linkTo_UnCryptMailto(%27hvdgoj5npkkjmoVnbvgdinfd9yz%27);"> support@sgalinski.de</a><br> <a href="skype:stefangalinski?add"> stefangalinski</a><br> <br> <strong>sgalinski Internet Services</strong><br> Proprietor: Stefan Galinski<br> Bahnhofstr. Gernrode 52<br> 37339 Gernrode</p> </div> </div> </div> <div id="c15101" class="default-content-element"><a id="c15102" class="ce-id-anchor"></a><p class="lead"><a href="https://twitter.com/sgalinski" target="_blank" rel="noopener"><span class="fa fa-twitter-square"></span></a> <a href="https://www.youtube.com/channel/UC0EhmXpBLHUeUp1ELMfXrTw" target="_blank" rel="noopener"><span class="fa fa-youtube-square"></span></a> <a href="https://www.xing.com/companies/sgalinskiinternetservices" target="_blank" rel="noopener"><span class="fa fa-xing-square"></span></a> <a href="https://www.facebook.com/sgalinskiAgency" target="_blank" rel="noopener"><span class="fa fa-facebook-square"></span></a> <a href="https://www.linkedin.com/company/sgalinski-internet-services" target="_blank" rel="noopener"><span class="fa fa-linkedin-square"></span></a></p><p><a href="https://cdn.sgalinski.de/news.xml" target="_blank" rel="noopener"><span class="fa fa-rss"></span> News Feed</a></p><p><a href="/en/impressum/"><span class="fa fa-external-link-square"></span> Imprint</a><br /><a href="/en/data-protection/"><span class="fa fa-external-link-square"></span> Data Protection</a><br /><a href="/en/html-sitemap/"><span class="fa fa-external-link-square"></span> Sitemap</a></p><p><a href="/unternehmen/kontakt/"><span class="fa fa-envelope"></span> Contact</a></p></div> <div id="c13208" class="default-content-element"> <div class="ce-textpic ce-left ce-above"> <div class="ce-bodytext"> <p><span class="lead">We on n-tv</span></p><ul class="default-list"> <li><a href="https://firmen.n-tv.de/digitalagentur-muenchen.html" target="_blank" rel="noreferrer noopener">Digital Agency Munich</a></li> <li><a href="https://firmen.n-tv.de/app-agentur.html" target="_blank" rel="noreferrer noopener">App Agency</a></li> <li><a href="https://firmen.n-tv.de/typo3-agentur-muenchen.html" target="_blank" rel="noreferrer noopener">TYPO3 Agency Munich</a></li> </ul> </div> </div> </div> </div> </div> </div> <div class="copyright-footer"> <div class="container"> © sgalinski Internet Services. Implemented by the TYPO3 agency <a href="https://www.sgalinski.de/" target="_blank" title="Your TYPO3 agency in Unterföhring">sgalinski Internet Services</a> </div> </div> </footer> </div> <div class="sg-search-box" id="search"> <button title="Close (Esc)" type="button" class="mfp-close">×</button> <form method="post" name="search" class="search-field" id="tx_indexedsearch" action=""> <div> <input type="hidden" name="tx_indexedsearch_pi2[__referrer][@extension]" value="" /> <input type="hidden" name="tx_indexedsearch_pi2[__referrer][@controller]" value="Standard" /> <input type="hidden" name="tx_indexedsearch_pi2[__referrer][@action]" value="index" /> <input type="hidden" name="tx_indexedsearch_pi2[__referrer][arguments]" value="YTowOnt9a6e6adb7b28cd387f14636f852316af4ed649939" /> <input type="hidden" name="tx_indexedsearch_pi2[__referrer][@request]" value="{"@extension":null,"@controller":"Standard","@action":"index"}ab18e6bbe252eceac085fd18fe398512e2bc9fd5" /> <input type="hidden" name="tx_indexedsearch_pi2[__trustedProperties]" value="{"search":{"_sections":1,"_freeIndexUid":1,"pointer":1,"ext":1,"searchType":1,"defaultOperand":1,"mediaType":1,"sortOrder":1,"group":1,"languageUid":1,"desc":1,"numberOfResults":1,"extendedSearch":1,"sword":1}}67b5c31834524cc31709443550d691b22f055889" /> </div> <div class="tx-indexedsearch-hidden-fields"> <input type="hidden" name="tx_indexedsearch_pi2[search][_sections]" value="0" /> <input id="tx_indexedsearch_freeIndexUid" type="hidden" name="tx_indexedsearch_pi2[search][_freeIndexUid]" value="_" /> <input id="tx_indexedsearch_pointer" type="hidden" name="tx_indexedsearch_pi2[search][pointer]" value="0" /> <input type="hidden" name="tx_indexedsearch_pi2[search][ext]" value="" /> <input type="hidden" name="tx_indexedsearch_pi2[search][searchType]" value="1" /> <input type="hidden" name="tx_indexedsearch_pi2[search][defaultOperand]" value="0" /> <input type="hidden" name="tx_indexedsearch_pi2[search][mediaType]" value="-1" /> <input type="hidden" name="tx_indexedsearch_pi2[search][sortOrder]" value="rank_flag" /> <input type="hidden" name="tx_indexedsearch_pi2[search][group]" value="" /> <input type="hidden" name="tx_indexedsearch_pi2[search][languageUid]" value="" /> <input type="hidden" name="tx_indexedsearch_pi2[search][desc]" value="" /> <input type="hidden" name="tx_indexedsearch_pi2[search][numberOfResults]" value="100" /> <input type="hidden" name="tx_indexedsearch_pi2[search][extendedSearch]" value="" /> </div> <input placeholder="Was erwarten Sie von uns?" class="tx-indexedsearch-searchbox-sword form-control" id="tx-indexedsearch-searchbox-sword" type="text" name="tx_indexedsearch_pi2[search][sword]" /> </form> </div> <div class="contact-layer" id="contact-layer"> <button title="Close (Esc)" type="button" class="mfp-close">×</button> <div class="row default-content-element "> <div class="col-md-4 col-sm-12 col-xs-12 "> <div id="c25204" class="default-content-element"> <div class="ce-textpic ce-left ce-above"> <div class="ce-gallery" data-ce-columns="1" data-ce-images="1"> <div class="ce-row"> <div class="ce-column"> <figure class="image"> <picture> <source media="(max-width: 480px)" srcset="https://cdn.sgalinski.de/fileadmin/_processed_/8/8/csm_sgalinski_map_neu_f68f2b07d3.jpg" /> <img class="image-embed-item image-no-svg" width="800" height="1438" alt="" src="https://cdn.sgalinski.de/fileadmin/_processed_/8/8/csm_sgalinski_map_neu_af6e7bb467.jpg" loading="lazy" /> </picture> </figure> </div> </div> </div> </div> </div> </div> <div class="col-md-8 col-sm-12 col-xs-12 "> <div id="c1547" class="default-content-element"> <header> <h2 class=""> Please contact us </h2> </header> <div class="ce-textpic ce-left ce-above"> <div class="ce-bodytext"> <p>You have an interesting project idea, would like to engage our agency for your TYPO3 / Shopware or Symfony project or contact us about another topic? We look forward to receiving your enquiry via our form or via one of the other contact channels.</p> <p><a href="javascript:linkTo_UnCryptMailto(%27hvdgoj5npkkjmoVnbvgdinfd9yz%27);" class="btn btn-md btn-primary">support@sgalinski.de</a></p> </div> </div> </div> <div id="c7774" class="default-content-element"><a id="c9640" class="ce-id-anchor"></a><form enctype="multipart/form-data" method="post" id="contact-7774" action="/en/open-source/sg-seo/?tx_form_formframework%5Baction%5D=perform&tx_form_formframework%5Bcontroller%5D=FormFrontend&cHash=b0e3c196d28a5a12d1513e1920eaf899#contact-7774"><div><input type="hidden" name="tx_form_formframework[contact-7774][__state]" value="TzozOToiVFlQTzNcQ01TXEZvcm1cRG9tYWluXFJ1bnRpbWVcRm9ybVN0YXRlIjoyOntzOjI1OiIAKgBsYXN0RGlzcGxheWVkUGFnZUluZGV4IjtpOjA7czoxMzoiACoAZm9ybVZhbHVlcyI7YTowOnt9fQ==757c395ef09e4205b3ae91151267132714c10ecd" /><input type="hidden" name="tx_form_formframework[__trustedProperties]" value="{"contact-7774":{"name":1,"email":1,"phone":1,"message":1,"data_protection":1,"__currentPage":1}}5b0a6640f23ece4a8788beb93f2889e9cf36051f" /></div><div class="form-group"><div class="input"><label class="control-label smart-label" for="contact-7774-name">Your Name <span class="required">*</span></label><input placeholder="Name *" required="required" data-element-type="Text" class=" form-control form-textfield form-textinput" id="contact-7774-name" type="text" name="tx_form_formframework[contact-7774][name]" value="" /></div></div><div class="form-group"><div class="input"><label class="control-label smart-label" for="contact-7774-email">Your E-mail Address <span class="required">*</span></label><input placeholder="E-mail Address *" required="required" data-element-type="Text" class=" form-control form-textfield form-textinput" id="contact-7774-email" type="text" name="tx_form_formframework[contact-7774][email]" value="" /></div></div><div class="form-group"><div class="input"><label class="control-label smart-label" for="contact-7774-phone">Your Telephone Number</label><input placeholder="Telephone Number" data-element-type="Text" class=" form-control form-textfield form-textinput" id="contact-7774-phone" type="text" name="tx_form_formframework[contact-7774][phone]" value="" /></div></div><div class="form-group"><div class="input"><label class="control-label smart-label" for="contact-7774-message">Your Message <span class="required">*</span></label><textarea placeholder="Message *" required="required" data-element-type="Textarea" rows="5" cols="20" class="xxlarge form-control form-textfield form-textarea" id="contact-7774-message" name="tx_form_formframework[contact-7774][message]"></textarea></div></div><div class="form-group"><div class="input checkbox"><div class="form-check"><label class="add-on form-check-label" for="contact-7774-data_protection"><input type="hidden" name="tx_form_formframework[contact-7774][data_protection]" value="" /><input required="required" data-element-type="Checkbox" class="add-on" id="contact-7774-data_protection" type="checkbox" name="tx_form_formframework[contact-7774][data_protection]" value="1" /><span>I have taken note of the  <a href="/en/data-protection/">Privacy Policy</a> and agree with the use of my data described there. <span class="required">*</span></span></label></div></div></div><div class="actions"><nav class="form-navigation"><div class="btn-toolbar" role="toolbar"><div class="btn-group" role="group"><span class="btn-group next submit"><button class="btn btn-primary" type="submit" name="tx_form_formframework[contact-7774][__currentPage]" value="1"> Submit now </button></span></div></div></nav></div></form></div> </div> </div> </div> <div class="contact-information-layer" id="contact-information-layer"> <button title="Close (Esc)" type="button" class="mfp-close">×</button> <div class="contact-information-layer-container"> Do you have any questions? <br/> Contact us! <ul class="contact-information-layer-list"> <li> <a href="mailto:support@sgalinski.de"><i class="fa fa-envelope-o" aria-hidden="true"></i> support@sgalinski.de</a> </li> <li> <a href="tel:+4936076209504"><i class="fa fa-phone ml-1" aria-hidden="true"></i> +49 (0) 36076 209504</a> </li> <li> <a href="tel:+4915121240734"><i class="fa fa-whatsapp ml-1" aria-hidden="true"></i> +49 (0) 151 21240734</a> </li> </ul> </div> </div> </body> </html>