Contao News Facebook Sync

inspiredminds/contao-news-facebook

von inspiredminds

Projekt Webseite unter Contao News Facebook Sync

Mit dieser Extension können automatisch Posts von Facebook Pages (oder Gruppen) als Nachrichten in Nachrichtenarchive importiert werden. Es können außerdem automatisch Nachrichten auf Facebook Seiten gepostet werden. Dadurch ist es möglich, ein Nachrichtenarchiv mit einer Facebook Seite synchron zu halten.

Installation

Um diese Erweiterung zu installieren, muss zuerst die composer.json der eigenen Contao Installation modifiziert werden. Dabei sind zwei Anpassungen notwendig: das private Repository hinzufügen und die Abhängigkeit hinzufügen.

Um das Repository hinzuzufügen, muss folgendes in der composer.json eingefügt werden:

{
    "repositories": [
        {
            "type": "composer",
            "url": "https://token:<YOUR_TOKEN>@packdis.inspiredminds.at/r"
        }
    ]
}

<YOUR_TOKEN> muss mit dem Repository Token ersetzt werden, welches von inspiredminds geschickt wurde.

Um die Abhängigkeit hinzuzufügen, muss folgendes in der composer.json eingefügt werden:

{
    "require": {
        "inspiredminds/contao-news-facebook": "^7.0"
    }
}
Komplettes Beispiel anzeigen

Nachdem diese Änderungen gemacht wurden, kann nun ein composer update auf der Kommandozeile oder eine Paketaktualisierung im Contao Manager durchgeführt werden. Danach wie gewohnt das Contao Install Tool aufrufen, um die Datenbank zu aktualisieren.

Konfiguration

Vor Version 7.0 dieser Erweiterung muss, um sie konfigurieren zu können, zuerst eine sogenannte »Facebook App« erzeugt werden. Die Details dieser App werden dann für die Konfiguration im Backend benötigt.

Facebook App anlegen

