Contao-Camp 2024
Ergebnis 1 bis 19 von 19

Thema: [Gelöst] Short URLS automatisch generieren

  1. #1
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    406

    Standard [Gelöst] Short URLS automatisch generieren

    Guten Tag,

    Bei einem Modul mit Liste und Reader das Freizeitangebote aufzeigt, wird ein QR Code ausgegeben. Da manche Links extrem lang sein können, übersteigt manchmal die Zeichenanzahl die der erlaubten in der gewählten QR Code version.

    Meine Idee war nun mit Short Urls zu arbeiten. Da es sich um sehr viele Einträge handelt, kommt nur in Frage, diese automatisch zu generieren.

    Gibt es hierfür bereits eine Erweiterung, oder muss ich da von 0 anfangen (wenn ja, weiss ich nicht genau wie ich anfangen soll.) Wie registriere ich diese URLs und verhindere, dass die "Seite nicht gefunden" Seite aufgerufen wird?

    PS: ich möchte ebenfalls vermeiden, die htaccess abändern zu müssen. Das Modul soll ebenfalls mit jedem im backend ausgewählten suffix funktioneren (testdomain.de/test , testdomain.de/test.html)

    Kann mir jemand weiterhelfen? Vielen Dank!
    Geändert von Nacht69 (21.07.2021 um 15:23 Uhr)

  2. #2
    Community-Moderatorin & Contao-Urgestein Avatar von mlweb
    Registriert seit
    10.07.2011.
    Beiträge
    6.704
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Ich habe mal in den Erweiterungen gesucht. Das hier könnte vielleicht so etwas sein wie Du suchst.
    Ich habe Dir mit meinen Hinweisen geholfen und Du möchtest Dich bedanken?
    Unterstütze bitte das Contao-Projekt (Button Links)
    Weitere Spendenmöglichkeiten
    ------------------------------------------------------------------------------------------------------
    Contao-Dokumentation: Contao-Handbuch und Contao-Entwickler-Doku
    Contao-Online-Video-Kurse: Contao Academy
    Funktionalität erweitern: Contao-Erweiterungen

    Für Dinge die man mit html5 und css3 lösen kann, braucht man kein javascript.




  3. #3
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    406

    Standard

    Zitat Zitat von mlweb Beitrag anzeigen
    Ich habe mal in den Erweiterungen gesucht. Das hier könnte vielleicht so etwas sein wie Du suchst.
    Vielen Dank,

    so wie ich die Erweiterung verstehe (hab mir kurz die dateien durchgeschaut) Muss man hier die Shortlinks im Backend anlegen. Ich brauche sie aber Dynamisch erzeugt in eigenen modulen.

  4. #4
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.674
    User beschenken
    Wunschliste

    Standard

    guck mal, ob Du das erstellen der Shortlinks mit der Erweiterung nicht auch über einen Methodenaufruf erstellen kannst - dann könntest Du das in Dein Modul mit einbauen z.B. per savecallback

  5. #5
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    406

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    guck mal, ob Du das erstellen der Shortlinks mit der Erweiterung nicht auch über einen Methodenaufruf erstellen kannst - dann könntest Du das in Dein Modul mit einbauen z.B. per savecallback
    Danke!

    Hab die Erweiterung mal installiert. Als erster stört mich, dass die shortlinks mit jeder Domain in der Installation aufrufbar sind (verschiedene kleinere Kunden). Bei Github steht folgendes:

    Code:
    Default configuration:
    
    terminal42_shortlink:
        host: ~
        salt: terminal42_shortlink
        log_ip: false
    host: The host to use for shortlinks. Can be different than the website host, but make sure it is set up on your hosting/server.
    
    salt: If a shortlink does not have a custom alias (path), a unique hash ID is generated from the database ID. By changing the salt you can get unique IDs for your installation.
    
    log_ip: This extension records how often a shortlink is accessed. Enable this flag to also capture IP addresses (not allowed under DSGVO in europe!)
    Jedoch finde ich diese Datei leider nicht. Ich verwende die Managed Version. Weiss jemand wo diese ist - oder muss ich die Datei selber erstellen? (Wenn ja wo)

    Wenn ich dann eine Domain zugewiesen habe, die nur für die Shortlinks existiert würde ich versuchen einen ganz einfachen weg zu gehen.

    Wenn ein Detaileintrag aufgerufen wird bei dem ein QR code ausgegeben wird soll erst die Datenbank abgefragt werden ob für diese Url bereits ein shortlink besteht. Wenn nicht trage die gewünschten Daten in die Datenbank ein. (so als würde ich händisch im Contao backend einen shortlink eintragen) .... ich denke das könnte funktionieren - oder?

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.803
    Partner-ID
    10107

    Standard

    Zitat Zitat von Nacht69 Beitrag anzeigen
    Jedoch finde ich diese Datei leider nicht.
    Die config/config.yaml legst du selbst an.
    » sponsor me via GitHub or PayPal or Revolut

  7. #7
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    406

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Die config/config.yaml legst du selbst an.
    Vielen Dank. Für andere die das selbe Problem haben - dies muss in die globale config.yml der Contao Installation.

    (ich habe erst ewig versucht die config.yml im config Ordner der Erweiterung zum laufen zu bringen. )

  8. #8
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    406

    Standard

    Off Topic: Gibt es in einem Modul eine einfache Art abzufragen ob ein bestimmtes Modul installiert ist? Alternativ wäre wohl auch möglich zu prüfen ob es eine bestimmte tabelle in der Datenbank gibt...

    Was machen die Contao-Profis in einem solchen Fall? Die Erweiterung soll auch in installationen ohne Shortlinks funktionieren.

  9. #9
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.803
    Partner-ID
    10107

    Standard

    Da gibt es mehrere Möglichkeiten. Wenn du einfach nur nach einem Paket prüfen willst: dafür verwende ich meist https://github.com/Jean85/pretty-package-versions - weil es am bequemsten ist.
    » sponsor me via GitHub or PayPal or Revolut

  10. #10
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    406

    Standard

    Vielen Dank! Letzte Frage: Gibt es einen Weg die in der config.yml angegeben Domain ins modul zu holen?

    edit: Bzw generell die config.yml auszulesen.... finde dazu leider keine Informationen....

    edit2: habe gesehen, dass die Domain in den Globals steht. Da ich diese aber weder mit var_dump noch mit print_r vollständig ausgeben kann, weiss ich nicht wo genau das ist. ['TL_CTE'] und ['FE_MOD'] habe ich bereits probiert... hier ist sie nicht zu finden.
    Geändert von Nacht69 (20.07.2021 um 16:17 Uhr)

  11. #11
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    406

    Standard

    Alles hat wie geplant funktioniert, jedoch habe ich die Domain immer noch hardgecoded.

    Mittlerweile weiss ich, dass die Domain in $GLOBALS['kernel'] steht - habe hier aber das selbe Problem, dass ich dies nicht ausgeben kann, und komme nicht weiter.

    Habe diese Datei gefunden:

    Code:
    declare(strict_types=1);
    
    namespace Terminal42\ShortlinkBundle\DependencyInjection;
    
    use Symfony\Component\Config\FileLocator;
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
    use Symfony\Component\HttpKernel\DependencyInjection\ConfigurableExtension;
    
    class Terminal42ShortlinkExtension extends ConfigurableExtension
    {
        /**
         * {@inheritdoc}
         */
        public function loadInternal(array $config, ContainerBuilder $container)
        {
            $loader = new YamlFileLoader(
                $container,
                new FileLocator(__DIR__.'/../Resources/config')
            );
    
            $loader->load('services.yml');
    
            $container->setParameter('terminal42_shortlink.host', $config['host']);
            $container->setParameter('terminal42_shortlink.salt', $config['salt']);
            $container->setParameter('terminal42_shortlink.log_ip', $config['log_ip']);
        }
    }
    Kann man sich irgendwie $config oder $container in mein Modul holen? Das Übersteigt leider stark meine Fähigkeiten....

    ich habe mal mit

    Code:
    	$this->import('Terminal42\ShortlinkBundle\DependencyInjection\Terminal42ShortlinkExtension');
    begonnen und bekomme so auch keine Fehlermeldung - jedoch weiss ich nicht wie ich weiter machen soll


    EDIT: Diese Datei sieht noch vielversprechender aus:

    Code:
    declare(strict_types=1);
    
    namespace Terminal42\ShortlinkBundle\EventListener\DataContainer;
    
    use Contao\DataContainer;
    use Hashids\Hashids;
    use Symfony\Component\Routing\RequestContext;
    use Terminal42\ShortlinkBundle\Entity\Shortlink;
    use Terminal42\ShortlinkBundle\Repository\ShortlinkRepository;
    
    class ShortlinkLabelListener
    {
        /**
         * @var ShortlinkRepository
         */
        private $repository;
        /**
         * @var Hashids
         */
        private $hashids;
        /**
         * @var RequestContext
         */
        private $requestContext;
        /**
         * @var string
         */
        private $host;
    
        public function __construct(ShortlinkRepository $repository, Hashids $hashids, RequestContext $requestContext, string $host)
        {
            $this->repository = $repository;
            $this->hashids = $hashids;
            $this->requestContext = $requestContext;
            $this->host = $host;
        }
    
        public function onLabelCallback(array $row, string $label, DataContainer $dc, array $columns)
        {
            /** @var Shortlink $shortlink */
            $shortlink = $this->repository->find($row['id']);
    
            if (!$columns[0]) {
                $columns[0] = $this->hashids->encode($row['id']);
            }
    
            $columns[0] = sprintf(
                '<a href="%s" target="_blank">%s</a>',
                ($this->host ? '//'.$this->host : '').'/'.$columns[0],
                ($this->host ?: $this->requestContext->getHost()).'/'.$columns[0]
            );
    
            $columns[1] = sprintf(
                '<a href="%s" target="_blank">%s</a>',
                $columns[1],
                $shortlink->getName() ?: $columns[1]
            );
    
            $columns[2] = $shortlink->countLog();
    
            return $columns;
        }
    }
    Geändert von Nacht69 (20.07.2021 um 17:58 Uhr)

  12. #12
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    406

    Standard

    Ich beschreibe mein Problem nochmal neu, das war wohl etwas zu unverständlich .....

    In meinem Modul werden automatisch beim Aufruf des Readers Einträge in die tl_terminal42_shortlink eingetragen und anschließend der passende Shortlink ausgeben.

    Die Domain für die Shortlinks muss man in der config.yml eintragen.

    Dies Funktioniert super. Jedoch habe ich in meinem Modul die Domain für den Shortlink noch hardgecoded.

    Seit gestern nachmittag versuche ich die Domain für die Shortlinks in meinem Modul auszugeben. Jedoch ohne erfolg.

    Da das Terminal24 Shortlink Modul im Backend (DCA) die Domain ausgibt - muss es hierfür einen Weg geben.

    Die Frage in Kurz:
    Wie bekomme ich die Domain für die Shortlinks die in der config.yml definiert ist in mein Modul

  13. #13
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.803
    Partner-ID
    10107

    Standard

    Was genau meinst du mit "Modul"? Meinst du damit ein Contao Frontend Modul? Wenn ja, poste mal den Code davon.
    » sponsor me via GitHub or PayPal or Revolut

  14. #14
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    406

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Was genau meinst du mit "Modul"? Meinst du damit ein Contao Frontend Modul? Wenn ja, poste mal den Code davon.
    Ja ist ein Frontend Modul ... ich denke zwar, dass dies nichts bringen wird aber ich poste mal die betreffende Zeilen (das Modul hat über 1000 zeilen die hiermit gar nichts zu tun haben)



    Code:
    ............
    
    	protected function compile()
    	{.....
    
    $base['shortdomain'] = 'short.diedomain.online';  <----- 
    $qr_code_shortlink = $base['shortdomain'].'/'.$qr_code_shortlink_alias.$GLOBALS['TL_CONFIG']['urlSuffix'];
    $this->Template->qr_container = '<div class="qr_container" data-link ="'.$qr_code_url.'"></div>'; 
    
    ....
    config.yml

    Code:
    contao:
        url_suffix: ""
        image:
            imagine_service: contao.image.imagine.gd
    
    terminal42_shortlink:
        host: short.diedomain.online
        salt: test123
        log_ip: false

    die Zeile mit dem Pfeil ist hardgecoded und muss dynamisiert werden - eben das was für die Shortlink Erweiterung in der config.yml steht - sonst funktioniert das modul bei anderen Kunden nicht. (weil falsche domain)

  15. #15
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.803
    Partner-ID
    10107

    Standard

    Generell würde ich dir empfehlen Frontend Module auf die empfohlene Art und Weise umzusetzen: https://docs.contao.org/dev/framewor...t-end-modules/

    Das Shortlink Bundle stellt dir von dir erwähnte Konfiguration als Parameter zur Verfügung: '%terminal42_shortlink.host%'. Diesen Parameter könntest du dir in dein Frontend Module Fragment injecten lassen.

    Falls du aber bei deinem Legacy Modul bleiben möchtest: dort kommst du so an den Parameter ran:

    PHP-Code:
    use Contao\System;

    System::getContainer()->getParameter('terminal42_shortlink.host'); 
    » sponsor me via GitHub or PayPal or Revolut

  16. #16
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    406

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Generell würde ich dir empfehlen Frontend Module auf die empfohlene Art und Weise umzusetzen: https://docs.contao.org/dev/framewor...t-end-modules/

    Das Shortlink Bundle stellt dir von dir erwähnte Konfiguration als Parameter zur Verfügung: '%terminal42_shortlink.host%'. Diesen Parameter könntest du dir in dein Frontend Module Fragment injecten lassen.

    Falls du aber bei deinem Legacy Modul bleiben möchtest: dort kommst du so an den Parameter ran:

    PHP-Code:
    use Contao\System;

    System::getContainer()->getParameter('terminal42_shortlink.host'); 
    Vielen Dank trotzdem. Ja ich denke das Modul wurde noch in contao 3 zeiten programmiert.

    1. direkt einen Weg die config.yml zu laden und den Inhalt zB als Array auszugeben gibt es nicht?
    2. in der Datei von Terminal24 wird host oft verwendet. zB $config['host']. An diese Variablen kommt man nicht irgendwie?


    Code:
    declare(strict_types=1);
    
    namespace Terminal42\ShortlinkBundle\DependencyInjection;
    
    use Symfony\Component\Config\FileLocator;
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
    use Symfony\Component\HttpKernel\DependencyInjection\ConfigurableExtension;
    
    class Terminal42ShortlinkExtension extends ConfigurableExtension
    {
        /**
         * {@inheritdoc}
         */
        public function loadInternal(array $config, ContainerBuilder $container)
        {
            $loader = new YamlFileLoader(
                $container,
                new FileLocator(__DIR__.'/../Resources/config')
            );
    
            $loader->load('services.yml');
    
            $container->setParameter('terminal42_shortlink.host', $config['host']);
            $container->setParameter('terminal42_shortlink.salt', $config['salt']);
            $container->setParameter('terminal42_shortlink.log_ip', $config['log_ip']);
        }
    }

  17. #17
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.803
    Partner-ID
    10107

    Standard

    Ich habe doch bereits geschrieben, wie du an den Parameter kommst?
    » sponsor me via GitHub or PayPal or Revolut

  18. #18
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    406

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Ich habe doch bereits geschrieben, wie du an den Parameter kommst?
    entweder ich spinne oder du hast deinen Beitrag nachträglich noch verändert

    EGAL! du hast meinen Tag gerettet! VIELEN VIELEN DANK - das funktioniert!

  19. #19
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.803
    Partner-ID
    10107

    Standard

    Zitat Zitat von Nacht69 Beitrag anzeigen
    entweder ich spinne oder du hast deinen Beitrag nachträglich noch verändert
    Ja, hatte ich
    » sponsor me via GitHub or PayPal or Revolut

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •