Привязка к каждому посту/комментарию кнопки «цитировать»

Главные вкладки

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 7 мая 2009 в 16:38

Здравствуйте!

Возможно, мой вопрос имеет к Друпал отношение косвенное и больше относится к JS, но, тем не менее, ответ на него часто нужен на сайтах, использующих Друпал.

Имеется сайт на Друпал с форумом (+ AF, Bbcode и BUEditor). Хочется дать пользователям возможность быстрого цитирования, чтобы щелчок на ссылке/кнопке вставлял в textarea кусок поста в тегах bbcode [ quote = "имя автора" ]%TEXT%[ / quote ]. Пытался найти в Сети описание того, как это делается, но, видимо, что-то с Гуглежом у меня сегодня не ладится — ничего путного не увидел. Подскажите, пожалуйста, если не трудно.
Спасибо.

Комментарии

Аватар пользователя Geldora Geldora 7 мая 2009 в 18:26

Поддерживаю! Кажется, Renexe говорил, что на Друпал.ру используется простой js - и тоже предлагал искать его в Гугле. И тоже пыталась - и тоже не нашла к сожалению (Поиск по Quote дает много мусора)

Может есть название у этого скрипта?

Аватар пользователя Geldora Geldora 7 мая 2009 в 19:07

Нет, модуль не так делает!...

Куот цитирует на отдельной странице +цитирует все сообещние (а если это нода?)- тот скрипт, который мы ищем уитирует только выделенное и без перехода на отдельную страницу.

Аватар пользователя penexe penexe 7 мая 2009 в 19:09
<img onclick="insertQuote();" onmouseover="getText('beerman');" title="Выделите текст и нажмите эту кнопку, чтобы вставить цитату" id="img_quote" src="/sites/all/themes/novosibirsk/img/icons/blog_pencil.gif"/>
function getText(aname) {
        txt = '';
        if (window.getSelection && !window.opera) txt = window.getSelection();
        else if (document.getSelection) txt = document.getSelection();
        else if (document.selection) txt = document.selection.createRange().text;
        txt = '
"'</span> <span style="color: #339933;">+</span> aname <span style="color: #339933;">+</span> <span style="color: #3366CC;">'" wrote:
' + txt + '
\n'
;
}

function insertQuote() {
        if (txt != '' && document.getElementById('edit-comment')) {
                insertAtCaret(document.getElementById("edit-comment"), txt);
        }
}

function insertAtCaret(textObj, textV) {
        textV = textV.replace(/\s\[\?\]/g, '');
        if (textV == ''||!textObj) return;
        var ver = 8;
        if (document.all && !window.opera) {
                if (textObj.createTextRange && textObj.caretPos) {
                        var caretPos = textObj.caretPos;
                        caretPos.text = textV;
                } else textObj.value+= textV;
        } else {
                var brows=navigator.userAgent.toString();
                var scrollTop, scrollLeft;
                if (textObj.type == 'textarea' && textObj.scrollTop) {
                        scrollTop = textObj.scrollTop;scrollLeft=textObj.scrollLeft;
                }
                if (brows.search(/opera\/?(\d*.\d*)/i) != -1) ver=RegExp.$1;
                if (textObj.selectionStart >= 0 && ver >= 8) {
                        if (textObj.textLength != undefined) {
                                var selLength = textObj.textLength;
                                var selStart = textObj.selectionStart;
                                var selEnd = textObj.selectionEnd;
                                if (selEnd == 1 || selEnd == 2) selEnd=selLength;
                                var s1 = (textObj.value).substring(0, selStart);
                                var s2 = (textObj.value).substring(selEnd, selLength);
                                textObj.value = s1 + textV + s2;
                                textObj.setSelectionRange(selStart + textV.length, selStart + textV.length);
                        }
                        if (typeof scrollTop != 'undefined') {
                                textObj.scrollTop=scrollTop;textObj.scrollLeft=scrollLeft;
                        }
                } else textObj.value+=textV;
        }
}

Аватар пользователя Химический Али Химический Али 12 мая 2009 в 13:26

Вставьте в ваши шаблоны node.tpl.php, comment.tpl.php что-то вроде этого:

<a id="quote" title="Выделите текст и нажмите ссылку, чтобы вставить цитату" onmouseover="getText('<?php $node->user_name; ?>');" onclick="insertQuote(); return false;">цитировать</a>

а приведенный выше код добавьте с помощью функции drupal_add_js: http://api.drupal.ru/api/function/drupal_add_js

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 27 июня 2009 в 2:07

