... | ... | @@ -10,10 +10,9 @@ Die Desktopsuche kann über Module und Plugins erweitert werden. Somit sind Inha |
|
|
Diese Schnittstelle soll es ermöglichen auch andere Daten durchsuchbar zu machen. Es ist somit möglich einzelne Produkte aus dem Shop System über die Desktop Suche zu finden und aufzurufen.
|
|
|
|
|
|
|
|
|
Ablauf für Entwickler
|
|
|
----
|
|
|
# Informationen für Entwickler
|
|
|
|
|
|
### PHP Service Provider registrieren
|
|
|
## PHP Service Provider registrieren
|
|
|
|
|
|
Erweitern Sie die [package.xml](/Package-Xml) um einen `desktopSearch` Provider Eintrag
|
|
|
|
... | ... | @@ -33,9 +32,9 @@ Erweitern Sie die [package.xml](/Package-Xml) um einen `desktopSearch` Provider |
|
|
|
|
|
```
|
|
|
|
|
|
### PHP Service Provider
|
|
|
## PHP Service Provider
|
|
|
|
|
|
Stellen Sie den Provider zur Verfügung welcher in src="" angegeben wurde. Der Provider muss das Interface `QUI\Workspace\Search\ProviderInterface` beinhalten, ansonsten wird er nicht von der Desktop Suche akzeptiert.
|
|
|
Stellen Sie den Provider zur Verfügung welcher in src="" angegeben wurde. Der Provider muss das Interface `QUI\Workspace\Search\ProviderInterface` implementieren. Das Interface ist wie folgt aufgebaut:
|
|
|
|
|
|
|
|
|
```php
|
... | ... | @@ -70,7 +69,170 @@ QUI\Products\DesktopSearch implements QUI\Workspace\Search\ProviderInterface |
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
// Gibt alle Gruppen zurück, nach denen Ergebnisse des Providers filterbar sind
|
|
|
public function getFilterGroups()
|
|
|
{
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
```
|
|
|
Grundsätzlich gibt es **zwei Arten**, wie ein Such-Provider durchsuchbare Daten für die QUIQQER Desktop-Suche liefern kann:
|
|
|
|
|
|
### 1. `buildCache()`
|
|
|
Diese Methode wird bei jedem QUIQQER System-Setup bei allen Such-Providern aufgerufen. Daten, die über diese Methode geliefert werden, werden in die **zentrale QUIQQER Such-Tabelle** eingetragen, welche automatisch bei jedem Suchvorgang durchsucht wird. In dieser Methode müssen eine Instanz von `\QUI\Workspace\Search\Builder` aufgebaut und einzelne Sucheinträge über `$Builder->addEntry()` hinzugefügt werden.
|
|
|
|
|
|
```php
|
|
|
<?php
|
|
|
|
|
|
// Builder Instanz aufbauen
|
|
|
$Builder = \QUI\Workspace\Search\Builder::getInstance();
|
|
|
|
|
|
// Einen Sucheintrag hinzufügen (alle Felder müssen vorhanden sein)
|
|
|
$Builder->addEntry(
|
|
|
'title' => 'Meine Katze Nimmersatt',
|
|
|
'search' => 'Katze Essen Nimmersatt Futter viel',
|
|
|
'group' => 'cats',
|
|
|
'groupLabel' => 'Katzen',
|
|
|
'filterGroup' => 'Haustiere',
|
|
|
'searchData' => array(
|
|
|
'require' => 'package/quiqqer/quiqqer/bin/QUI/controls/workspace/search/builder/Animals',
|
|
|
'params' => array(
|
|
|
'animalId' => 1337
|
|
|
)
|
|
|
)
|
|
|
);
|
|
|
|
|
|
```
|
|
|
Die Bedeutung der einzelnen Felder eines Sucheintrags werden weiter unten erläutert.
|
|
|
|
|
|
### 2. `search()` und `getEntry()`
|
|
|
Liefert ein Such-Provider keine Daten an die zentrale QUIQQER Such-Tabelle über `buildCache()`, kann er auch eine eigene Suchmethode implementieren. Hier ein Beispiel für einen Such-Provider, der die Seiten aller Projekte durchsucht:
|
|
|
|
|
|
```php
|
|
|
<?php
|
|
|
|
|
|
/**
|
|
|
* Execute a search
|
|
|
*
|
|
|
* @param string $search
|
|
|
* @param array $params
|
|
|
* @return mixed
|
|
|
*/
|
|
|
public function search($search, $params = array())
|
|
|
{
|
|
|
if (!in_array('sites', $params['filterGroups'])) {
|
|
|
return array();
|
|
|
}
|
|
|
|
|
|
$projects = QUI::getProjectManager()->getProjectList();
|
|
|
$results = array();
|
|
|
|
|
|
/** @var QUI\Projects\Project $Project */
|
|
|
foreach ($projects as $Project) {
|
|
|
$siteIds = $Project->getSitesIds(array(
|
|
|
'where' => array(
|
|
|
'active' => -1
|
|
|
),
|
|
|
'where_or' => array(
|
|
|
'title' => array(
|
|
|
'type' => '%LIKE%',
|
|
|
'value' => $search
|
|
|
),
|
|
|
'name' => array(
|
|
|
'type' => '%LIKE%',
|
|
|
'value' => $search
|
|
|
)
|
|
|
),
|
|
|
'limit' => isset($params['limit']) ? (int)$params['limit'] : null
|
|
|
));
|
|
|
|
|
|
$projectName = $Project->getName();
|
|
|
$projectLang = $Project->getLang();
|
|
|
$groupLabel = QUI::getLocale()->get(
|
|
|
'quiqqer/quiqqer',
|
|
|
'search.provider.sites.group.label',
|
|
|
array(
|
|
|
'projectName' => $projectName,
|
|
|
'projectLang' => $projectLang
|
|
|
)
|
|
|
);
|
|
|
|
|
|
$group = 'project-' . $projectName . '-' . $projectLang;
|
|
|
|
|
|
foreach ($siteIds as $row) {
|
|
|
$siteId = $row['id'];
|
|
|
$Site = $Project->get($siteId);
|
|
|
|
|
|
$results[] = array(
|
|
|
'id' => $projectName . '-' . $projectLang . '-' . $siteId,
|
|
|
'title' => $Site->getAttribute('title'),
|
|
|
'description' => $Site->getUrlRewritten(),
|
|
|
'icon' => 'fa fa-file-o',
|
|
|
'groupLabel' => $groupLabel,
|
|
|
'group' => $group
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return $results;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Return a search entry
|
|
|
*
|
|
|
* @param integer $id
|
|
|
* @return mixed
|
|
|
*/
|
|
|
public function getEntry($id)
|
|
|
{
|
|
|
$data = explode('-', $id); // z.B. $data = 'MeinProject-de-42';
|
|
|
|
|
|
return array(
|
|
|
'searchdata' => json_encode(array(
|
|
|
'require' => 'package/quiqqer/quiqqer/bin/QUI/controls/workspace/search/provider/Sites',
|
|
|
'params' => array(
|
|
|
'projectName' => $data[0],
|
|
|
'projectLang' => $data[1],
|
|
|
'siteId' => $data[2]
|
|
|
)
|
|
|
))
|
|
|
);
|
|
|
}
|
|
|
```
|
|
|
#### `search()`
|
|
|
Hier ist zu beachten, dass die einzelnen Elemente des `$results`-Arrays in `search()` bestimmte Daten enthalten *müssen* (ausgenommen ist dabei das Feld `searchdata`, welches über `getEntry()` geliefert wird). **Wichtig** ist das Feld `id`, welches die Identifikation eines Suchergebnisses im Nachhinein ermöglicht.
|
|
|
|
|
|
#### `getEntry()`
|
|
|
Diese Methode wird aufgerufen, sobald ein Benutzer auf einen Sucheintrag in der Suchergebnis-Liste klickt. Übergeben wird der `id`-Wert des Suchergebnisses.
|
|
|
|
|
|
## Struktur von Sucheinträgen
|
|
|
Jeder Sucheintrag, der über `$Builder->addEntry()` in die zentrale Such-Tabelle eingetragen wird oder per `search()` zurückgegeben wird, muss bestimmte Felder beinhalten.
|
|
|
### `id` *(nur `search()`)*
|
|
|
Eindeutiger Identifier (*String*). Muss nicht numerisch sein. Dient zur eindeutigen Zuweisung eines Sucheintrags für die `getEntry()`-Methode.
|
|
|
### `title`
|
|
|
Text, der als Suchergebnis erscheint. Beispiel:
|
|
|
![image](/uploads/a2b3d3f521f583e14d0bcefb42cb06fa/image.png)
|
|
|
### `description` *(optional)*
|
|
|
Text, der bei mouseover über das Suchergebnis-Element ercheint (`title`-Attribut).
|
|
|
### `icon` *(optional)*
|
|
|
Icon, welches links neben dem Titel erscheint.
|
|
|
### `group`
|
|
|
Interner Bezeichner für die Gruppierung der Suchergebnisse. Alle einzelnen Suchergebnis-Einträge mit demselben `group`-Wert, werden in der Ergebnisliste zusammengefasst untereinander dargestellt. Unterschiedliche Such-Provider können so auch zur selben Ergebnis-Gruppe beitragen.
|
|
|
### `groupLabel`
|
|
|
(Multilingualer) Text, der den Gruppen-Titel darstellt (z.B. "Benutzer").
|
|
|
### `filterGroup` *(nur `addEntry()`)*
|
|
|
Interner Bezeichner einer **Filter-Gruppe** (s.u.), der sich auf diesen Suchergebnis-Eintrag bezieht. Bei der Desktop-Suche können bestimmte Such-Filter an- und ausgeschaltet werden:
|
|
|
![image](/uploads/e62309d1c2d75dc1b927e1a8b4a67085/image.png)
|
|
|
Jeder Provider entscheidet selbst, welche **Gruppen** er durchsucht/anzeigt, wenn eine bestimmte **Filter-Gruppe** aktiv ist. **Filter-Gruppen** werden an die `search()`-Methode im `$params`-Parameter mitgeliefert (` $params['filterGroups']`).
|
|
|
### `search` *(nur `addEntry()`)*
|
|
|
String, welcher alle (durch Leerzeichen getrennte) Begriffe enthält, mit denen ein Sucheintrag gefunden werden kann. **Hinweis:** `addEntry()` erwartet einen Parameter für Sprache (`lang`), die angegebenen Suchbegriffe sollten daher in der jeweiligen Sprache sein.
|
|
|
### `searchdata` *(nur `addEntry()`)*
|
|
|
Enthält Informationen darüber, was passiert, wenn der Benutzer auf einen Sucheintrag klickt. Ermöglicht, ein Control mit bestimmten Parametern aufzurufen. `searchData` ist ein Array mit folgenden Feldern:
|
|
|
* `require`: Control, welches aufgerufen wird
|
|
|
* `params`: Übergabeparamter an das Control (kann auch ein Array sein, für mehrere Parameter)
|
|
|
**Hinweis:** Die Methode `getEntry()` muss ein Array zurückliefern, welches das Feld `searchdata` mit der angegebenen Struktur enthält.
|
|
|
|
|
|
## Sonstiges
|
|
|
* `buildCache()` kann von einem Provider leergelassen werden, wenn er die Methode `search()` implementiert (und andersrum) |
|
|
\ No newline at end of file |