+60.64
450 читателей, 105 топиков

похожие темы через sphinx

Дело, было как обычно вечером :) И лежало на мне уже давно задание — добавить «похожие темы» к проекту, но ввиду приоритетов откладывалось оно на потом постоянно. Полазил по LS, нашел уже готовый бесплатный модуль: livestreet.ru/blog/2053.html
Но незадача :( нужен fulltext для InnoDB… уже хотел похерить задание и отложить опять до лучших времен, но что-то дернуло меня все-таки покопаться чуток. А именно, вспомнил я про уже готовый fulltext поиск реализованный на sphinx'e в дефолтной сборке LS. Там как раз есть тайтл + текст, так что впринципе больше и не надо :)
В общем, пришлось чуток модифицировать имеющийся модуль + добавить ф-цию в Sphinx.class.php
К действиям:
1) берем имеющийся модуль
2) удаляем папку и ее содержимое /classes/modules/similartopics/mapper
3) заменяем полностью содержимое файла(/classes/modules/similartopics/SimilarTopics.class.php) на:
<?php
##### [hack] similar_topics_sphinx #####
class LsSimilarTopics extends Module {
	public function Init() {
	}
	public function GetSimilarTopics($oTopic){
	    $sTitleTags=$oTopic->getTags();
	    $aTopics=array();
	    $data=$this->Sphinx_FindSimilarTopics($sTitleTags,SIMILARTOPICS_COUNT+1);
	    if(is_array($data['matches']) && sizeof($data['matches'])>0){
		foreach($data['matches'] as $k=>$v) if($k!=$oTopic->getId()) $aTopics[]=$this->Topic_GetTopicById($k);
		return $aTopics;
	    }else return false;
	}
}
##### [hack] similar_topics_sphinx #####
?>

4) добавляем в класс(classes/modules/sphinx/Sphinx.class.php):
        ##### [hack] SimilarTopics #####
        public function FindSimilarTopics($sTerms,$iLimit){
                $cacheKey=SEARCH_ENTITY_PREFIX."similartopics_{$sTerms}_{$iLimit}";
                if(false===($data=$this->Cache_Get($cacheKey))){
                        $this->oSphinx->SetMatchMode(SPH_MATCH_ANY);
                        $this->oSphinx->SetLimits(0,$iLimit);

                        if(!is_array($data=$this->oSphinx->Query($sTerms,SEARCH_ENTITY_PREFIX.'topicsIndex'))) return FALSE;

                        # no results = no cache
                        if($data['total']>0) $this->Cache_Set($data,$cacheKey,array(),60*15);
                }
                return $data;
        }
        ##### [hack] SimilarTopics #####

лично я оставил поиск по тэгам, хотя — можете добавить и по тайтлу, как было первоначально в плагине
5) все, радуемся жизни :)

п.с. должен быть настроен уже sphinx и работать поиск через sphinx
п.п.с. делаем на свой страх и риск, так что не забываем о том что надо бэкапить файлы ;)

Хак: Выполнение PHP кода на статических страницах

Иногда бывает полезно выполнить на статической странице PHP код (различные сервисы, mini-tools, и т.д.). В WordPress для этого есть специальный плагин, а для полюбившегося LiveStreet сделал так:

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

Хак "Фотоотчет"

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

Основные возможности:

  • Загрузка фотографий при помощи flash-загрузчика при добавлении топика

  • Отображение фотографий при помощи LightBox

  • Отображение количества фотографий в топике при просмотре блога



Рассчитано на небольшие фотоотчеты.

Пример
Модуль

Борьба с попаданием автоматических писем с сайта в спам [ЧАСТИЧНОЕ РЕШЕНИЕ]

Потратил кучу времени на решение проблемы, а именно письма-оповещения с сайта попадали в СПАМ, особенно остро стояла проблема с Google. На данный момент я смог побороть этот недуг и хочу поделиться с вами своим решением.



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

Проблема при загрузке изображений в фотосет

При работе на Shared хостинге возможна ситуация, когда загрузка изображений в фотосет зависает на фразе «file.png Resize...», хотя файл на сервер загрузился и все операции над ним выполнились. Эта ошибка сопровождается следующим сообщением в log-файле:
[15-Nov-2013 00:00:00] PHP Warning:  filesize() [<a href='0function.filesize0'>function.filesize0</a>]: open_basedir restriction in effect. File(/var/sites/site.ru/tmp/phpsnEaep) is not within the allowed path(s): (/var/sites/site.ru/htdocs/:.) in /var/sites/site.ru/htdocs/classes/actions/ActionPhotoset.class.php on line 267


Вызвана данная проблема одновременным действием двух источников:
1) не совсем корректной настройкой PHP, связанной с включенными директивами "open_basedir" и "upload_tmp_dir";
2) неточностью в определении размера загруженного файла в классе "ActionPhotoset".
Исправление любого из пунктов приводит к нормальной работе процесса загрузки.

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

Сортировка топиков по последним действиям. для 0.3.1

Сделано было давно, специально для проекта cgvault.ru, потому могу что-то пропустить или забыть написать. ищем баги и тд. поправлю)

Итак. Сортировка топиков по последним действиям, что это означает? Это значит, что топики сортируются по последним комментариям, а если комментариев нет, то по дате добавления. Итак на нужно будет добавить одно поле в таблицу и поправить несколько файлов

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

Доработка хака «Выпадающее меню стран и городов»

Переписал код ajax-запросов. Теперь нет ajax-ошибки. И есть кеш запросов. Работать стало немного быстрее вроде как… Но я сравнивал тока по ощущениям, а они могут быть обманчивы.
Сделано 2 варианта. Для 0.3.1 и для последней SVN. Смотрим, устанавливаем, проверяем, комментим.
Читать дальше →

Кнопка "загрузить файл" в стандартном редакторе

Основные возможности:

  • Ограничение загрузки по типам

  • Загрузка по прямой ссылке на файл

  • Защита от хотлинков

  • Подсветка типа файла иконкой

  • Префикс для загружаемых файлов

  • Транслитерация русских имен файлов



Как это выглядит

Добавляем количество просмотров топику

Многие хотели, но не знали как доковырять, показываю на простом примере.

Открываем файл Topic.class.php
И добавляем перед закрытием класса функцию
/**
	 * Обновляем топик без всяких примочек
	 *
	 * @param TopicEntity_Topic $oTopic
	 * @return unknown
	 */
	// 
	public function SetTopicCountRead(TopicEntity_Topic $oTopic) {		
		$this->oMapperTopic->UpdateTopic($oTopic);
		$this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array('topic_update',"topic_update_{$oTopic->getId()}"));
	}

функцию по делу надо назвать по другому, т.к. она просто обновляет топик, без дополнительных операций (таги, дата изменения и т.п.)

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