Подскажите, как реализовать:
требуется добавить в BUEditor кнопку, вызывающую окошко, в котором будет присутствовать список существующих на сайте страниц (node type "page"), выбором из которого в поле редактора добавляется ссылка на выбранную из списка страницу.
Вроде что-то похожее делает модуль linktocontent для tinymce.
заранее благодарен.
Комментарии
вощем-то сделал, хотя, видимо,
через за..не изящно.добавил невидимый блок, формирующий список страниц:
unset ($output);
$node_type = "book";
$sql = "SELECT node.title, node.type, node.nid FROM {node} WHERE node.type = '$node_type' AND node.status = 1 ORDER BY node.created DESC";
$output .= "<select id='nodelistic' style='display:none;'>";
$result = db_query($sql);
while ($anode = db_fetch_object($result)) {
$output .= "<option value='node/". $anode->nid. "'>".$anode->title. "</option>";
}
$output .= "</select>";
print $output;
?>
и на самой кнопке:
coc1 = '<a href="/';
coc2 = '" title="';
coc3 = '">'+editor.active.getSelection()+'</a>';
var content = "<select id='megaselect'></select>";
content = content+"<br /><input type=button value='ok' onclick=\"code=coc1+document.getElementById('megaselect').value+coc2+document.getElementById('megaselect').options[document.getElementById('megaselect').selectedIndex].text+coc3; editor.active.replaceSelection(code); editor.dialog.close();\" />";
editor.dialog.open("Links", content);
document.getElementById('megaselect').innerHTML=document.getElementById('nodelistic').innerHTML;
Спасибо большое, удобная вещь!
А научит вставлять чистые ссылки нельзя? и выбор типа материала сделать через форму, а не в блоке?
немного исправлений:
- сортировка списка по заголовкам
- поддержка ИЕ
текст блока:
unset ($output);
$node_type = "book";
$sql = "SELECT node.title, node.type, node.nid FROM {node} WHERE node.type = '$node_type' AND node.status = 1 ORDER BY node.title, node.created DESC";
$output .= "<div id='nodelistic' style='display:none;'><select id='megaselect'>";
$result = db_query($sql);
while ($anode = db_fetch_object($result)) {
$output .= "<option value='node/". $anode->nid. "'>".$anode->title. "</option>";
}
$output .= "</select></div>";
print $output;
?>
текст кнопки:
coc1 = '<a href="/';
coc2 = '" title="';
coc3 = '">'+editor.active.getSelection()+'</a>';
var content = "<div id='selecter' style='display:inline;'></div>";
content = content+" <input type=button value='Вставить' onclick=\"code=coc1+document.getElementById('megaselect').value+coc2+document.getElementById('megaselect').options[document.getElementById('megaselect').selectedIndex].text+coc3; editor.active.replaceSelection(code); document.getElementById('nodelistic').innerHTML=document.getElementById('selecter').innerHTML; editor.dialog.close();\" />";
editor.dialog.open("Перекрестная ссылка", content);
document.getElementById('selecter').innerHTML=document.getElementById('nodelistic').innerHTML;
document.getElementById('nodelistic').innerHTML="lol";
Что тут имеется ввиду? пустой хреф? или использование алиасов/синонимов?
можно в блоке добавить создание нескольких селекторов для разных типов материала, а в форме кнопки - еще один селектор со списком этих типов, при выборе из которого - список статей будет браться из того или иного селектора, созданного блоком
Да, как раз использование алиасов.
А выбор типа материала, в идеале хотелось бы видеть так же как в LinkToNode для TyneMCE
А там оно как?
Я выбор типа материала буду у себя делать, так что позже размещу и здесь свой вариант этого решения.
А по поводу алиасов - ничего пока сказать не могу - я не программист, а тут надо еще одно обращение к базе, хз как, может кто из спецов подскажет.
На заметку. Спасибо.
Вставка алиаса выглядит так:
unset ($output);
$node_type = "story";
$sql = "SELECT node.title, node.type, node.nid FROM {node} WHERE node.type = '$node_type' AND node.status = 1 ORDER BY node.title, node.created DESC";
$output .= "<div id='nodelistic' style='display:none;'><select id='megaselect'>";
$result = db_query($sql);
while ($node = db_fetch_object($result)) {
$sql = "SELECT dst FROM {url_alias} WHERE src = 'node/$node->nid'";
$result1 = db_query($sql);
while ($anode = db_fetch_object($result1)) {
$output .= "<option value='". $anode->dst. "'>".$node->title. "</option>";
}
}
$output .= "</select></div>";
print $output;
?>
это-то просто,вот с выбором типа мтериала без перезагрузки формы придется повозиться. потому что если на сайте из 200-500 материалов просмотр материалов одним списком - это еще кула ни шло, то на сайте с несколькими тысячами нод - это уже не смешно ни разу.
З.Ы. плиз, не кидайте камнями, я не гуру мускула... понимаю, что запросов в базу при такой конструкции будет по числу строчек. но структура таблиц такова, что по nid их не свяжешь (убила бы за это конструктора!), а подзапросы нынешняя версия мускула не поддерживет же?
ребят, уже решил сюда вопрос задать:
как сделать кнопку в BUEditor'е для вставки ссылки с уже установленными параметрами (например, чтобы автоматом вставлялся параметр 'target=_blank' т.д.). Если для вставки обычной ссылки кнопка имеет такой код:
js: eDefFileDialog('link', { "title": "Insert/edit link", "url": "Link href", "tt": "Title text", "ok": "OK", "brw": "Browse" }, '');
то куда в этом коде вставить нужный параметр? т.е. как должен выглядеть код кнопки, чтобы автоматом при вставке ссылки в ней вставлялся нужный параметр.
спасибо,на заметку.
Спустя столько лет хотел поднять тему, именно для BUEditor. Перерыл довольно много материалов на эту тему, но так и не получилось сделать человеческий вариант этой проблемы. Сейчас появилось множество интересных вещей, таких как jQuery, ajax, ahah - и не применить их было бы неправильно.
Для других редакторов (Tiny, FCK..) есть модуль Linkit, а для BUEditor нет его реализации. Все что здесь написано - рабочий вариант, но может будут идеи как заставить работать диалоги BUEditor через jQuery, ajax или другие callback'и для автозаполнения (autocomlete)?
Сюда же вопрос - не получается вставить готовую форму с autocomlete, сформированную функцие drupal_get_form() в диалог редактора - пропадают все кнопки. Может кому-то удавалось подружить это все? Благодарю.