+4.52
5 читателей, 84 топика

Как установить livestreet на хостинг ?

Я буду думать, что вы уже грамотный человек, и готовы тратить настоящие средства, а не говно-копейки на хостинг, поэтому мы будет устанавливать livestreet сразу на VDS, с залогом на будушее развитие. Ибо livestreet, когда разрастается жрет порядком.
*дада, 1 домен, 1 проект, никаких ISP manager(тем более на clodo они платные, нада самому покупать) для управления и прочее.

Я опишу, на примере компании Clodo.

1. Регистрируемся.

Процесс активации аккаунта, я не буду описывать. Все банально.
2. Заказываем VDS.
Шаг1 — выбор Дата центра. Я рекомендую Оверсан, ihc например там же и железо — качественное.
Шаг2 — выбор типа сервера. Я рекомендую Scale Servers
Шаг3. Вот то, что нам нужно. Кликаем на картинку.

Шаг4. Ставим первичные лимиты. Например такие как я указал — за глаза для старта.

Шаг5. Айпишники, расширенные опции и прочее.

А потом, заходим на наш сайт, по тем данным, что мы вводили на ШАГЕ-3. И пользуемся. Пробуйте. Но еще раз скажу, это для тех, кто готов в месяц 250-500р отдавать. И кто явно собрался — делать классное сообщество на livestreet. Кто уже натестился и уверен в себе, чтобы потом с шаредов дешевых не переезжать, когда будет нагрузка, лучше сразу спроектировать на Scale от clodo.

//
Вот так, после заказа будет все выглядеть. (тут правда не пример с livestreet, а тут другое, для чела делал, но для примера статистики пойдет)

Важное замечание. Перезагрузка находится тут.


Но если вы хотите потестировать движок и прочее. То я бы посоветовал любой шаред. Например точно так же, как с установкой wordpress. Просто скачать движок livestreet и так же залить по FTP, потом запустить ваш_сайт/install/ и там уже настроить config движка.

Плагин Компании

Скачал у вас сборочку (за что большое спс), так вот там плагин «Компании» — активировал, стал тестить и нашел небольшой баг. Вопрос может ли кто-нибудь подсказать?

Баг заключается в следующем: в профиле пользователя выводится ссылки на созданные компании, и вот сами ссылки на них неправильные, по идее должно быть так: test.ru/company/super/ ну или так test.ru/company/super/blog/ (я не знаю), но получается такая ссылка: test.ru/blog/super/. Вроде ка попробовал покавырять, хотя не очень в нем разбираюсь, так вот как мне показалось проблема в файле Topic.entity.class.php, потому что пробовал мутить с кодом — ссылка меняется, но все равно неправильно.

Может кто подскажет где и как изменить для правильной работы плагина?

Список репозитории бесплатных расширений

Выводим в Top блогов количество постов вместо рейтинга

Для начала находим Экшен блока. Структура LS подробно описана, поэтому легко находим нужный блок: /classes/blocks/BlockBlogs.class.php В блоке вызывается единственная функция: Blog_GetBlogsRating, с ней и будем работать.

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

Шаг 1. Инициализируем модуль
Есть достаточно много статей описывающих как написать простой модуль, поэтому останавливаться на этом вопросе не будем. Создаем папку /plugins/topblogs2 и в ней делаем XML описание плагина, файл plugin.xml:
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
    <name>
        <lang name="default">TopBlogs2</lang>
    </name>
    <author>
        <lang name="default">Begetan</lang>
    </author>
    <homepage></homepage>
    <version>0.1</version>
    <requires>
        <livestreet>0.5.0</livestreet>
        <plugins>
        </plugins>
    </requires>
    <description>
        <lang name="default">Show top rated blogs by count of posts instead of standart LiveStreet blog's rating</lang>
        <lang name="russian">Выводит топ блогов по количеству постов, а не по стандартному рейтингу блогов LiveStreet</lang>
    </description>
</plugin>


Далее создаем класс активации нашего плагина — /plugins/topblogs2/PluginTopblogs2.class.php:
if (!class_exists('Plugin')) die('Are you sure?');

class PluginTopBlogs2 extends Plugin
{
    protected $aInherits=array(
        'module' => array('ModuleBlog' => '_ModuleTop'),
    );

    public function Activate() {
        return true;
    }

    public function Init() {
    }
}

