Hi ulfben, thanks for the reply. It is a local site at the mo for testing. However I have tried on another site, and the open to selection DOES work when viewing categories, but NOT when viewing the actual post itself.
I have replicated this on my test site also so I assume this is how it is supposed to work?
Many thanks π
Plugin Author
ulfben
(@ulfben)
No that’s not the way it’s supposed to work. Open To Selection = opens to (and optionally highlights) the current post, category or archive, respectively.
I need access to the site to help. But you can test if there’s a difference when using permalinks or not. Make sure you’re not using “force open to”. Try running two types of trees; a category and an archive, see if their behaviour differs.
Ahhh I see!
OK, I think the problem is that I have it configured to not display posts, only categories.
I have tried turning ‘list posts’ on and it does open the correct tree to display the current post name.
Ideally I would like it to open and highlight the current category that the post is in, rather than the post itself in the tree. Currently it keeps open whatever tree was open before, or if its the first visit, then all trees are closed.
Is this option possible at all?
If so then I could upload the site to a test domain for you to have a look at? π
Thanks again, your help is appreciated!
Plugin Author
ulfben
(@ulfben)
You have discovered an edge case. I probably never tested without listing posts.
I’ve added this this to my list. I’ll let you know when a new release is out.
Plugin Author
ulfben
(@ulfben)
Please try the development version here. I’ve added a fix for category trees without posts.
Hi Ulf,
I’ve found a related issue (still present in the dev version). In the categories widget if I open a page (which is not allocated to any category), not a post, the selection is opened up to a random category. I would have expected the tree to be collapsed instead.
http://funk.eu
Click on the “Contact” and “Imprint” links at the top, those are pages.
Great work, keep it up!
Thanks and Best Regards
Karsten
Plugin Author
ulfben
(@ulfben)
Interresting. We have an unintended ID-collision; your page is id 11 – correctly identified by the plugin. But the dtree JavasScript erroneously matches this with category ID ‘-110’.
And I thought the negated category IDs was such a clever little hack. π
Could you edit wp-dtree.php
so I can run a debugger on the script?
Just change
define('WPDT_SCRIPT', 'wp-dtree.min.js');
to
define('WPDT_SCRIPT', 'wp-dtree.js');
and post here again.
Plugin Author
ulfben
(@ulfben)
Actually, no. It’s not an ID clobbering. The script simply assumes the ID passed to “openTo” is valid. If it doesn’t find it in the tree it will open to the index. Your category “Coding” (ID = -110) is actually the 11nth node in the tree. Similarly; your “Imprint” (page id = 78) opens the three to index 78 (which happens to be a post on Alexa rankings).
I need some time to set up and test a fix, but perhaps you can try it yourself?
The offending function is wpdTree.prototype.openTo
in wp-dtree.js
. I believe all we need to do is remove the conditional from the lookup loop to always run it, and abort if there’s no matching node.
However; I’m not sure what side effects this might cause. Mr. LandrΓΆ probably had a reason to put the conditional there in the first place.
Hmm, tinkered with it without success, but my JS knowledge is just fundamental to say the least :). How about adding all valid IDs to a string during creation and check for the IDs existence (with something like instr?) as the first check in the function?
Plugin Author
ulfben
(@ulfben)
Checking for the ID is not a problem; that check is being done. But even if the ID isn’t found the function progresses, treating the ID as an index. Our problem now is to find why it was written this way, or rather what side-effects it might cause to change the behaviour.
I like your look-up solution though. Remember doing that often in ActionScript 2; the String-functions were way faster than to iterate-and-compare through an Array.
All you need to do to test this for me is change this:
wpdTree.prototype.openTo = function(nId, bSelect, bFirst){
if(!bFirst){
for (var n=0; n<this.adtNodes.length; n++){
if(this.adtNodes[n].id == nId){
nId=n;
break;
}
}
}
var cn=this.adtNodes[nId];
if(cn.pid==this.root.id || !cn._p) return;
cn._io = true;
cn._is = bSelect;
if(this.completed && cn._hc) this.nodeStatus(true, cn._ai, cn._ls);
if(this.completed && bSelect) this.s(cn._ai);
else if(bSelect) this._sn=cn._ai;
this.openTo(cn._p._ai, false, true);
};
(http://pastebin.com/Wy81h3Mm)
To this:
wpdTree.prototype.openTo = function(nId, bSelect, bFirst){
for (var n=0; n<this.adtNodes.length; n++){
if(this.adtNodes[n].id == nId){
nId=n;
var cn=this.adtNodes[nId];
if(cn.pid==this.root.id || !cn._p) return;
cn._io = true;
cn._is = bSelect;
if(this.completed && cn._hc) this.nodeStatus(true, cn._ai, cn._ls);
if(this.completed && bSelect) this.s(cn._ai);
else if(bSelect) this._sn=cn._ai;
this.openTo(cn._p._ai, false, true);
}
}
};
(http://pastebin.com/0Fn8uNv0)
wp-dtree.js does not seem to be used but wp-dtree.min.js
I changed this
wpdTree.prototype.openTo=function(b,a,c){if(!c){for(var e=0;e<this.adtNodes.length;e++){if(this.adtNodes[e].id==b){b=e;break}}}var d=this.adtNodes[b];if(d.pid==this.root.id||!d._p){return}d._io=true;d._is=a;if(this.completed&&d._hc){this.nodeStatus(true,d._ai,d._ls)}if(this.completed&&a){this.s(d._ai)}else{if(a){this._sn=d._ai}}this.openTo(d._p._ai,false,true)};
to this
wpdTree.prototype.openTo=function(b,a,c){for(var e=0;e<this.adtNodes.length;e++){if(this.adtNodes[e].id==b){b=e;var d=this.adtNodes[b];if(d.pid==this.root.id||!d._p){return}d._io=true;d._is=a;if(this.completed&&d._hc){this.nodeStatus(true,d._ai,d._ls)}if(this.completed&&a){this.s(d._ai)}else{if(a){this._sn=d._ai}}this.openTo(d._p._ai,false,true)}}};
but that seems to break the opento function and nothing is opened at all.
Plugin Author
ulfben
(@ulfben)
wp-dtree.js does not seem to be used but wp-dtree.min.js […]
… so either read what I’ve said, or – you know – copy the content of one into the other? Whichever makes you happy.
The code above should be the minified version of what you’ve posted. Nevertheless I copied your original code to wp-dtree.js and replaced the wp-dtree.min.js on my server with this new version… exactly the same result as for my minified version above, opento does not seem to work at all.
Plugin Author
ulfben
(@ulfben)
Check. I need to set up a test environment and sort this out. You’ll be notified when a new version is out.