+ Antworten
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Joomla-Header manipulieren bzw. erweitern

  1. #1
    Verbringt hier viel Zeit
    Registriert seit
    09.08.2008
    Ort
    /dev/null
    Beiträge
    979
    Bedankte sich
    52
    Erhielt 123 Danksagungen
    in 116 Beiträgen

    Standard Joomla-Header manipulieren bzw. erweitern

    Guten Morgen zusammen.
    Ich habe folgendes Problem:
    Wenn ich einen Beitrag aus einer selbstgebauten Komponente auf zb. Facebook teilen will, wird von FB das Logo der Webseite genommen, dieses ist allerdings zu groß.
    Jetzt ist es ja so, dass bei selbstgebauten Sachen (welche im Joomla nicht als "Article" gelten) die Header-Einträge von "Open Graph" fehlen.

    Ist es möglich, diese in der Komponente zu aktivieren und ähnlich wie bei einem eigenen Stylesheet einzubinden bzw. zu laden?

  2. #2
    Verbringt hier viel Zeit Avatar von Dudlhofer
    Registriert seit
    11.02.2009
    Ort
    da wo Bayern am schönsten ist
    Beiträge
    575
    Bedankte sich
    29
    Erhielt 184 Danksagungen
    in 149 Beiträgen

    Standard

    Es gibt dafür 'zig Plugins im JED...

    ♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦ EXTRA BAVARIAM NULLA VITA ♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦


  3. #3
    Gehört zum Inventar Avatar von Re:Later
    Registriert seit
    21.04.2014
    Ort
    Berlin
    Beiträge
    5.511
    Bedankte sich
    151
    Erhielt 2.151 Danksagungen
    in 1.921 Beiträgen

    Standard

    So was ähnliches kannst in deiner Komponente nahezu überall einsetzen. Natürlich sind im Code einige Variablen, z.B. $image, nicht gesetzt und musst halt selber ... bzw. weglassen, was Quatsch ist ...

    Code:
    $tags = array();
    
    $doc = JFactory::getDocument();
    
    $tags[] = array(
    'property' => 'fb:app_id',
    'content' => $fb_appid'
    );
    
    $tags[] = array(
    'property' => 'fb:admins',
    'content' => $fb_admins'
    );
    
    $tags[] = array(
    'property' => 'og:title',
    'content' => htmlentities($doc->getTitle(), ENT_QUOTES, 'utf-8')
    );
    
    $tags[] = array(
    'property' => 'og:type',
    'content' => 'article'
    );
    
    $tags[] = array(
    'property' => 'og:url',
    'content' => $doc->getBase()
    );
    
    $tags[] = array(
    'property' => 'og:site_name',
    'content' => htmlentities(JFactory::getConfig()->get('sitename'), ENT_QUOTES, 'utf-8')
    );
    
    $tags[] = array(
    'property' => 'og:description',
    'content' => htmlentities($doc->getDescription(), ENT_QUOTES, "UTF-8")
    );
    
    $image = JUri::root() . $img_url;
    
    $tags[] = array(
    'property' => 'og:image',
    'content' => $image
    );
    
    foreach ($tags as $tag)
    {
    $doc->addCustomTag('<meta property="' . $tag['property'] . '" content="' . $tag['content'] . '" />');
    }
    Nicht mehr ganz "modern", der Code, aber wird wohl auch noch Joomla 4 überleben.

    Weiters muss beachten, dass ein $doc->getTitle() nicht unbedingt den finalen Title liefert, da er noch anderweitig manipuliert werden könnte, z.B. in der view.html.php. Also auf Reihenfolge achten, wann der Code ausgeführt wird.

    Es bietet sich auch ein spät ausgeführtes Plugin mit Methode onBeforeCompileHead() an. Ist aber weiterer Code nötig, bspw. um sicher nur die eigene Komponente zu bearbeiten.
    Geändert von Re:Later (09.07.2018 um 15:32 Uhr)
    Joomlafachmann: https://www.ghsvs.de

  4. #4
    Verbringt hier viel Zeit
    Registriert seit
    09.08.2008
    Ort
    /dev/null
    Beiträge
    979
    Bedankte sich
    52
    Erhielt 123 Danksagungen
    in 116 Beiträgen

    Standard

    Das Problem, was ich festgestellt habe, ist, dass wenn ich einen Artikel auf zb. FB teile, dort immer nur ein Teil des Bildes angezeigt wird. Ist im Artikel kein Bild, nimmt er irgendein Bild aus dem Veranstaltungkalender. Das Bild, welches dann auf FB auftaucht ist nie komplett, sondern immer nur ein Teil.
    Ich habe jetzt ein Default-Bild hinterlegt und über die jImage-Klasse die Größe des Bildes ermittelt, vielleicht hilft es ja.

    $imageHeight = 350;
    $imageWidth = 350;

    if ($article_image) {
    $jImage = new JImage($article_image);
    $imageHeight = $jImage->getHeight();
    $imageWidth = $jImage->getWidth();
    }


    $ogTitle = mb_strimwidth($this->escape($this->item->title), 0, 180, "...");
    $document = JFactory::getDocument();
    $document->addCustomTag('<meta property="og:title" content="' . mb_strimwidth($this->escape($this->item->title), 0, 180, "...") . '" />');
    $document->addCustomTag('<meta property="og:description" content="' . JHtml::_('string.truncate', $this->item->introtext, 155, false, false ) . '" />');
    $document->addCustomTag('<meta property="og:image:width" content="' . $imageWidth . '" />');
    $document->addCustomTag('<meta property="og:image:height" content="' . $imageHeight . '" />');
    if ($article_image) {
    $document->addCustomTag('<meta property="og:image" content="' . JURI::root() . $article_image . '" />');
    }
    else {
    $document->addCustomTag('<meta property="og:image" content="' . JURI::root() . 'images/logo/socialmedia/nrw_socialmedia_350x350.png" />');
    }
    Das ganze sieht dann so aus:

    Artikel ohne Bild (Default-Bild wird genommen):
    <meta property="og:image:width" content="350" />
    <meta property="og:image:height" content="350" />
    Artikel mit Bild (Größe über jImage ermittelt):
    <meta property="og:image:width" content="1148" />
    <meta property="og:image:height" content="523" />
    Bei dem ganzen gebastel ist mir auch aufgefallen, dass Joomla gar nicht prüft, ob ein Tag schon im Array enthalten ist. Der wird einfach da mir rein gepackt und taucht dann eventuell doppelt oder dreifach im Quelltext auf:

    /libraries/src/Document/HtmlDocument.php => function addCustomTag($html)

    Original ist:
    $this->_custom[] = trim($html);
    besser wäre:
    if (!in_array($html, $this->_custom)) {
    $this->_custom[] = trim($html);
    }
    Geändert von breaker (11.07.2018 um 09:03 Uhr)

  5. #5
    Gehört zum Inventar Avatar von Re:Later
    Registriert seit
    21.04.2014
    Ort
    Berlin
    Beiträge
    5.511
    Bedankte sich
    151
    Erhielt 2.151 Danksagungen
    in 1.921 Beiträgen

    Standard

    EDIT: Folgendes ist falsch. Siehe weitere Posts.

    Da ein Custom Tag alles sein darf, z.B. auch Kommentare oder bewusst doppelte Marker etc. wäre die if-Abfrage im Core falsch. Kannst sie aber doch in deinem Code einsetzen.
    Geändert von Re:Later (12.07.2018 um 11:41 Uhr)
    Joomlafachmann: https://www.ghsvs.de

  6. #6
    Verbringt hier viel Zeit
    Registriert seit
    09.08.2008
    Ort
    /dev/null
    Beiträge
    979
    Bedankte sich
    52
    Erhielt 123 Danksagungen
    in 116 Beiträgen

    Standard

    Der "Hack" würde ja nur prüfen, ob ein bestimmter String schon in diesem Array ist. Ein doppeltes Ausführen wäre doch unsinnig.

  7. #7
    Gehört zum Inventar Avatar von Re:Later
    Registriert seit
    21.04.2014
    Ort
    Berlin
    Beiträge
    5.511
    Bedankte sich
    151
    Erhielt 2.151 Danksagungen
    in 1.921 Beiträgen

    Standard

    "Ein doppeltes Ausführen wäre doch unsinnig."

    Hast wohl recht und ich lag falsch, aber ein 3-faches

    $this->addCustomTag('<meta property="og:image:height" content="blah" />');
    $this->addCustomTag('<meta property="og:image:height" content="blah" />');
    $this->addCustomTag('<meta property="og:image:height" content="blah" />');

    gibt bei mir im HEAD den custom Tag nur 1x aus. ($this im Template-index.php ist in diesem Fall gleichbedeutend mit $document bei dir).

    Grund ist dieses 2015 eingesetzte array_unique: https://github.com/joomla/joomla-cms/pull/7147/files
    Joomlafachmann: https://www.ghsvs.de

  8. #8
    Gehört zum Inventar Avatar von Re:Later
    Registriert seit
    21.04.2014
    Ort
    Berlin
    Beiträge
    5.511
    Bedankte sich
    151
    Erhielt 2.151 Danksagungen
    in 1.921 Beiträgen

    Standard

    Und es gibt eine weitere Variante seit 2016, die noch gründlicher ausputzt.

    $document->setMetaData('og:image', 'https://cdn.joomla.org/images/Joomla_logo.png', 'property');

    https://github.com/joomla/joomla-cms/pull/10682

    Das hat ggf. den Nachteil, dass man nur 1 einzelnes og:image in den HEAD einsetzen kann, auch wenn diese unterschiedliche Pfade haben.
    Zumindest früher machte es Sinn, mehrere Bilder anzubieten, aus denen der Teilende dann eines via kleinen Pfeilchen für seinen FB-Post auswählen konnte.
    Bin bei Facebook aber lange als Nutzer raus. Weiß also nicht, ob das noch der Fall ist.

    Außerdem (für Puristen) sind mehrere og:image nicht valides HTML (mir wurst).

    Andersrum muss man bei mehreren Bildern aber natürlich wieder mit og:width aufpassen, was ich aber noch nie gesetzt habe. Ich passe halt auf, dass nur Bilder mit ausreichender, empfohlener Größe überhaupt als og:image auftauchen. Wenn keins im Beitrag ist, wird ein passendes Fallback-Bild genommen.
    Geändert von Re:Later (12.07.2018 um 11:43 Uhr)
    Joomlafachmann: https://www.ghsvs.de

  9. #9
    Verbringt hier viel Zeit
    Registriert seit
    09.08.2008
    Ort
    /dev/null
    Beiträge
    979
    Bedankte sich
    52
    Erhielt 123 Danksagungen
    in 116 Beiträgen

    Standard

    Zitat Zitat von Re:Later Beitrag anzeigen
    Und es gibt eine weitere Variante seit 2016, die noch gründlicher ausputzt.

    $document->setMetaData('og:image', 'https://cdn.joomla.org/images/Joomla_logo.png', 'property');

    https://github.com/joomla/joomla-cms/pull/10682

    Das hat ggf. den Nachteil, dass man nur 1 einzelnes og:image in den HEAD einsetzen kann, auch wenn diese unterschiedliche Pfade haben.
    Zumindest früher machte es Sinn, mehrere Bilder anzubieten, aus denen der Teilende dann eines via kleinen Pfeilchen für seinen FB-Post auswählen konnte.
    Bin bei Facebook aber lange als Nutzer raus. Weiß also nicht, ob das noch der Fall ist.

    Außerdem (für Puristen) sind mehrere og:image nicht valides HTML (mir wurst).

    Andersrum muss man bei mehreren Bildern aber natürlich wieder mit og:width aufpassen, was ich aber noch nie gesetzt habe. Ich passe halt auf, dass nur Bilder mit ausreichender, empfohlener Größe überhaupt als og:image auftauchen. Wenn keins im Beitrag ist, wird ein passendes Fallback-Bild genommen.
    Ja, ein einzelnes og:image. Das Problem ist nur, diese Images sind auf FB, Twitter und VK unterschiedlich groß. Die angaben "og:image width" und "og:image height" scheinen alle zu ignorieren. Deshalb hat man in den Netzwerken nur einen Ausschnitt von dem Image und ein "og:facebook:image height" usw. gibt es ja nicht

  10. #10
    Gehört zum Inventar Avatar von Re:Later
    Registriert seit
    21.04.2014
    Ort
    Berlin
    Beiträge
    5.511
    Bedankte sich
    151
    Erhielt 2.151 Danksagungen
    in 1.921 Beiträgen

    Standard

    Kann sein, dass ich dich falsch verstehe: width und height geben die Echtgröße des Bildes an, nicht irgendeine Wunschgröße, die man gerne bei der Darstellung hätte.

    Deshalb halte ich die Angabe width/height auch für relativ sinnfrei. Nur bei Structured Datas berechne ich sie und setze ein, weil Google sonst die SD als fehlerhaft bewertet. Keine Ahnung, was FB dazu im Testing-Tool mittlerweile sagt, wenn og-width fehlt. Wenns nur ein Hinweis ist, den man sieht, auch wurst.

    (ich halte von allen Bildern automatisert mehrere Größen vor, weil Google wieder andere width haben will und für's "Logo" wieder andere. Auf meiner Seite will ich aber oft kleinere, je nach Bildschirmbreite. Also 5, 6 unterschiedliche Größen pro Bild. Ob sich der Programmier-Aufwand gelohnt hat, keine Ahnung.)
    Joomlafachmann: https://www.ghsvs.de

+ Antworten
Seite 1 von 2 1 2 LetzteLetzte

Berechtigungen

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