Шаг 2. Пишем код модуля
Согласно тем названиям, которые мы придумали и объявили в конфигурации плагина код модуля должен находится в файле: /plugins/topblogs2/classes/modules/top/Top.class.php:
<?php
class PluginTopBlogs2_ModuleTop extends PluginTopBlogs2_Inherit_ModuleBlog {

        protected $oMapperBlog2;

        public function GetBlogsRating($iCurrPage,$iPerPage) {

                $this->oMapperBlog2 = Engine::GetMapper ( __CLASS__ );

#               $aResult=parent::GetBlogsRating($iCurrPage, $iPerPage);
                $aResult=$this->GetTopBlogsByPosts($iCurrPage, $iPerPage);
                return $aResult;
        }

        public function GetTopBlogsByPosts($iCurrPage,$iPerPage) {
                list ($aTopBlogs, $aRating) = $this->oMapperBlog2->GetTopBlogsByPosts($iCount,$iCurrPage,$iPerPage);
                $data = array('collection'=>$aTopBlogs,'count'=>$iCount);
                $aBlogs = parent::GetBlogsAdditionalData($data['collection'],array('owner'=>array(),'relation_user'));
                # Подменяем рейтинг блога на новый
                foreach ( $aBlogs as $oBlog ) {
                        $oBlog->setRating($aRating[$oBlog->getId()]);
                        $data2[] = $oBlog;
                }
                # Обновляем список блогов
                $data['collection'] = $data2;
                return $data;
        }
}
?>

Сначала объявляем стандартную функцию GetBlogsRating для того, чтобы переопределить ее в нашем файле. Затем из нее мы вызываем уже нашу функцию GetTopBlogsByPosts, которая и будет делать то что нам нужно. При отладке может возникнуть желание вызвать исходную функцию GetBlogsRating, пример такого вызова в строчке с комментарием.

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

Затем мы для всех блогов подменяем поле рейтинг значением из второго массива, содержащего количество постов в каждом блоге. Этот нехитрый трюк позволяет сделать модуль совместимым с абсолютно любым шаблоном, поскольку вся информация в отображение поступает только в стандартных массивах и объектах.

Шаг 3. Пишем код маппера
Маппер у нас окажется тут: /plugins/topblogs2/classes/modules/top/mapper/Top.mapper.class.php.
<?php

class PluginTopBlogs2_ModuleTop_MapperTop  extends Mapper {

        public function GetTopBlogsByPosts (&$iCount,$iCurrPage,$iPerPage) {
                $sql = "SELECT t.blog_id, COUNT(t.blog_id) as rating " .
                        "FROM ".Config::Get('db.table.topic')." as t " .
                        "GROUP BY t.blog_id " .
                        "ORDER BY 2 DESC " .
                        "LIMIT ?d, ?d";

                $aReturn=array();
                $aReturn2=array();
                if ($aRows=$this->oDb->selectPage($iCount,$sql,($iCurrPage-1)*$iPerPage, $iPerPage)) {
                        foreach ($aRows as $aRow) {
                                $aReturn[]=$aRow['blog_id'];
                                $aReturn2[$aRow['blog_id']]=$aRow['rating'];
                        }
                }
                return array ($aReturn, $aReturn2);
        }
}
?>


В отличие от стандартной функции мы возвращаем два массива — массив ID найденных блогов и ассоциативный массив блог->рейтинг. Сделано так потому что в стандартном объекте «блог» нет значения количества постов. Наверно можно было расширить свойства блога, но так было проще. Буду рад услышать предложения и идеи как изменить или улучшить код.

Аналогично нужно изменить функции GetBlogsRatingJoin и GetBlogsRatingSelf чтобы получился законченный модуль.

Удаление UTF-8 BOM из консоли

linux (debian)
find путь/к/лайвстриту/ -type f \( -name '*.tpl' -o -name '*.php' \) -exec sed -i '1 s/^\xef\xbb\xbf//' {} \;

freebsd (7.2)
find ./ -type f \( -name '*.tpl' -o -name '*.php' \) -exec sed -i -e '1 s/^\xef\xbb\xbf//' {} \;

sed почему-то иногда не отрабатывает, поэтому php, find, awk, xargs:
php -r "ob_start();
passthru('find ./ -type f \( -name \'*.tpl\' -o -name \'*.php\' \) -print0 | xargs -0r awk \'/^\xEF\xBB\xBF/ {print FILENAME}{nextfile}\'');
foreach(array_filter(explode(\"\n\",ob_get_clean())) as \$f){
        echo \"remove BOM from \$f...\n\";
        file_put_contents(\$f, substr(file_get_contents(\$f), 3));
};"