x

Einloggen

Hast du noch keinen Account? Jetzt registrieren!

Выкарыстанне Thickbox у WordPress адміністратара

Original on binarybonsai.com
Пераклад на беларускую мову Patricia Clausnitzer


Поўнае кіраўніцтва па выкарыстанні Thickbox у адмін панэлі, нягледзячы на геніяльныя пасткі закладзены распрацоўнікамі сродкаў масавай інфармацыі мэнэджара і Thickbox сябе. Пры гэтым кіраўніцтва ў рукі, вы таксама можаце крычаць 'Spaaaartaaaaa' і ўдар дрэнны код у азадак вялікай адтулінай у зямлі.

Ва ўсякім разе, я ведаў, што WordPress пастаўляецца з Thickbox, для выкарыстання з мэнэджарам сродкаў масавай інфармацыі, і я жадаў выкарыстоўваць яго для перазапісу ўсплывальнае акно рашэнне ў выглядзе ўбудовы для шматслоўных у выкарыстанне IFRAME функцыянальнасць Thickbox. Вы ведаеце, такія рэчы, што здаецца простым пакуль вы не пачняце капаць, дакладна? Зараз, я мог бы з адным з новых Thickboxesque праектаў, але я жадаў бы мець убудову адчуваю, як яна была часткай WordPress, і бо адміністратар WordPress выкарыстоўвае Thickbox, гэта шлях.

Ну, першае, што я пазнаў, як Thickbox менш, чым добра дакументаваны (не кажучы ўжо пра застойныя з 2007), а праз некаторы час у спробах зрабіць галавой і хвастом код, я пазнаў, што варыянт дастаўкі з WP насамрэч утрымоўвае памылку. Тым не менш, я неўзабаве знайшоў спосаб атрымаць яе і, падбегшы да моманту, калі я толькі дзве асноўныя праблемы, якія стаяць перад мной.

Па-першае, большасць JS у адмін загружаецца выкарыстаннем нагрузкі scripts.php, якія ў асноўным згортваецца ўсё па змаўчанні, JS і загружае іх у адзін вялікі файл, у канцы файла, перад </body>, што, у сваю чаргу, азначае, што пры Thickbox і яго нагрузкі сцэнары Бретерен чэргі некаторыя ініцыялізацыі код, выкарыстоўваючы .ready(), ён непазбежна прыйдзе пасля які-небудзь код я магу паставіць у чаргу, і таму мой код не можа быць упэўнены, што нават Thickbox ініцыялізацыі і пры запуску, якая яшчэ больш пагаршаецца тым, што Thickbox не пакінуць без відавочных прыкмет таго, што былі ініцыялізаваны.

Эх.

Існуе абыйсці аднак, паколькі Thickbox надае падзеі некаторыя элементы з "Thickbox 'класа. Мы можам пайсці і знайсці гэтай падзеі, і калі яна ёсць - гэта азначае, Thickbox ініцыялізацыі - выканаць нашы рэчы. Мы робім гэта, праходзячы праз падзеі націску стэк першым знайшоў a.thickbox, ператварыўшы яго ў радок, выдаленне радкоў, табуляцыі і прабелы з яго, і параўноўваючы яе тое, што мы ведаем Thickbox ставіць там. Прамыванне, скуры, паўтараю, пакуль не знойдзем тое, што мы шукаем, і мы добра ісці (хоць, на ўсякі выпадак, мы прымушаем, каб гэта адбылося праз 2 секунды, незалежна).

Гэта не Перді, але гэта працуе:

/**
* Checks the first found a.thickbox element to see if Thickbox has attached a click event.
*/
function checkThickboxInit() {
jQuery.each( jQuery(‘a.thickbox:first’).data(‘events’)[‘click’], function(i, event) {
var thisEvent = event.toString().replace(/\n/g, ‘’).replace(/\t/g, ‘’).split(’ ‘).join(’‘);
var TBEvent = ‘function(){vart=this.title||this.name||null;vara=this.href||this.alt;varg=this.rel||false;tb_show(t,a,g);this.blur();returnfalse;}’;
if (thisEvent == TBEvent) {
clearTimeout(forcePayment);
clearInterval(checkThickboxInitInterval);

postThickboxInit();

return;
}
})
}

function postThickboxInit() {
/* Thickbox-related code can now be run */
}

checkThickboxInitInterval = setInterval(checkThickboxInit, 50);
forcePayment = setTimeout(‘clearInterval(checkThickboxInitInterval); postThickboxInit();’, 2000);

Медыя мэнэджар жахаў


Другая праблема, значна больш. Невялікі, таму што гэта значна дурней. Thickbox быў дададзены ў WordPress разам з мэнэджарам сродкаў масавай інфармацыі, і той, хто піша, што мабыць, вырашыў, што Thickbox не будзе выкарыстоўвацца кім-або іншым усё адно, так што яны могуць, а ісці наперад і парушыць яе асноўных функцый. Атрымаць. У медыя-upload.js, tb_position () функцыю, што і Thickbox выкарыстоўвае, каб кіраваць памерам і становішчам акна Thickbox, замяняецца ў поўным аб'ёме з функцыяй прызначана для выкарыстання толькі з дапамогай Media Manager, якая пастаўляецца разам з цвёрда і шырыні, які прыкладаецца да window.resize падзеі.

Гэта заняло ў мяне час, каб высвятліць.

Навошта гэта было трэба, я паняцця не маю; Thickbox дазваляе ўсталяваць неабходны памер праз URL параметраў, якія вы лічыце, можа быць досыць добры для кіраўнікоў СМІ, а таксама, але, мабыць, не.

Так мы змагаемся ў цені ...

/**
* Add ‘sparta’ class to the Thickbox window. Called from inside the TB iframe.
*/
function sparta_iframe_loaded() {
jQuery(’#TB_window’).addClass(‘sparta’)
}

/**
* Checks how to resize the TB window. Called on window.resize.
*/
function sparta_window_resize() {
if (jQuery(’#TB_window’).hasClass(‘sparta’))
sparta_resize_thickbox();
else
tb_position();
}

/**
* Resizes the TB window our way, not the highway.
*/
function sparta_resize_thickbox() {
var SpartaWidth = 1000;
var TB_newWidth = jQuery(window).width() < (SpartaPaymentWidth + 40) ? jQuery(window).width() – 40 : SpartaPaymentWidth;
var TB_newHeight = jQuery(window).height() – 70;
var TB_newMargin = (jQuery(window).width() – SpartaPaymentWidth) / 2;

jQuery(’#TB_window’).css({‘marginLeft’: -(TB_newWidth / 2)})
jQuery(’#TB_window, #TB_iframeContent’).width(TB_newWidth).height(TB_newHeight)
}

jQuery(document).ready(function() {
/**
* Cast the media managers window.resize event into the fire.
*/
jQuery.each( jQuery(window).data(‘events’)[‘resize’], function(i, event) {
var thisEvent = event.toString().replace(/\n/g, ‘’).replace(/\t/g, ‘’).split(’ ‘).join(’‘);
var expectedEvent = ‘function(){tb_position()}’;

if (thisEvent == expectedEvent) {
delete jQuery(window).data(‘events’)[‘resize’][i];
jQuery(window).bind(‘resize.ournamespace’, sparta_window_resize)
}
})

// Open a Thickbox window
tb_show(‘This is Sparta’, ‘sparta.html?TB_iframe=true’);
}

Зараз стварыце sparta.html і на дне яго, у блок сцэнара, устаўце наступнае, таму мы можам прыкласці свой уласны клас для ТБ акно:

parent.sparta_iframe_loaded();

І там вы маеце яго. Ліст адкрыццём.