We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 785
    • 2,113 Posts
    По просьбе одного из посетителей форума написал простой плагин для заполнения аннотаций первым абзацем из основного содержимого. Привязать его надо к событию OnBeforeDocFormSave.
    Если аннотация не заполнена, берется первый абзац (между <p> и </p>). Если он длинный, то обрезается и в конец добавляется троеточие. В плагине используются мультибайтные функции для кодировки UTF8. Для конкретного сайта может потребоваться доработка плагина.

    global $introtext;
    $e = &$modx->Event;
    if ($e->name == "OnBeforeDocFormSave") {
    	if (!strlen($_POST['introtext'])) {
    		$output=explode ("</p>",$_POST['ta'],2);
    		$introtext=strip_tags($output[0]);
    		$introtext=trim($introtext);
    		if (mb_strlen ($introtext,'UTF-8') > 255)
    			$introtext = mb_substr($introtext,0,252,'UTF-8')."...";
    		$introtext = mysql_escape_string($introtext);
     	}
    }
      Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
      Статьи о MODx, регулярно новые публикации
      • 6272
      • 95 Posts
      Спасибо! wink У меня сайт в cp1251 - просто поменял ’UTF-8’ в двух местах на ’cp1251’ - на первый взгляд работает отлично! Если будет иначе - отпишу.
        • 785
        • 2,113 Posts
        Quote from: D.SID at Feb 08, 2009, 07:56 AM

        меня сайт в cp1251
        Зря...

        В этом случае нужно вместо
        if (mb_strlen ($introtext,’UTF-8’) > 255)
        $introtext = mb_substr($introtext,0,252,’UTF-8’)."...";

        использовать
        if (strlen ($introtext) > 255)
        $introtext = substr($introtext,0,252)."...";

          Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
          Статьи о MODx, регулярно новые публикации
          • 26883
          • 137 Posts
          Прошу прощения, что не по этому плагину, но тоже по заполнению Аннотации.

          Имею TV типа RichText с именем, например annotation. Это для того, чтобы можно было в визуальном редакторе редактировать - любит наша пресс-служба именно так.

          Задача - при сохранении документа поместить текст из TV "annotation" в поле introtext. Вроде бы всё просто (упрощаю, без проверок):

          global $introtext;
          $tv = $modx->getTemplateVar('annotation'); 
          $tv_content = $tv['value']; 
          $introtext = $tv_content;
          


          Если этот код использовать в сниппете, то всё работает. В переменной $tv_content оказывается содержимое TV.
          Если этот код использовать в плагине, то выдается ошибка MySQL о неверных кавычках. При замене на $tv = $modx->getTemplateVar(`annotation`); ошибки нет, но нет и результата.

          Плагин выполняется на событии OnBeforeDocFormSave.

          Какую детскую ошибку я допускаю? Нельзя ли эту махинацию как-то иначе провернуть?

            • 785
            • 2,113 Posts
            Quote from: ShaggyDoc at Feb 09, 2009, 02:59 AM

            Прошу прощения, что не по этому плагину, но тоже по заполнению Аннотации.
            Лучше было бы создать новую тему...

            Насколько я понимаю, функция getTemplateVar использует переменные documentIdentifier и documentObject, которые не определены перед сохранением документа. То есть с помощью данной функции решить задачу не получится (смотрел не слишком внимательно, могу и ошибаться).
            А зачем вообще переносить информацию из TV в introtext? Используйте везде в шаблонах нужную переменную TV и никаких проблем.
              Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
              Статьи о MODx, регулярно новые публикации
              • 26883
              • 137 Posts
              А зачем вообще переносить информацию из TV в introtext? Используйте везде в шаблонах нужную переменную TV и никаких проблем.
              Примерно затем же, зачем Вы в introtext вырезаете первый абзац. Это ведь тоже можно сниппетом выводить во всякие ленты. И по метке типа <!-- splitter --> тоже можно.

              Конечно же я знаю, как TV в шаблонах использовать. Но хочется, чтобы в introtext сохранялось, а TV использовать как визуальный редактор. Да журналюги желают в introtext не только один абзац запихивать, а несколько, да с картинкой. С последующей очисткой TV, видимо, сделать надо.

              Кстати, проблему решил именно по Вашему примеру - взял значение TV в виде $_POST[’tvannotation’]. Может быть этот прием кому-то пригодится.

              Спасибо, ветку больше портить не буду.
                • 8199
                • 24 Posts
                Quote from: AKots at Feb 08, 2009, 06:02 AM

                написал простой плагин для заполнения аннотаций первым абзацем из основного содержимого

                Спасибо!
                  • 8643
                  • 271 Posts
                  @AKots
                  А почему в репозитории плагина нет?
                  Почему  в репозитории нет моего любимого плагина для генерации псевдонимов?
                  А эта хохма про сниппет автоматизации ссылок, его придумали раза три в русском сообществе, наверно и буржуи его тоже придумывают регулярно.

                  Давайте облегчим друг другу жизнь и будем размещать всё в репозитории.


                  p.s. DEEP MODx - вроде всё уже придуманно, но нифига не найдёш...
                    • 15944
                    • 88 Posts
                    Очень хотелось бы, чтобы кто-нибудь со знанием php и чуточкой свободного времени доработал этот отличный плагин, чтобы в аннотацию передавался ещё и тег переноса строки
                    . А то сейчас текст туда попадает сплошняком. smiley
                      • 785
                      • 2,113 Posts
                      Quote from: KiR at Jun 15, 2009, 08:09 AM

                      чтобы в аннотацию передавался ещё и тег переноса строки
                      .
                      Вместо строки
                      $introtext=strip_tags($introtext);
                      

                      нужно поставить несколько строк:
                      $introtext=str_replace ("\n", " ", $output[0]);
                      $introtext=preg_replace('/\<br(\s*)?\/?\>/i', "\n", $introtext);
                      $introtext=strip_tags($introtext);
                      $introtext=nl2br($introtext);


                      Сам не пробовал, может быть потребуется еще что-то.
                        Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                        Статьи о MODx, регулярно новые публикации