TYPO3 Routing war eine der am meisten erwarteten Ergänzungen des CMS und ist seit TYPO3 v9 Bestandteil des Cores. In diesem Artikel führen wir Sie von den Grundlagen bis hin zu erweiterten Routing-Konfigurationen.
Routing ist ein Bestandteil beim Aufbau eines modernen und strukturierten TYPO3-Projekts. Teams, die dasselbe Projekt um kontrolliert verwaltete KI-Tools erweitern, können die AI Foundation für TYPO3 nutzen, um KI-Anbieter, Berechtigungen, Prompts und Automatisierungen zentral zu verwalten.
In der Vergangenheit war die TYPO3-Community auf Erweiterungen zur Verwaltung von TYPO3-URLs wie EXT:realurl angewiesen. Für ein so wichtiges Feature war es für jeden sehr schwierig, sich auf andere Erweiterungen zu verlassen. Wie dem auch sei, jetzt haben wir ein fantastisches TYPO3-Routing-Feature innerhalb des TYPO3 Kerns, also lassen Sie uns untersuchen, wie es funktioniert.
Wussten Sie davon?
Das Routing in TYPO3 ist auf Basis der Symfony-Routing-Komponenten implementiert.
Was ist TYPO3-Routing und deren Terminologien?
Der menschenfreundliche Name des Routing ist "Sprechende URL", TYPO3 ist ein bisschen berühmt dafür, "entwicklerfreundliche" Namen für CMS-Funktionen zu vergeben ;)
Vor: https:// t3planet .com/index.php?id=10
Nach: https:// t3planet .com/news
Vor: https:// t3planet .com/profiles?user=magdalena
Nach: https:// t3planet .com/profiles/magdalena
Die Route
Die sprechende URL als Ganzes (ohne den Domain-Teil); zum Beispiel /blog/post/typo3-routing
Schnecke
Eindeutiger Name für eine Ressource, der bei der Erstellung von URLs verwendet werden soll; zum Beispiel könnte der Slug der Blog-Post-Seite /blog/post und der Slug eines Blog-Eintrags "typo3-routing" lauten.
Was ist eine Voraussetzung beim TYPO3-Routing?
Um das TYPO3-Routing zu aktivieren und gut zu konfigurieren, sollten Sie die folgenden Einstellungen für Ihren speziellen Web-Server konfigurieren.
Apache
Enable mod_rewrite Apache modules. The following modules are used by the default .htaccess
# .Htaccess
RewriteEngine on
RewriteRule ^(typo3/|fileadmin/|typo3conf/|typo3temp/|uploads/|) - [L]
RewriteRule ^typo3$ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .* index.php [L]
Microsoft Internet Information Services (IIS)
Stellen Sie sicher, dass das URL-Rewrite-Plugin auf Ihrem System installiert ist.
https://www.iis.net/downloads/microsoft/url-rewrite
NGINX
NGINX web server does not support any static file like htaccess in the document root by default.
The NGINX configuration has to be set up manually.
location / {
try_files $uri $uri/ /index.php$is_args$args;
} TYPO3 Seitenbasiertes Routing
Um das seitenbasierte Routing zu aktivieren, müssen Sie die folgenden Schritte konfigurieren.
Schritt 4. Testlauf-Frontend-URL
Um mehr über die Verwaltung von TYPO3-Websites zu erfahren, können Sie meinen Artikel lesen
How to Manage TYPO3 Site Configuration?
Einführung in config.yaml
Sobald Sie die Site-Konfiguration erstellt haben, generiert TYPO3 automatisch die Datei config.yaml an der unten angegebenen Stelle.
Für Composer-basierte TYPO3-Installation
/project-root/config/sites/your-site-name/
Für Nicht-Composer-basierte TYPO3-Installationen
/project-root/typo3conf/sites/your-site-name/
Beispiel für config.yaml
base: yourtypo3site.com
errorHandling:
-
errorCode: '404'
errorHandler: Page
errorContentSource: 't3://page?uid=1693'
languages:
-
title: English
enabled: true
languageId: '0'
base: /
typo3Language: default
locale: en_US.UTF-8
iso-639-1: en
navigationTitle: English
hreflang: en-US
direction: ''
flag: gb
rootPageId: 1
Verbesserer: TYPO3-Routing für Erweiterungen
TYPO3 kümmert sich um das Routing von CMS-Seiten mit coolen Backend-Funktionen menschenfreundlicher URLs. Aber was ist mit Ihren eigenen oder TER TYPO3-Erweiterungen?
Beispiel für Ihre Extension-URL https:// t3planet .com/path-to/my-page/products/index.php?id=10&tx_product_name[controller]=Product... sollte sein wie https:// t3planet .com/path-to/my-page/products/{product-name}
1. Einfacher Enhancer (Typ: Einfach)
Der Simple Enhancer arbeitet mit verschiedenen Routenargumenten, um sie einem Argument zuzuordnen, das später verwendet werden kann.
# Vor
https:// t3planet .com/index.php?id=13&category=241&tag=T3Terminal
# Nach
https:// t3planet .com/path-to/my-page/show-by-category/241/T3Terminal
# Config.yaml
routeEnhancers:
# Eindeutiger Name für die Enhancer, der intern zur Referenzierung verwendet wird
CategoryListing:
type: Simple
limitToPages: [13]
routePath: '/show-by-category/{category_id}/{tag}'
defaults:
tag: ''
requirements:
category_id: '[0-9]{1,3}'
tag: '[a-zA-Z0-9].*'
_arguments:
category_id: 'category'
2. Plugin Enhancer (type: Plugin)
Der Plugin Enhancer arbeitet mit Plugins auf einer Seite, die allgemein als Pi-basierte Plugins bekannt sind, wo früher die folgenden GET/POST-Variablen verwendet wurden:
# Vor
https:// t3planet .com/index.php?id=13&tx_felogin_pi1[forgot]=1&&tx_felogin_pi1[user]=82&tx_felogin_pi1[hash]=ABC
# Nach
https:// t3planet .com/path-to/my-page/forgot-password/82/ABCDEFGHIJKLMNOPQRSTUVWXYZ012345
# Config.yaml
routeEnhancers:
ForgotPassword:
type: Plugin
limitToPages: [13]
routePath: '/forgot-password/{user}/{hash}'
namespace: 'tx_felogin_pi1'
defaults:
forgot: "1"
requirements:
user: '[0-9]{1..3}'
hash: '^[a-zA-Z0-9]{32}$'
3. Extbase Plugin Enhancer (type: Extbase)
Bei der Erstellung von Extbase-Plugins ist es sehr üblich, mehrere Controller/Action-Kombinationen zu haben. Der Extbase Plugin Enhancer ist daher eine Erweiterung des regulären Plugin Enhancers und bietet die Funktionalität, dass mehrere Varianten generiert werden, die typischerweise auf der Anzahl der Controller/Action-Paare aufbauen.
# Vor
https:// t3planet .com/index.php?id=13&tx_news_pi1[controller]=News&tx_news_pi1[action]=list&tx_news_pi1[page]=5
# Nach
https:// t3planet .com/path-to/my-page/list/5
# Config.yamlrouteEnhancers:NewsPlugin:type: ExtbaselimitToPages: [13]extension: Newsplugin: Pi1routes:- { routePath: '/list/{page}', _controller: 'News::list', _arguments: {'page': '@widget_0/currentPage'} }- { routePath: '/tag/{tag_name}', _controller: 'News::list', _arguments: {'tag_name': 'overwriteDemand/tags'}}- { routePath: '/blog/{news_title}', _controller: 'News::detail', _arguments: {'news_title': 'news'} }- { routePath: '/archive/{year}/{month}', _controller: 'News::archive' }defaultController: 'News::list'defaults:page: '0'requirements:page: '\d+'
4. Seitentyp-Dekorator (Typ: PageType)
Der PageType Enhancer (Decorator) ermöglicht das Hinzufügen eines Suffixes zu der vorhandenen Route (einschließlich vorhandener anderer Enhancer), um einen Seitentyp (GET-Parameter &type=) auf ein Suffix abzubilden.
# Vor
https:// t3planet .com/?type=13
# Nach
https:// t3planet .com/rss.feed.json
# Setup.typoscript
rssfeed = PAGE
rssfeed.typeNum = 13
rssfeed.10 < plugin.tx_myplugin
rssfeed.config.disableAllHeaderCode = 1
rssfeed.config.additionalHeaders.10.header = Content-Type: xml/rss
# Config.yaml
routeEnhancers:
PageTypeSuffix:
type: PageType
default: '.json'
index: 'index'
map:
'rss.feed': 13
'.json': 26
5. Kundenspezifische TYPO3-Erweiterungen entwickeln
Für den Fall, dass Sie Ihre eigene Geschäftslogik in Ihrer Erweiterung erstellen möchten, ist TYPO3 flexibel, um eigene TYPO3 Enhancer zu konfigurieren, indem Sie eine eigene Enhancer-Klasse registrieren
# ext_localconf.php
$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['enhancers']['MyCustomEnhancerAsUsedInYaml'] = \MyVendor\MyExtension\Routing\Enhancer\MyCustomEnhancer::class;
TYPO3-Aspekte: Routing für Erweiterungen
Die TYPO3 Aspects-Konfiguration ist hilfreich, um einen Parameter {blog}, der eine UID innerhalb von TYPO3 ist, auf den eigentlichen Blog-Slug abzubilden, d.h. ein Feld innerhalb der Datenbanktabelle, das den bereinigten/sanitisierten Titel des Blogs enthält (z.B. "typo3-routing" bildet auf die Blog-ID 10 ab).
1. StaticValueMapper
Der StaticValueMapper ersetzt Werte einfach auf einer 1:1-Zuordnungsliste eines Arguments in ein sprechendes Segment.
# Result
https:// t3planet .com/archive/{year}/{month}
# Config.yaml
routeEnhancers:
NewsArchive:
type: Extbase
limitToPages: [13]
extension: News
plugin: Pi1
routes:
- { routePath: '/{year}/{month}', _controller: 'News::archive' }
defaultController: 'News::list'
defaults:
month: ''
aspects:
month:
type: StaticValueMapper
map:
january: 1
february: 2
march: 3
april: 4
may: 5
june: 6
july: 7
august: 8
september: 9
october: 10
november: 11
december: 12
2. LocaleModifier
# Result
English Language: https:// t3planet .com/archive/{year}/{month}/
German Language: https:// t3planet .com/archiv/{year}/{month}/
# Config.yaml
routeEnhancers:
NewsArchive:
type: Extbase
limitToPages: [13]
extension: News
plugin: Pi1
routes:
- { routePath: '/{localized_archive}/{year}/{month}', _controller: 'News::archive' }
defaultController: 'News::list'
aspects:
localized_archive:
type: LocaleModifier
default: 'archive'
localeMap:
- locale: 'fr_FR.*|fr_CA.*'
value: 'archives'
- locale: 'de_DE.*'
value: 'archiv'
3. StaticRangeMapper
# Result
https:// t3planet .com/list/{page}/1
# Config.yaml
routeEnhancers:
NewsPlugin:
type: Extbase
limitToPages: [13]
extension: News
plugin: Pi1
routes:
- { routePath: '/list/{page}', _controller: 'News::list', _arguments: {'page': '@widget_0/currentPage'} }
defaultController: 'News::list'
defaults:
page: '0'
requirements:
page: '\d+'
aspects:
page:
type: StaticRangeMapper
start: '1'
end: '100'
4. PersistedAliasMapper
Wenn eine Erweiterung mit einem Slug-Feld oder einem anderen Feld geliefert wird, das für den sprechenden URL-Pfad verwendet wird, kann dieses Datenbankfeld zum Aufbau der URL verwendet werden:
# Result
https:// t3planet .com/detail/{path_segment}/
# Config.yaml
routeEnhancers:
NewsPlugin:
type: Extbase
limitToPages: [13]
extension: News
plugin: Pi1
routes:
- { routePath: '/detail/{news_title}', _controller: 'News::detail', _arguments: {'news_title': 'news'} }
defaultController: 'News::detail'
aspects:
news_title:
type: PersistedAliasMapper
tableName: 'tx_news_domain_model_news'
routeFieldName: 'path_segment'
routeValuePrefix: '/'
5. PersistedPatternMapper
Wenn ein Platzhalter aus mehreren Feldern der Datenbank geholt werden soll, ist der PersistedPatternMapper das Richtige für Sie. I
# Result
https:// t3planet .com/blog/{title}-{uid}/
# Config.yaml
routeEnhancers:
Blog:
type: Extbase
limitToPages: [13]
extension: BlogExample
plugin: Pi1
routes:
- { routePath: '/blog/{blogpost}', _controller: 'Blog::detail', _arguments: {'blogpost': 'post'} }
defaultController: 'Blog::detail'
aspects:
blogpost:
type: PersistedPatternMapper
tableName: 'tx_blogexample_domain_model_post'
routeFieldPattern: '^(?P<title>.+)-(?P<uid>\d+)$'
routeFieldResult: '{title}-{uid}'
6. Kundenspezifische TYPO3-Aspekte entwickeln
Ähnlich wie Enhancers bietet der TYPO3-Kern eine API, mit der Sie Ihre eigenen benutzerdefinierten Aspekte erstellen können, indem Sie sich unten registrieren.
# ext_localconf.php
$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['aspects']['MyCustomMapperNameAsUsedInYamlConfig'] = \MyVendor\MyExtension\Routing\Aspect\MyCustomMapper::class; Praktisches Beispiel für TYPO3 Enhancers & TYPO3-Aspekte
Example #1 TYPO3 Routing for EXT:news
# Result
Detail view: https:// t3planet .com/news/detail/the-news-title
Pagination: https:// t3planet .com/news/page-2
Category filter: https:// t3planet .com/news/my-category
Tag filter: https:// t3planet .com/news/my-tag
# Config.yaml
routeEnhancers:
News:
type: Extbase
extension: News
plugin: Pi1
routes:
- routePath: '/page-{page}'
_controller: 'News::list'
_arguments:
page: '@widget_0/currentPage'
- routePath: '/{news-title}'
_controller: 'News::detail'
_arguments:
news-title: news
- routePath: '/{category-name}'
_controller: 'News::list'
_arguments:
category-name: overwriteDemand/categories
- routePath: '/{tag-name}'
_controller: 'News::list'
_arguments:
tag-name: overwriteDemand/tags
defaultController: 'News::list'
defaults:
page: '0'
aspects:
news-title:
type: PersistedAliasMapper
tableName: tx_news_domain_model_news
routeFieldName: path_segment
page:
type: StaticRangeMapper
start: '1'
end: '100'
category-name:
type: PersistedAliasMapper
tableName: sys_category
routeFieldName: slug
tag-name:
type: PersistedAliasMapper
tableName: tx_news_domain_model_tag
routeFieldName: slug
Example #2 TYPO3 Routing for EXT:blog
Die TYPO3-Blog-Erweiterung bietet eine integrierte TYPO3-Routing-Konfiguration, die Sie einfach wie unten beschrieben in Ihr Projekt importieren können.
# Config.yaml
imports:
- { resource: "EXT:blog/Configuration/Routes/Default.yaml" }
Hilfreiche TYPO3-Routing-Erweiterungen
Um Ihnen die Arbeit zu erleichtern, habe ich versucht, hilfreiche TYPO3-Routing-Erweiterungen wie unten beschrieben zu finden.
3. Just In Case - Case-insensitive URLs
Bei eingehenden URLs spielt es keine Rolle, ob sie groß- oder kleingeschrieben sind, sie funktionieren einfach. Standardmäßig ist TYPO3 v9 streng, wenn Ihre eigentliche Seite aufgerufen wird aber Ihre Marketing-Typen nennen es . TYPO3 v9 speichert URLs standardmäßig in Kleinbuchstaben.
4. Extbase Yaml-Routen
Bietet die Möglichkeit, einen Route Slug an einen bestimmten Extbase Action-Endpunkt zu binden. Diese Erweiterung gibt Ihnen die Möglichkeit, den URL-Endpunkt mit einer bestimmten Extbase Action zu binden. Kurz gesagt, Sie können eine API für Ihr TYPO3-Projekt erstellen.
Merkmale
- Erlauben Sie dem Entwickler, seine eigene Route mit YAML zu registrieren.
- CRUD sofort einsatzbereit.
- Zusätzliche Middleware für Ihre Routen.
- Einfaches Modul für allgemeine Informationen.
6. Sprechende URL-Fragmente (Anker)
Fügt ein Slug-Feld für menschenlesbare Anker ("domain.com/page/#my-section") zu TYPO3-Inhaltselementen hinzu. Standardmäßig wird dieser Anker als id-Attribut des Header gerendert.
7. T3AI TYPO3 KI Erweiterung
Während TYPO3-Routing-Erweiterungen bei der URL-Struktur und der Navigation der Website helfen, bietet die T3AI TYPO3 AI Erweiterung intelligente Werkzeuge zur Verwaltung und Optimierung von Inhalten in TYPO3. Mit Funktionen zur Unterstützung bei der Inhaltserstellung, Übersetzung und SEO sorgt T3AI dafür, dass jede geroutete Seite sowohl für die Nutzerinteraktion als auch für Suchmaschinen optimiert ist. Ein zusätzliches Feature in T3AI: Sie können den Seitenslug direkt mit der T3AI-Erweiterung bearbeiten und generieren – einfach klicken und mit KI erstellen
Es wurde ein Upgrade-Assistent bereitgestellt, der sich um die Generierung von Slugs für alle vorhandenen Seiten kümmert. Wenn Sie zuvor RealURL verwendet haben, versucht der Assistent, die RealURL-Caches zu verwenden, um passende Slugs zu generieren. Dies wird jedoch nicht in allen Fällen erfolgreich sein, und Sie sollten die generierten Slugs erneut überprüfen, wenn Sie möchten, dass die URL-Struktur nach einem Upgrade gleich bleibt.
Für Ihre benutzerdefinierten TYPO3 extensions müssen Sie die Datenbank im Rahmen des TYPO3 Upgrade-Prozesses manuell aktualisieren, wie unten dargestellt.
# Database SQL Queries
UPDATE tx_table_name AS n JOIN tx_realurl_uniqalias AS r ON (n.uid = r.value_id AND r.tablename = 'tx_table_name') SET n.slug = r.value_alias WHERE (n.slug IS NULL OR n.slug = '');Eines möchte ich sagen: "Herzlichen Dank an Dmitry Dulepov" für seine engagierte Arbeit und Unterstützung der RealURL TYPO3 Extension für ein Jahr. EXT:realurl war eine der großartigen TYPO3 Extension, die uns sehr hilft.
Tipp 2. Verwenden Sie die Funktion "Importe"
Eine Routing-Konfiguration (und die Site-Konfiguration im Allgemeinen) kann schnell ziemlich lang werden, Sie sollten in Ihrer YAML-Konfiguration den Import nutzen, der es Ihnen erlaubt, Routing-Konfigurationen aus verschiedenen Dateien und mit verschiedenen Erweiterungen hinzuzufügen.
# Config.yaml
imports:
- { resource: "EXT:myblog/Configuration/Routes/Default.yaml" }
- { resource: "EXT:mynews/Configuration/Routes/Default.yaml" }
- { resource: "EXT:template/Configuration/Routes/Default.yaml" }
Tipp 3. Fügen Sie einen Schrägstrich oder ein .html-Suffix am Ende von URL
Sie können PageTypeSuffix einfach so konfigurieren, dass Sie .html am Ende der URL erhalten.
# Ergebnis
https:// t3planet .com/about
# Config.yaml
rootPageId: 7
base: 'https://mydomain.com/'
errorHandling: { }
routes: { }
routeEnhancers:
PageTypeSuffix:
type: PageType
default: '.html'
index: 'index'
map:
'.html': 0 Tipp 4. Wie setzt man statische Routen in TYPO3?
Statische Routen bieten eine Möglichkeit, scheinbar statische Inhalte auf einer Basis pro Standort zu erstellen.
StaticText (Beispiel von Robots.txt)
routes:
-
route: robots.txt
type: staticText
content: "User-agent: *\r\nDisallow: /typo3/\r\nDisallow: /typo3_src/\r\nAllow: /typo3/sysext/frontend/Resources/Public/*\r\n"
TYPO3 URL (Example of Sitemapxml)
routes:
-
route: sitemap.xml
type: uri
source: 't3://page?uid=1693&type=1533906435'
-
route: favicon.ico
type: uri
source: 't3://file?uid=77'
Tipp 5. Debugging-Route verbessert
Wenn es um die Auflösung geht, sind die PSR-15-Middleware "PageResolver" und der "PageRouter" ein guter Anfang beim Debugging.
typo3/sysext/core/Classes/Routing/PageRouter.php -> generateUri
typo3/sysext/extbase/Classes/Routing/ExtbasePluginEnhancer.php -> enhanceForGeneration
Tipp 6. Slug-Bearbeitung erhält automatische Umleitung
Beachten Sie jedoch, dass bei jeder Änderung eines Slugs (von Seiten oder Datensätzen) die alte URL automatisch als „307 Redirect“ gesetzt wird. Dies ist in Produktionsumgebungen sinnvoll, kann jedoch in TYPO3 Entwicklung umgebungen unnötige Einträge verursachen.
Tipp 7. Wie erstellt man TYPO3 Sitemap-Routing?
Sie können eine TYPO3-Sitemap mit PageTypeSuffix > PageType vorbereiten.
# Setup.typoscriptseo_sitemap = PAGEseo_sitemap {typeNum = 1533906435config {cache_period = 900disableAllHeaderCode = 1admPanel = 0removeDefaultJS = 1removeDefaultCss = 1removePageCss =additionalHeaders.10 {header = Content-Type:application/xml;charset=utf-8}}10 = USER10.userFunc = TYPO3\CMS\Seo\XmlSitemap\XmlSitemapRenderer->render}
Schlussfolgerung
Vielen Dank für die Lektüre dieses etwas langen TYPO3-Artikels.
Ich hoffe, dass Ihnen die grundlegenden bis fortgeschrittenen Fähigkeiten des TYPO3-Routings gefallen haben und Sie diese erkunden konnten. Lassen Sie mich kurz die wichtigsten Punkte zusammenfassen.
- Die Grundstruktur von config.yaml verstehen, die über das Backend-Modul Site Management verwaltet wird.
- Das URL-Segment können Sie ganz einfach unter Seite > Eigenschaft bearbeiten konfigurieren.
- Lernen und erforschen Sie TYPO3 Enhancer und TYPO3-Aspekt
Gibt es Probleme bei der Konfiguration des TYPO3-Routings? Ich bin Ihnen gerne behilflich, Fragen können Sie gerne in das Kommentarfeld schreiben.
Haben Sie ein glückliches TYPO3-Routing!
Very good post! We are linking to this particularly great article on our website. Keep up the good writing.https://atlas-krasnodar.ru/bitrix/redirect.php?goto=https%3A%2F%2Fste-b2b.agency
I know this if off topic but I'm looking into starting my own blog and was wondering what all is required to get setup? I'm assuming having a blog like yours would cost a pretty penny? I'm not very web smart so I'm not 100% sure.
Any recommendations or advice would be greatly appreciated.
Many thankshttp://cse.google.com.fj/url?sa=t&url=http%3A%2F%2Fsecurepayment.onagrup.net%2Findex.php%3Ftype%3D1%26lang%3Ding%26return%3Dste-b2b.agency%26lang%3Des
When I initially commented I clicked the "Notify me when new comments are added" checkbox and now each time a comment is added I get four e-mails with the same comment. Is there any way you can remove me from that service? Thanks!http://viralcomms.com/bbs/board.php?bo_table=free&wr_id=1363393
Nice post. I was checking continuously this blog and I am impressed! Extremely helpful info particularly the last part :) I care for such info much. I was seeking this particular information for a long time. Thank you and best of luck.https://usvitok.ru/bitrix/redirect.php?goto=https://ste-b2b.agency/
Man ļoti patīk Billybets kazino.|
Billybets casino izskatās vienkārša azartspēļu lapa!|
Diezgan labs tiešsaistes kazino, īpaši tiem, kam patīk ātras kazino spēles!|
Billybets casino piedāvā dažādām kazino spēlēm.|
Saprotams interfeiss, lapa šķiet diezgan skaidra.|
Man patīk Billybets casino neizskatās pārbāzts ar lieku informāciju.|
https://billybets-kazino.com/
Hello, its fastidious article about media print, we all understand media is a enormous source of data.https://divingspot.co.kr/member/login.html?noMemberOrder=&returnUrl=http%3a%2f%2fste-b2b.agency
It's amazing to visit this web site and reading the views of all colleagues on the topic of this paragraph, while I am also eager of getting know-how.http://www.champagnebeerens.com/themes/champagnebeerens/legal_cookie.php?url=https://ste-b2b.agency/
I just like the helpful information you provide to your articles. I'll bookmark your weblog and test once more here regularly. I'm rather sure I'll be told many new stuff right here! Best of luck for the following!http://pacificllm.com/notice/1057563
Magnificent beat ! I wish to apprentice while you amend your site, how can i subscribe for a blog website? The account aided me a applicable deal. I had been a little bit acquainted of this your broadcast offered brilliant transparent concepthttps://alexanderbogdanov.com/bitrix/redirect.php?goto=https://ste-b2b.agency/
hi!,I like your writing so so much! proportion we be in contact more approximately your article on AOL? I require an expert on this area to solve my problem. May be that's you! Taking a look ahead to look you. http://Sp.H.E.R.Ic.Al.J.W.Yo@Moskraeved.ru/redirect?url=https://cpinteriordesigns.com/x/cdn/%3Fhttps://ste-b2b.agency/
Hey I know this is off topic but I was wondering if you knew of any widgets I could add to my blog that automatically tweet my newest twitter updates. I've been looking for a plug-in like this for quite some time and was hoping maybe you would have some experience with something like this. Please let me know if you run into anything. I truly enjoy reading your blog and I look forward to your new updates.http://aquarium-vl.ru/forum/go.php?url=aHR0cHM6Ly9wcmFnYS1wcmFoYS5ydS9nbz9odHRwczovL3N0ZS1iMmIuYWdlbmN5Lw
I read this post completely about the resemblance of newest and earlier technologies, it's remarkable article.http://Megan.Ramsden@bcmk.ru/bitrix/redirect.php?goto=https://webneel.com/i/3d-printer/5-free-3d-printer-model-website-yeggi/ei/12259%3Fs=ste-b2b.agency
Everything is very open with a really clear explanation of the issues. It was truly informative. Your site is very helpful. Many thanks for sharing!http://aquarium-vl.ru/forum/go.php?url=aHR0cHM6Ly80My52aXJvbWluLmNvbS9pbmRleC9kMT9kaWZmPTAmdXRtX3NvdXJjZT1vZ2RkJnV0bV9jYW1wYWlnbj0yNjYwNyZ1dG1fY29udGVudD0mdXRtX2NsaWNraWQ9OXNnNDA4d3N3czgwbzhvOCZhdXJsPWh0dHAlM0ElMkYlMkZzdGUtYjJiLmFnZW5jeSZwdXNoTW9kZT1wb3B1cA
Thanks on your marvelous posting! I genuinely enjoyed reading it, you happen to be a great author. I will be sure to bookmark your blog and will come back someday. I want to encourage you to definitely continue your great posts, have a nice weekend!https://avtokraska-shop.ru:443/bitrix/redirect.php?goto=https://ste-b2b.agency/
I'd like to find out more? I'd like to find out more details.http://18364.Users.Rrmail1.com/go/iRlY.Zl9np.fz75.1z1Lvb/?aHR0cHM6Ly9nLWktdC5ydS9iaXRyaXgvcmVkaXJlY3QucGhwP2dvdG89aHR0cHM6Ly9zdGUtYjJiLmFnZW5jeS8
Aw, this was an incredibly nice post. Finding the time and actual effort to produce a good article… but what can I say… I put things off a whole lot and never seem to get nearly anything done.http://avto-shop.su/bitrix/redirect.php?event1=click_to_call&event2=&event3=&goto=https://ste-b2b.agency/
Your mode of explaining the whole thing in this post is truly good, all be able to effortlessly understand it, Thanks a lot.http://www3.tvt.ne.jp/~shogo-s/cgi-bin/album/album.cgi?mode=detail&no=14
There is certainly a great deal to learn about this subject. I like all of the points you made.http://www.changdat.com.cn/cases-details.aspx?ContentID=8&t=19&returnurl=http%3a%2f%2fste-b2b.agency
This blog was... how do you say it? Relevant!! Finally I've found something that helped me. Thank you!http://xn--b1agvbq6g.xn--p1ai/bitrix/redirect.php?event1=&event2=&event3=&goto=https%3a%2f%2falpha.astroempires.com%2Fredirect.aspx%3Fhttps%3A%2F%2Fste-b2b.agency%2F