hak_tinymce вставка картинок 3

04 июня 2010

Внимание! Вышла новая версия hak_tinymce, читать Hak_tinymce 1.0

В прошлой статье я подробно описал все изменение которые сделал в файлах css/txpimage.css, image.htm, js/txpimage.js. Как видно из название это файлы с описанием стиля CSS, HTML разметкой и JavaScript код. В принципе возможно Вам не так сильно интересно полное описание и мое рассуждение, поэтому Вы можете скачать все измененные файлы, ссылка на них находиться в конце статьи.

Наибольшие изменения я внес в код плагина hak_tinymce. Писал на языке программирования PHP, которого по сути не знаю. Всю информацию искал в интернете и возможно код можно улучшить и оптимизировать.

В самом начале плагина hak_tinymce объявляем и регистрируем новую функцию hak_txpcountselect:

if (@txpinterface == 'admin') {
add_privs('article','1,2,3,4,5,6');
add_privs('hak_tinymce_prefs', '1,2');
add_privs('hak_tinymce_js','1,2,3,4,5,6');
add_privs('hak_tinymce_compressor_js','1,2,3,4,5,6');
add_privs('hak_txpimage','1,2,3,4,5,6');
add_privs('hak_txpcatselect','1,2,3,4,5,6');
add_privs('hak_txpcountselect','1,2,3,4,5,6');

register_callback(array("hak_tinymce","js_prep"), "hak_tinymce_js");
register_callback(array("hak_tinymce","compressor_js_prep"), "hak_tinymce_compressor_js");
register_callback("hak_txpimage", "hak_txpimage");
register_callback("hak_txpcatselect", "hak_txpcatselect");
register_callback("hak_txpcountselect", "hak_txpcountselect");

Что обозначают цифры в функции add_privs, я не знаю. Сделал по аналогии с функцией hak_txpcatselect. Потому как по своему функционалу они одинаковые, только передают разные параметры в разные блоки. Можете посмотреть чистый код функции hak_txpcountselect. Так как функция большая, тут мы ее разберем по частям. В самом начале я добавил дополнительную функцию count_to_width отвечающею за преобразование количества страниц в требуемую ширину для вывода.

function count_to_width($n, $widthc){
$result = 0;
if ($n > 99999) {$n = 99999;}
$w = $n * 4;
if ($n < 10) { $result = $n * $widthc; }
elseif ($n < 100) { $result = ($n - 9) * 2 * $widthc + (9 * $widthc); }
elseif ($n < 1000) { $result = ($n - 99) * 3 * $widthc + (180 * $widthc) + (9 * $widthc); }
elseif ($n < 10000) { $result = ($n - 999) * 4 * $widthc + (2700 * $widthc) + (180 * $widthc) + (9 * $widthc); }
else { $result = ($n - 9999) * 5 * $widthc + (36000 * $widthc) + (2700 * $widthc) + (180 * $widthc) + (9 * $widthc); }
return $result + $w;
}

На вход функции мы получаем количество страниц и ширину одного символа. На выходе функции мы должны получить требуемую ширину в пикселях. Я ограничил максимальное количество страниц. По умолчанию выбор картинок идет по 10 штук на одну страницу и если подсчитать то для правильно работы моего дополнения максимально количество картинок ограничено 999990 штук. Думаю что это число достаточно высокое для сайтов самого разного направления. Потом количество страниц умножаем на 4. В прошлой статье я уже писал про это значение. Это padding у HTML тега li с помощью которого выводятся номера страниц. 2 пикселя справа и 2 пикселя слево, это значение описано в файле css/txpimage.css. Логика простая, отдельно рассчитываем ширину для единиц, десяток, сотен, тысяч и складываем.

Еще одна дополнительная функция width_to_count которая отвечает за вывод номеров начальной и конечной страниц для отображения смещения. Вот с этой функцией пришлось попотеть и до конца так и не отточил ее.

function width_to_count($wl, $wh, $w, $l, $n, $widthc){
$result = array($l, $l);
$check1 = 0; $check2 = 0;

while ( $w > 0 ) {

if ($result[0] < $n) {$tl = count_to_width($result[0] + 1, $widthc) - count_to_width($result[0], $widthc);}
else {$tl = count_to_width($n, $widthc) - count_to_width($n-1, $widthc);}
if (($result[0] > 1) AND ($wl > 0) AND ($w > $tl)) {
$result[0]--;
$tmpl = count_to_width($result[0] + 1, $widthc) - count_to_width($result[0], $widthc);
$w = $w - $tmpl;
$wl = $wl - $tmpl;
}
else {
if ( $check1 == 0 ){ $w = $w - $widthc - 4; }
$check1 = 1;
}

if ($result[1] > 1) {$th = count_to_width($result[1], $widthc) - count_to_width($result[1] - 1, $widthc);}
else {$th = $widthc + 4;}
if (($result[1] < $n) AND ($wh > 0) AND ($w > $th)) {
$result[1]++;
$tmph = count_to_width($result[1], $widthc) - count_to_width($result[1] - 1, $widthc);
$w = $w - $tmph;
$wh = $wh - $tmph;
}
else {
if ($check2 = 0) {
$tmph = count_to_width($result[1], $widthc) - count_to_width($result[1] - 1, $widthc);
$w = $w - $tmph;
}
$check2 = 1;
}

if (($check1 == 1) AND ($check2 == 1)) {break;}
}

return $result;
}

Вход функции получаем 6 параметров, на выходе мы получаем массив с двумя элементами. Первый элемент содержит номер начальной страницы, второй конечный номер которые надо вывести. С выходными параметрами все понятно. Входные параметры я опишу не по порядку, а опишу по логике работы. Самый легкий это шестой параметр $widthc, он передает в функцию ширину одного символа. Третий параметр $w передает ширину блока в котором будут выводиться номера страниц. Номера страниц выводятся в линию и важно не вылазить за ширину этого блока.(У меня все таки не получилось и нет нет а номера страниц вылазят за ширину блока) Пятый параметр $n передает сколько всего номеров, а $l передает выбранный номер страницы. Первый параметр $wl показывает сколько требуется ширины от начала (от первой страницы) и до выбранной страницы(включительно), $wh показывает сколько требуется ширины от выбранной страницы до последней страницы. Везде ширину измеряется и передается в пикселях. И так зная все эти параметры производим расчет начального и конечного номера страницы. Номер страницы может занимать от 1 до 5 символов + padding. Если бы номера занимали одинаковую ширину эта функция была бы намного проще.

Из доступной ширины блока ($w) по очереди  вычитаем ширину которую занимает номер страницы. Цикл продолжается пока есть доступная ширина ( while ( $w > 0 ) ). Так же предусмотрен выход из цикла если будет достигнут первый и последний номер страницы if (($check1 == 1) AND ($check2 == 1)) {break;}, но такая ситуация не должна возникнуть, так как если ширина блока где выводятся номера страниц($w) больше требуемой ширины ($wl + $wh) то функция width_to_count не вызывается. В этом случаи понятно что необходимо отображать номера с первого по последний.

Изначально значения номеров начальной и конечной страниц устанавливаем равными выбранной страницы $result = array($l, $l);. И при каждом проходе цикла значение первого элемента уменьшаем, а второго увеличиваем($result[0]--; $result[1]++;). Если конечно уже не достигли первого и последнего номера страниц и есть доступная ширина.

А вот само тело функции hak_txpcountselect:

global $img_dir,$path_to_site,$txpcfg;
$category = gps("c");
$category = (!empty($category)) ? "AND category='".$category."'" : "" ;

$limit_image = gps("limimg");
if ((empty($limit_image)) || ($limit_image == "All") || (!intval($limit_image))){ $limit_image = 1; }

$limit_img_count = gps("limcount");
if ((empty($limit_img_count)) || (!intval($limit_img_count)) ) { $limit_img_count = 1; }

$count_width = gps("width");
if ((empty($count_width)) || (!intval($count_width)) ) { $count_width = 0; }

$last_width = gps("wl");
if ((empty($last_width)) || (!intval($last_width))) {$last_width = 12;}
$char_width = gps("wc");
if ((empty($char_width)) || (!intval($char_width))) { $char_width = 12; }

$rcount = safe_count("txp_image", "1=1 ".$category);
echo "<input type=\"hidden\" id=\"count_images\" name=\"count_images\" value=\"$rcount\">\n";

$yw = 0;
$x = ceil($rcount/$limit_image);
$yw = ($last_width * 4 + 16) + count_to_width($x, $char_width);

echo "<ul id=\"txpLimitCount\" class=\"pagination\" style=\"visibility:hidden\">";
echo "<li><a href=\"#\" onclick=\"TxpImageDialog.loadCountImage2(tinyMCEPopup.dom.get('txpCategory').value, tinyMCEPopup.dom.get('txpLimitimg').value, 1);return false;\">&laquo</a></li>";

if ( $limit_img_count == 1 ) { echo "<li>&lt</li>"; }
else {
echo "<li><a href=\"#\" onclick=\"TxpImageDialog.loadCountImage2(tinyMCEPopup.dom.get('txpCategory').value, tinyMCEPopup.dom.get('txpLimitimg').value, $limit_img_count - 1);return false;\">&lt</a></li>";
}
$clw = 0; $chw = 0;
if ( $count_width > $yw + 16) { $xw = 1; $zw = $x; }
else {
$clw = count_to_width($limit_img_count, $char_width);
$chw = count_to_width($x, $char_width) - $clw;
$a = width_to_count($clw, $chw, $count_width - ($last_width * 4 + 16) - 16, $limit_img_count, $x, $char_width);
$xw = $a[0];
$zw = $a[1];
}

for ($i = $xw; $i <= $zw; $i++ ) {
if ($i == $limit_img_count) { echo "<li>$i</li>"; }
else { echo "<li><a href=\"#\" onclick=\"TxpImageDialog.loadCountImage2(tinyMCEPopup.dom.get('txpCategory').value, tinyMCEPopup.dom.get('txpLimitimg').value, $i);return false;\">$i</a></li>";}
}

if ( $limit_img_count == $x ) { echo "<li>&gt</li>"; }
else {
echo "<li><a href=\"#\" onclick=\"TxpImageDialog.loadCountImage2(tinyMCEPopup.dom.get('txpCategory').value, tinyMCEPopup.dom.get('txpLimitimg').value, $limit_img_count + 1);return false;\">&gt</a></li>";
}
echo "<li><a href=\"#\" onclick=\"TxpImageDialog.loadCountImage2(tinyMCEPopup.dom.get('txpCategory').value, tinyMCEPopup.dom.get('txpLimitimg').value, $x);return false;\">&raquo</a></li>";

echo "</ul>";

Тут анализируем полученные параметры - категорию, лимит(сколько картинок отображать), смещение, ширину блока в котором отображать номера страниц, ширину одного символа и ширину символа <(&lt;). Делаем запрос  базу данных для подсчета количества картинок ($rcount = safe_count("txp_image", "1=1 ".$category);). Получив количество картинок делаем его доступным для JavaScript с помощью скрытого элемента формы INPUT(echo "<input type=\"hidden\" id=\"count_images\" name=\"count_images\" value=\"$rcount\">\n";)

Далее получаем начальный и закрывающий номер страницы и заполняем строчку с номерами страниц для смещения.

if ( $count_width > $yw + 16) { $xw = 1; $zw = $x; }
else {
$clw = count_to_width($limit_img_count, $char_width);
$chw = count_to_width($x, $char_width) - $clw;
$a = width_to_count($clw, $chw, $count_width - ($last_width * 4 + 16) - 16, $limit_img_count, $x, $char_width);
$xw = $a[0];
$zw = $a[1];
}

Вот в этом участке кода проверяем достаточно ли ширины блока для отображения всех номеров страниц или нет? Конечно же если ширины блока хватает - то делаем начальный номер равный 1, конечный номер равен максимальному. Максимальный номер вычисляем несколькими строчками выше ($x = ceil($rcount/$limit_image);). Округляем в большую сторону количество всех картинок на количество отображаемых картинок за 1 раз(ЛИМИТ).

Ничего сложного в коде PHP тут нет(на мой взгляд). Само заполнение происходит в цикле:

for ($i = $xw; $i <= $zw; $i++ ) {
if ($i == $limit_img_count) { echo "<li>$i</li>"; }
else { echo "<li><a href=\"#\" onclick=\"TxpImageDialog.loadCountImage2(tinyMCEPopup.dom.get('txpCategory').value, tinyMCEPopup.dom.get('txpLimitimg').value, $i);return false;\">$i</a></li>";}
}

Делаем ссылки (HTML тег a), при выборе ссылки передаем все необходимые параметры в JavaScript функцию loadCountImage2, описание котором можно посмотреть в прошлой статье.

Продолжение следует...

Внимание! Вышла новая версия hak_tinymce, читать Hak_tinymce 1.0

Вы можете скачать архив(tar) всех измененных файлов. Не забудьте сохранить свои файлы перед изменением!

Скачать: txpimage

Скачать: hak_tinymce.txt

Весь код доступен под лицензиями BSD, GPL2, GPL3, LGPL. Если Вам необходимо получить код под любой другой свободной лицензией прошу обращаться по адресу redduck@solo-line.ru.

 

Андрей Лебедев

,

, , , , , , , , , ,

Комментарий

Нет комментарий.

Комментировать: