SideBarMenu

Activity API

Mit Stud.IP Version 3.5 wurde eine neue API zum Erzeugen, Darstellen und Filtern von kontextrelevanten Aktivitäten eingeführt. Diese API kann u.a. dafür genutzt werden um Nutzern einen schnellen Überblick über die für ihn relevanten Information/Aktivitäten zu geben.

Activity-Streams

Der Activity-Stream befindet sich auf oberster Ebene der API. Möchte man einen Activity-Stream haben:

$stream = new \Studip\Activity\Stream($observer_id, $contexts, $filter);

Wobei der Parameter $observer_id die Nutzer-ID des Betrachters ist, $contexts ein Kontext oder ein Array der zu betrachtenden Aktivitätskontexte (z.B. eine Veranstaltung, ein Institut oder ein Nutzer) und $filter ein entsprechendes Filter-Objekt ist.

Möchte man diesen ausgeben:

foreach($stream->asArray() as $key => $activity) {
    echo $activity;
}

Filter

Um den Zugriff auf bestimmte Aktivitäten oder Zeiräume zu fokussieren, können entsprechenden Filter-Objekte definiert werden. Filter-Objekte bestehen aus einem Start-, Endpunkt und einem Aktivitätstyp, welcher einen entsprechenden Activity-Provider beschreibt.

Activity-Kontexte

Der Activity-Stream bekommt die Aktivitäten über Activity-Kontexte bereitgestellt. Kontexte beschreiben die Bereiche in Stud.IP, in denen potentielle Aktivitäten generiert werden können.

Beispiele für Kontexte:

Veranstaltungen Einrichtungen Systemweiter Kontext Nutzerbezogener Kontext

Klassenbeschreibung des Activity-Kontext:

abstract class Context
{
    protected
        $provider;

    /**
     * return array, listing all active providers in this context
     *
     * @return array
     */

    abstract protected function getProvider();

    /**
     * get id denoting the context (user_id, course_id, institute_id, ...)
     *
     * @return string
     */

    abstract public function getRangeId();

    /**
     * get type of context (f.e. user, system, course, institute, ...)
     *
     * @return string
     */

    abstract protected function getContextType();

    /**
     * get list of activities as array for the current context
     *
     * @param string $observer_id
     * @param \Studip\Activity\Filter $filter
     *
     * @return array
     */

    public function getActivities($observer_id, Filter $filter)
    {
        $providers = $this->filterProvider($this->getProvider(), $filter);

        $activities = Activity::findBySQL('context = ? AND context_id = ?  AND mkdate >= ? AND mkdate <= ? ORDER BY mkdate DESC',
            array($this->getContextType(), $this->getRangeId(), $filter->getStartDate(), $filter->getEndDate()));

        foreach ($activities as $key => $activity) {
            if (isset($providers[$activity->provider])) {                        // provider is available
                $providers[$activity->provider]->getActivityDetails($activity);
            } else {
                unset($activities[$key]);
            }
        }

        return array_flatten($activities);
    }

    /**
     *
     * @param type $provider
     */

    protected function addProvider($provider)
    {
        $class_name = 'Studip\Activity\\' . ucfirst($provider) . 'Provider';

        $reflectionClass = new \ReflectionClass($class_name);
        $this->provider[$provider]$reflectionClass->newInstanceArgs();
    }

    /**
     *
     * @param type $providers
     * @param \Studip\Activity\Filter $filter
     * @return type
     */

    protected function filterProvider($providers, Filter $filter)
    {
        $filtered_providers = array();

        if (is_null($filter->getType())) {
            $filtered_providers = $providers;
        } else {
            foreach($providers as $provider) {
                $filtered_class = 'Studip\Activity\\' . ucfirst($filter->getType()) . 'Provider';

                if ($provider instanceof $filtered_class) {
                    $filtered_providers[]$provider;
                }
            }
        }

        return $filtered_providers;

    }
}

Activity-Provider

Orthogonal zu diesen Kontexten existieren Activity-Provider. Diese aggregieren bestimmte Activities. Beispiele für Activity-Provider:

  • Forum
  • Blubber
  • Dateibereich
  • Nachrichten
  • News
  • Teilnehmer
  • Wiki
  • Ablaufplan
  • Liteaturverwaltung

Das Activity-Provider-Interface

Möchte man einen neuen Activity-Provider implementieren, muss man das entsprechende Interface berücksichtigen, welches die Methoden getActivityDetails() und getLexicalField() voraussetzt.

interface ActivityProvider
{
    /**
     * Fill in the url, route and any lengthy content for the passed activity
     *
     * @param Studip\Activity\Activity $activity
     */

    public function getActivityDetails(&$activity);

    /**
     * Human readable name for the current provider to be used in the activity-title
     */

    public static function getLexicalField();
}

Um eine persistente Datenhaltung der Aktivitäten sicherzustellen, wird empfohlen zusätzlich die Methode postActivity() zu implementieren, welche unter Verwendung entsprechender Observer aus dem NotificationCenter Daten in die Activity-Tabelle speichert.

Die Klasse ActivityObserver

Die Klasse ActivityObserver sorgt dafür, dass relevante Observer aus dem NotifactionCenter geladen werden. Hier können nach Bedarf weitere Observer für z.B. neue Provider abgelegt werden.

Activities

Activity-Feed Widget

Das ActivityFeed-Widget wird als Portalplugin implementiert. Neben der Ansicht des Activity-Streams bietet das Widget dem Nutzer auch die Möglichkeit den Stream individuell zu Filtern.

REST-Route

Als alternative Zugriffsmöglichkeit werden der Stud.IP REST-API folgende neue Routen hinzugefügt:

/user/:user_id/activitystream # get - Ausgabe des Streams

Die Route kann durch Angabe weiterer Queryparameter gefiltert werden.

Letzte Änderung am 30.05.2016 16:20 Uhr von aklassen.