Erstellen Sie komplexe verschachtelte Abfragen mit mehreren Feldern und Seiten und geben Sie ein Array zurück, das in JSON analysiert werden kann. Dies ist nützlich, um Daten für SPA und PWA abzurufen.
Sie können das Modul verwenden, um eine ProcessWire-Seite oder ein PageArray – sogar RepeaterMatrixPageArrays – in ein Array oder JSON umzuwandeln. Abfragen können verschachtelt sein und Abschlüsse als Rückruffunktionen enthalten. Einige Feldtypen werden automatisch transformiert, z. B. Pageimages oder MapMarker.
Schauen Sie sich die Veröffentlichungsseite an und abonnieren Sie Updates.
Es wird empfohlen, die Installation über den ProcessWire-Administrator „ Module “ > „ Site “ > „ Neu hinzufügen “ > „ Modul aus Verzeichnis hinzufügen “ unter Verwendung des PageQueryBoss
-Klassennamens durchzuführen.
Laden Sie die Dateien von Github oder dem ProcessWire-Repository herunter: https://modules.processwire.com/modules/page-query-builder/
Es gibt zwei Hauptmethoden:
$page->pageQueryJson($query);
$page->pageQueryArray($query);
Die Abfrage kann Schlüssel-Wert-Paare oder nur Schlüssel enthalten. Es kann verschachtelt sein und Abschlüsse für dynamische Werte enthalten. Um ein kurzes Beispiel zu veranschaulichen:
// simple query:
$query = [
'height',
'floors',
];
$pages->find('template=skyscraper')->pageQueryJson($query);
Abfragen können verschachtelt sein, Seitennamen, Vorlagennamen oder Funktionen und ProcessWire-Selektoren enthalten:
// simple query:
$query = [
'height',
'floors',
'images', // < some fileds contain default sub-queries to return data
'files' => [ // but you can also overrdide these defaults:
'filename'
'ext',
'url',
],
// Assuming there are child pages with the architec template, or a
// field name with a page relation to architects
'architect' => [ // sub-query
'name',
'email'
],
// queries can contain closure functions
'querytime' => function($parent){
return "Query for $parent->title was built ".time();
}
];
$pages->find('template=skyscraper')->pageQueryJson($query);
Ein einzelner Feldname ; height
oder floors
oder architects
Das Modul kann die folgenden Felder verarbeiten:
Ein Vorlagenname ; skyscraper
oder city
Name einer untergeordneten Seite (page.child.name=Seitenname); my-page-name
Ein ProcessWire-Selektor ; template=building, floors>=25
Ein neuer Name für den zurückgegebenen Index, übergeben durch ein #
-Trennzeichen:
// the field skyscraper will be renamed to "building":
$query = ["skyscraper`#building`"]
Jeder der oben genannten Schlüssel (1–5) mit einem neuen verschachtelten Unterabfrage-Array:
$query = [
'skyscraper' => [
'height',
'floors'
],
'architect' => [
'title',
'email'
],
]
Ein benannter Schlüssel und eine Abschlussfunktion zum Verarbeiten und Zurückgeben einer Abfrage. Der Abschluss erhält das übergeordnete Objekt als Argument:
$query = [
'architecs' => function($parent)
{
$architects = $parent->find('template=architect');
return $architects->arrayQuery(['name', 'email']);
// or return $architects->explode('name, email');
}
]
$query = [
'title',
'subtitle',
// naming the key invitation
'template=Invitation, limit=1#invitation' => [
'title',
'subtitle',
'body',
],
// returns global speakers and local ones...
'speakers' => function($page){
$speakers = $page->speaker_relation;
$speakers = $speakers->prepend(wire('pages')->find('template=Speaker, global=1, sort=-id'));
// build a query of the speakers with
return $speakers->arrayQuery([
'title#name', // rename title field to name
'subtitle#ministry', // rename subtitle field to ministry
'links' => [
'linklabel#label', // rename linklabel field to minlabelistry
'link'
],
]);
},
// Child Pages with template=Program
'Program' => [
'title',
'summary',
'start' => function($parent){ // calculate the startdate from timetables
return $parent->children->first->date;
},
'end' => function($parent){ // calculate the endate from timetables
return $parent->children->last->date;
},
'Timetable' => [
'date', // date
'timetable#entry'=> [
'time#start', // time
'time_until#end', // time
'subtitle#description', // entry title
],
],
],
// ProcessWire selector, selecting children > name result "location"
'template=Location, limit=1#location' => [
'title#city', // summary title field to city
'body',
'country',
'venue',
'summary#address', // rename summary field to address
'link#tickets', // rename ticket link
'map', // Mapmarker field, automatically transformed
'images',
'infos#categories' => [ // repeater matrix! > rename to categories
'title#name', // rename title field to name
'entries' => [ // nested repeater matrix!
'title',
'body'
]
],
],
];
if ($input->urlSegment1 === 'json') {
header('Content-type: application/json');
echo $page->pageQueryJson($query);
exit();
}
Die Moduleinstellungen sind öffentlich. Sie können direkt geändert werden, zum Beispiel:
$modules->get('PageQueryBoss')->debug = true;
$modules->get('PageQueryBoss')->defaults = []; // reset all defaults
Einige Feldtypen oder Vorlagen verfügen über Standardselektoren, z. B. Seitenbilder usw. Dies sind die Standardabfragen:
// Access and modify default queries: $modules->get('PageQueryBoss')->defaults['queries'] = …
public $defaults = [
'queries' => [
'Pageimage' => [
'basename',
'url',
'httpUrl',
'description',
'ext',
'focus',
],
'Pageimages' => [
'basename',
'url',
'httpUrl',
'description',
'ext',
'focus',
],
'Pagefile' => [
'basename',
'url',
'httpUrl',
'description',
'ext',
'filesize',
'filesizeStr',
'hash',
],
'Pagefiles' => [
'basename',
'url',
'httpUrl',
'description',
'ext',
'filesize',
'filesizeStr',
'hash',
],
'MapMarker' => [
'lat',
'lng',
'zoom',
'address',
],
'User' => [
'name',
'email',
],
],
];
Diese Standardwerte werden nur verwendet, wenn für den jeweiligen Typ keine verschachtelte Unterabfrage vorhanden ist. Wenn Sie ein Feld mit komplexen Daten abfragen und keine Unterabfrage bereitstellen, wird es entsprechend transformiert:
$page->pageQueryArry(['images']);
// returns something like this
'images' => [
'basename',
'url',
'httpUrl',
'description',
'ext',
'focus'=> [
'top',
'left',
'zoom',
'default',
'str',
]
];
Sie können jederzeit Ihre eigene Unterabfrage bereitstellen, sodass die Standardeinstellungen nicht verwendet werden:
$page->pageQueryArry([
'images' => [
'filename',
'description'
],
]);
Sie können beispielsweise auch die Standardeinstellungen überschreiben
$modules->get('PageQueryBoss')->defaults['queries']['Pageimages'] = [
'basename',
'url',
'description',
];
Der Index für verschachtelte Elemente kann angepasst werden. Dies geschieht auch mit Standardwerten. Es gibt 3 Möglichkeiten:
Dies ist die Standardeinstellung. Wenn Sie ein Feld haben, das Unterelemente enthält, ist der Name der Schlüssel in den Ergebnissen:
// example
$pagesByName = [
'page-1-name' => [
'title' => "Page one title",
'name' => 'page-1-name',
],
'page-2-name' => [
'title' => "Page two title",
'name' => 'page-2-name',
]
]
Wenn ein Objekt in $defaults['index-id'] aufgeführt ist, ist die ID der Schlüssel in den Ergebnissen. Derzeit sind keine Elemente als Standard für den id-basierten Index aufgeführt:
$modules->get('PageQueryBoss')->defaults['index-id']['Page'];
// example
$pagesById = [
123 => [
'title' => "Page one title",
'name' => 123,
],
124 => [
'title' => "Page two title",
'name' => 124,
]
]
Standardmäßig werden einige Felder automatisch so umgewandelt, dass sie nummerierte Indizes enthalten:
// objects or template names that should use numerical indexes for children instead of names
$defaults['index-n'] => [
'skyscraper', // template name
'Pageimage',
'Pagefile',
'RepeaterMatrixPage',
];
// example
$images = [
0 => [
'filename' => "image1.jpg",
],
1 => [
'filename' => "image2.jpg",
]
]
Tipp: Wenn Sie den Schlüssel Pageimage
aus $defaults['index-n'] entfernen, ist der Index wieder namensbasiert.
Dies sind einige Helpfill-Abschlussfunktionen, die Sie möglicherweise verwenden möchten oder die als Ausgangspunkt für Ihre eigenen dienen könnten (lassen Sie es mich wissen, wenn Sie eigene haben):
$query = ['languages' => function($page){
$ar = [];
$l=0;
foreach (wire('languages') as $language) {
// build the json url with segment 1
$ar[$l]['url']= $page->localHttpUrl($language).wire('input')->urlSegment1;
$ar[$l]['name'] = $language->name == 'default' ? 'en' : $language->name;
$ar[$l]['title'] = $language->getLanguageValue($language, 'title');
$ar[$l]['active'] = $language->id == wire('user')->language->id;
$l++;
}
return $ar;
}];
Mit dem ContinentsAndCountries-Modul können Sie ISO-Code und Namen für Länder extrahieren:
$query = ['country' => function($page){
$c = wire('modules')->get('ContinentsAndCountries')->findBy('countries', array('name', 'iso', 'code'),['code' =>$page->country]);
return count($c) ? (array) $c[count($c)-1] : null;
}];
Mithilfe einer RepeaterMatrix können Sie eine Vorlagenzeichenfolge für Ihr Frontend erstellen. Dies ist nützlich für Schaltflächen, Beschriftungen usw. Der folgende Code verwendet einen Repeater mit dem Namen strings
hat ein key
und ein body
, das zurückgegebene Array enthält das key
, wie Sie vermuten, Schlüssel und das body
als Werte:
// build custom translations
$query = ['strings' => function($page){
return array_column($page->get('strings')->each(['key', 'body']), 'body', 'key');
}];
Mit dem folgenden Setup können Sie mit Mehrsprachen umgehen und Ihre Standardsprache zurückgeben, wenn die angeforderte Sprache nicht vorhanden ist. Die URL setzt sich wie folgt zusammen: page/path/{language}/{content-type}
zum Beispiel: api/icf/zurich/conference/2019/de/json
// get contenttype and language (or default language if not exists)
$lang = wire('languages')->get($input->urlSegment1);
if(!$lang instanceof Nullpage){
$user->language = $lang;
} else {
$lang = $user->language;
}
// contenttype segment 2 or 1 if language not present
$contenttype = $input->urlSegment2 ? $input->urlSegment2 : $input->urlSegment1;
if ($contenttype === 'json') {
header('Content-type: application/json');
echo $page->pageQueryJson($query);
exit();
}
Das Modul respektiert Wire('config')->debug. Es lässt sich in TracyDebug integrieren. Sie können es folgendermaßen überschreiben:
// turns on debug output no mather what:
$modules->get('PageQueryBoss')->debug = true;
Machen Sie die Standardeinstellungen über das Backend konfigurierbar. Wie könnte das mit den Standardabfragen stilvoll gemacht werden?
Den vollständigen Lizenztext finden Sie in der mitgelieferten LIZENZdatei.
© noelboss.com