We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 6481
    • 4 Posts
    Ребята, привет!

    Я новичок в MODX, поэтому, может быть, напишу о том, что уже давно решено (в этом случае прошу вас дать ссылку на статью, в которой описывается как это делать). После установки MODX и экспериментов, у меня возникло следующее естественное желание - иметь возможность делать ссылку на внутреннюю страницу сайта по id страницы, при этом поля title и собственно название ссылки чтобы заполнялись автоматически. Я не нашел стандартного средства MODX чтобы это делать автоматически, поэтому написал такой сниппет:

    Сниппет [[L]]

    <?php
    $doc = $modx->getDocument($page, ’*’, 1);
    $linktext = ($text)? $text : $doc[’pagetitle’];
    $Link = ’<a href="[~’.$page.’~]" title="’.$doc[’pagetitle’].’">’.$linktext.’</a>’;
    return $Link;
    ?>

    Теперь для ссылки на внутреннюю страницу, можно вставить а документе, например:
    [[L?&page=`5`]]

    И эта команда выльется в следующий код:
    <a href="линк на нужную страницу" title="описание нужной страницы">Описание нужной страницы или то, что задается параметром $text</a>

    Надеюсь, кому-то будет полезно.
      • 22532
      • 349 Posts
      поэтому, может быть, напишу о том, что уже давно решено

      ага
      вот к примеру вариантег
        • 6481
        • 4 Posts
        Я знал, что кто-то должен был это сделать! smiley Спасибо за ссылку.
          • 3256
          • 26 Posts
          Quote from: danilski at Apr 24, 2009, 08:09 AM

          Ребята, привет!

          Я новичок в MODX, поэтому, может быть, напишу о том, что уже давно решено (в этом случае прошу вас дать ссылку на статью, в которой описывается как это делать). После установки MODX и экспериментов, у меня возникло следующее естественное желание - иметь возможность делать ссылку на внутреннюю страницу сайта по id страницы, при этом поля title и собственно название ссылки чтобы заполнялись автоматически. Я не нашел стандартного средства MODX чтобы это делать автоматически, поэтому написал такой сниппет:

          Сниппет [[L]]

          <?php
          $doc = $modx->getDocument($page, ’*’, 1);
          $linktext = ($text)? $text : $doc[’pagetitle’];
          $Link = ’<a href="[~’.$page.’~]" title="’.$doc[’pagetitle’].’">’.$linktext.’</a>’;
          return $Link;
          ?>

          Теперь для ссылки на внутреннюю страницу, можно вставить а документе, например:
          [[L?&page=`5`]]

          И эта команда выльется в следующий код:
          <a href="линк на нужную страницу" title="описание нужной страницы">Описание нужной страницы или то, что задается параметром $text</a>

          Надеюсь, кому-то будет полезно.

          можно еще добавить tv к шаблону странице с типом image и получится банерное поле wink
            • 31136
            • 72 Posts
            Для тех, кому необходимо больше гибкости, предлагаю свой вариант сниппета "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).

            Если считаете сниппет полезным на столько, что можно добавить в репозиторий - готов составить описание и добавить.