Jump to content

[solved] Sort a gallery by descending date


biber
 Share

Recommended Posts

Hi,

I have built a site with some galleries, which can be ordered by different criteria, like place, name or date_created. This works fine, iname_1,2 or 3 can be chosen by user.

Now I want to have the option to sort the images "latest image first".  Setting "rsort" instead of "sort" in line 31 comes up with this error:

Quote

Warning: foreach() argument must be of type array|object, string given in /var/www/html/processwire/processwire-master/site/templates/galerie.php on line 53

Where is my mistake? Any idea?

Here is my template:

1 <?php include(\ProcessWire\wire('files')->compile(\ProcessWire\wire("config")->paths->
root . 'site/templates/_head.php',array('includes'=>true,'namespace'=>true,'modules'=>
true,'skipIfNamespace'=>true))); // include header markup ?>
2 
3 <div id='haupt'>
4 
5 <?php
6 
7 // output 'headline' if available, otherwise 'title'
8 echo '<h1>' . $page->get('headline|title') . '</h1>';
9 
10 //get all segments and clean segments!
11 $seg1 = $sanitizer->pageName($input->urlSegment1);
12 $seg2 = $sanitizer->pageName($input->urlSegment2);
13 $seg3 = $sanitizer->pageName($input->urlSegment3);
14 
15 //check for the second urlsegment not needed
16 if ($seg2) {
17 // unknown URL segment, send a 404
18 throw new \ProcessWire\Wire404Exception();
19 }
20 
21 //check for the third urlsegment not needed
22 if ($seg3) {
23 // unknown URL segment, send a 404
24 throw new \ProcessWire\Wire404Exception();
25 }
26 // Sortierung übernehmen:
27 $order = $input->get->order;
28 
29 // sortiere nach name_:
30 if ($order >0) {
31 $images = $page->images->sort("iname_".$order, SORT_NATURAL |
SORT_FLAG_CASE);
32 $session->set($order, $order);
33 }
34 
35 // ohne Sortierung:
36 else {
37 $images = $page->images;
38 }
39 
40 //normal content without first url segment!
41 if (!$seg1) {
42 
43 echo $page->body;
44 if (!empty ($page->name_1|$page->name_2|$page->name_3)) echo '<p>Sortierung nach 
';
45 if (!empty($page->name_1))
46 echo '<a class="tab" href="'.$page->url.'?order=1">'. $page->get('name_1').
'</a>&nbsp;';
47 if (!empty($page->name_2))
48 echo '<a class="tab " href="'.$page->url.'?order=2">'. $page->get('name_2').
'</a>&nbsp;';
49 if (!empty($page->name_3))
50 echo '<a class="tab " href="'.$page->url.'?order=3">'. $page->get('name_3').
'</a></p>';
51 
52 // output images
53 foreach($images as $image) {
54 $iname_3 = $image->created;
55 $thumbnail = $image->height(100);
56 echo '<div class="rahmen"><a href="'.$page->url . $image.'?order='.$session->
get($order).'"><img class="shadow" src="'.$thumbnail->url.'" alt="'.$image->
kopf.'" title="'.$image->kopf.'" loading="lazy"></a></div>';
57 }
58 
59 }
60
61 //special view output with an url segment...
62 if ($seg1) {
63 // get the image in the correspondent position:
64 $index = $input->$seg1;
65 $image = $page->images->index($index);
66 
67 // Link zum vorigen Bild:
68 echo '<a href="'.$images->getPrev($images->$seg1).'?order='.$session->get($order).
'"><img src="'.$config->urls->site.'templates/styles/links.gif" alt="voriges 
Bild" title="voriges Bild"></a>&nbsp;';
69 
70 // Link zur Thumbnail-Seite:
71 echo '<a href="'.$page->url.'?order='.$session->get($order).'"><img src="'.$config
->urls->site.'templates/styles/index.gif" alt="zurück zur Übersicht" 
title="zurück zur Übersicht"></a>&nbsp;';
72 
73 // Link zum nächsten Bild:
74 echo '<a href="'.$images->getNext($images->$seg1).'?order='.$session->get($order).
'"><img src="'.$config->urls->site.'templates/styles/rechts.gif" alt="nächstes 
Bild" title="nächstes Bild"></a><br />';
75 
76 // Bild zeigen:
77 echo '<img class="shadow" src="'.$images->url . $seg1.'" alt="'.$images->$seg1->
get('kopf|name_1').'" title="'.$images->$seg1->get('kopf|name_1').'">';
78 
79 //echo '<img class="shadow" src="'.$images->url. $seg1.'" 
alt="'.$images->$seg1->kopf.'" title="'.$images->$seg1->get('name_1|kopf').'">'; 
80 
81 
82 // Textfelder zu den Bildern anzeigen:
83 echo '<h2>'.$images->$seg1->caption.'</h2>';
84 echo '<h2>'.$images->$seg1->get('kopf|name_1').'</h2>';
85 //var_dump($images->$seg1->filedata['_109']);
86 //var_dump($images->$seg1->caption);
87 echo '<p>'.$images->$seg1->bildtext.'</p>';
88 echo '<p>| '.$images->$seg1->iname_1.'&nbsp; &nbsp;| '.$images->$seg1->iname_2.
'&nbsp; &nbsp; | '.date("d.m.Y",($images->$seg1->created)).' |</p>';
89 }
90 ?>
91 </div><!-- end content -->
92 <?php include(\ProcessWire\wire('files')->compile(\ProcessWire\wire("config")->paths->
root . 'site/templates/_foot.php',array('includes'=>true,'namespace'=>true,'modules'=>
true,'skipIfNamespace'=>true))); // include footer markup ?>

 

Edited by biber
Link to comment
Share on other sites

Hi @biber

I don't think the sort() function is available to pageimages because pageimages is not WireArray.

The result of the below line returns nothing.

$images = $page->images->sort("iname_".$order, SORT_NATURAL |SORT_FLAG_CASE);

Then

foreach($images as $image) 

Give error because the variable $images is empty.

Gideon

 

 

  • Like 1
Link to comment
Share on other sites

@Gideon So I beg to differ on that assumption. Pageimages is a WireArray and thus will have a sort() function. See here: Pageimages class - ProcessWire API.

@biber You can find the API for sort() here: WireArray::sort() method - ProcessWire API. There is no rsort() function, but sort() can still reverse the order like so:

$images = $page->images->sort("-iname_".$order, SORT_NATURAL |SORT_FLAG_CASE);

note the "-" (minus) in front of the field name.

Here is another approach:

$images = $page->images->sort("iname_".$order, SORT_NATURAL |SORT_FLAG_CASE)->reverse();

This is using the reverse() function of WireArray, whose docs you can find here: WireArray::reverse() method - ProcessWire API

  • Like 1
Link to comment
Share on other sites

hi @ShaunaB1 and @Gideon So,

Thanks for your efforts to help to my problem. Unfortunately a simple "-" does not solve my challenge.  I also tried a "sort(1/iname_3)", where iname_3 contains a timestamp - no success.

@Gideon SoI did a dump on $images in line 32 and it throws a long list of all parts of the image-field. Sorting itself works as desired, but not with an option "image_created descending".

Greetings Günter

Link to comment
Share on other sites

Hi @poljpocket,

sort (-iname ... ) does not work, because iname_* contain different criteria to sort the images.

To have an impression of the site, here's the link: (The new sorting function is not yet implemented completely) http://www.malabu.de

But

->reverse();

was the right way, it works!

Thanks to you all

Günter

  • Like 2
Link to comment
Share on other sites

  • biber changed the title to [solved] Sort a gallery by descending date

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...