Buat kueri bersarang kompleks yang berisi beberapa bidang dan halaman dan kembalikan array yang dapat diurai ke JSON. Ini berguna untuk mengambil data untuk SPA dan PWA.
Anda dapat menggunakan Modul untuk mengubah Halaman ProcessWire atau PageArray – bahkan RepeaterMatrixPageArrays – menjadi array atau JSON. Kueri dapat disarangkan dan berisi penutupan sebagai fungsi panggilan balik. Beberapa tipe bidang diubah secara otomatis, seperti Pageimages atau MapMarker.
Kunjungi Halaman Rilis dan berlangganan pembaruan.
Disarankan untuk menginstal melalui admin ProcessWire " Modul " > " Situs " > " Tambah Baru " > " Tambah Modul dari Direktori " menggunakan nama kelas PageQueryBoss
.
Unduh file dari Github atau repositori ProcessWire: https://modules.processwire.com/modules/page-query-builder/
Ada dua metode utama:
$page->pageQueryJson($query);
$page->pageQueryArray($query);
Kueri dapat berisi pasangan kunci dan nilai, atau hanya kunci saja. Itu bisa disarangkan dan berisi penutupan untuk nilai dinamis. Untuk mengilustrasikan contoh singkat:
// simple query:
$query = [
'height',
'floors',
];
$pages->find('template=skyscraper')->pageQueryJson($query);
Kueri dapat disarangkan, berisi nama halaman, nama templat, atau berisi fungsi dan pemilih ProcessWire:
// 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);
Satu nama bidang ; height
atau floors
atau architects
Modul dapat menangani bidang-bidang berikut:
Nama templat ; skyscraper
atau city
Nama halaman anak (page.child.name=namahalaman); my-page-name
Pemilih ProcessWire ; template=building, floors>=25
Nama baru untuk indeks yang dikembalikan yang diteruskan oleh #
pembatas:
// the field skyscraper will be renamed to "building":
$query = ["skyscraper`#building`"]
Salah satu kunci di atas (1-5) dengan array sub-kueri bersarang baru:
$query = [
'skyscraper' => [
'height',
'floors'
],
'architect' => [
'title',
'email'
],
]
Kunci bernama dan fungsi penutupan untuk memproses dan mengembalikan kueri. Penutupan menjadikan objek induk sebagai argumen:
$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();
}
Pengaturan modul bersifat publik. Bisa langsung dimodifikasi, misalnya:
$modules->get('PageQueryBoss')->debug = true;
$modules->get('PageQueryBoss')->defaults = []; // reset all defaults
Beberapa jenis bidang atau templat dilengkapi dengan pemilih default, seperti Pageimages, dll. Ini adalah kueri default:
// 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',
],
],
];
Default ini hanya akan digunakan jika tidak ada sub-kueri bersarang untuk masing-masing jenis. Jika Anda menanyakan bidang dengan data kompleks dan tidak menyediakan subkueri, bidang tersebut akan diubah sesuai:
$page->pageQueryArry(['images']);
// returns something like this
'images' => [
'basename',
'url',
'httpUrl',
'description',
'ext',
'focus'=> [
'top',
'left',
'zoom',
'default',
'str',
]
];
Anda selalu dapat memberikan subkueri Anda sendiri, sehingga defaultnya tidak akan digunakan:
$page->pageQueryArry([
'images' => [
'filename',
'description'
],
]);
Anda juga dapat mengganti defaultnya, misalnya
$modules->get('PageQueryBoss')->defaults['queries']['Pageimages'] = [
'basename',
'url',
'description',
];
Indeks untuk elemen bersarang dapat disesuaikan. Hal ini juga dilakukan dengan default. Ada 3 kemungkinan:
Ini adalah pengaturan default. Jika Anda memiliki bidang yang berisi sub-item, namanya akan menjadi kunci dalam hasil:
// example
$pagesByName = [
'page-1-name' => [
'title' => "Page one title",
'name' => 'page-1-name',
],
'page-2-name' => [
'title' => "Page two title",
'name' => 'page-2-name',
]
]
Jika suatu objek terdaftar di $defaults['index-id'] id akan menjadi kunci dalam hasil. Saat ini, tidak ada item yang terdaftar sebagai default untuk indeks berbasis id:
$modules->get('PageQueryBoss')->defaults['index-id']['Page'];
// example
$pagesById = [
123 => [
'title' => "Page one title",
'name' => 123,
],
124 => [
'title' => "Page two title",
'name' => 124,
]
]
Secara default, beberapa bidang diubah secara otomatis untuk memuat indeks bernomor:
// 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",
]
]
Tip: Saat Anda menghapus kunci Pageimage
dari $defaults['index-n'], indeks akan kembali berbasis nama.
Ini adalah beberapa fungsi penutupan bantuan yang mungkin ingin Anda gunakan atau dapat membantu sebagai titik awal untuk Anda sendiri (beri tahu saya jika Anda punya sendiri):
$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;
}];
Dengan menggunakan Modul ContinentsAndCountries Anda dapat mengekstrak kode iso dan nama negara:
$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;
}];
Menggunakan RepeaterMatrix Anda dapat membuat string templat untuk frontend Anda. Ini berguna untuk tombol, label, dll. Kode berikut menggunakan repeater dengan nama strings
yang memiliki key
dan bidang body
, array yang dikembalikan berisi bidang key
sebagai, Anda dapat menebak, kunci dan bidang body
sebagai nilai:
// build custom translations
$query = ['strings' => function($page){
return array_column($page->get('strings')->each(['key', 'body']), 'body', 'key');
}];
Dengan menggunakan pengaturan berikut, Anda dapat menangani multibahasa dan mengembalikan bahasa default jika bahasa yang diminta tidak ada. Urlnya disusun seperti ini: page/path/{language}/{content-type}
misalnya: 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();
}
Modul ini menghormati wire('config')->debug. Ini terintegrasi dengan TracyDebug. Anda dapat menimpanya seperti ini:
// turns on debug output no mather what:
$modules->get('PageQueryBoss')->debug = true;
Jadikan default dapat dikonfigurasi melalui Backend. Bagaimana hal itu bisa dilakukan dengan gaya kueri default?
Lihat file LISENSI yang disertakan untuk teks lisensi lengkap.
© noelboss.com