Здравствуйте!
Возможно, мой вопрос имеет к Друпал отношение косвенное и больше относится к JS, но, тем не менее, ответ на него часто нужен на сайтах, использующих Друпал.
Имеется сайт на Друпал с форумом (+ AF, Bbcode и BUEditor). Хочется дать пользователям возможность быстрого цитирования, чтобы щелчок на ссылке/кнопке вставлял в textarea кусок поста в тегах bbcode [ quote = "имя автора" ]%TEXT%[ / quote ]. Пытался найти в Сети описание того, как это делается, но, видимо, что-то с Гуглежом у меня сегодня не ладится — ничего путного не увидел. Подскажите, пожалуйста, если не трудно.
Спасибо.
Комментарии
Поддерживаю! Кажется, Renexe говорил, что на Друпал.ру используется простой js - и тоже предлагал искать его в Гугле. И тоже пыталась - и тоже не нашла к сожалению (Поиск по Quote дает много мусора)
Может есть название у этого скрипта?
Есть модуль http://drupal.org/project/quote
Нет, модуль не так делает!...
Куот цитирует на отдельной странице +цитирует все сообещние (а если это нода?)- тот скрипт, который мы ищем уитирует только выделенное и без перехода на отдельную страницу.
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 = ' + 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;
}
}
Спасибо!
Модуль quote может понадобиться для добавления фильтра, обрабатывающего бб-код [quоte]
Спасибо! Я пока, правда, не понял, как это прикрутить на практике к каждому посту и комментарию, но буду думать.
Вставьте в ваши шаблоны 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
Большое спасибо. Сейчас буду пробовать.
Только дошли руки до того, чтобы попытаться реализовать это, но что-то, видимо, я делаю неправильно. Помогите, пожалуйста, определить, что именно я делаю не так.
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. При попытке проверить работу скрипта драгонфлаем, вижу, что уже при наведении мышки на «цитировать» выскакивает ошибка:
message: Statement on line 1: Undefined variable: getText
А есть ещё и
Expected statement
txt = '<br />
8. Если нажать на «цитировать», вижу в драгонфлае ещё одно сообщение об ошибке:
message: Statement on line 1: Undefined variable: insertQuote
Backtrace:
Line 1 of function script
insertQuote(); return false;
Подскажите, пожалуйста, что я делаю не так?
здесь нормальный код, парсер друпал.ру закосячил
Спасибо Вам большое! Так действительно работает. После того, как я посмотрел код по последней Вашей ссылке, я понял, что же в первом варианте было не так — это позволило мне чуть лучше понять, как это всё работает. Спасибо!
А для тех кто в "танке" все еще непонятно.
Вставляю в template.php
drupal_add_js(path_to_theme() .'/quote.js', 'theme');
в соей теме создаю файл quote.js, куда вставляю код (чем отличается код отсюда от кода оттуда, так и не понял, с виду одинаковый)
Вставляю в comment.tpl.php "что-то вроде этого"
Результатом у меня получается цитата, правда без user_name просто "".
{quote=""}здесь какой-то текст{/quote}
(здесь вместо фигурных должны квадратные скобки стоять)
но ведь цитата в виде символов, а не оформленная красиво, типа на сером квадрате кто написал и что написал???
«Оформленная красиво» делается через css. Данный код всего лишь вставляет в текстареа выделенный фрагмент текста заключённый в теги цитирования.
Переработал все выше написанное и оформил это все в виде модуля buquote. Взял за основу quote - там идет хороший фильтр. Добавил js код обработки клика, добавил добавление ссылки "Цитировать", сразу все перевел на русский. Функцию изменения настроек модуля убрал полностью. Так что надо просто включить модуль и включить "Quote filter" в "Форматы ввода".
Сейчас модуль позволяет цитировать в нодах типа blog, story, forum. Настраивается это в buquote.module на 84 строчке 'node_types' => array('blog', 'story', 'forum').
!!! Не могу прикрепить файл с модулем. Попробую чуть позжеМодуль в аттачменте
На народ выкладывай.
Пробовал включить модуль как описано (настройки не трогал)
Получил на форуме
* 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 строке
return $map[$path_language][$path];
}
if (strlen($text) == 0) {
return TRUE;
}
771: return (preg_match('/^./us', $text) == 1);
}
функция insertAtCaret здесь слегка кривая.. не работает в google chrome
вот эта работает:
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
}
}
действительно, не работает.
внес изменение в function insertAtCaret
ничего принципиально не изменилось - не работает
Нормальный код должен работать во всех браузерах, а так это ерунда, которую должно быть стыдно публиковать настоящему мастеру:
В chrome и safari вставка цитат не работает...
Предложите свой вариант. Я не думаю, что последуют возражения.
Не знаю.. Я поставила самый первый модуль - может, его автор и залил обновленный вариант, я не в курсе. Все работает.
Если ваш проект требует, чтобы кнопка Цитата работала в Сафари - думаю, вы сможете поправить модуль (и не забудете выложить его на Друпал.ру!) Лично мне вполне хватило 4х наиболее распространенных браузеров
Вот как раз этот код и не работает, если использовать тот что предложен
все работает.Действительно в сафари упираться на стоит. Посмотрел на посещаемость своего одного сайта с 1000 чел в сутки , то получается сафари использует всего 2 человека.
Chrome 6 человек, Больше всех 212 человек Firefox, потом Опера 200, и поровну по 150 чел все три баузера IE 6, 7 и 8.
Почему-то не работат предложенный модуль, Drupal 6.14
На кнопке QUOTE ссылка на мойсайт.ru
Че делать? Очень классная штука, охота ее поставить
Тестил в нескольких браузерах. в чем может быть причина?
Хороший модуль.
У меня Drupal 6.14 заработал везде кроме формы комментариев Advanced Forum, при переходе к форме ответа (комментария) ссылка "цитировать" пропадает, хотя в типах материалов buquote.module стр. 93 тип forum есть
'node_types' => array('blog', 'story', 'forum'),
Тоже поставил себе этот модуль.
Просто и со вкусом ))
Хотелось бы в нём ещё видеть следующее:
Если пользователь не выделяет текст и нажимает на "цитировать" - то цитирование бы не происходило (защита), но происходила бы вставка ника.
цитирование работает только когда цитируешь пост. если цитируешь пост где уже вставлена цитата то при клике ответить кнопки цитирования уже нет...
что делать.
это вообще работает только когда к томуже поле для ввода коментариев выбираешь на отдельной странице....
когда в том же блоге написан пост а ниже коменты то при выделение текста любого комента и клике на цитировать ничего не появляется.
пи.эс. использую модуль buquote
вобщем модуль не пашет с аякс коментс модулем. убрал все заработало.
Модуль рабочий. У меня всё работает без проблем и во всех поп. браузерах.
с ajax comments он и не сможет работать (там js c textfield играет постоянно). сам для связки с ajax comments использую обычный quote. интеграцию с advanced forum тоже надо напильником доделывать.
А где перевести слово wrote?
Друзья!
Никак не получается подружить quote (точнее цитирование выделяемого текста) c Ajax comment.
Удалось ли кому решить-таки эту проблему?
с Ajax commen многое чо не пашет. Либо без него либо с вичами в коментах выбирайте
и не получится связать - я писал. надо отдельный модуль делать чтобы функции и ajax_comments были и buqote
тут пытался понять что к чему http://drupal.org/node/264075 вроде есть решение, если кто разберётся прошу тут отписать как это дело исправить и довести до ума.
.
решили эту проблему?
не вставляет цитаты, если включен ckeditor..это как-нить можно обойти?
Проблема так и остается, лично у меня.
Так что пока пользователям приходится пользоваться разве что встроенной в FCKEditor кнопкой "цитата" (с настроенным мной стилем).
То есть скопировал, вставил, оформил стилем "цитата", комментируешь
Поставил модуль buquote. Все работает отлично. Только вот одна мелочь мешает радоваться. В списке последних комментариев теперь у меня: "Тот писал" "Этот писал". Неинформативно получается. Никто не сталкивался с данной проблемой?
Перевод изменить надо. Пройдите admin/build/translate/search
введите, что не нравится, найдите и скорректируйте как надо
Перевод изменить надо. Пройдите admin/build/translate/search
введите, что не нравится, найдите и скорректируйте как надо
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">
?>
но ничего не происходит, может взгляните?
ссылка
Проверил. Всё у вас работает, если не считать того, что анкор ссылки набран в какой-то неправильной кодировке — у меня он отображается вопросами.
http://www.drupal.ru/node/50654
Да, сам скрипт поборол, теперь не могу сделать что б имя пользователя писал, ставил
<?phponmouseover="getText('<?php print $account->name; ?>');"?>
<?phponmouseover="getText('<?php $node->user_name; ?>');"?>
а ставит только кавычки, и никак.
Что на Drupal.ru стоит?
У меня на сайте была та же фигня. Это связано с тем, как формируется массив $links, из которого и выводятся ссылки под каждым комментариям. Я не разобрался и в итоге забил на это — добавил сделанные руками кнопки цитирования и shout (обратиться по имени) в тело комментария (а точнее — в author_pane, который там использую).
Для 7 друпала не будет работать?
Не знаю. Наверно нет. Хм, если кому интересно и захочет оказать спонсорскую поддержку, то можно сделать нормальный релиз.
для семерки есть аналог?
Инферна, какая тебе семёрка? Ты с шестёркой ещё не разобрался
я хо перевести сайт свой на семерку чтобы был уже. осталось чучуть до боекомплекта.
http://www.drupal.ru/node/84938