Here's the ReadMe for Collapso V1.25 for SellerDeck V12.
I now have a general purpose sulution that will work with the current Collapso (V1.25 SellerDeck V12). It uses a new section-level variable Hide From Collapso that, if set true, hides that section and it's children. This is for use on top-level sections only. It should not be used on lower level sections.
Patch for Collapso V1.19 ONLY is:
Collapso modification to allow hiding of certain top-level sections.
FOR Collapso V1.25 / SellerDeck V12 ONLY
INSTALLATION
Go to Design / Library / Variables / Section. Right-click Section and choose New Variable.
Make the following settings
Code: Select all
Name: Hide From Collapso
Description: Whether to hide the Section in the Collapso Menu.
Defaults to false for all Sections.
Prompt: Hide From Collapso
Group: Section
Place Of Setting: Section
Tab Name: Properties
Allow <Use Parent>.. Checked
Type: True/False
Searchable: Unchecked
Upload: Unchecked
Initial Value: Use Parent ()
Top Level Value: False
Replace (in Site1) the file collapso-5.js with the following
Code: Select all
// Collapso-5 support SDV12-V1.23 - HIDE TOP LEVEL SECTION MOD
var parentlist = new Array();
var levellist = new Array();
var imagelist = new Array();
function shM(obj){ // [+] or [-] image has been clicked
var result = obj.id.match(/_(.*)_(.*)/);
if (result == null) return false;
var level = result[1] - 0;
var index = result[2] - 0;
var subid = 'ul_' + (level + 1) + '_' + (index + 1);
// first close any open menus at this level
if ( levellist[level] != null )
{
// swap back to [+] and deal with brochure home page
var oldimg = document.getElementById(imagelist[level]).src;
var newimg = oldimg.replace(/(.*\/).*/, '$1c-p' + '.gif');
document.getElementById(imagelist[level]).src = newimg;
// hide the sub-level
document.getElementById(levellist[level]).className = 'hOb';
}
// if we're clicking an already open menu just close it
if ( levellist[level] == subid )
{
levellist[level] = null;
return false;
}
// now open any sub-menu if it exists
if ( document.getElementById(subid) )
{
// swap back to [-] and deal with brochure home page
var imgid = 'im_' + (level) + '_' + (index);
var oldimg = document.getElementById(imgid).src;
var newimg = oldimg.replace(/(.*\/).*/, '$1c-m' + '.gif');
document.getElementById(imgid).src = newimg;
// show the sub-level
document.getElementById(subid).className = 'sOb';
// remember where we've opened sub-sections
levellist[level] = subid;
imagelist[level] = imgid;
}
return false;
}
function collclks(rootid){ // set an onclick event for our [+] images
var divs = document.getElementById(rootid).getElementsByTagName('div');
for(i = 0; i < divs.length; i++)
{
var imgs = divs[i].getElementsByTagName('img');
if ( imgs[0].id ) imgs[0].onclick = function(){shM(this);};
var ancs = divs[i].getElementsByTagName('a');
// if we're using OnlyFinalLinks turn intermediate links into [+] image onclicks.
if ( ancs[0].href.indexOf('#') > -1 ) ancs[0].href="javascript:document.getElementById('" + imgs[0].id + "').onclick();";
}
}
function walktree(list, level){ // traverse list and open up sections that match breadcrumb trail
if ( strail.length == 0 ) return; // not on a Section page
var list = document.getElementById(list);
var cnodes = list.childNodes;
var thistrail = "" + strail[level]; // extract current levels name
thistrail = thistrail.replace(/\s+/g,''); // despace (IE despaces innerHTML)
for ( var i = 0; i < cnodes.length; i++ )
{
var thisnode = cnodes[i];
if ( thisnode.nodeType != 1 ) continue; // skip non element type nodes
var links = thisnode.getElementsByTagName('a'); // get all anchor tags (we want 1st one)
var images = thisnode.getElementsByTagName('img'); // and all img tags (we want 1st one)
if ( links[0].innerHTML.replace(/\s+/g,'') == thistrail ) // if section name matches breadcrumb
{
// first and only image is the [+] icon if it has an id tag (no id tag if null icon)
if ( images[0].id ) document.getElementById(images[0].id).onclick(); // found it so fire onclick
var sublist = thisnode.getElementsByTagName('ul'); // see if any sub-lists
if ( sublist.length > 0 ) walktree(sublist[0].id, level + 1); // if so recurse and look for next breadcrumb
return; // all done so exit early
}
}
}
Go to Design / Library / Layouts / Collapso-5 Dynamic Menu / Collapso-5 Menu and replace
all code with the following
Code: Select all
<actinic:block php="true">
// V1.25 - HIDE TOP LEVEL SECTION MOD
$firstid = '';
</actinic:block>
<actinic:block if="%3cactinic%3avariable%20name%3d%22CollapsoDiagnostics%22%20%2f%3e%20%3d%3d%20true" >
<actinic:block php="true">
list($startusec, $startsec) = explode(" ", microtime());
</actinic:block>
</actinic:block>
<actinic:block php="true">
// V1.24 (also in code at bottom)
$maxdepth = <actinic:variable name="CollapsoMaxDepth" encoding="perl" selectable="false" />;
$iconafter = <actinic:variable name="CollapsoIconAfter" encoding="perl" selectable="false" />;
$iconspacer = '<actinic:variable name="CollapsoSeparator" encoding="perl" selectable="false" />';
$lastlevel = 0;
$inlist=false;
$onlyfinallinks = <actinic:variable name="CollapsoOnlyFinalLinks" selectable="false" selectable="false" />;
$thispage = '';
$classadjust = '';
$charcount = 0;
$linkhref = '#';
</actinic:block>
<actinic:block if="%28%3cactinic%3avariable%20name%3d%22PageType%22%20%2f%3e%20%3d%3d%20%22Section%22%29%20%7c%7c%20%28%3cactinic%3avariable%20name%3d%22PageType%22%20%2f%3e%20%3d%3d%20%22Product%20Page%22%29" >
<actinic:block php="true">
$thispage = '<actinic:variable name="SectionPageName" encoding="perl" selectable="false" />';
</actinic:block>
</actinic:block>
<div id="collapso5">
<actinic:block if="%3cactinic%3avariable%20name%3d%22CollapsoShowBrochure%22%20%2f%3e" >
<ul class="sOb">
<actinic:block type="BrochurePagesList">
<li class="nsc"><div><img class="nsi" src="c-n.gif"/> <a class="nsa" href="<actinic:variable name="BrochurePageURL" />"><actinic:variable name="BrochureName" /></a></div></li>
</actinic:block>
</ul>
</actinic:block>
<actinic:block type="EntireSectionList"><actinic:block if="%3cactinic%3avariable%20name%3d%22SectionLevel%22%20%2f%3e%20%21%3d%200"><actinic:block php="true">
/*
Menu needs unordered list of format
<div id="collapso5">
<ul class="sOb">
<li class="nsc"><div><img class="nsi" src="c-n.gif"/><a class="nsa" ... ">Top Section 1</a></div></li>
<li class="nsc"><div><img class="nsi" src="c-n.gif"/><a class="nsa" ... ">Top Section 2</a></div></li>
<li class="hsc"><div><img class="hsi" src="c-p.gif"/><a class="hsa" ... ">Top Section 3 with sub-section</a></div>
<ul class="hOb">
<li class="nsc"><div><img class="nsi" src="c-n.gif"/><a class="nsa" ... ">Sub Section A</a></div></li>
<li class="hsc"><div><img class="hsi" src="c-p.gif"/><a class="hsa" ... ">Sub Section B with sub-sub-section</a></div>
<ul class="hOb">
<li class="nsc"><div><img class="nsi" src="c-n.gif"/><a class="nsa" ... ">Sub-sub Section X</a></div></li>
</ul>
</li>
</ul>
</li>
<li class="nsc"><div><img class="nsi" src="c-n.gif"/><a class="nsa" ... ">Top Section 4</a></div></li>
</ul>
</div>
Each call of this code is for a Section line.
We can't generate the code right away as we need to wait to see if the next section is
at the same level.
So we save the link and name and output it at the next iteration.
*/
$thislevel = <actinic:variable name="SectionLevel" encoding="perl" selectable="false" />;
$index = <actinic:variable name="ListIndex" encoding="perl" selectable="false" />;
$hidefromcollapso = <actinic:variable name="Hide From Collapso" encoding="perl" selectable="false" />;
$currentid = 'ul_' . $thislevel . '_' . $index;
if ( (($maxdepth == 0) || ($thislevel <= $maxdepth)) && (! $hidefromcollapso) )
{
if ( $firstid == '' ) $firstid = $currentid;
if ( $thislevel > $lastlevel ) // Start a new list (also done for first item)
{
// no LI if very first call - we just need to start an UL
if ( $inlist )
{
// show that previous item has sub-section
if ( $onlyfinallinks ) $linkhref = '#';
$bits[0] = "<img class=\"hsi\" id=\"im_$linklevel" . "_$linkindex\" src=\"c-p.gif\"/>";
$bits[1] = "<a class=\"hsa$classadjust\" href=\"$linkhref\">$linkname</a>";
if ( $iconafter ) $bits = array_reverse($bits);
$html = "<li class=\"hsc\"><div>$bits[0]$iconspacer$bits[1]</div>";
echo $html;
$charcount += strlen($html);
}
// now start sub-section list
while ( $lastlevel < $thislevel )
{
$nmclass = ( $thislevel == 1 ) ? 'class="sOb"' : 'class="hOb"'; // show only 1st level lists
$html = "<ul id=\"$currentid\" $nmclass >";
echo $html;
$charcount += strlen($html);
$lastlevel++;
}
}
else if ( $thislevel < $lastlevel ) // Returning from a sub-section
{
$bits[0] = "<img class=\"nsi\" src=\"c-n.gif\" />";
$bits[1] = "<a class=\"nsa$classadjust\" href=\"$linkhref\">$linkname</a>";
if ( $iconafter ) $bits = array_reverse($bits);
$html = "<li class=\"nsc\"><div>$bits[0]$iconspacer$bits[1]</div></li>";
echo $html;
$charcount += strlen($html);
while ( $lastlevel > $thislevel )
{
echo '</ul></li>';
$charcount += 10;
$lastlevel--;
}
}
else // same level as previous item
{
$bits[0] = "<img class=\"nsi\" src=\"c-n.gif\" />";
$bits[1] = "<a class=\"nsa$classadjust\" href=\"$linkhref\">$linkname</a>";
if ( $iconafter ) $bits = array_reverse($bits);
$html = "<li class=\"nsc\"><div>$bits[0]$iconspacer$bits[1]</div></li>";
echo $html;
$charcount += strlen($html);
}
$inlist = true;
// store LI code for next iteration
$linkhref = '<actinic:block if="%3cactinic%3avariable%20name%3d%22IsLoginPageSuppressed%22%20%2f%3e%20AND%0d%3cactinic%3avariable%20name%3d%22UnregCustomersAreNotAllowed%22%20%2f%3e" ><actinic:variable name="SectionPageName" encoding="perl" selectable="false" /></actinic:block><actinic:block if="%28%3cactinic%3avariable%20name%3d%22IsLoginPageSuppressed%22%20%2f%3e%20%3d%3d%20false%29%20OR%0d%28%3cactinic%3avariable%20name%3d%22UnregCustomersAreNotAllowed%22%20%2f%3e%20%3d%3d%20false%29" ><actinic:variable name="SectionURL" encoding="perl" selectable="false"/></actinic:block>';
$linkname = htmlspecialchars('<Actinic:Variable Name="SectionName" php="true" encoding="perl" selectable="false" />');
$linklevel = $thislevel;
$linkindex = $index;
$currentsection = '<actinic:variable name="SectionPageName" encoding="perl" selectable="false" />';
$classadjust = ( $currentsection == $thispage ) ? '_c' : '';
}
</actinic:block></actinic:block></actinic:block>
<actinic:block php="true">
$bits[0] = "<img class=\"nsi\" src=\"c-n.gif\" />";
$bits[1] = "<a class=\"nsa$classadjust\" href=\"$linkhref\">$linkname</a>";
if ( $iconafter ) $bits = array_reverse($bits);
echo "<li class=\"nsc\"><div>$bits[0]$iconspacer$bits[1]</div></li>";
while ( $thislevel-- > 1 )
{
echo '</ul></li>';
$charcount += 10;
}
</actinic:block></ul>
</div>
<script type="text/javascript">
<!-- V1.24
collclks('<actinic:block php="true">echo $firstid;</actinic:block>');
<actinic:block if="%3cactinic%3avariable%20name%3d%22CollapsoShowTree%22%20%2f%3e" >
var strail = new Array();
<actinic:block type="ParentSectionList">
strail.push('<actinic:block php="true">
echo str_replace("'", "\'", htmlspecialchars('<actinic:variable name="SectionName" encoding="perl" selectable="false" />'));
</actinic:block>');
</actinic:block>
walktree('<actinic:block php="true">echo $firstid;</actinic:block>',0);
</actinic:block>
// -->
</script>
<actinic:block if="%3cactinic%3avariable%20name%3d%22CollapsoDiagnostics%22%20%2f%3e%20%3d%3d%20true" >
<actinic:block php="true">
list($endusec, $endsec) = explode(" ", microtime());
$duration = ((float)$endusec + (float)$endsec) - ((float)$startusec + (float)$startsec);
echo "<br><b>Duration: $duration <br>Bytes: $charcount </b>";
</actinic:block>
</actinic:block>
That's installation finished
OPERATION
In a top-level Section Details / Properties, set Hide From Collapso to true for those Sections
that you want to hide. Do not use on sub-sections and make sure that all sub-sections
have Use Parent set for this variable.
NOTES
This is supplied without any guarantees that it will work in all cases.