Cree consultas anidadas complejas que contengan varios campos y páginas y devuelva una matriz que se pueda analizar en JSON. Esto es muy útil para recuperar datos para SPA y PWA.
Puede utilizar el módulo para transformar una página de ProcessWire o un PageArray (incluso un repetidorMatrixPageArrays) en una matriz o JSON. Las consultas se pueden anidar y contener cierres como funciones de devolución de llamada. Algunos tipos de campos se transforman automáticamente, como Pageimages o MapMarker.
Consulte la página de lanzamientos y suscríbase a las actualizaciones.
Se recomienda realizar la instalación a través del administrador de ProcessWire " Módulos " > " Sitio " > " Agregar nuevo " > " Agregar módulo desde directorio " usando el nombre de clase PageQueryBoss
.
Descargue los archivos desde Github o el repositorio de ProcessWire: https://modules.processwire.com/modules/page-query-builder/
Hay dos métodos principales:
$page->pageQueryJson($query);
$page->pageQueryArray($query);
La consulta puede contener pares clave y valor, o solo claves. Puede anidarse y contener cierres para valores dinámicos. Para ilustrar un breve ejemplo:
// simple query:
$query = [
'height',
'floors',
];
$pages->find('template=skyscraper')->pageQueryJson($query);
Las consultas pueden estar anidadas, contener nombres de páginas, nombres de plantillas o contener funciones y selectores de 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);
Un solo nombre de campo ; height
o floors
o architects
El Módulo puede manejar los siguientes campos:
Un nombre de plantilla ; skyscraper
o city
Nombre de una página secundaria (page.child.name=pagename); my-page-name
Un selector ProcessWire ; template=building, floors>=25
Un nuevo nombre para el índice devuelto pasado por un delimitador #
:
// the field skyscraper will be renamed to "building":
$query = ["skyscraper`#building`"]
Cualquiera de las claves anteriores (1-5) con una nueva matriz de subconsulta anidada:
$query = [
'skyscraper' => [
'height',
'floors'
],
'architect' => [
'title',
'email'
],
]
Una clave con nombre y una función de cierre para procesar y devolver una consulta. El cierre obtiene el objeto principal como argumento:
$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();
}
La configuración de los módulos es pública. Se pueden modificar directamente, por ejemplo:
$modules->get('PageQueryBoss')->debug = true;
$modules->get('PageQueryBoss')->defaults = []; // reset all defaults
Algunos tipos de campos o plantillas vienen con selectores predeterminados, como Pageimages, etc. Estas son las consultas predeterminadas:
// 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',
],
],
];
Estos valores predeterminados solo se utilizarán si no hay una subconsulta anidada para el tipo respectivo. Si consulta un campo con datos complejos y no proporciona una subconsulta, se transformará en consecuencia:
$page->pageQueryArry(['images']);
// returns something like this
'images' => [
'basename',
'url',
'httpUrl',
'description',
'ext',
'focus'=> [
'top',
'left',
'zoom',
'default',
'str',
]
];
Siempre puede proporcionar su propia subconsulta, por lo que no se utilizarán los valores predeterminados:
$page->pageQueryArry([
'images' => [
'filename',
'description'
],
]);
También puede anular los valores predeterminados, por ejemplo
$modules->get('PageQueryBoss')->defaults['queries']['Pageimages'] = [
'basename',
'url',
'description',
];
El índice de elementos anidados se puede ajustar. Esto también se hace con los valores predeterminados. Hay 3 posibilidades:
Esta es la configuración predeterminada. Si tiene un campo que contiene subelementos, el nombre será la clave en los resultados:
// example
$pagesByName = [
'page-1-name' => [
'title' => "Page one title",
'name' => 'page-1-name',
],
'page-2-name' => [
'title' => "Page two title",
'name' => 'page-2-name',
]
]
Si un objeto aparece en $defaults['index-id'], la identificación será la clave en los resultados. Actualmente, no hay elementos listados como predeterminados para el índice basado en ID:
$modules->get('PageQueryBoss')->defaults['index-id']['Page'];
// example
$pagesById = [
123 => [
'title' => "Page one title",
'name' => 123,
],
124 => [
'title' => "Page two title",
'name' => 124,
]
]
De forma predeterminada, un par de campos se transforman automáticamente para contener índices numerados:
// 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",
]
]
Consejo: Cuando eliminas la clave Pageimage
de $defaults['index-n'], el índice volverá a estar basado en nombres.
Estas son algunas funciones de cierre de ayuda que quizás quieras usar o que podrían ayudarte como punto de partida (avísame si tienes la tuya propia):
$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;
}];
Usando el módulo ContinentsAndCountries puede extraer códigos ISO y nombres de países:
$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;
}];
Con un repetidorMatrix puede crear una cadena de plantilla para su interfaz. Esto es útil para botones, etiquetas, etc. El siguiente código utiliza un repetidor con las strings
de nombre que tienen una key
y un campo body
, la matriz devuelta contiene el campo key
como, como puede suponer, claves y el campo body
como valores:
// build custom translations
$query = ['strings' => function($page){
return array_column($page->get('strings')->each(['key', 'body']), 'body', 'key');
}];
Con la siguiente configuración, puede manejar varios idiomas y devolver su idioma predeterminado si el idioma solicitado no existe. La URL se compone así: page/path/{language}/{content-type}
por ejemplo: 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();
}
El módulo respeta wire('config')->debug. Se integra con TracyDebug. Puedes anularlo así:
// turns on debug output no mather what:
$modules->get('PageQueryBoss')->debug = true;
Haga que los valores predeterminados sean configurables a través del backend. ¿Cómo podría hacerse eso con estilo con las consultas predeterminadas?
Consulte el archivo de LICENCIA incluido para obtener el texto completo de la licencia.
© noelboss.com