Обновление guid при переносе WordPress с домен на домен
UPDATE wp_posts SET guid = REPLACE(guid,"dev.site.com","www.site.com"); UPDATE wp_posts SET post_content = REPLACE(post_content,"dev.site.com","www.site.com"); UPDATE wp_options SET option_value = REPLACE(option_value,"dev.site.com","www.site.com"); UPDATE wp_links SET link_url = REPLACE(link_url,"dev.site.com","www.site.com"); UPDATE wp_postmeta SET meta_value = REPLACE(meta_value,"dev.site.com","www.site.com");
Файлы Windows XP Fax console
Намаялся тут пытаясь настроить факс на WinXP удаленно. На той стороне не было диска с виндой, чтобы поставить родной микрософтовский компонент Fax Console (простой и удобный кстати). Пришлось качнуть. Вот выкладываю. В архиве все файлы, которые нужны для установки компонента Windows Fax Console. Разговор идет о Win XP SP3 Professional.
Отложенное выполнение… меню в Битрикс
Ну это же чудесно. Великолепное нововведение. Битрикс поддерживает отложенное выполнение, исполнение, формирование меню. И как никогда вовремя.
Все очень просто: делаем меню, например, left. Подключаем его в нужное место и выставляем DELAY=Y. Дальше в любом месте любого компонента:
<?$GLOBALS['BX_MENU_CUSTOM']->AddItem('left', array('TEXT' => 'Текст ссылки', 'LINK' => 'ссылка'));?>
Что может быть проще и понятней)
Ubuntu Server 11.04 и карточка Asus WL-138G
При установке этой самой Asus WL-138G при помощи ndiswrapper на Ubuntu Server 11.0 надо иметь ввиду, что официальный драйвер с сайта Asus - не канает. Он вешает работает, но вызывает смерть системы примерно через 2-4 минуты после запуска. По каким-то загадочным причинам отлично работает драйвер от DR-WL8313v230 того же Асуса. Вот так.
Встраиваемые шрифты — будущее типографики
http://sprungmarker.de/wp-content/uploads/webfont-services/
ссылка by clicheist - таблица сравнения самых популярных сервисов, хостящих шрифты.
jQuery.fn репост для памяти
Каждый кто сталкивался с написанием собственных плагинов на jQuery задавал вопрос — "В чем различие между объявлением функций через jQuery и jQuery.fn?".
Для того, чтобы ответить на поставленный вопрос приведу два примера.
Пример 1.
jQuery.sayHello = function() {
alert('Привет! Найдено ' + this.length + 'элементов' );
}
$('div').sayHello(); // ничего не происходит
Пример 2.
jQuery.fn.sayHello = function() {
alert('Привет! Найдено ' + this.length + 'элементов' );
}
$('div').sayHello(); // Выводит "Привет! найдено ХХ элементов", где ХХ - это количество найденных элементов на странице
Если запустить первый пример, то произойдет одно из двух событий — браузер выдаст ошибку (например, если у Вас установлен FireBug) либо не выдаст ничего. А если запустить второй пример, то на экране появится сообщение о количестве найденных элементов.
Прежде чем делать какие-либо выводы, приведу еще один пример:
jQuery.sayHello = function(elem) {
alert('Привет! Найдено ' + elem.length + 'элементов' );
}
jQuery.sayHello($('div'));
В данном примере, будет выдано сообщение о количестве найденных объектов.
Думаю теперь у нас достаточно информации, чтобы сделать некоторые выводы:
Вывод 1: Если задать функцию через jQuery.fn, то она будет работать с элементами найденными через функцию $(). Контекст этой функции будет содержать выбранные элементы;
Вывод 2: Если задать функцию через jQuery, то к ней можно обратиться только через глобальный объект jQuery. В таком случае контекст функции будет указывать на глобальный объект window.
Таким образом, если нужно написать плагин, который будет работать только с выбранными объектами, то нужно его создавать вjQuery.fn, а если нам неважно какие элементы страницы были выбраны, то лучше создавать функцию через jQuery.
Немного о недокументированной функции CIBlockFormatProperties::GetDisplayValue
Итак, в Битрикс существует недокументированная (вернее плохо документированная) функция CIBlockFormatPropertiesCustom::GetDisplayValue. Что она делает? Она добавляет к массиву, например, в news.detail пару пунктов, в которых содержатся отформатированные значения свойств текущего элемента.
Вот тут человек радостно рассказывает, как круто, что она есть. Однако мне вот тут стало недостаточно функционала. Что мне лично странно: почему у функции форматирования чего бы то ни было в таком фреймворке как Битрикс нет возможности передавать шаблон вывода входящим параметром. Объяснение тут в архитектуре: формат напрямую связан с типом свойства. Например, тип данных "Привязка к элементам" - обозначается буквой E, для это буковки указано в switch, что надо вернуть массив со ссылками! То есть внутренняя функция возвращает закопанный где-то в недрах HTML-код. Против всякой логики отделения логики от представления... Простите тавтологию.
Задача в том, чтобы захачить Битрикс, но не потерять целостность системы. Чтоб при обновлении все не вылетело в трубу, да и вообще хачить ядро Битрикс - дело неблагодарное, сами знаете.
Входящие данные: я хочу показывать на главной странице аккордеон из картинок товаров, вручную подобранных управляющим сайта. Для этого я создал инфоблок, в инфоблоке для удобства раздел, в разделе элемент. Инфоблоку дал свойство Привязка к элементам (другого инфоблока) - множественное. То есть один элемент хранит информацию о привязанных элементах, которые в свою очередь уже имеют картинки для моего аккордеона.
Решение: решение достаточно хитрое, но зато кошерное.
Я создал новый компонент путем прямого копирования родного компонента news.detail. Кто не знает, делается это так: в папке /bitrix/components/ создаем папочку под свои компоненты, например /bitrix/components/my/ - в нее копируем целиком папку /bitrix/components/bitrix/news.detail и переименовываем. Получилось: /bitrix/components/my/news.detail.custom/
Открываем /bitrix/components/my/news.detail.custom/component.php и ищем в нем строку, которая содержит CIBlockFormatProperties::GetDisplayValue. Она там одна должна быть. И именно она отвечает за форматирование свойств элемента инфоблока.
Держим файл открытым и открываем еще один /bitrix/php_interface/init.php. Как известно, это файл, который в логике Битрикс может и должен содержать все наши кастомные настройки, надстройки и хаки. Здесь мы и подменим родной класс форматирования свойств элемента.
Он находится тут: /bitrix/module/iblock/classes/general/comp_formatprops.php. Я сделал так: скопировал весь класс в init.php и переименовал сам класс в CIBlockFormatPropertiesCustom. Таким образом у меня теперь есть свой класс с другим именем, но методы его полностью сохранены. Ядро мы так и не тронули.
Возвращаемся к /bitrix/components/my/news.detail.custom/component.php и редактируем только одну строчку, ту самую где CIBlockFormatProperties - меняем имя класса на CIBlockFormatPropertiesCustom.
Теперь у нас в наличии весь нужный нам функционал - хачим свой класс как угодно и имеем что угодно.
В моем случае получилось вот что:
Ищем:
$rsLink = CIBlockElement::GetList(array(), $arLinkFilter, false, false, array("ID","IBLOCK_ID","NAME","DETAIL_PAGE_URL")); $CACHE["E"][$val] = $rsLink->GetNext();
Заменяем на:
// BOF modification
if($arProperty['CODE'] == 'elements'){
$rsLink = CIBlockElement::GetList(array(), $arLinkFilter, false, false, array("ID","IBLOCK_ID","NAME","PREVIEW_PICTURE","DETAIL_PICTURE","DETAIL_PAGE_URL"));
$CACHE["E"][$val] = $rsLink->GetNext();
$CACHE["E"][$val]['PREVIEW_PICTURE'] = CFile::GetFileArray($CACHE["E"][$val]["PREVIEW_PICTURE"]);
$CACHE["E"][$val]['DETAIL_PICTURE'] = CFile::GetFileArray($CACHE["E"][$val]["DETAIL_PICTURE"]);
} else {
// EOF modification
$rsLink = CIBlockElement::GetList(array(), $arLinkFilter, false, false, array("ID","IBLOCK_ID","NAME","DETAIL_PAGE_URL"));
$CACHE["E"][$val] = $rsLink->GetNext();
// BOF modification
}
// EOF modification
Ищем:
if(is_array($CACHE["E"][$val]))
$arDisplayValue[]='<a href="'.$CACHE["E"][$val]["DETAIL_PAGE_URL"].'">'.$CACHE["E"][$val]["NAME"].'</a>';
Заменяем на:
// BOF modification
if($arProperty['CODE'] == 'elements'){
if(is_array($CACHE["E"][$val]))
$arDisplayValue[] = array(
'PREVIEW_PICTURE' => $CACHE["E"][$val]["PREVIEW_PICTURE"],
'DETAIL_PICTURE' => $CACHE["E"][$val]["DETAIL_PICTURE"],
'DETAIL_PAGE_URL' => $CACHE["E"][$val]["DETAIL_PAGE_URL"]
);
} else {
// EOF modification
if(is_array($CACHE["E"][$val]))
$arDisplayValue[]='<a href="'.$CACHE["E"][$val]["DETAIL_PAGE_URL"].'">'.$CACHE["E"][$val]["NAME"].'</a>';
// BOF modification
}
// EOF modification
Размещаем наш кастомный компонент на странице.
Теперь логика такова: один элемент хранит несколько привязанных элементов в свойстве elements - news.detail.custom берет этот элемент, в свойстве PROPERTY_CODES компонента установлен elements - компонент выполняет обычную работу, но в момент получения отформатированных данных из значений свойств в случае если имя свойства elements создает не обычный массив со ссылками, а массив содержащий пути к превьюшке, пути к большой картинке и ссылки на соответствующие элементы. Дело за малым - создать шаблон для нашего компонента.
ЗЫ. Очевидно, что это не самое оптимальное решение с точки зрения производительности, однако оно наиболее правильно в логике Битрикс. Если вы очень озабочены производительностью - можно спокойно урезать кастомный компонент, убрав лишние запросы.
Гудлак.
Rule #1
Если на тебя начинают кричать, не надо кричать в ответ.
*Спустя пять минут разговор превратится в программу "К барьеру" с Вл. Соловьевым
BackupPC: Решение проблемы с некорректным завершением бэкапа
Поставил BackupPC на VPS сервак на Хетцнер. Все работает, но зараза в конце итерации выдает сообщение, что мол все ок, ошибок нет, а следующей строчкой: Got fatal error during xfer (Всего записано байт: 3297280 (3,2MiB, 2,6MiB/s)). И кроет одну только версию бэкапа все время.
Меня смутило русское сообщение об ошибке. Не должно быть так. И правда - бэкаперу нужен родной язык, чтобы нормально работать.
Чтобы решить эту проблему, надо вставить в начале скрипта backuppc start stop (в моем случае на Gentoo - /etc/init.d/backuppc) вот такие строчки:
unset LC_ALL LANG
export LC_ALL LANG
Так язык BackupPC скинется на английский и резервное копирование пойдет своим путем)
Удачи.
Jquery и стильный select box
Пожалуй, это наконец то, что я искал)
http://jquerystyle.com/2009/08/24/jquery-ui-selectmenu
Нормальная реализация под jQuery UI с поддержкой тем и массой хороших вариантов, включая optgroups. Куль)