Кастомный макрос разрезания текста на тизер и полный текст в UMI.CMS

Два варианта макроса, применять в шаблоне tpl так, например:
%custom cutDescription(%pid%, 'opisanie')%

Вариант 1: реально разрезание с убиранием тегов и ограничением 300 символов (потом ещё ищет пробел с конца и оставляет только до него):

        public function cutDescription($elementId,$groupName){
        $hierarchy = umiHierarchy::getInstance();
        if (!$hElement = $hierarchy->getElement($elementId)) return;
        $typeId = $hElement->getObjectTypeId();
        $objectType = umiObjectTypesCollection::getInstance()->getType($typeId);
        if (!$objectGroup = $objectType->getFieldsGroupByName($groupName)) return;
        $fields = $objectGroup->getFields();
        $text='';
        foreach($fields as $fieldsObject) {
          $value = $hElement->getValue($fieldsObject->getName());
          if (!$value) continue;
          $text.=$value;
        }
      if (!$text) return '';
        $cut=substr(strip_tags($text),0,300);
        $cut=substr($cut,0,strrpos($cut,' '));
        return '<div class="less_text"><p>'.
              $cut.
              '  <a class="show_less" href="#" onclick="$(\'.less_text\').hide();
              $(\'.full_text\').slideDown();
          ; return false;">&hellip;</a>
          <a class="show_more" href="#" onclick="$(\'.less_text\').hide();
              $(\'.full_text\').slideDown();
          ; return false;">читать далее</a>
              </p></div>
              <div class="full_text" style="display:none;">'.
              $text.
              '<a class="show_less" href="#" onclick="$(\'.full_text\').slideUp();
              $(\'.less_text\').show();
          ; return false;">^ свернуть описание</a>
          </div>';
        }

Вариант 2 (более предпочтительный) - изменение высоты блока с помощью jquery/css:

        public function cutDescription($elementId,$groupName){
        $hierarchy = umiHierarchy::getInstance();
        if (!$hElement = $hierarchy->getElement($elementId)) return;
        $typeId = $hElement->getObjectTypeId();
        $objectType = umiObjectTypesCollection::getInstance()->getType($typeId);
        if (!$objectGroup = $objectType->getFieldsGroupByName($groupName)) return;
        $fields = $objectGroup->getFields();
        $text='';
        foreach($fields as $fieldsObject) {
          $value = $hElement->getValue($fieldsObject->getName());
          if (!$value) continue;
          $text.=$value;
        }
      if (!$text) return '';
        return '<div id="full_text" style="height:45px;overflow:hidden;">'.
              $text.
              '</div>
              <a id="show_more" class="show_less" href="#"
onclick="$(\'#show_more\').hide();
  $(\'#show_less\').show();
  var currentHeight = $(\'#full_text\').height();
  $(\'#full_text\').css(\'height\', \'auto\');
  var height = $(\'#full_text\').height();
  $(\'#full_text\').css(\'height\', currentHeight + \'px\');
  $(\'#full_text\').animate({
    height: height
  }); return false;">читать далее</a>
<a id="show_less" class="show_less" href="#" style="display:none;" onclick="$(\'#show_less\').hide();
  $(\'#show_more\').show();
  $(\'#full_text\').animate({
    height: \'45px\'
  }); return false;">^ свернуть описание</a>
';
        }

Знаю, "грязно", скрипты можно вынести и т.п.
Но это черновик, рабочая запись, не более :)

Метки:

Оставить комментарий

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

Подробнее о форматировании

КАПЧА
А ты не робот? Введи 5 цифр
                                                                       
ad8888ba, 8888888888 8888888888 ad88888ba 888888888888
8P' "Y8 88 88 d8" "8b ,8P'
d8 88 ____ 88 ____ Y8a a8P d8"
88,dd888bb, 88a8PPPP8b, 88a8PPPP8b, "Y8aaa8P" ,8P'
88P' `8b PP" `8b PP" `8b ,d8"""8b, d8"
88 d8 d8 d8 d8" "8b ,8P'
88a a8P Y8a a8P Y8a a8P Y8a a8P d8"
"Y88888P" "Y88888P" "Y88888P" "Y88888P" 8P'

Enter the code depicted in ASCII art style.
To prevent automated spam submissions leave this field empty.