На всякий случай сделал зеркало зеркала не так давно почившего сайта разработчиков AMBS (http://www.ipstudio.net/wiki)
Category: tech
Изменение высоты дива средствами javascript
Имеем следующую конструкцию:
Контейнер component_left_row зависит от высоты контейнера component_right_row, потому что обычно он самый большой по высоте. Но если контейнер component_left_row_userinfo становится больше чем component_right_row - то внизу component_right_row образуется пустота и выглядывает фон.
Нужно чтобы component_right_row растянулся,а сам он не хочет)
Выход - джаваскрипт.
$(document).ready(function(){
var height_left = document.getElementById('component_left_row_userinfo').clientHeight; //узнаем высоту левого дива
var height_right = document.getElementById('component_right_row').clientHeight; //узнаем высоту правого дива
if (height_right//если меньше - делаем)
$("#component_right_row").css({height:$("#component_left_row_userinfo").height()}); //аяксовая магия
$("#component_right_row").animate({height:$("#component_left_row_userinfo").height()},600); //аяксовая магия
}
});
Функция генерации ссылки и картинки к ней, в зависимости от введенного URL
Понадобилось при генерации форм распознавать, что же ввел пользователь, и в зависимости от этого пихать рядом со ссылочкой фавикон сайта. Ну и название ссылки чтобы генерилось нормальное.
Вот функция:
...continue reading "Функция генерации ссылки и картинки к ней, в зависимости от введенного URL"
Удаление отмеченных сообщений в Instant CMS
Назрела необходимость удалять несколько сообщений одновременно.
Три дня изысков и вуаля - чекбоксы,массив данных-и можно удалять отмеченные сообщения.
Код под спойлером.
В Instant CMS подобный код называется хаком. Так что я теперь официально хакер =)
Это пихаем в темплейт:
<td width=30px><input name="checkbox[]" type="checkbox" id="checkbox[]" value="{$record.id}"></td>
checkbox[] - название массива. В скобки ничего не пихаем, ибо php тогда не поймет что ему передают массив.
<form action="/users/delselectedmsg.html" id="selmessage" method="POST" name="selmessage">
Это будет форма, в которой выводятся месседжи.
<a href="javascript:document.selmessage.submit();">Удалить отмеченные</a>
Это волшебная кнопочка =)
Это пихаем во фронтенд:
if ($do=='delselected'){ if (!$cfg['sw_msg']) { cmsCore::error404(); } if (!$inUser->id) { cmsCore::error404(); } // Удалить сразу несколько записей можно // при помощи запроса "DELETE FROM table_1 WHERE id IN (1,3,5,7)" // Получаем список отмеченных checkbox $type = $_POST["checkbox"]; if(!empty($type)) { // Начинаем формировать переменную, содержащую этот список // в формате "(3,5,6,7)" foreach($type as $val) $query.= "$val,"; // Удаляем последнюю запятую, заменяя ее закрывающей скобкой) $query = substr($query, 0, strlen($query) - 1 ); // Завершаем формирование SQL-запроса на удаление //$query = "DELETE FROM table_1 WHERE id IN ".$query; $msg = $inDB->get_fields('cms_user_msg', "id IN ($query)", '*'); if ($msg['to_id']==$inUser->id){ $inDB->query("UPDATE cms_user_msg SET to_del=1 WHERE id IN ($query)"); $inCore->addSessionMessage($_LANG['MESS_DEL_OK'], 'info'); } if ($msg['from_id']==$inUser->id && !$msg['is_new']){ $inDB->query("UPDATE cms_user_msg SET from_del=1 WHERE id IN ($query)"); $inCore->addSessionMessage($_LANG['MESS_DEL_OK'], 'info'); } if ($msg['from_id']==$inUser->id && $msg['is_new']){ $inDB->query("DELETE FROM cms_user_msg WHERE id IN ($query) LIMIT 1"); $inCore->addSessionMessage($_LANG['MESS_BACK_OK'], 'info'); } $inDB->query("DELETE FROM cms_user_msg WHERE to_del=1 AND from_del=1"); $inCore->redirectBack(); } else $inCore->redirectBack(); }
Это - в роутер:
$routes[] = array( '_uri' => '/^users\/delselectedmsg.html$/i', 'do' => 'delselected', 1 => 'id' );
Еще у одного чувака спиздил классный аяксовый аккордеон, но тут выкладывать не буду, ибо лень.
Labels behind in front of form fields
Нашел кошерный способ делать лейблы для инпутов на форме.
Запуск x11vnc
Пользуясь случаем, скопипастю у бывшего сенсея инфу о том, как запустить vnc сервер, а то у меня это не получалось другими способами.
Create passwd: x11vnc -storepasswd GDM: x11vnc -forever -bg -rfbauth /root/.vnc/passwd -display :0 -auth /var/lib/gdm/:0.Xauth SLIM: x11vnc -forever -bg -rfbauth /root/.vnc/passwd -display :0 -auth /var/run/slim.auth
Кстати подключаться к нему легче всего - юзая remmina, она позволяет сохранить профиль подключения, чтобы потом в пару кликов подключиться снова. Пускать vnc через туннель она также умеет. И еще умеет RDP. И много всего-всего.
Cacti. Назад в будущее.
Cacti отказался рисовать графики. В логах всё ок. Понятно что ничего не понятно. А к слову, часы недавно сбились (загрузился в винду и она решила синкнуть время). А я про это как-то забыл.
Попытки запустить поллер вручную с просмотром дебага показала что скрипт запускался -9490 секунд назад (отрицательное время, поскольку время последнего запуска скрипта - в будущем ):
root@cacti:/var/www/default/cacti# php /var/www/default/cacti/poller.php -d
05/01/2012 07:36:54 AM - POLLER: Poller[0] NOTE: Poller Int: '300', Cron Int: '300', Time Since Last: '-9490', Max Runtime '298', Poller Runs: '1'
Тут и вспомнил что только буквально недавно синкал время из-за того что оно было неправильным (до синхронизации время было на три часа больше)
Для того чтобы скрипт запустился - надо в нём переменную $force объявить TRUE, запустить его снова, и вернуть значение переменной обратно на FALSE.
Но после этого столкнулся на такие сообщения:
ERROR: /var/www/default/cacti/rra/26/258.rrd: illegal attempt to update using time 1335858285 when last update time is 1335867065 (minimum one second step)
Это потому что в файлах round robin database последнее время также в будущем. А RRD не даст задним числом обновиться базам. Так что не паримся и ждем пока время станет больше времени обновления rrd.
Поллер уже запускается, так что кактус сам начнет рисовать графики, пинать его не нужно.
PHP GD crop image into circle
Задача: на лету обрезать изображение, чтобы оно было в кружочке.
Стандартная библиотека, идущая в комплекте с цмс-кой, обрезала. Но делала это не совсем кошерно. Обрезанную часть заполнян белый цвет. А нужно чтобы там была прозрачность.
Весь день ипался над прозрачным фоном, в конце вспомнил что у формата jpeg нет и не может быть альфа-канала блеать. Нужно для начала в png сконвертировать штоле =)
UPD: После мучений, когда уже немного начал понимать как работать с gd, в интернетах был найден способ взять изображение, засунуть его в круг и сделать обрезанные края прозрачными.
UPD2: Добавлено сглаживание изображения. Сглаживание достигается масштабированием.
Вот она, рыба моей мечты:
function img_circle($file_name = false, $param = 20){ $err = true; $image = imagecreatefromjpeg($file_name); $inCore = cmsCore::getInstance(); $cfg = $inCore->loadComponentConfig('users'); $width=$cfg['medw']; $height=$cfg['medh']; if($image){ $err = false; } if(!$err){ $x=$width ; $y=$height; $img2 = imagecreatetruecolor($x, $y); $bg = imagecolorallocate($img2, 255, 255, 255); imagefill($img2, 0, 0, $bg); $e = imagecolorallocate($img2, 0, 0, 0); $r = $x <= $y ? $x : $y; imagefilledellipse($img2, ($x/2), ($y/2), $r, $r, $e); imagecolortransparent($img2, $e); imagecopymerge($image, $img2, 0, 0, 0, 0, $x, $y, 100); imagecolortransparent($image, $bg); $W=$cfg['medw']; $H=$cfg['medh']; // Исходный код построения карты России пропущен. // Смотрите урок №8 $img3=imagecreatetruecolor($W/2,$H/2); imagecolortransparent($img3, $bg); imagecopyresampled($img3,$image,0,0,0,0,$W/2,$H/2,$W,$H); header("Content-type: image/png"); imagepng($img3, $file_name); imagedestroy($img2); imagedestroy($img3); imagedestroy($image); }}
mvts
MVTS (MERA VoIP Transit Softswitch) - это полнофункциональный пограничный контроллер сессий, предназначенный для гибкого управления VoIP-трафиком в сетях операторского класса. Основная задача MVTS — концентрация и коммутация VoIP-потоков, трансляция их между сетями с разнородной сигнализацией.
Ограничение количества вводимой информации в textarea по числу символов средствами JS
<script language="javascript" type="text/javascript"> function limitText(limitField, limitCount, limitNum) { if (limitField.value.length > limitNum) { limitField.value = limitField.value.substring(0, limitNum); } else { limitCount.value = limitNum - limitField.value.length; } } </script> <textarea name="text" id="text" onKeyUp="limitText(this.form.text,this.form.countdown,400);"> </textarea> <br /><font size="1">(Максимум символов: 400) <input readonly type="text" name="countdown" size="3" value="100"/> символов осталось.</font>