среда, 10 октября 2012 г.

Кастомизация вывода форм в Symfony2

В официальном кукбуке, есть статья How to customize form rendering, в которой описано, как создать свою тему для форм в Symfony2 (свои шаблоны). Этот пост - пересказ моментов, которые я не понял с первого раза.

суббота, 25 августа 2012 г.

Ширина окна Guake в Unity (Ubuntu 12.04)

Guake - это выпадающий терминал (а-ля консоль в играх типа quake), написанный на python.

В Ubuntu 12.04 текст в guake уходит за экран (из-за боковой панели unity). Проблема легко решается небольшой правкой исходного кода.

В файле /usr/lib/guake/guake.py в функции get_final_window_rect, нужно заменить строку "width = 100" на "width = 97" (ширина окна guake в процентах). Подберите нужное вам значение. После изменения файла нужно перезапустить guake.

вторник, 31 июля 2012 г.

Запросы UPDATE, DELETE вместе с JOIN

Примеры, по которым сразу понятен синтаксис

UPDATE:
update
    target_table
join
    join_table
on
    tt.id = jt.id
set
    tt.field = jt.field

DELETE:
delete
    target_table.*
from
    target_table `tt_alias`
inner join
    join_table `jt_alias`
on
    tt_alias.id = jt_alias.id
where
    jt_alias.row = 1;

среда, 1 февраля 2012 г.

Склонение существительных после числительных.

Приятнее, когда программа общается с вами человеческим языком, а не раздражающим "у вас 10 сообщения". А ведь правильно склонять слова не так уж и сложно.

Короткое решение, взятое отсюда и адаптированное под использование с php.
$word = array('комментарий', 'комментария', 'комментариев');
$plural=($count%10==1 && $count%100!=11) ? 0 : ($count%10>=2 && $count%10<=4 && ($count%100<10 || $count%100>=20) ? 1 : 2);
echo $count . ' ' . $word[$plural];

По массиву видно какие формы слова должны быть, но поясню:
0 => слово при 1, или "один"
1 => 2 или "два"
2 => 5 или "много"

Т.е.
один (1) - комментарий,
два (2) - комментария,
много (5) - комментариев.

Решение однострочное, можно внедрить в какой угодно фреймворк/CMS.

воскресенье, 23 октября 2011 г.

jScrollPane плагин для создания своего скроллбара.

Мне не нравятся скроллбары с нестандартным дизайном по двум причинам: при использовании своего дизайна не всегда очевидно, что это скроллбар, и если ваша страница сама по себе имеет прокрутку, то блок с отдельной прокруткой - мучение для конечного пользователя.

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

Плагин для jQuery решает эту проблему. Имя ему - jScrollpane. Посмотреть как он выглядит можно на странице с множеством примеров. Скачать последнюю версию можно с github.

Использовать его достаточно легко, достаточно завернуть контент в два блока:
<div class="scroll-wrapper">
<div class="scroll-pane">
...
...
...
</div>
</div>

Причем div с классом "scroll-wrapper" используется только для позиционирования.

Вызывается плагин следующей функцией (список параметров в конце поста):
$(".scroll-pane").jScrollPane();

Подключить к странице нужные скрипты и стили:
<script type="text/javascript" src="scripts/jquery-1.2.6.min.js"></script>
<script type="text/javascript" src="scripts/jquery.mousewheel.min.js"></script>
<script type="text/javascript" src="scripts/jScrollPane.js"></script>
<link rel="stylesheet" type="text/css" media="all" href="styles/jScrollPane.css" />


Два важных момента, из-за которых jScrollPane может не заработать сразу:
- нужно использовать последнюю версию плагина
- внутренний div с классом "scroll-pane" должен иметь заданную высоту и css-свойство "overflow:hidden;"

И напоследок параметры запуска:

scrollbarWidth [int] - ширина полосы прокрутки в пикселях (по умолчанию - 10)
scrollbarMargin [int] - отступ в пикселях слева от прокручиваемого блока (по умолчанию - 5)
wheelSpeed [int] - скорость прокрутки колесом мыши (по умолчанию - 18)
showArrows [boolean] - отображение стрелок у прокрутки (по умолчанию - false)
arrowSize [int] - высота стрелок, если showArrows=true (берется из CSS, если не определено)
animateTo [boolean] - прокручивать или нет при вызове функций scrollTo и scrollBy (по умолчанию - false)
dragMinHeight [int] - минимальная высота, при которой появляется прокрутка (по умолчанию - 0)
dragMaxHeight [int] - максимальная высота, при которой появляется прокрутка (по умолчанию - 99999!)
animateInterval [int] - интервал обновления при анимации scrollPane, в миллисекундах (по умолчанию - 100)
animateStep [int] - число, на которое делится дистанция при прокрутке (по умолчанию - 3)
maintainPosition [boolean] - не прокручивать при добавлении контента в блок (по умолчанию - true)
scrollbarOnLeft [boolean] - полоса прокрутки с левой стороны блока (убедитесь, что CSS тоже поддерживает эту позицию)
reinitialiseOnImageLoad [boolean] - перезагружать jScrollPane, когда изображения внутри загрузились (по умолчанию - false)

среда, 12 октября 2011 г.

Размер фотографий в lightbox в зависимости от размера экрана

Lightbox - на мой взгляд, один из самых удобных плагинов для просмотра фотографий. Я ценю простоту и поэтому он мне нравится.

У меня возникла следующая проблема - большие фотографии не влазят в экран. Крайне неудобно.

Я немного переделал сам скрипт и стили, чтобы решить эту проблему. Заодно сделал закрытие по кнопке Esc (вместо X по умолчанию) и перевел интерфейс на русский язык.

Теперь фотографии уменьшаются до подходящих размеров, так чтобы они влазили в экран.

Скачать можно по этой ссылке

PS. Совсем недавно вышел lightbox2. Добавилась возможность переключения между фотографиями и всякие красивости в виде анимаций. Полная поддержка прошлых версий, вам не нужно будет менять свой html-код.

TODO: Изменять ширину непосредственно у картинки
TODO: Возможность просмотра изображения в реальном размере

PPS. Забросил lightbox, нашел fancybox. Анимации, удобная структура и использование, отображение всего, от картинок до iframe. И объем кода в несколько раз меньше, чем у lightbox. Однозначно лучший плагин для модальных окон.

вторник, 6 сентября 2011 г.

Поиск в CGridView

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

Если указан параметр filter - в таблице выводятся поля ввода. По их значениям и будет фильтроваться выборка.

Во view инициализируем виджет CGridView, в параметрах надо указать модель для фильтрации.

View:
// $model - переданная модель из контроллера
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'profiles',
'dataProvider'=>$model->search(),
'filter'=>$model,

));


CGridView посылает ajax запрос на текущую страницу, с массивом в $_GET['Название_модели']. Этот массив - атрибуты модели. Их можно присвоить модели для выборки. По сути так и происходит фильтрация.

Итак, в текущем действии контроллера (текущем, значит в котором выводится таблица):

Controller:
public function actionUsers()
{
// Создаем модель
$model = User::model();
/* Не забудьте в rules модели указать нужные поля как 'safe', 'on'=>'search'
иначе по ним поиск будет невозможен.
*/
$model->setScenario('search');
//
if(isset($_GET['User'])) {
// Присваиваем модели полученные атрибуты
$model->attributes = $_GET['User'];
}
// В рендер передаем переменную $model
$this->render('users', array('model'=>$model));
}


Такой простейший пример весьма сложно найти, как правило, везде подразумевается, что он известен по умолчанию.