1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-09 16:26:59 +02:00

Fix issue processwire/processwire-issues#1436 where $pages->findJoin() used on file/image fields was resulting in them being blank in returned pages

This commit is contained in:
Ryan Cramer
2021-09-17 08:14:54 -04:00
parent 976ca7ab25
commit ba14fbde0a
2 changed files with 21 additions and 4 deletions

View File

@@ -345,12 +345,18 @@ class PageFinder extends Wire {
protected $reverseAfter = false; protected $reverseAfter = false;
/** /**
* Data that should be populated back to any resulting PageArrays data() method * Data that should be conditionally populated back to any resulting PageArrays data() method
* *
* @var array * @var array
* *
*/ */
protected $pageArrayData = array(); protected $pageArrayData = array(
/* may include:
'fields' => array()
'extends' => array()
'joinFields' => array()
*/
);
/** /**
* The fully parsed/final selectors used in the last find() operation * The fully parsed/final selectors used in the last find() operation
@@ -1670,13 +1676,19 @@ class PageFinder extends Wire {
$query->leftjoin('pages_paths ON pages_paths.pages_id=pages.id'); $query->leftjoin('pages_paths ON pages_paths.pages_id=pages.id');
} }
if(!empty($opts['joinFields'])) { if(!empty($opts['joinFields'])) {
$this->pageArrayData['joinFields'] = array(); // identify whether each field supported autojoin
foreach($opts['joinFields'] as $joinField) { foreach($opts['joinFields'] as $joinField) {
$joinField = $this->fields->get($joinField); $joinField = $this->fields->get($joinField);
if(!$joinField || !$joinField instanceof Field) continue; if(!$joinField || !$joinField instanceof Field) continue;
$joinTable = $database->escapeTable($joinField->getTable()); $joinTable = $database->escapeTable($joinField->getTable());
if(!$joinTable || !$joinField->type) continue; if(!$joinTable || !$joinField->type) continue;
if(!$joinField->type->getLoadQueryAutojoin($joinField, $query)) continue; if($joinField->type->getLoadQueryAutojoin($joinField, $query)) {
$autojoinTables[$joinTable] = $joinTable; // added at end if not already joined $autojoinTables[$joinTable] = $joinTable; // added at end if not already joined
$this->pageArrayData['joinFields'][$joinField->name] = true;
} else {
// fieldtype does not support autojoin
$this->pageArrayData['joinFields'][$joinField->name] = false;
}
} }
} }
} else if($options['returnVerbose']) { } else if($options['returnVerbose']) {

View File

@@ -609,6 +609,10 @@ class PagesLoader extends Wire {
$pageArray = $rows['pageArray']; $pageArray = $rows['pageArray'];
$pageArray->setTrackChanges(false); $pageArray->setTrackChanges(false);
$paginationTotal = $pageArray->getTotal(); $paginationTotal = $pageArray->getTotal();
/** @var array $joinResults PageFinder sets which fields supported autojoin true|false */
$joinResults = $pageArray->data('joinFields');
unset($rows['pageArray']); unset($rows['pageArray']);
foreach($rows as $row) { foreach($rows as $row) {
@@ -667,6 +671,7 @@ class PagesLoader extends Wire {
// set blank values where joinField didn't appear on page row // set blank values where joinField didn't appear on page row
foreach($joinFields as $joinField) { foreach($joinFields as $joinField) {
if(isset($row["{$joinField}__data"])) continue; if(isset($row["{$joinField}__data"])) continue;
if(empty($joinResults[$joinField])) continue; // field did not support autojoin
if(!$template->fieldgroup->hasField($joinField)) continue; if(!$template->fieldgroup->hasField($joinField)) continue;
$field = $page->getField($joinField); $field = $page->getField($joinField);
if(!$field || !$field->type) continue; if(!$field || !$field->type) continue;