Skip to content

Instantly share code, notes, and snippets.

@pepebe
Last active August 29, 2015 14:13
Show Gist options
  • Select an option

  • Save pepebe/f77f90ddfae1fcdca9a1 to your computer and use it in GitHub Desktop.

Select an option

Save pepebe/f77f90ddfae1fcdca9a1 to your computer and use it in GitHub Desktop.
The plugin adds a breadcrumb navigation below the pagetitle for easier navigation/orientation.
<?php
/*
ppb_managerBreadCrumbs
Version: 0.1
original plugincode written by argnist
frankensteined by pepebe.
Description: The plugin adds a breadcrumb navigation below the pagetitle
for easier navigation/orientation.
Note: Moste of the code was shamelessly frankensteined from modDevTools by argnis
(a very useful plugin).
If you want to have breadcrumbs, but you don't need the rest of modDevTools,
this is what you need.
Usage: Copy code into plugin and set it to OnDocFormPrerender. Done.
2do:
Rewrite the whole thing and get rid of stuff we don't need.
*/
$debug = false;
$limit = 3;
if($modx->event->name != 'OnDocFormPrerender') return;
if(!function_exists('writeToLog')){
function writeToLog($msg,$debug){
if($debug){
$modx->log(modX::LOG_LEVEL_ERROR, '[managerBreadCrumbs] moddevtools plugin ' .$msg);
}
return;
}
}
if(is_object($modx->getObject('modPlugin', array ('name' => 'modDevTools', 'disabled' => 0), true))){
$msg = 'installed and active. No need for additional breadcrumbs';
writeToLog($msg,$debug);
return;
}
else {
$msg = 'either not installed or deactivated. Lets have our own breadcrumbs';
writeToLog($msg,$debug);
}
$config = array();
if(!function_exists(getBreadCrumbs)){
function getBreadCrumbs($resource,$modx,$limit) {
if (($modx === modSystemEvent::MODE_NEW) || !$resource) {
if (!isset($_GET['parent'])) {return;}
// $resource = $modx->getObject('modResource', $_GET['parent']);
if (!$resource) {return;}
}
$context = $resource->get('context_key');
if ($context != 'web') {
$modx->reloadContext($context);
}
$resources = $modx->getParentIds($resource->get('id'), $limit, array( 'context' => $context ));
if ($modx === modSystemEvent::MODE_NEW) {
array_unshift($resources, $_GET['parent']);
}
$crumbs = array();
$root = $modx->toJSON(array(
'text' => $context,
'className' => 'first',
'root' => true,
'url' => '?'
));
$controllerConfig = $modx->controller->config;
$action = $controllerConfig['controller'];
if ($action == 'resource/create') {
$action = 'resource/update';
}
if (isset($controllerConfig['id'])) {
if ($controllerConfig['controller'] == 'resource/create') {
$actionObj = $modx->getObject('modAction', array('controller' => 'resource/update'));
$action = $actionObj->get('id');
} else {
$action = $controllerConfig['id'];
}
}
$modx->log(modX::LOG_LEVEL_ERROR, '[managerBreadCrumbs] action: ' . $action);
$isAll = false;
for ($i = count($resources)-1; $i >= 0; $i--) {
$resId = $resources[$i];
if ($resId == 0) {
continue;
}
$parent = $modx->getObject('modResource', $resId);
if (!$parent) {break;}
if ($parent->get('parent') == 0) {
$isAll = true;
}
$crumbs[] = array(
'text' => $parent->get('pagetitle'),
'url' => '?a=' . $action . '&id=' . $parent->get('id')
);
}
$modx->log(modX::LOG_LEVEL_ERROR, '[managerBreadCrumbs] crumbs: ' . print_r($crumbs,true));
if ((count($resources) == $limit) && !$isAll) {
array_unshift($crumbs, array(
'text' => '...',
));
}
// Add pagetitle of current page
if ($modx === modSystemEvent::MODE_NEW) {
$pagetitle = $modx->lexicon('new_document');
} else {
$pagetitle = $resource->get('pagetitle');
}
$crumbs[] = array('text' => $pagetitle);
$crumbs = $modx->toJSON($crumbs);
//$modx->controller->addJavascript('../assets/components/ppb_managerBreadcrumbs/js/breadcrumbs.panel.js');
$tpl = "
<script id='managerBreadCrumbs_tpl' type='text' data-plugin='managerBreadCrumbs'>
<tpl if=\"typeof(trail) != 'undefined'\">
<div class='crumb_wrapper'>
<ul class='crumbs'>
<tpl for=\"trail\">
<li {[values.className != 'undefined' ? 'class=\"'+values.className+'\"' : '' ]}>
<tpl if=\"typeof url != 'undefined'\">
<button type='button' data-url='{url}' class=\"controlBtn {[values.root ? ' root' : '' ]}\">
{text}
</button>
</tpl>
<tpl if=\"typeof url == 'undefined'\">
<span class=\"text{[values.root ? ' root' : '' ]}\">
{text}
</span>
</tpl>
</li>
</tpl>
</ul>
</div>
</tpl>
</script>
";
$modx->controller->addHtml($tpl);
$panel = "
<script type='text/javascript' data-plugin='managerBreadCrumbs'>
var modDevTools = function(config) {
config = config || {};
modDevTools.superclass.constructor.call(this,config);
};
Ext.extend(modDevTools,Ext.Component,{
page:{},window:{},grid:{},tree:{},panel:{},combo:{},config: {},view: {},utils: {}
});
Ext.reg('moddevtools',modDevTools);
modDevTools = new modDevTools();
if (typeof modDevTools.modx23 == 'undefined') {
modDevTools.modx23 = typeof MODx.config.connector_url != 'undefined' ? true : false;
}
modDevTools.BreadcrumbsPanel = function(config) {
config = config || {};
Ext.applyIf(config,
{
bdMarkup: document.getElementById('managerBreadCrumbs_tpl').innerHTML
,bodyStyle: {background: 'transparent'}
}
);
modDevTools.BreadcrumbsPanel.superclass.constructor.call(this,config);
}
Ext.extend(modDevTools.BreadcrumbsPanel,MODx.BreadcrumbsPanel,{
onClick: function(e) {
var target = e.getTarget();
if (typeof target != 'undefined') {
var url = target.getAttribute('data-url');
if (url) {
MODx.loadPage(url);
}
}
}
,_updatePanel: function(data){
this.tpl.overwrite(this.body, data);
var \$this = this;
setTimeout(function(){
\$this.ownerCt.doLayout();
}, 200);
}
,getPagetitle: function(){
var pagetitleCmp = Ext.getCmp('modx-resource-pagetitle');
var pagetitle;
if (typeof pagetitleCmp != 'undefined') {
pagetitle = pagetitleCmp.getValue();
if (pagetitle.length == 0) {
pagetitle = _('new_document');
}
} else {
pagetitle = '';
}
return pagetitle;
}
});
Ext.reg('moddevtools-breadcrumbs-panel',modDevTools.BreadcrumbsPanel);
Ext.onReady(function() {
var header = Ext.getCmp('modx-resource-header').ownerCt;
header.insert( 1, {
xtype: 'moddevtools-breadcrumbs-panel'
,id: 'resource-breadcrumbs'
,desc: ''
,root : {$root}
});
header.doLayout();
var crumbCmp = Ext.getCmp('resource-breadcrumbs');
var bd = { trail : {$crumbs}};
crumbCmp.updateDetail(bd);
Ext.getCmp('modx-resource-pagetitle').on('keyup', function(){
bd.trail[bd.trail.length-1] = {text: crumbCmp.getPagetitle()};
crumbCmp._updatePanel(bd);
});
});
</script>";
$modx->controller->addHtml($panel);
}
}
getBreadCrumbs($resource,$modx,$limit);
return;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment