+0.44
Рейтинг
5.60
Сила

Илья

Поиск Яндекса вместо Sphinx

Это просто, но для меня стало решением проблемы поиска по сайту на виртуальном хостинге.
В выдаче много повторов (ссылки на теги, топы), но зато все прелести Яндекса( подсказки, автозамена, смена раскладки, транслит, морфология).
Результат: govoritoskol.ru и страница результатов поиска

Читать дальше →

Плагин Note - позволяем юзерам делать пометки в профилях друг друга


Плагин, чья идея основана на полюбившейся пользователям Суверенного Лепрозория (которого не существует) функции заметок в профилях.
Для установки
  1. Скопировать папку note в /plugins/ и активировать через админку
  2. !!! Прописать в /templates/skin/ваш скин/actions/ActionProfile/whois.tpl перед
    <div class="profile-user">
    {hook run='profile_start' oUserProfile=$oUserProfile}

Плагин прошел премодерацию и доступен здесь
Демонстрация плагина — здесь. Для его работы необходима регистрация. (демо-аккаунт — livestreet, пароль livestreet)

Share to LJ button

ЖЖ у школоты совсем не пользуется спросом, но мало ли кому пригодится для кросс-постов.
Моя реализация букмарклета для ЖЖ (по типу share для вконтакта).



1. Берём картинку, кладём в папку с картинками вашего скина.

2. В то место, где хотим выводить кнопку, вставляем код
<a href="{literal}javascript:void((function(){var%20u='http://www.livejournal.com/',w=window.open('','','toolbar=0,resizable=1,scrollbars=1,status=1,width=730,height=500');if(window.LJ_bookmarklet){return%20LJ_bookmarklet(w,u)};var%20e=document.createElement('script');e.setAttribute('type','text/javascript');e.onload=function(){LJ_bookmarklet(w,u)};e.setAttribute('src',u+'js/bookmarklet.js');document.getElementsByTagName('head').item(0).appendChild(e)})()){/literal}"><img src="{$DIR_STATIC_SKIN}/images/post-to-lj.gif" border=0></a>

3. PROFIT

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

Желающие могут допилить джаваскрипт-обработчик под себя.

Обновление плагина "Sitemap" до версии 0.2



Что нового в версии 0.2?

  • Основательный рефакторинг кода плагина. Теперь все действия которые производят с наборами сущностей или свойствами сущностей другие плагины отображаются в генерируемых sitemap'ах. Для примера плагин NiceUrl изменяет url записей и в sitemap топиков выводятся url измененные плагином NiceUrl (т.е. есть поддержка NiceUrl).
  • Изменены ссылки в sitemap.xml в соответсвии с рекомандациями опубликованными на странице sitemaps.org/ru/protocol.php#location. Теперь они выглядят так как будто файлы sitemap'ов расположены в корне сайта.
  • Добавлены XSLT шаблоны для удобного просмотра sitemap в окне браузера.
  • Все основные настройки вынесены в конфиг плагина. Это время жизни кеша для наборов записей, приоритеты страниц, вероятная частота изменений страниц.
  • Добавлена возможность интеграции для сторонних плагинов.

Читать дальше →

/FAQ/ → Назначаем любого пользователя «админом или модератором» блога

В связи с частыми вопросами на эту тему, решил создать отдельный топик. Раньше приходилось отвечать где-то в комментариях, или в личке. Тут решил всё собрать в одном месте. И так, поехали…

Читать дальше →

Форматирование дат (На сайте: 1 год 5 месяцев 6 дней )

Хочу поделится хаком, как выводить дату в таком формате. Для этого необходимо в файл \engine\modules\viewer\plugs\function.date_format.php в function smarty_function_date_format вставить:

if(isset($aParams['day_back'])) {
		require_once('modifier.declension.php');
		$iTimeDelta = round((time()- $iDate)/(60*60*24));
		$year=floor($iTimeDelta/365);
		$mouth=floor(($iTimeDelta%365)/30);
		$day=($iTimeDelta%365)%30;
		$r = "";
		if($year>0) $r = smarty_modifier_declension(
						$year,
						$oEngine->Lang_Get('date_year_back',array('year'=>$year)),
						$oEngine->Lang_GetLang()
					);
		if($mouth>0) $r.= smarty_modifier_declension(
						$mouth,
						$oEngine->Lang_Get('date_mouth_back',array('mouth'=>$mouth)),
						$oEngine->Lang_GetLang()
					); 	
		if($day>0)	$r.= smarty_modifier_declension(
						$day,
						$oEngine->Lang_Get('date_day_back',array('day'=>$day)),
						$oEngine->Lang_GetLang()
					);	
		if($r!=""){
			return $r;
		}
		else return $oEngine->Lang_Get('date_day_back_less');
			
		
	}

В файл \templates\language\russian.php

'date_day_back' => '%%day%% день; %%day%% дня; %%day%% дней',
'date_mouth_back' => '%%mouth%% месяц; %%mouth%% месяца; %%mouth%% месяцев',
'date_year_back' => '%%year%% год; %%year%% года; %%year%% лет',

И при выводе даты прописать {date_format date=$oUserProfile->getDateRegister() day_back=«1»}

Предложение по улучшению роутера

На данный момент, для роутера нет никакой разницы между livestreet.ru/blog/ и livestreet.ru/blog. И это по моему скромному имху не правильно т.к. по двум разным урлам находятся совершенно одинаковые страницы.

Решение я для себя выбрал следующее:
/engine/classes/Router.class.php->GetRequestUri()
после
$sReq=preg_replace("/\/+/",'/',$_SERVER['REQUEST_URI']);

добавить
if(empty($_GET) && !strpos($sReq, '.') && substr($sReq, strlen($sReq) - 1 ,1) != '/'){
            header('Location: ' . $sReq . '/',TRUE,301);
            die;
}

В этом случае, все запросы к «директории», которые не заканчиваются на "/", будут перенаправляться с кодом 301 (Moved Permanently) на урл который заканчивается "/".

Ну и да, это очень любят поисковики.

З.Ы. Совершенно за, если кто-то скажет как это сделать лучше :)

UPD. Po6oT В комментариях, подсказал решение гораздо лучше моего.

Плагин для размещения контекстных (и обычных) ссылок sape.ru

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

О контекстных ссылках с сайта sape.ru «Рекламные ссылки в контенте страницы позволяют рекламодателям покупать рекламные места внутри существующих текстов на страницах Вашего сайта. Показ таких ссылок не требует выделения отдельного места на странице, и визуально более выгоден рекламодателям и вебмастерам.»

После установки модуль размещает обычные ссылки двумя блоками в сайдбаре и в футере.
Также топики становятся доступны в Sape для размещения контекстных ссылок Sape.

Тестирование завершится через несколько дней.

Предлагаю до начала продажи бесплатное распространение за размещение проекта в сапе по реферальной ссылке

Логины на кириллице

Возникла потребность сделать возможность пользователям обзываться по-русски.
Казалось бы, UTF-8, все дела — но нет: то ли из-за потенциальной возможности сделать каждому по поддомену, то ли еще почему-то, логины можно делать только латиницей.

Мне поддомены не нужны, поэтому вот решение:
В файле /classes/actions/ActionProfile.class.php в функции RegisterEvent дополняем в регэкспах \w сочетанием \p{L}
$this->AddEventPreg('/^[\w\p{L}\-\_]+$/i','/^(whois)?$/i','EventWhois');				
$this->AddEventPreg('/^[\w\p{L}\-\_]+$/i','/^favourites$/i','/^comments$/i','/^(page(\d+))?$/i','EventFavouriteComments');			
$this->AddEventPreg('/^[\w\p{L}\-\_]+$/i','/^favourites$/i','/^(page(\d+))?$/i','EventFavourite');

\w — любой строковый символ, но не юникодовский (и не кириллица)
\p{L} — любая буква юникода, конструкции друг друга отлично дополняют.

Следующий этап: правка функции проверки логина на валидность.
Находится она в файле /engine/includes/function.php и обзывается func_check()
Там тоже регулярные выражения, которые правим аналогично предыдущему файлу.

Во время тестирования регистрации я столкнулся с другим глюком: логин передавался в cp1251, а обрабатывался в юникоде. Конечно, валидатор его не понимал! Для этого лезем в файл /classes/actions/ActionRegistration.class.php и правим там функцию EventIndex(), переписав проверку логина так:
/**
 * Проверка логина
 */
$utf8 = false;
if (!func_check(getRequest('login'),'login',3,30)) {
if (!func_check(iconv('windows-1251', 'utf-8', getRequest('login')),'login',3,30)) {
	$this->Message_AddError($this->Lang_Get('registration_login_error'),$this->Lang_Get('error'));
	$bError=true; // Маленький обходной маневр для поддержки кириллицы в логинах
	} else $_REQUEST['login'] = iconv('windows-1251', 'utf-8', getRequest('login'));
}

В случае, если проверка логина провалилась, мы его проверяем еще раз в UTF. Если проверка удалась, то в _REQUEST меняем login из cp1251 в utf-8, чтоб потом не заморачиваться.

В общем, теперь можно наслаждаться кириллическими именами пользователя. И заводить тему в FAQ'е под названием «Не могу войти»;)