Только дошли руки до того, чтобы попытаться реализовать это, но что-то, видимо, я делаю неправильно. Помогите, пожалуйста, определить, что именно я делаю не так.
1. Сохранил подаренный penexe JS в файл quote.js, который положил в папку на сервере.
2. Вставил в шаблон, который отрисовывает мне топик форума drupal_add_js, который добавляет мой скрипт.
3. Вставил в шаблон к каждому комментарию <?php <a id="quote" title="Выделите текст и нажмите ссылку, чтобы вставить цитату" onmouseover="getText('<?php print $account->name; ?>');" onclick="insertQuote(); return false;">цитировать</a> ?>
4. Если нажимаю на появившуюся кнопку «цитировать», ничего не происходит.
5. В коде страницы всё, вроде бы, в порядке: <a id="quote" title="Выделите текст и нажмите ссылку, чтобы вставить цитату" onmouseover="getText('Ingumsky');" onclick="insertQuote(); return false;">цитировать</a>
6. Сообщение о добавлении скрипта тоже есть:
7. При попытке проверить работу скрипта драгонфлаем, вижу, что уже при наведении мышки на «цитировать» выскакивает ошибка:

name: ReferenceError
message: Statement on line 1: Undefined variable: getText

А есть ещё и

Syntax error while loading: line 6 of linked script at http://localhost/drupal/sites/all/modules/birdie_features/files/quote.js?T :
Expected statement
        txt = '<br />

8. Если нажать на «цитировать», вижу в драгонфлае ещё одно сообщение об ошибке:

name: ReferenceError
message: Statement on line 1: Undefined variable: insertQuote
Backtrace:
  Line 1 of function script
    insertQuote(); return false;

Подскажите, пожалуйста, что я делаю не так?

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 28 июня 2009 в 18:20

Спасибо Вам большое! Так действительно работает. После того, как я посмотрел код по последней Вашей ссылке, я понял, что же в первом варианте было не так — это позволило мне чуть лучше понять, как это всё работает. Спасибо!

Аватар пользователя Serg_M Serg_M 5 июля 2009 в 9:12

А для тех кто в "танке" все еще непонятно.
Вставляю в template.php
drupal_add_js(path_to_theme() .'/quote.js', 'theme');
в соей теме создаю файл quote.js, куда вставляю код (чем отличается код отсюда от кода оттуда, так и не понял, с виду одинаковый)

Вставляю в comment.tpl.php "что-то вроде этого"

Результатом у меня получается цитата, правда без user_name просто "".
{quote=""}здесь какой-то текст{/quote}
(здесь вместо фигурных должны квадратные скобки стоять)
но ведь цитата в виде символов, а не оформленная красиво, типа на сером квадрате кто написал и что написал???

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 16 июля 2009 в 19:59

но ведь цитата в виде символов, а не оформленная красиво, типа на сером квадрате кто написал и что написал???
«Оформленная красиво» делается через css. Данный код всего лишь вставляет в текстареа выделенный фрагмент текста заключённый в теги цитирования.

Аватар пользователя Sinn Sinn 10 ноября 2015 в 11:46

Переработал все выше написанное и оформил это все в виде модуля buquote. Взял за основу quote - там идет хороший фильтр. Добавил js код обработки клика, добавил добавление ссылки "Цитировать", сразу все перевел на русский. Функцию изменения настроек модуля убрал полностью. Так что надо просто включить модуль и включить "Quote filter" в "Форматы ввода".

Сейчас модуль позволяет цитировать в нодах типа blog, story, forum. Настраивается это в buquote.module на 84 строчке 'node_types' => array('blog', 'story', 'forum').
!!! Не могу прикрепить файл с модулем. Попробую чуть позже
Модуль в аттачменте

Аватар пользователя babuta babuta 25 июля 2009 в 21:45

