Files section / field: multiple parents

Can you combine query results? For instance: query more than one parent in a files field or section?
Concrete use case: I need a files field where the user can insert an image from either one of two folders. It would be nice if I could also display all the images from these two folders in a files section.

A files section can only have a single parent. To display files from multiple parents, you would have to create multiple files sections or a custom section.

Querying multiple pages in a files field should be possible.

EDIT: had a mistake in my query

Thanks for the suggestions. Multiple file sections is the workaround I have right now. But I don’t see how I can combine queries in a files field. I tried

  fields:
    image:
      label: Image
      type: files
      query: page.images.add(site.find("images").images)

(And also extend instead of add)

Note: there is an images folder at site level. Both page.images and site.find("images").images queries work fine, but I don’t see how I can combine the results.

You could probably use a files collection?

Collections don’t seem to work in queries? Tried:

in collections/images.php:

return function ($site) {
  return $site->find("images")->images();
};

and in the files field:
query: collection("images")

but that yields “The files query does not seem to be correct”

Try

query: kirby.collection("images")

Of course. That works indeed. But now I’m back to square one because the $page object is not available in custom collections, nor does $site->page() seem to work there. So I’m still not able to collect site files with page files.

Guess I’m asking too much :slight_smile:

But you can combine the collections, for example:

<?php
return function ($site) {
    $siteImages = $site->images();
    $pageImages = page('photography')->children()->first()->images();
    $allImages = $siteImages->add($pageImages);
  return $allImages;
};

You can use the page() helper here to get a page by ID, or use $site->find() or whatever you need to find the page or pages you want to query for files.

Yeah, but I’m querying the collection on a files field of a page I’m creating.

The catch is: I want query the files from this page (that I’m creating) + some other files I can get via the $site object.
So I can either query the $page object directly in the query but then I can’t combine the results with whatever else I want to query (apparently), OR I can use a custom collection and combine stuff there but that collection is agnostic of the page I’m creating so it can’t add that page’s files there either.

return function ($site) {
    $siteImages = $site->images();
    $pageImages = page()->images();
    $allImages = $siteImages->add($pageImages);
  return $allImages;
};

The page() helper without a parameter always refers to the current page…

So if you query that collection in Page A, you will get the site’s file + the images uploaded to Page A.

I did try the $site->page() helper, but the list turns up empty if I do. So I presumed it doesn’t work from a custom collection. Do you think that’s a bug? If so I can file an issue.

Yes, you are right, I tested in the home page and there it works, but not on other pages. So it doesn’t seem to be possible to fetch the current page in a collection, because the page helper in that case always gets the home page, not the current page, too bad. $site->index()->current() doesn’t work, either.

The page helper works fine when calling the above collection in any template, but in a Panel context, it stops working and defaults to the home page.

:cry:

Till Prochaska suggested in Slack to use a custom page model to solve this and it works:

  class ExhibitionPage extends Page {

    public function allImages() {
      return $this->images()->add($this->site()->find('images')->images());
    }

  }

Then in the files field I added:

query: page.allImages

2 Likes