Поставив себе на блог контекстные объявления от Бегуна, я обнаружил, что после этого перестал корректно работать модуль BuEditor.
При нажатии на любую кнопку, выводящую диалоговое окно, код генерировался неправильно, а именно содержал что-то подобное:
<tr in_array="function (value) { for (var i = 0, l = this.length; i < l; i++) { if (this[i] == value) { return true; } } return false; }"> <td in_array="function (value) { for (var i = 0, l = this.length; i < l; i++) { if (this[i] == value) { return true; } } return false; }">Link href</td> <td in_array="function (value) { for (var i = 0, l = this.length; i < l; i++) { if (this[i] == value) { return true; } } return false; }"><input type="text" name="attr_href" value="" /></td> <td in_array="function (value) { for (var i = 0, l = this.length; i < l; i++) { if (this[i] == value) { return true; } } return false; }">undefined</td> </tr>
Правильно сгенерированный код должен был выглядеть так:
<tr> <td>Link href</td> <td><input type="text" name="attr_href" value="" /></td> <td></td> </tr>
Лишний элемент - это кусок javascript-кода, который почему-то брался из скрипта автоконтекста бегуна (скрипт вот этот - http://autocontext.begun.ru/autocontext2.js):
/** * in_array extension */ if (typeof Array.prototype.in_array == 'undefined') Array.prototype.in_array = function(value){ for (var i = 0, l = this.length; i < l; i++) if (this[i] == value) return true; return false; }
Т.е., как мы видим, прогеры Бегуна взяли да и переопределили массивы вообще.
Разумеется, после такого скрипты BuEditor'а отказались корректно работать. Потратив полдня на поиски ошибки, я нашел решение. Подобная вольность программеров Бегуна была критична для двух функций: eDefHTML() и eDefRow(), которые находятся в файле \sites\all\modules\bueditor\library\default_buttons_functions.js. Как они выглядят в оригинальном Буэдиторе, вы сами можете посмотреть (если читаете данную статью - наверняка у вас похожие проблемы и у вас уже установлен BuEditor), а вот измененный код я приложу.
//return html for the given tag. attributes having value=null are not printed. function eDefHTML(tag, innerHTML, attributes) { var attributes = attributes||[]; var html = '<'+ tag; if (typeof(attributes.in_array)!='undefined') attributes.in_array = undefined; for (var i in attributes) { html += attributes[i] == null ? '' : ' '+ i +'="'+ attributes[i] +'"'; } html += editor.inArray(tag, ['img', 'input', 'hr', 'br']) ? ' />' : '>'+ innerHTML +'</'+ tag +'>'; return html; }
//return a table row containing the cells(array of strings or objects(data:string, attributes:object)) function eDefRow(cells, attributes) { var html = ''; for (var i in cells) { if(typeof(cells[i]) != 'function' ) { html += typeof(cells[i]) == 'string' ? eDefHTML('td', cells[i]) : eDefHTML('td', cells[i]['data'], cells[i]['attributes']); } } return eDefHTML('tr', html, attributes); }
Надеюсь, это вам поможет. Не стесняйтесь комментировать предложенное решение, предлагайте свое.
PS: В Бегун я об этой ошибке сообщил.
Отправить комментарий