Пробовал включить модуль как описано (настройки не трогал)
Получил на форуме

    * warning: Illegal offset type in isset or empty in /srv/www/vhosts/*.RU/httpdocs/includes/path.inc on line 65.
    * warning: Illegal offset type in /srv/www/vhosts/*.RU/httpdocs/includes/path.inc on line 70.
    * warning: preg_match() expects parameter 2 to be string, array given in /srv/www/vhosts/*.RU/httpdocs/includes/bootstrap.inc on line 771.
    * warning: preg_match() expects parameter 2 to be string, array given in /srv/www/vhosts/*.RU/httpdocs/includes/bootstrap.inc on line 771.
    * warning: preg_match() expects parameter 2 to be string, array given in /srv/www/vhosts/*.RU/httpdocs/includes/bootstrap.inc on line 771.
    * warning: preg_match() expects parameter 2 to be string, array given in /srv/www/vhosts/*.RU/httpdocs/includes/bootstrap.inc on line 771.
    * warning: Illegal offset type in isset or empty in /srv/www/vhosts/*.RU/httpdocs/includes/path.inc on line 65.
    * warning: Illegal offset type in /srv/www/vhosts/*.RU/httpdocs/includes/path.inc on line 70.
    * warning: preg_match() expects parameter 2 to be string, array given in /srv/www/vhosts/*.RU/httpdocs/includes/bootstrap.inc on line 771.
    * warning: Illegal offset type in isset or empty in /srv/www/vhosts/*.RU/httpdocs/includes/path.inc on line 65.
    * warning: Illegal offset type in /srv/www/vhosts/*.RU/httpdocs/includes/path.inc on line 70.
    * warning: preg_match() expects parameter 2 to be string, array given in /srv/www/vhosts/*.RU/httpdocs/includes/bootstrap.inc on line 771.
    * warning: preg_match() expects parameter 2 to be string, array given in /srv/www/vhosts/*.RU/httpdocs/includes/bootstrap.inc on line 771.
    * warning: Illegal offset type in isset or empty in /srv/www/vhosts/*.RU/httpdocs/includes/path.inc on line 65.
    * warning: Illegal offset type in /srv/www/vhosts/*.RU/httpdocs/includes/path.inc on line 70.
    * warning: preg_match() expects parameter 2 to be string, array given in /srv/www/vhosts/*.RU/httpdocs/includes/bootstrap.inc on line 771.
    * warning: preg_match() expects parameter 2 to be string, array given in /srv/www/vhosts/*.RU/httpdocs/includes/bootstrap.inc on line 771.
    * warning: preg_match() expects parameter 2 to be string, array given in /srv/www/vhosts/*.RU/httpdocs/includes/bootstrap.inc on line 771.
    * warning: preg_match() expects parameter 2 to be string, array given in /srv/www/vhosts/*.RU/httpdocs/includes/bootstrap.inc on line 771.
    * warning: Illegal offset type in isset or empty in /srv/www/vhosts/*.RU/httpdocs/includes/path.inc on line 65.
    * warning: Illegal offset type in /srv/www/vhosts/*.RU/httpdocs/includes/path.inc on line 70.
    * warning: preg_match() expects parameter 2 to be string, array given in /srv/www/vhosts/*.RU/httpdocs/includes/bootstrap.inc on line 771.

Верия Drupal 6.10, Quote 6.x-1.1-beta2
Здесь же как то получилось. Подскажите как лучьше внедрить эту возможность.
В 65 строке

      if (isset($map[$path_language][$path])) {
        return $map[$path_language][$path];
      }
function drupal_validate_utf8($text) {
  if (strlen($text) == 0) {
    return TRUE;
  }
771:   return (preg_match('/^./us', $text) == 1);
}
Аватар пользователя clubwave.ru clubwave.ru 17 августа 2009 в 22:21

функция insertAtCaret здесь слегка кривая.. не работает в google chrome

вот эта работает:

function insertAtCaret(tObj,textV){    
    textV=textV.replace(/\s\[\?\]/g,'')
    if (textV==''||!tObj) return
    var ver=8
    if(document.all && !window.opera){
      if (tObj.createTextRange&&tObj.caretPos) {
          var caretPos=tObj.caretPos
          caretPos.text=textV
        }else tObj.value+= textV
        }else
        {var brows=navigator.userAgent.toString()
         var scrollTop, scrollLeft
         if (tObj.type=='textarea'&&tObj.scrollTop)
         {scrollTop=tObj.scrollTop;scrollLeft=tObj.scrollLeft}                
          if(brows.search(/opera\/?(\d*.\d*)/i)!=-1) ver=RegExp.$1
          if(tObj.selectionStart>=0&&ver>=8){
          if(tObj.textLength!=undefined||tObj.value.length!=undefined)
           {var selLength=tObj.textLength!=undefined?tObj.textLength:tObj.value.length
            var selStart=tObj.selectionStart
            var selEnd=tObj.selectionEnd
            if (selEnd==1||selEnd==2)selEnd=selLength  
            var s1=(tObj.value).substring(0,selStart)
            var s2=(tObj.value).substring(selEnd,selLength)
            tObj.value=s1+textV+s2
            tObj.setSelectionRange(selStart+textV.length,selStart+textV.length)
            }
            if (typeof scrollTop != 'undefined')
            {tObj.scrollTop=scrollTop;tObj.scrollLeft=scrollLeft}
           }else tObj.value+=textV
        }
}
Аватар пользователя babuta babuta 13 сентября 2009 в 0:07

действительно, не работает.
внес изменение в function insertAtCaret
ничего принципиально не изменилось - не работает

Аватар пользователя VladoMire VladoMire 14 сентября 2009 в 13:03

Нормальный код должен работать во всех браузерах, а так это ерунда, которую должно быть стыдно публиковать настоящему мастеру:
В chrome и safari вставка цитат не работает...

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 14 сентября 2009 в 13:08

"VladoMire" wrote:
Нормальный код должен работать во всех браузерах, а так это ерунда, которую должно быть стыдно публиковать настоящему мастеру:
В chrome и safari вставка цитат не работает...

Предложите свой вариант. Я не думаю, что последуют возражения.

Аватар пользователя Geldora Geldora 14 сентября 2009 в 20:23

"VladoMire" wrote:
В chrome и safari вставка цитат не работает...

Не знаю.. Я поставила самый первый модуль - может, его автор и залил обновленный вариант, я не в курсе. Все работает.

Если ваш проект требует, чтобы кнопка Цитата работала в Сафари - думаю, вы сможете поправить модуль (и не забудете выложить его на Друпал.ру!) Лично мне вполне хватило 4х наиболее распространенных браузеров

Аватар пользователя VladoMire VladoMire 14 сентября 2009 в 23:49

"clubwave.ru" wrote:
функция insertAtCaret здесь слегка кривая.. не работает в google chrome
вот эта работает

Вот как раз этот код и не работает, если использовать тот что предложен

"Sinn" wrote:
Переработал все выше написанное и оформил это все в виде модуля buquote. Взял за основу quote - там идет хороший фильтр. Добавил js код обработки клика, добавил добавление ссылки "Цитировать", сразу все перевел на русский. Функцию изменения настроек модуля убрал полностью. Так что надо просто включить модуль и включить "Quote filter" в "Форматы ввода"
все работает.

Действительно в сафари упираться на стоит. Посмотрел на посещаемость своего одного сайта с 1000 чел в сутки , то получается сафари использует всего 2 человека.
Chrome 6 человек, Больше всех 212 человек Firefox, потом Опера 200, и поровну по 150 чел все три баузера IE 6, 7 и 8.

Аватар пользователя Ant141 Ant141 11 октября 2009 в 18:36

Почему-то не работат предложенный модуль, Drupal 6.14
На кнопке QUOTE ссылка на мойсайт.ru
Че делать? Очень классная штука, охота ее поставить
Тестил в нескольких браузерах. в чем может быть причина?

Аватар пользователя Arturus Arturus 23 декабря 2009 в 15:59

Хороший модуль.
У меня Drupal 6.14 заработал везде кроме формы комментариев Advanced Forum, при переходе к форме ответа (комментария) ссылка "цитировать" пропадает, хотя в типах материалов buquote.module стр. 93 тип forum есть
'node_types' => array('blog', 'story', 'forum'),

Аватар пользователя orsi orsi 25 февраля 2010 в 19:58

Тоже поставил себе этот модуль.
Просто и со вкусом ))

Хотелось бы в нём ещё видеть следующее:

Если пользователь не выделяет текст и нажимает на "цитировать" - то цитирование бы не происходило (защита), но происходила бы вставка ника.

Аватар пользователя iNFerNo iNFerNo 26 февраля 2010 в 6:48

цитирование работает только когда цитируешь пост. если цитируешь пост где уже вставлена цитата то при клике ответить кнопки цитирования уже нет...

что делать.

Аватар пользователя iNFerNo iNFerNo 26 февраля 2010 в 6:54

это вообще работает только когда к томуже поле для ввода коментариев выбираешь на отдельной странице....

когда в том же блоге написан пост а ниже коменты то при выделение текста любого комента и клике на цитировать ничего не появляется.

пи.эс. использую модуль buquote

Аватар пользователя Sinn Sinn 2 марта 2010 в 17:01

с ajax comments он и не сможет работать (там js c textfield играет постоянно). сам для связки с ajax comments использую обычный quote. интеграцию с advanced forum тоже надо напильником доделывать.

Аватар пользователя sokol sokol 14 октября 2010 в 2:30

Друзья!

Никак не получается подружить quote (точнее цитирование выделяемого текста) c Ajax comment.
Удалось ли кому решить-таки эту проблему?

Аватар пользователя Sinn Sinn 14 октября 2010 в 13:23

и не получится связать - я писал. надо отдельный модуль делать чтобы функции и ajax_comments были и buqote

Аватар пользователя opex opex 10 декабря 2010 в 11:42

"Arturus" wrote:
Хороший модуль.
У меня Drupal 6.14 заработал везде кроме формы комментариев Advanced Forum, при переходе к форме ответа (комментария) ссылка "цитировать" пропадает, хотя в типах материалов buquote.module стр. 93 тип forum есть
'node_types' => array('blog', 'story', 'forum'),

решили эту проблему?

не вставляет цитаты, если включен ckeditor..это как-нить можно обойти?

Аватар пользователя sokol sokol 14 декабря 2010 в 23:49

Проблема так и остается, лично у меня.
Так что пока пользователям приходится пользоваться разве что встроенной в FCKEditor кнопкой "цитата" (с настроенным мной стилем).
То есть скопировал, вставил, оформил стилем "цитата", комментируешь

Аватар пользователя Abazinchik Abazinchik 7 марта 2011 в 14:05

Поставил модуль buquote. Все работает отлично. Только вот одна мелочь мешает радоваться. В списке последних комментариев теперь у меня: "Тот писал" "Этот писал". Неинформативно получается. Никто не сталкивался с данной проблемой?

Аватар пользователя VladoMire VladoMire 23 марта 2011 в 1:26

Перевод изменить надо. Пройдите admin/build/translate/search
введите, что не нравится, найдите и скорректируйте как надо

Аватар пользователя VladoMire VladoMire 23 марта 2011 в 1:26

Перевод изменить надо. Пройдите admin/build/translate/search
введите, что не нравится, найдите и скорректируйте как надо

Аватар пользователя kpv_dnepr@drupal.org kpv_dnepr@drupal.org 12 апреля 2011 в 17:04

Hello world)))

Третий раз подхожу к этому скрипту и опять безуспешно, не могу понять в чем дело, на странице скрипт стоит, взял один в один с Друпал.ру, добавил в comments.php.tpl такой код

<?php
<img onclick="insertQuote();" onmouseover="getText('sokol');" 
title="Выделите текст и нажмите эту кнопку, чтобы вставить цитату" 
id="img_quote" src="http://www.drupal.ru/sites/all/themes/novosibirsk/img/icons/blog_pencil.gif">
?>

но ничего не происходит, может взгляните?

ссылка

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 13 апреля 2011 в 16:49

"<a href="mailto:kpv_dnepr@drupal.org">kpv_dnepr@drupal.org</a>" wrote:
но ничего не происходит, может взгляните?

Проверил. Всё у вас работает, если не считать того, что анкор ссылки набран в какой-то неправильной кодировке — у меня он отображается вопросами.

Аватар пользователя kpv_dnepr@drupal.org kpv_dnepr@drupal.org 14 апреля 2011 в 12:25

"<a href="mailto:ingumsky@drupal.org">ingumsky@drupal.org</a>" wrote:
Проверил. Всё у вас работает

Да, сам скрипт поборол, теперь не могу сделать что б имя пользователя писал, ставил
<?phponmouseover="getText('<?php print $account->name?>');"?>
<?phponmouseover="getText('<?php $node->user_name?>');"?>

а ставит только кавычки, и никак.

Что на Drupal.ru стоит?

Аватар пользователя ingumsky@drupal.org ingumsky@drupal.org 14 апреля 2011 в 16:47

"<a href="mailto:kpv_dnepr@drupal.org">kpv_dnepr@drupal.org</a>" wrote:
Да, сам скрипт поборол, теперь не могу сделать что б имя пользователя писал, ставил

У меня на сайте была та же фигня. Это связано с тем, как формируется массив $links, из которого и выводятся ссылки под каждым комментариям. Я не разобрался и в итоге забил на это — добавил сделанные руками кнопки цитирования и shout (обратиться по имени) в тело комментария (а точнее — в author_pane, который там использую).

Аватар пользователя Радосвет Радосвет 9 июля 2011 в 10:41

"Sinn" wrote:
Переработал все выше написанное и оформил это все в виде модуля buquote. Взял за основу quote - там идет хороший фильтр. Добавил js код обработки клика, добавил добавление ссылки "Цитировать", сразу все перевел на русский. Функцию изменения настроек модуля убрал полностью. Так что надо просто включить модуль и включить "Quote filter" в "Форматы ввода".

Для 7 друпала не будет работать?

Аватар пользователя Sinn Sinn 3 августа 2011 в 11:08

Не знаю. Наверно нет. Хм, если кому интересно и захочет оказать спонсорскую поддержку, то можно сделать нормальный релиз.