Для тех, кому
необходимо больше гибкости, предлагаю свой вариант сниппета "A":
<?php
$id = isset($id) ? $id : null; // prefix for placeholders
$doc = isset($doc) ? $doc : $modx->documentIdentifier;
$fields = isset($fields) ? $fields : 'pagetitle';
$mode = isset($mode) ? $mode : null;
$s = isset($s) ? $s : ',';
$tpl = isset($tpl) ? $tpl : null;
if($tpl) {
$chunk = $modx->getChunk($tpl);
if($chunk) $tpl = $chunk;
$tpl = str_replace('%%', '=', $tpl);
}
if($mode == 'link') {
$fields = 'id,pagetitle,description,menutitle,url';
}
$docfields = array('type','contentType','pagetitle','longtitle','description','alias','link_attributes','published','pub_date','unpub_date','parent','isfolder','introtext','content','richtext','template','menuindex','searchable','cacheable','createdby','createdon','editedby','editedon','deleted','deletedon','deletedby','publishedon','publishedby','menutitle','donthit','haskeywords','hasmetatags','privateweb','privatemgr','content_dispo','hidemenu');
$fields = explode(',',$fields);
if(!function_exists('aParser')) { // parser of %variables%
function aParser($template, $fields) {
if(!is_array($fields)) $template;
foreach($fields as $name=>$value) {
$names[] = '%'.$name.'%';
$values[] = $value;
}
return str_replace($names, $values, $template);
}
}
if(!is_numeric($doc)) { // support to use document alias like id
$sql = "SELECT id FROM ".$modx->getFullTableName('site_content')." WHERE alias='$doc'";
$res = $modx->db->query($sql);
$row = $modx->db->getRow($res);
$doc = $row['id'];
}
$dbfields = array_intersect($fields,$docfields);
if(count($dbfields) > 0) $d = $modx->getDocument($doc,implode($dbfields,','));
if(in_array('url',$fields)) $d['url'] = $modx->makeUrl($doc); // generate url to doc
if(is_array($d)) {
if($id) { // generate placeholders
foreach($fields as $field) $modx->setPlaceholder(($id ? $id.'_'.$field : $field),$d[$field]);
}
switch($mode) {
case 'link':
$out = '<a href="'.$d['url'].'"'.(empty($d['description'])?'':' title="'.$d['description'].'"').'>'.(empty($d['menutitle'])?$d['pagetitle']:$d['menutext']).'</a>';
break;
default:
$out = implode($d,$s);
break;
}
if($tpl) return aParser($tpl,$d);
else return $out;
}
?>
Получить ссылку можно одним из перечисленных вариантов:
[[A? &doc=`100` &mode=`link`]]
[[A? &doc=`news` &mode=`link`]]
[!A? &doc=`11` &mode=`link` &tpl=`<a href%%"%url%" rel%%"nofollow" title%%"%description%">%pagetitle%</a>`!]
[!A? &doc=`11` &fields=`pagetitle,longtitle,url` &tpl=`<a href%%"%url%" title%%"%longtitle%">%pagetitle%</a>`!]
[[A? &doc=`blog` &fields=`pagetitle,description,url` &id=`b`]]
Link to blog: <a href="[+b_url+]" title="[+b_description+]">[+b_pagetitle+]</a>
Сниппет использует свой очень простой и легкий шаблонизатор, который меняет %параметр документа% на соответствующее значение. Чтобы обеспечить возможность использования в шаблоне знака равенства (в конструкции вызова сниппета, в значении параметра использование знака равенства невозможно), была введена конструкция "%%", которая преобразовывается шаблонизатором в знак "=".
Параметры
- doc - id/alias документа
- fields - поля документа, которые необходимо получить (через запятую), для удобства здесь также можно использовать виртуальное поле url, возвращающее url документа
- tpl - шаблон либо чанк
- mode - готовый предустановленный режим (сейчас есть только link для генерирования ссылок)
- id - префикс для плейсхолдеров + активирует режим генерирования плейсхолдеров для полей указанных в параметре fields (удобно, если нужно после вызова сниппета использовать возвращаемые им значения в документе/чанке), при этом плейсхолдеры будут иметь формат id_fieldname, т.е. для id="mylink" и fields="id,pagetitle", будем иметь плейсхолдеры: mylink_id и mylink_pagetitle
- s - сепаратор (в случае, если нужно просто вывести несколько параметров одного документа друг за другом)
При указании в fields виртуального поля url, в шаблоне также можно использовать параметр %url% - который будет заменен на соответствующую ссылку (нет необходимости использовать конструкцию [~id~] ), для параметра url также будет сгенерирован плейсхолдер (в режиме генерирования плейсхолдеров (при установленном значении id).
Если считаете сниппет полезным на столько, что можно добавить в репозиторий - готов составить описание и добавить.