Using $page->isDescendantOf on a subpage


#1

Im trying to use $page->isDescendantOfon a subpage, but it throws a whoops. It works if i give it a top level page, but i want to test if the current page is a descendant of a particular subpage. Is this expected behaviour? How can I do it?


#2

How are you using it? Please post your code and the page structure


#3

Has this been resolved, @jimbobrjames?


#4

Ah… i solved it another way, sorry I meant to come back and say. But i never did get $page->isDescendantOf to work from a child down rather than a top most level page. Think i ended up matching from an array of ID’s with the help of AutoID instead.


#5

I’d still be interested in what you tried that didn’t work?


#6

Well ok… if you promise not to raise your eyebrows at how i did this… :slight_smile: …

the code has evolved a bit since i asked but it was something like this…

<?php $thispageid = $page->autoid()->value() ?>

<?php if($page->isDescendantOf('toplevelone') || $thispageid == '65'): ?>
  <?php snippet('navs/nav-subpagelist', array('pagelist' => ['65', '159', '66', '68', '71', '72', '73' ])) ?>
  
<?php elseif($page->isDescendantOf('topleveltwo') || $thispageid == '58'): ?>
  <?php snippet('navs/nav-subpagelist', array('pagelist' => ['58', '160', '74', '78', '79', '76', '75' ])) ?>
  
<?php elseif($page->isDescendantOf('toplevelthree') || $thispageid == '29'): ?>
  <?php snippet('navs/nav-subpagelist', array('pagelist' => ['125', '127', '128', '1' ])) ?>
  
<?php elseif($page->isDescendantOf('toplevelfour') || $thispageid == '124'): ?>
  <?php snippet('navs/nav-subpagelist', array('pagelist' => ['125', '127', '128', '1' ])) ?>
  
<?php else: ?>
  <!-- no match -->
<?php endif ?>

nav-subpagelist snippet just lists out the array of IDs in the order supplied.

<?php $relevantPages = $site->index()->visible()->filterBy('autoid', 'in', $pagelist); ?>
<ul>
  <?php foreach($pagelist as $id): ?>
    <?php if($p = $relevantPages->findBy('autoid', $id)):?>
    <li id="<?= $p->uid() ?>-menu"><a <?php e($p->isOpen(), ' class="active"') ?> href="<?= $p->url() ?>"><?= $p->title() ?></a></li>
    <?php endif ?>
  <?php endforeach ?>
</ul>

basically if changed the descendentOf in any of these to any page that had children, but wasn’t at the very top level, it broke.

<?php if($page->isDescendantOf('subpageone') || $thispageid == '112'): ?>

#7

That’s because the method wants either the URI or a page object as parameter, not just the page id.


#8

I see…thanks…i’ll read that again tomorrow when i haven’t had three :beers: :slight_smile:


#9

Lucky you, my fridge is as empty as can be.


#10

Oh dear. Well, i have one left I would gladly give you if you weren’t so far away. Would you care to explain again in terms a slightly tipsy person can understand? :slight_smile:


#11

I appreciate it :heart_eyes:

Well, for example, pass the URI to. the page, which is the complete path:

<?php if($page->isDescendantOf('mainlevel-page/subpageone') || $thispageid == '112'): ?>

Or passing a page object as parameter:

<?php
$subpage = page('some/page/really/deep/down/the/tree');
if($page->isDescendantOf($subpage) || $thispageid == '112'): ?>