أنشئ استعلامات متداخلة معقدة تحتوي على حقول وصفحات متعددة وأرجع مصفوفة يمكن تحليلها إلى JSON. هذا الاستخدام كامل لجلب البيانات الخاصة بـ SPA وPWA.
يمكنك استخدام الوحدة النمطية للانتقال من صفحة ProcessWire أو PageArray - حتى RepeaterMatrixPageArrays - إلى مصفوفة أو JSON. يمكن أن تكون الاستعلامات متداخلة وتحتوي على عمليات إغلاق كوظائف رد اتصال. يتم تحويل بعض أنواع الحقول تلقائيًا، مثل Pageimages أو MapMarker.
الخروج من صفحة الإصدارات والاشتراك في التحديثات.
يوصى بالتثبيت عبر مشرف ProcessWire " الوحدات " > " الموقع " > " إضافة جديد " > " إضافة وحدة من الدليل " باستخدام اسم فئة PageQueryBoss
.
قم بتنزيل الملفات من Github أو مستودع ProcessWire: https://modules.processwire.com/modules/page-query-builder/
هناك طريقتان رئيسيتان:
$page->pageQueryJson($query);
$page->pageQueryArray($query);
يمكن أن يحتوي الاستعلام على أزواج المفاتيح والقيم، أو المفاتيح فقط. يمكن أن تكون متداخلة وتحتوي على عمليات إغلاق للقيم الديناميكية. لتوضيح مثال قصير:
// simple query:
$query = [
'height',
'floors',
];
$pages->find('template=skyscraper')->pageQueryJson($query);
يمكن أن تكون الاستعلامات متداخلة أو تحتوي على أسماء الصفحات أو أسماء القوالب أو تحتوي على وظائف ومحددات 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);
اسم حقل واحد ; height
أو floors
أو architects
يمكن للوحدة التعامل مع الحقول التالية:
اسم القالب ; skyscraper
أو city
اسم الصفحة الفرعية (page.child.name=pagename); my-page-name
محدد ProcessWire ؛ template=building, floors>=25
اسم جديد للفهرس الذي تم إرجاعه تم تمريره بواسطة محدد #
:
// the field skyscraper will be renamed to "building":
$query = ["skyscraper`#building`"]
أي من المفاتيح المذكورة أعلاه (1-5) مع مصفوفة استعلام فرعي متداخلة جديدة:
$query = [
'skyscraper' => [
'height',
'floors'
],
'architect' => [
'title',
'email'
],
]
مفتاح مسمى ووظيفة إغلاق لمعالجة الاستعلام وإرجاعه. يحصل الإغلاق على الكائن الأصلي كوسيطة:
$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();
}
إعدادات الوحدات عامة. ويمكن تعديلها مباشرة، على سبيل المثال:
$modules->get('PageQueryBoss')->debug = true;
$modules->get('PageQueryBoss')->defaults = []; // reset all defaults
تأتي بعض أنواع الحقول أو القوالب مع محددات افتراضية، مثل Pageimages وما إلى ذلك. وهذه هي الاستعلامات الافتراضية:
// 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',
],
],
];
سيتم استخدام هذه الإعدادات الافتراضية فقط في حالة عدم وجود استعلام فرعي متداخل للنوع المعني. إذا قمت بالاستعلام عن حقل يحتوي على بيانات معقدة ولم تقدم استعلامًا فرعيًا، فسيتم تحويله وفقًا لذلك:
$page->pageQueryArry(['images']);
// returns something like this
'images' => [
'basename',
'url',
'httpUrl',
'description',
'ext',
'focus'=> [
'top',
'left',
'zoom',
'default',
'str',
]
];
يمكنك دائمًا تقديم الاستعلام الفرعي الخاص بك، لذلك لن يتم استخدام الإعدادات الافتراضية:
$page->pageQueryArry([
'images' => [
'filename',
'description'
],
]);
يمكنك أيضًا تجاوز الإعدادات الافتراضية، على سبيل المثال
$modules->get('PageQueryBoss')->defaults['queries']['Pageimages'] = [
'basename',
'url',
'description',
];
يمكن تعديل فهرس العناصر المتداخلة. ويتم ذلك أيضًا مع الإعدادات الافتراضية. هناك 3 احتمالات:
هذا هو الإعداد الافتراضي. إذا كان لديك حقل يحتوي على عناصر فرعية، فسيكون الاسم هو المفتاح في النتائج:
// example
$pagesByName = [
'page-1-name' => [
'title' => "Page one title",
'name' => 'page-1-name',
],
'page-2-name' => [
'title' => "Page two title",
'name' => 'page-2-name',
]
]
إذا تم إدراج كائن في $defaults['index-id']، فسيكون المعرف هو المفتاح في النتائج. حاليًا، لم يتم إدراج أي عناصر كإعدادات افتراضية للفهرس المستند إلى المعرف:
$modules->get('PageQueryBoss')->defaults['index-id']['Page'];
// example
$pagesById = [
123 => [
'title' => "Page one title",
'name' => 123,
],
124 => [
'title' => "Page two title",
'name' => 124,
]
]
افتراضيًا، يتم تحويل بعض الحقول تلقائيًا لتحتوي على فهارس مرقمة:
// 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",
]
]
نصيحة: عند إزالة Pageimage
الرئيسية من $defaults['index-n']، سيعتمد الفهرس مرة أخرى على الاسم.
هذه بعض وظائف الإغلاق المساعدة التي قد ترغب في استخدامها أو يمكن أن تساعد كنقطة بداية خاصة بك (أخبرني إذا كان لديك وظائف خاصة بك):
$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;
}];
باستخدام وحدة ContinentsAndCountries، يمكنك استخراج رمز ISO وأسماء البلدان:
$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;
}];
باستخدام RepeaterMatrix يمكنك إنشاء سلسلة قالب للواجهة الأمامية الخاصة بك. يعد هذا مفيدًا للأزرار والتسميات وما إلى ذلك. يستخدم التعليمة البرمجية التالية مكررًا مع strings
الاسم التي تحتوي على key
وحقل body
، وتحتوي المصفوفة التي تم إرجاعها على حقل key
كمفاتيح، كما تعتقد، وحقل body
كقيم:
// build custom translations
$query = ['strings' => function($page){
return array_column($page->get('strings')->each(['key', 'body']), 'body', 'key');
}];
باستخدام الإعداد التالي، يمكنك التعامل مع اللغات المتعددة وإرجاع لغتك الافتراضية في حالة عدم وجود اللغة المطلوبة. يتكون عنوان URL على النحو التالي: page/path/{language}/{content-type}
على سبيل المثال: 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();
}
تحترم الوحدة wire('config')->debug. أنه يتكامل مع TracyDebug. يمكنك تجاوزه مثل هذا:
// turns on debug output no mather what:
$modules->get('PageQueryBoss')->debug = true;
اجعل الإعدادات الافتراضية قابلة للتكوين عبر الواجهة الخلفية. كيف يمكن القيام بذلك بأناقة باستخدام الاستعلامات الافتراضية؟
راجع ملف الترخيص المضمن للحصول على نص الترخيص الكامل.
© نويلبوس.كوم