Мелкие плюшки для админки

Отказавшись от использования плагина ManagerManager стали всплывать некоторые недостающие моменты, которые решились достаточно легко.
Во первых использованием плагина templatesEdit2, а во вторых созданием плагина на событие OnDocFormPrerender.
Ниже речь пойдёт о втором плагине.

Создаём плагин ManagerAndAdmin на событие OnDocFormPrerender

подключаем jQuery к странице
$e = $modx->Event;
if($e->name == 'OnDocFormPrerender') {
        // подключаем jQuery и UI
	$e->output('<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>');
	$e->output('<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>');
}


меняем шаблоны по умолчанию и скрываем новый документ из меню
$e = $modx->Event;
if($e->name == 'OnDocFormPrerender') {
	if($_REQUEST['pid']) {
                global $content;
		$top = $modx->getParentIds($_REQUEST['pid']);
		$firstparent = $top ? end($top) : $_REQUEST['pid'];

                // если верхний родитель документа имеет id 22, ставим шаблон 13
		if($firstparent == 22) {
			$_REQUEST['newtemplate'] = 13;
		}
                // если верхний родитель документа имеет id 6, ставим шаблон 12
		if($firstparent == 6) {
			$_REQUEST['newtemplate'] = 12;
		}
                // если родитель нового документа имеет id 2, ставим шаблон 4
		if($_REQUEST['pid'] == 2) {
			$_REQUEST['newtemplate'] = 4;
		}

                // скрываем новый документ из меню
		$content['hidemenu'] = 1;
	}
}


делаем крошки для админа ( решение от webber Крошки для админа)
подключаем jQuery и меняем заголовок Редактировать ресурс на название ресурса и так же при изменении заголовка
if($e->name == 'OnDocFormPrerender') {
	global $content, $_lang;
	$e->output('<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>');
	$e->output('<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>');
	
	$parent = $_REQUEST['pid'] ? $_REQUEST['pid'] : $content['parent'];
	$parents = $modx->getParentIds($parent);
	$parents[] = $parent;
	
	if($parents) {
		$breadcrumbs = '<div style=\"font-size: 11px;\">';
		$parents = implode(',', $parents);
		$sql = $modx->db->query('SELECT * FROM ' . $modx->getFullTableName("site_content") . ' WHERE id IN(' . $parents . ') ORDER BY  FIND_IN_SET(id, "' . $parents . '")');
		foreach($modx->db->makeArray($sql) as $v) {
			$breadcrumbs .= '<a href=\"index.php?a=27&id=' . $v['id'] . '\">' . $v['pagetitle'] . '</a> / ';
		}
		$breadcrumbs .= '</div>';
	}
        
        // меняем заголовок на название ресурса
	$_lang['edit_resource_title'] = $content['pagetitle'];
	
	$e->output('
	<script type="text/javascript">
		$.noConflict();
		jQuery(document).ready(function($) {

                        // меняем заголовок при изменении
			function keyUpPagetitle(a) {
				if(a.val()) $("#create_edit h1").html(a.val() + " <small>('.$content['id'].')</small>");
			}
			keyUpPagetitle($("input[name=pagetitle]"));
			$("input[name=pagetitle]").keyup(function() {
				keyUpPagetitle($(this))
			});

                        // ставим крошки для админа			
			$(".sectionBody").prepend("' . $breadcrumbs . '");
		});
	</script>');

}


для изменения URL для документа, к плагину добавляем новое событие OnBeforeDocFormSave
в примере ниже, alias выставляется из tv с типом Date, который используется для выставления даты мероприятия и дата должна быть уникальной.
if($e->name == 'OnBeforeDocFormSave') {
        // если шаблон документа id = 4 то берём для alias значение из tv id=7, в котором выставляется дата документа вида 2015-12-29-20-00
	if($_POST['template'] == 4 && $_POST['tv7']) {
		global $alias;
		$alias = date("Y-m-d-H-i" , strtotime($_POST['tv7']));
	}	
}


и всё вместе
$e = $modx->Event;

if($e->name == 'OnDocFormPrerender') {
	global $content, $_lang;
	$e->output('<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>');
	$e->output('<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>');

	if($_REQUEST['pid']) {
		$top = $modx->getParentIds($_REQUEST['pid']);
		$firstparent = $top ? end($top) : $_REQUEST['pid'];
		if($firstparent == 22) {
			$_REQUEST['newtemplate'] = 13;
		}
		if($firstparent == 6) {
			$_REQUEST['newtemplate'] = 12;
		}

		if($_REQUEST['pid'] == 2) {
			$_REQUEST['newtemplate'] = 4;
		}

		$content['hidemenu'] = 1;
	}
	
	$parent = $_REQUEST['pid'] ? $_REQUEST['pid'] : $content['parent'];
	$parents = $modx->getParentIds($parent);
	$parents[] = $parent;
	
	if($parents) {
		$breadcrumbs = '<div style=\"font-size: 11px;\">';
		$parents = implode(',', $parents);
		$sql = $modx->db->query('SELECT * FROM ' . $modx->getFullTableName("site_content") . ' WHERE id IN(' . $parents . ') ORDER BY  FIND_IN_SET(id, "' . $parents . '")');
		foreach($modx->db->makeArray($sql) as $v) {
			$breadcrumbs .= '<a href=\"index.php?a=27&id=' . $v['id'] . '\">' . $v['pagetitle'] . '</a> / ';
		}
		$breadcrumbs .= '</div>';
	}

	$_lang['edit_resource_title'] = $content['pagetitle'];
	
	$e->output('
	<script type="text/javascript">
		$.noConflict();
		jQuery(document).ready(function($) {
			function keyUpPagetitle(a) {
				if(a.val()) $("#create_edit h1").html(a.val() + " <small>('.$content['id'].')</small>");
			}
			keyUpPagetitle($("input[name=pagetitle]"));
			$("input[name=pagetitle]").keyup(function() {
				keyUpPagetitle($(this))
			});			
			$(".sectionBody").prepend("' . $breadcrumbs . '");
		});
	</script>');

}

if($e->name == 'OnBeforeDocFormSave') {
	if($_POST['template'] == 4 && $_POST['tv7']) {
		global $alias;
		$alias = date("Y-m-d-H-i" , strtotime($_POST['tv7']));
	}	
}

Всё предельно просто.
Делитесь своими решениями для удобства редактирования документов :)

2 комментария

avatar
А по какой причине отказались от плагина ManagerManager?
avatar
Низкая скорость загрузки страниц в админке на больших проектах.
Если сделать вкладок 6-8 и на каждой по 5-10 тв-параметров, то вкладки долго рендерятся. Поэтому создал плагин, и вкладки рендерятся на php, что намного быстрее. Да и возникающие конфликты MM с самописными плагинами, немного надоели.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.