DeviceDetector installieren - wie geht das ohne Composer?

Hallo. Ich bin leider nicht so fit in PHP. Ich möchte den Matomo DeviceDetector einbauen? Kann man das irgendwie auf die einfache Art machen mit Dateien kopieren, in einer Config-Datei die Verzeichnisnamen anpassen und es läuft? Ich habe leider keinen Composer und das mit dem autoload wirft auch immer nur Fehlermeldungen. Mit der Anleitung auf github.com habe ich jetzt 3 Stunden rumprobiert und bin total verzweifelt. Kann mir bitte einer helfen?

Hi,

a) Wo willst du den einbauen?
b) Ich gehe davon aus, dass du die Anleitung befolgt hast. Ich bräuchte dann mal eine tatsächliche Fehlermeldung von dir um weiterhelfen zu können.
c) Hast du Spyc oder einen anderen YAML-Parser installiert und korrekt verlinkt?

a) Zunächst erstmal in meinem lokalen System (PHP System basierend auf xampp). Mein Server läuft. Ich kann Scripte aufrufen. Ansonsten ist die Umgebung leer. Keine Frameworks, keine Libraries installiert.

c) Spyc und YAML habe ich nicht installiert.

b) Fehlermeldungen sehen in der Regel so aus, dass die Klassen nicht gefunden werden. Vermutlich weil weder Autoloader noch Script da liegen. Daher meine Frage, ob es irgendwo eine Art Config-Datei gibt, wo man die Verzeichnisse hinterlegen kann.

Ok, also ein Basisproblem. Schauen wir uns kurz den Beispielcode an:

<?php

include_once 'path/to/spyc/Spyc.php';
include_once 'path/to/device-detector/autoload.php';

use DeviceDetector\DeviceDetector;

$deviceDetector = new DeviceDetector();

// ...

Damit das Beispiel funktionieren kann, werden 2 Dinge benötigt: Spyc und DeviceDetector.

Lege also bitte die Ordner device-detector (GitHub - matomo-org/device-detector: The Universal Device Detection library will parse any User Agent and detect the browser, operating system, device used (desktop, tablet, mobile, tv, cars, console, etc.), brand and model.) und spyc (GitHub - mustangostang/spyc: A simple YAML loader/dumper class for PHP) in den selben Ordner in dem auch deine PHP-Datei liegt und ändere das Bespiel wie folgt ab:

<?php

include_once 'spyc/Spyc.php';
include_once 'device-detector/autoload.php';

use DeviceDetector\DeviceDetector;

$deviceDetector = new DeviceDetector();

// ...

Hallo,

Erstens würde ich dir wirklich sehr stark empfehlen composer zu verwenden, es macht so viele Dinge unglaublich viel einfacher.

Zweitens, der Trick beim Programmieren liegt immer in der exakten Fehlermeldung. Darin steht meistens schon der Weg zur Lösung. Also wenn du wen um Rat fragst immer die exakte Fehlermeldung angeben, damit geht alles viel schneller.
So muss ich jetzt mal raten, dass du vermutlich diese Fehlermeldung meinst:

include_once(path/to/spyc/Spyc.php): failed to open stream: No such file or directory in /home/lukas/tmp/device-detector/test.php on line 2

Drittens, Device Detector besteht aus einer Menge YAML Dateien, also brauchst du irgendeine Library die YAML Dateien lesen kann. Composer könnte diese Abhängigkeit automatisch auflösen, die richtige Library herunterladen und importieren, aber da du composer nicht verwendest, musst du all diese Schritte einzeln machen.
Sorry @fdellwing, habe nicht gesehen, dass du schon geantwortet hast und wollte jetzt meine Antwort nicht verwerfen, obwohl sie sich wiederholt.

Mit “keine Library installiert” meine ich, dass ich nichts Zusätzliches installiert habe. Also nur XAMPP out of the Box.

Dem Beispiel von Fabian bin ich gefolgt. Ich habe nun folgende Struktur:

domain/DeviceDetector/Cache/…
domain/DeviceDetector/parser/…
domain/DeviceDetector/regexes/…
domain/DeviceDetector/Yaml/…
domain/DeviceDetector/autoload.php

domain/spyc/examples/…
domain/spyc/php4/…
domain/spyc/tests/…
domain/spyc/phpunit.xml
domain/spyc/Spyc.php

domain/DeviceDetector.php

Ich habe jeweis von Github die Pakete runtergeladen.

Als Startdatei im Wurzelverzeichnis habe ich mir die DeviceDetector.php von Gitbub genommen.
https__github_com/matomo-org/device-detector/blob/master/DeviceDetector.php

Dort habe ich diese beiden Zeilen oben eingefügt:

require_once ‘spyc/Spyc.php’;
require_once ‘DeviceDetector/autoload.php’;

Dann geht es weiter mit diesen Zeilen:

namespace DeviceDetector;
use DeviceDetector\Cache\StaticCache;
use DeviceDetector\Cache\Cache;
use DeviceDetector\Parser\Bot;
use DeviceDetector\Parser\BotParserAbstract;
use DeviceDetector\Parser\Client\Browser;
use DeviceDetector\Parser\OperatingSystem;
use DeviceDetector\Parser\Client\ClientParserAbstract;
use DeviceDetector\Parser\Device\DeviceParserAbstract;
use DeviceDetector\Parser\VendorFragment;
use DeviceDetector\Yaml\Parser AS YamlParser;
use DeviceDetector\Yaml\Spyc;

Resultat ist die folgende Fehlermeldung:
Fatal error : Namespace declaration statement has to be the very first statement or after any declare call in the script in … Server\xampp\htdocs\domain\DeviceDetector.php on line 12 (das ist die Zeile mit “namespace DeviceDetector;”)

Wenn ich diese Zeile auskommentiere, kommt eine weiße Seite.

Hallo,

Die Fehlermeldung hilft schon weiter.

In PHP dürfen “namespace” Zeilen nur ganz am Anfang des Programmes stehen.

Die Frage ist, woher du das hast, da du das nicht brauchst.

ich habe das aus dieser datei: device-detector/DeviceDetector.php at master · matomo-org/device-detector · GitHub

Das habe ich aus dem Original Paket von github.

Wenn ich die namespace-zeile ganz nach oben setze, bekomme ich diese Fehlermeldung:
Fatal error : Uncaught Error: Using $this when not in object context in F:\Server\xampp\htdocs\domain\DeviceDetector.php:908 Stack trace: #0 {main} thrown in F:\Server\xampp\htdocs\domain\DeviceDetector.php on line 908

Hallo,

Diese Datei brauchst du nicht zu bearbeiten, sondern du brauchst nur die autoload.php laden:

<?php

include_once 'path/to/spyc/Spyc.php';
include_once 'path/to/device-detector/autoload.php';

use DeviceDetector\DeviceDetector;

$userAgent = $_SERVER['HTTP_USER_AGENT']; // change this to the useragent you want to parse

$dd = new DeviceDetector($userAgent);

$dd->parse();

if ($dd->isBot()) {
  // handle bots,spiders,crawlers,...
  $botInfo = $dd->getBot();
} else {
  $clientInfo = $dd->getClient(); // holds information about browser, feed reader, media player, ...
  $osInfo = $dd->getOs();
  $device = $dd->getDeviceName();
  $brand = $dd->getBrandName();
  $model = $dd->getModel();
}

Verstehe ich dich richtig:
die “DeviceDetector.php” belasse ich in dem Verzeichnis “/DeviceDetector/” und ändere da gar nichts dran.

Dann:

  • erstelle ich eine index.php,
  • lege diese ins Wurzelverzeichnis.
  • Trage oben die Verzeichnisse bei den Includes ein.
  • und mache unten noch ein print_r($clientInfo); rein

Genau, die Libraries selbst musst du nicht ändern.

Ahh, ok. Ich bekomme folgende Ausgabe, wenn ich mir alles ausgeben lasse. Verstehe. Das müsste es dann sein, oder?

Array
(
[type] => browser
[name] => Firefox
[short_name] => FF
[version] => 65.0
[engine] => Gecko
[engine_version] =>
)
Array
(
[name] => Windows
[short_name] => WIN
[version] => 10
[platform] => x64
)
desktop

VIELEN DANK!!! :slight_smile: :slight_smile: :slight_smile: :slight_smile:

1 Like