Глюк при совместном использовании объявлений Бегун (новый код автоконтекста) и модуля BuEditor

аватар: andyceo

Поставив себе на блог контекстные объявления от Бегуна, я обнаружил, что после этого перестал корректно работать модуль 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), а вот измененный код я приложу.

eDefHTML()

//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;
}

eDefRow()

//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: В Бегун я об этой ошибке сообщил.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • You can use the <go> tags just like the <a> for nicer urls.
  • Доступны HTML теги: <a> <img> <noindex> <br> <em> <i> <strong> <b> <strike> <s> <u> <sup> <sub> <h1> <h2> <h3> <h4> <h5> <h6> <cite> <blockquote> <abbr> <code> <ul> <ol> <li> <dl> <dt> <dd> <p> <div> <span> <hr>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <blockcode>. The supported tag styles are: <foo>, [foo]. PHP source code can also be enclosed in <?php ... ?> or <% ... %>.

Подробнее о форматировании

CAPTCHA
Введите, пожалуйста, код, который Вы видите на картинке. Показ изображений в браузере должен быть включен.
CAPTCHA на основе изображений
Введите символы, которые показаны на картинке.
Добавьте страницу в закладки. Перейти к верху страницы
RSS-материал