Кнопка BUEditor'a: cсылка на ноду из списка

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

Аватар пользователя arteias arteias 4 марта 2008 в 14:17

Подскажите, как реализовать:
требуется добавить в BUEditor кнопку, вызывающую окошко, в котором будет присутствовать список существующих на сайте страниц (node type "page"), выбором из которого в поле редактора добавляется ссылка на выбранную из списка страницу.

Вроде что-то похожее делает модуль linktocontent для tinymce.

заранее благодарен.

Комментарии

Аватар пользователя arteias arteias 5 марта 2008 в 4:54

вощем-то сделал, хотя, видимо, через за.. не изящно.

добавил невидимый блок, формирующий список страниц:

<?php
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;
?>

и на самой кнопке:

js:
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;
Аватар пользователя andreyle andreyle 6 марта 2008 в 13:24

Спасибо большое, удобная вещь!
А научит вставлять чистые ссылки нельзя? и выбор типа материала сделать через форму, а не в блоке?

Аватар пользователя arteias arteias 10 марта 2008 в 13:33

немного исправлений:
- сортировка списка по заголовкам
- поддержка ИЕ Smile

текст блока:

<?php
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;
?>

текст кнопки:

js:
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";
 
Аватар пользователя arteias arteias 10 марта 2008 в 13:31

Quote:
А научит вставлять чистые ссылки нельзя?

Что тут имеется ввиду? пустой хреф? или использование алиасов/синонимов?

Quote:
и выбор типа материала сделать через форму, а не в блоке?

можно в блоке добавить создание нескольких селекторов для разных типов материала, а в форме кнопки - еще один селектор со списком этих типов, при выборе из которого - список статей будет браться из того или иного селектора, созданного блоком Smile

Аватар пользователя andreyle andreyle 16 марта 2008 в 6:37

Quote:

или использование алиасов/синонимов?

Да, как раз использование алиасов.
А выбор типа материала, в идеале хотелось бы видеть так же как в LinkToNode для TyneMCE Smile

Аватар пользователя arteias arteias 20 марта 2008 в 17:12

Quote:
А выбор типа материала, в идеале хотелось бы видеть так же как в LinkToNode для TyneMCE :)

А там оно как? Smile

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

Аватар пользователя aguri aguri 2 июня 2008 в 17:31

Вставка алиаса выглядит так:

<?php
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 их не свяжешь (убила бы за это конструктора!), а подзапросы нынешняя версия мускула не поддерживет же?

Аватар пользователя STINGER STINGER 1 июля 2008 в 23:17

ребят, уже решил сюда вопрос задать:
как сделать кнопку в BUEditor'е для вставки ссылки с уже установленными параметрами (например, чтобы автоматом вставлялся параметр 'target=_blank' т.д.). Если для вставки обычной ссылки кнопка имеет такой код:

js: eDefFileDialog('link', { "title": "Insert/edit link", "url": "Link href", "tt": "Title text", "ok": "OK", "brw": "Browse" }, '');

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

Аватар пользователя popovtv popovtv 25 января 2011 в 22:05

Спустя столько лет хотел поднять тему, именно для BUEditor. Перерыл довольно много материалов на эту тему, но так и не получилось сделать человеческий вариант этой проблемы. Сейчас появилось множество интересных вещей, таких как jQuery, ajax, ahah - и не применить их было бы неправильно.

Для других редакторов (Tiny, FCK..) есть модуль Linkit, а для BUEditor нет его реализации. Все что здесь написано - рабочий вариант, но может будут идеи как заставить работать диалоги BUEditor через jQuery, ajax или другие callback'и для автозаполнения (autocomlete)?

Сюда же вопрос - не получается вставить готовую форму с autocomlete, сформированную функцие drupal_get_form() в диалог редактора - пропадают все кнопки. Может кому-то удавалось подружить это все? Благодарю.