Skip to content

Понадобилось при генерации форм распознавать, что же ввел пользователь, и в зависимости от этого пихать рядом со ссылочкой фавикон сайта. Ну и название ссылки чтобы генерилось нормальное.

 

Вот функция:

...continue reading "Функция генерации ссылки и картинки к ней, в зависимости от введенного URL"

Назрела необходимость удалять несколько сообщений одновременно.
Три дня изысков и вуаля - чекбоксы,массив данных-и можно удалять отмеченные сообщения.
Код под спойлером.
В 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'
);

Еще у одного чувака спиздил классный аяксовый аккордеон, но тут выкладывать не буду, ибо лень.

Пользуясь случаем, скопипастю у бывшего сенсея инфу о том, как запустить 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 отказался рисовать графики. В логах всё ок. Понятно что ничего не понятно. А к слову, часы недавно сбились (загрузился в винду и она решила синкнуть время). А я про это как-то забыл.

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

Задача: на лету обрезать изображение, чтобы оно было в кружочке.

Стандартная библиотека, идущая в комплекте с цмс-кой, обрезала. Но делала это не совсем кошерно. Обрезанную часть заполнян белый цвет. А нужно чтобы там была прозрачность.

Весь день ипался над прозрачным фоном, в конце вспомнил что у формата 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 (MERA VoIP Transit Softswitch)
 - это полнофункциональный пограничный контроллер сессий, предназначенный для гибкого управления VoIP-трафиком в сетях операторского класса. Основная задача MVTS — концентрация и коммутация VoIP-потоков, трансляция их между сетями с разнородной сигнализацией.

...continue reading "mvts"

Ура ура!!11Я пол-года назад, или даже больше, оставлял заявку на сайте одного человека.
И мне сегодня наконец-то пришла открытка от него. Этого человека зовут Витер. Это как ветер, только Витер ( в украинском языке ветер будет "витэр" )
На самом деле его зовут Андрей, он фотограф из Украины. Вот его сайт
Этот человек сейчас скорее всего живет на Гоа, путешествует, и ему хорошо.
Открытка кстати отправлена из Индии. У меня еще никогда не было предметов которые мне присылали бы настолько издалека. Теперь есть =)
Буду в записной книжке носить.

Вот тут в комментах люди которым пришла открытка отписываются, скидывают фоторгафии и радуются.

Ну и собственно вот фото моей открытки, с замазюканными при помощи Paint.NET палевными частями.

<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>

 

π