Dieser Schritt kann ab Version 7.0 der Extension übersprungen werden.

  1. Gehe zuerst zu developers.facebook.com. Wenn noch kein Facebook Developer Account existiert, muss nun einer angelegt werden (bzw. der Developer Account muss für einen existierenden Facebook Benutzer freigeschalten werden).
  2. Unter Meine Apps auf App erstellen klicken.
  3. Einen Anzeige Name für die App eingeben (z. B. der Titel der Webseite) und eine Kontakt E-Mail Adresse angeben. Dann auf App-ID erstellen klicken.
  4. Auf der nächsten Seite können Produkte zur App hinzugefügt werden. Füge das Facebook Login Produkt hinzu in dem du dort auf Einrichten klickst.
  5. Auf der nächsten Seite Web auswählen, dann die URL der Webseite eingeben (inklusive https://). Danach auf Save klicken.
  6. Auf der linken Seite auf Facebook Login » Einstellungen klicken. Unter Gültige OAuth Redirect URIs die folgende URL eingeben: https://example.com/system/modules/news_facebook/public/callback.php. example.com muss mit der Domain deiner Webseite ersetzt werden. Dann auf Änderungen speichern klicken.
  7. Auf der linken Seite auf Einstellungen » Allgemeines klicken und die Domain der Webseite unter App Domains eingeben. Danach wieder auf Änderungen speichern klicken.

Der Facebook Account, unter dem man die App anlegt, muss die Berechtigung haben, auf der timeline der jeweiligen Facebook Page, mit der synchronisiert werden soll, Posts machen zu dürfen (dies ist optional, wenn nur Posts von der Page in das Nachrichtenarchiv geholt werden sollen). Alternativ können aber auch weitere Administratoren oder Developer zur Facebook App unter Rollen hinzugefügt werden.

App ID und App Secret in Contao konfigurieren

Dieser Schritt kann ab Version 7.0 der Extension übersprungen werden.

Gehe im Contao Backend zu System » Einstellungen. Dort unter Facebook App müssen die App ID und das App Secret eingegeben werden. Diese Informationen können in den Facebook App Einstellungen unter Einstellungen » Allgemeines gefunden werden.

Facebook App Einstellungen

Contao Nachrichtenarchiv konfigurieren

Öffne die Einstellungen deines Nachrichtenarchivs. In der Sektion Facebook sync kann der Facebook sync aktiviert werden. Danach kann die numerische ID der Facebook Page eingegeben werden, mit der das Nachrichtenarchiv synchronisiert werden soll. Wenn automatisch Facebook Page Posts als Nachrichtenbeiträge angelegt werden sollen, dann muss die Einstellung Page Posts holen aktiviert werden. Optional kann auch ein Page Post Datum Limit eingestellt werden.

Dasselbe kann auch für eine Facebook Gruppe gemacht werden, wenn Posts dieser Gruppe zum Nachrichtenarchiv importiert werden sollen. Allerdings können keine Nachrichtenbeiträge automatisch in Gruppen gepostet werden.

Nun muss ein Access Token von Facebook geholt werden. Dazu kann die Facebook connect Schaltfläche benutzt werden. Dadurch wird man bei Facebook eingeloggt und es werden Berechtigungen für den eingeloggten Facebook Benutzer angefordert. Nachdem dies bestätigt wurde, wird ein sogenannter »Long Term Access Token« von Facebook geholt.

Falls Nachrichtenbeiträge automatisch auf der Facebook Page gepostet werden sollen, dann muss in diesem Prozess erlaubt werden, dass die Facebook App öffentliche Posts in deinem Namen machen darf. Der Facebook Account, mit dem man sich hier anmeldet, muss außerdem die Berechtigung haben, Posts auf der Timeline der jeweiligen Facebook Page posten zu dürfen.

Nachrichtenarchiv Einstellungen

Heruntergeladene Bilder werden im eingestellten Ordner gespeichert (Standard: files/facebook_images). Dieser Ordner muss in Contao 4 veröffentlicht werden!

Zusätzliche Einstellungen

Seit Version 3.0.0 können folgende Einstellungen in den Systemeinstellungen von Contao unter Facebook Sync getroffen werden:

Keine OpenGraph Meta Tags: seit Version 3.0.0 der Extension wird automatisch ein og:image meta Tag im <head> eingefügt, wenn ein Nachrichtenartikel verarbeitet wird, damit das Teaserbild auch auf Facebook automatisch ausgegeben wird, wenn der Link zu der Nachricht geteilt wird. Mit dieser Einstellung kann dies deaktiviert werden.

Als Fotos posten: seit Version 3.0.0 werden Nachrichtenbeiträge nicht mehr automatisch als Fotos gepostet, wenn der Nachrichtenbeitrag ein Teaserbild hat. Mit der Einstellung kann dies wieder aktiviert werden.

Backend Einstellungen

Falls kein Hook benutzt wird, kann die Standard Überschriftenlänge über

$GLOBALS['FACEBOOK_TITLE_LENGTH'] = ;

in der eigenen config.php eingestellt werden.

Benutzung

Facebook Page/Group Posts holen

Sobald das Nachrichtenarchiv konfiguriert ist und die Page Posts holen bzw. Group Posts holen Option aktiv ist, überprüft die Erweiterung stündlich auf neue Facebook Posts über den Cronjob von Contao.

Facebook Posts veröffentlichen

Contao Nachrichtenbeiträge werden auf Facebook unter zwei Bedingungen veröffentlicht:

  • In den Einstellungen der jeweiligen Nachricht wurde unter der Facebook sync Sektion die Einstellung Auf Facebook Page posten aktiviert.
  • Der Nachrichtenbeitrag wurde veröffentlicht.

In den Einstellungen der Nachricht kann außerdem ein abweichender Text für den Facebook Post angegeben werden. Andernfalls wird der Teaser Text benutzt.

Die Erweiterung überprüft minütlich auf neue Nachrichten, die auf Facebook veröffentlicht werden sollen.

Nachrichten Einstellungen

Synchronisation manuell auslösen

Es gibt eine Schaltfläche zur manuellen Auslösung der Synchronisation im Backend. Oben bei den globalen Operationen für Nachrichtenarchive.

Globale Operationen für Nachrichtenarchive

Hooks

Die Extension stellt einige Hooks zur Verfügung, welche das Verhalten beeinflussen können, wenn zu Facebook gepostet, oder ein Post von Facebook zu Contao geholt wird.

processFacebookPost

Die Erweiterung prozessiert einen Facebook-Post und versucht diesen zu einem passenden Contao Nachrichtenbeitrag umzuwandeln. Dieser Prozess kann mit dem processFacebookPost selbst angepasst werden. Als Rückgabewert wird ein Array erwartet, mit den finalen Daten für den Datenbankeintrag eines Nachrichtenbeitrags. Wenn der Rückgabewert false ist, wird kein Nachrichtenbeitrag erzeugt.

Parameter

  1. array $arrData Die bereits prozessierten Daten, die für den Nachrichtenbeitrag benutzt werden.
  2. object $objPost Die originalen Daten des Posts von Facebook.
  3. object $objArchive Das Newsarchiv Objekt.

changeFacebookMessage

Wenn ein Contao Nachrichtenbeitrag als Facebook Post vorbereitet wird, wird entweder der Teaser oder der bei der Nachricht angegebene Text verwendet. Falls aber automatisch dieser Text angepasst werden soll, kann dies mit dem changeFacebookMessage Hook gemacht werden. Als Rückgabewert wird der finale Text erwartet.

Parameter

  1. string $message Die bereits vorgefertigte Nachricht.
  2. object $objArticle Der originale Contao Nachrichtenbeitrag.
  3. object $objArchive Das Newsarchiv Objekt.

Beispiel

Das folgende Beispiel implementiert einen Hook, der die URL zum Nachrichtenbeitrag an den Text des Facebook-Posts anhängt:

// src/EventListener/ChangeFacebookMessageListener.php
namespace App\EventListener;

use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
use Contao\News;
use Contao\NewsArchiveModel;
use Contao\NewsModel;

#[AsHook('changeFacebookMessage')]
class ChangeFacebookMessageListener
{
    public function __invoke(string $message, NewsModel $news, NewsArchiveModel $archive): string
    {
        // Append the URL to photo posts
        if ($news->addImage && $news->fbPostAsPhoto) {
            $message .= "\n\n".News::generateNewsUrl($news, false, true);
        }

        return $message;
    }
}
// src/EventListener/ChangeFacebookMessageListener.php
namespace App\EventListener;

use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
use Contao\News;
use Contao\NewsArchiveModel;
use Contao\NewsModel;

#[AsHook('changeFacebookMessage')]
class ChangeFacebookMessageListener
{
    public function __invoke(string $message, NewsModel $news, NewsArchiveModel $archive): string
    {
        // Append the URL to photo posts
        if ($news->addImage && $news->fbPostAsPhoto) {
            $message .= "\n\n".News::generateNewsUrl($news, false, true);
        }

        return $message;
    }
}
# config/services.yaml
services:
    App\EventListener\ActivateAccountListener:
        tags:
            - { name: contao.hook, hook: changeFacebookMessage }
// src/EventListener/ChangeFacebookMessageListener.php
namespace App\EventListener;

use Contao\CoreBundle\ServiceAnnotation\Hook;
use Contao\News;
use Contao\NewsArchiveModel;
use Contao\NewsModel;

class ChangeFacebookMessageListener
{
    public function __invoke(string $message, NewsModel $news, NewsArchiveModel $archive): string
    {
        // Append the URL to photo posts
        if ($news->addImage && $news->fbPostAsPhoto) {
            $message .= "\n\n".News::generateNewsUrl($news, false, true);
        }

        return $message;
    }
}
// contao/config.php
use App\EventListener\ChangeFacebookMessageListener;

$GLOBALS['TL_HOOKS']['changeFacebookMessage'][] = [ChangeFacebookMessageListener::class, '__invoke'];
// src/EventListener/ChangeFacebookMessageListener.php
namespace App\EventListener;

use Contao\CoreBundle\ServiceAnnotation\Hook;
use Contao\News;
use Contao\NewsArchiveModel;
use Contao\NewsModel;

class ChangeFacebookMessageListener
{
    public function __invoke(string $message, NewsModel $news, NewsArchiveModel $archive): string
    {
        // Append the URL to photo posts
        if ($news->addImage && $news->fbPostAsPhoto) {
            $message .= "\n\n".News::generateNewsUrl($news, false, true);
        }

        return $message;
    }
}

Template Daten

In den Nachrichtentemplates stehen zusätzliche Daten zur Verfügung:

  • object fbData Die originalen Daten des Posts von Facebook.
  • string fbPostId Die Facebook ID des verknüpften Facebook Posts.
  • char fromFb Gibt an, ob der Nachrichtenbeitrag ursprünglich von Facebook importiert wurde.