+18.28
Рейтинг
45.76
Сила
  • avatar mixan
  • 0
RewriteCond %{HTTP_HOST}  ^www\.(.+)$  [NC]
RewriteRule ^(.*)         http://%1/$1 [L,R=301]
o — object
i — integer
b — boolean
f — float
s — string (или что-то еще?)

a-array

oBlog
oBlogs
aTopicId
aCacheKeys
iTopicId
sId
  • avatar kerby
  • 1
Не знаю как для 0.3.1, но для 0.4.2 достаточно в конфиге указать

$config['sys']['cache']['use']    = true;
$config['sys']['cache']['type']   = 'memory';             
$config['sys']['cache']['prefix'] = '<prefix>';
Вот в последней строчке префикс должен быть разным для разных сайтов, чтобы не получилась «каша». Еще раз повторюсь, для 0.3.1 — не знаю, но возможно все то же.
  • avatar ort
  • 1
попробовать так:
<?php
class BlockMyBlock extends Block {
        public function Exec() {
        }
}
?>
Вообще создавать класс обработчика для блока не обязательно, тем более, если никаких вычислений не происходит. В этом случаи достаточно подключить блок указанием полного пути до него, например:
'blocks'  => array(
                        'right' => array('stream'=>array('priority'=>100), 'block.myblock.tpl'=>array('priority'=>90), 'tags'=>array('priority'=>50),'blogs'=>array('params'=>array(),'priority'=>1))
                )
ну и дальше что? ну что, что модуль? ну и в чем неполноценный? есть ЛС, есть магазин. Робокрафт и не создавался как магазин.

Просто вы фигню пишите. Можно и на ЛС магазин замутить
  • avatar gran
  • 2
1. Еле методом тыка нашел 0.4.1 версию, запарился реально искать рабочий вариант, для тех кто как я, он тут idea2.ru/files/iface/0.4.1/iface.zip пс: автор упорядочите ссылки по версиям чтобы людей не путать и в модули на лс загрузите под 0.4.1
2. Чтобы работало с плагином рейтиг пользователей, нужно в плагине PluginUserhacks.class.php закомментировать
/*
	protected $aDelegates=array(
        'template'=>array(
        				'actions/ActionProfile/whois.tpl'=>'../../../plugins/userhacks/templates/skin/default/actions/ActionProfile/whois.tpl',
						),			
	);
	*/

и в файл templates/skin/new/actions/ActionProfile/whois.tpl (уже скопированный в этот каталог из плагина круг друзей) перед строкой
{if $oUserProfile->getProfileSex()!='other'
добавить {hook run='userhacks_whois'}
3. если вы используете плагин компании, то нужно также убрать делегирование whois.tpl, в файле PluginCompany.class.php удалив строку
'actions/ActionProfile/whois.tpl'=>'../../../plugins/company/templates/skin/default/actions/ActionProfile/whois.tpl',
далее все в тот же whois.tpl добавить перед строкой
<tr>
						<td class="var">{$aLang.profile_date_registration}:</td>

эти строки
{if $aCompanyEmployee}
					<tr>
						<td class="var">{$aLang.company_is_work}:</td>
						<td>
							{foreach from=$aCompanyEmployee item=oCompanyEmploye name=company_user}
								<a href="{router page='company'}{$oCompanyEmploye->getCompanyUrl()}/">{$oCompanyEmploye->getCompanyName()|escape:'html'}</a>{if !$smarty.foreach.company_user.last}, {/if}
							{/foreach}
						</td>
					</tr>
					{/if}
					
					{if $aCompanyAdmirer}
					<tr>
						<td class="var">{$aLang.company_is_like}:</td>
						<td>
							{foreach from=$aCompanyAdmirer item=oCompanyAdmirer name=company_user}
								<a href="{router page='company'}{$oCompanyAdmirer->getCompanyUrl()}/">{$oCompanyAdmirer->getCompanyName()|escape:'html'}</a>{if !$smarty.foreach.company_user.last}, {/if}
							{/foreach}
						</td>
					</tr>
					{/if}

4. Наслаждаемся симбиозом 3х плагинов =)
  • avatar ort
  • 2
Проблема в не целостности базы, возможно она была MyISAM.
Конвертировать текущую 0.3.1 БД в нормальный целостный вид можно этим скриптом. Далее уже получившуюся БД конвертировать в 0.4.
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
set_time_limit(0);


$conn1 = mysql_connect("localhost", "root", "");
$conn2 = mysql_connect("localhost", "root", "",true);

if (!$conn1) {
    echo "Unable to connect to DB: " . mysql_error();
    exit;
}
  
if (!mysql_select_db("livestreet03",$conn1)) {
    echo "Unable to select mydbname: " . mysql_error();
    exit;
}
if (!mysql_select_db("livestreet03new",$conn2)) {
    echo "Unable to select mydbname: " . mysql_error();
    exit;
}
mysql_query("set character_set_client='utf8'",$conn1);
mysql_query("set character_set_results='utf8'",$conn1);
mysql_query("set collation_connection='utf8_bin'",$conn1);
mysql_query("set character_set_client='utf8'",$conn2);
mysql_query("set character_set_results='utf8'",$conn2);
mysql_query("set collation_connection='utf8_bin'",$conn2);


function buildInsertSql($sTable,$aRow)  {
	$sql='INSERT INTO '.$sTable.' SET ';
	foreach ($aRow as $key => $value) {
		if (!is_null($value)) {
			$value="'".mysql_escape_string($value)."'";
		} else {
			$value='NULL';
		}
		$sql.=' '.$key."=".$value.",";
	}
	return trim($sql,',');
}

function exportTable($sTable) {
	global $conn1;
	global $conn2;
	
	$iAll=0;
	$iExp=0;
		
	$res = mysql_query("SELECT * FROM {$sTable}",$conn1);
	if ($res) {
		while ($row = mysql_fetch_assoc($res)) {
			if (@mysql_query(buildInsertSql($sTable,$row),$conn2)) {
				$iExp++;
			}
		}
		$iAll=mysql_num_rows($res);
		mysql_free_result($res);
	}
	echo "Export {$sTable}: {$iExp} from {$iAll}\n";
}


//пользователи
exportTable('prefix_user');
exportTable('prefix_user_administrator');
exportTable('prefix_user_vote');

//блоги
exportTable('prefix_blog');
exportTable('prefix_blog_user');
exportTable('prefix_blog_vote');

//топики
exportTable('prefix_topic');
exportTable('prefix_topic_vote');
exportTable('prefix_topic_tag');
exportTable('prefix_topic_read');
exportTable('prefix_topic_question_vote');
exportTable('prefix_topic_content');
exportTable('prefix_topic_comment');
exportTable('prefix_topic_comment_vote');
exportTable('prefix_topic_comment_online');

//почта
exportTable('prefix_talk');
exportTable('prefix_talk_comment');
exportTable('prefix_talk_user');

//география
exportTable('prefix_city');
exportTable('prefix_city_user');
exportTable('prefix_country');
exportTable('prefix_country_user');

//остальное
exportTable('prefix_reminder');
exportTable('prefix_page');
exportTable('prefix_invite');
exportTable('prefix_friend');
exportTable('prefix_favourite_topic');

?>
  • avatar noonv
  • 2
http://idea2.ru/files/feedback/feedback.zip
вот модуль для 0.3.1
Установка:
1. скопировать
2. настроить адрес в конфиге
3. доступ по адресу сайт/feedback

Условие использования:
бесплатно при условии сохранения копирайта.
На мой взгляд, эти изменения, может, немного запоздалые, но совершенно необходимые. Я понимаю некоторое недовольство, но это как больной зуб, который, вроде, и не особо мешает жить, но рано или поздно им приходится заняться.

Теперь именования классов получают четкую и внятную систему именований. Не знаю, как у других разработчиков, но у меня ни разу не получилось написать имя класса сущности (entity) с первого захода. Поэтому я для себя давно уже решил, что надо упорядочить это безобразие, и если глянете сущности и мапперы админпанели, то увидите уже сейчас там такие имена классов: PluginAceadminpanel_ModuleAdmin_EntityUser или PluginAceadminpanel_ModuleAdmin_MapperAdmin. :) Рад, что Максим прислушался к моим советам.

Проблем с адаптацией плагинов я вообще не вижу. Тут Макс прав — просто немного имена классов изменить. Любые самописные, заказные, тиражируемые — абсолютно любые модули портируются на счет раз.

Например, был у нас класс PluginPage_Page, т.к. это модуль, то переименовываем его в PluginPage_ModulePage. И запускаем в ТоталКоммандоре поиск строки PluginPage_Page во всех php-файлах. Везде, где нашли, меняем эту строку на PluginPage_ModulePage. Делаем такую же замену для сущности (меняем PluginPage_PageEntity_Page на PluginPage_ModulePage_EntityPage) и для маппера (меняем PluginPage_Mapper_Page на PluginPage_ModulePage_MapperPage). Все! Вот мы целый плагин адаптирвали под новую версию! Больше не нужно ни-че-го! Трудно? Долго? Страшно?

ЗЫ Я плагин Page только для примера привел, на самом деле там уже все изменено.
  • avatar ort
  • 4
было:

<?
class LsUser extends Module {
	
}


class UserEntity_Country extends Entity {    
  
}

class Mapper_User extends Mapper {
	
}



class PluginPage_Page extends Module {
	
}

class PluginPage_PageEntity_Page extends Entity {
	
}

class PluginPage_Mapper_Page extends Mapper {
	
}
?>

стало:

<?
class ModuleUser extends Module {
	
}

class ModuleUser_EntityCountry extends Entity {    
  
}

class ModuleUser_MapperUser extends Mapper {
	
}



class PluginPage_ModulePage extends Module {
	
}

class PluginPage_ModulePage_EntityPage extends Entity {
	
}

class PluginPage_ModulePage_MapperPage extends Mapper {
	
}
?>
маленькие советы.
убрать поля «индекс», «кому доставить» заменить на «адрес». Во вкладку «способ оплаты» вписать «Наличными курьеру», чтобы оно было первым в выборе. И сделать список категории, чтобы товары были по полочкам. К какому времени вы сделаете версию для 0.4? Уж очень вопрос остро стоит для меня :)
  • avatar ort
  • 3
зачатки есть здесь trac.lsdev.ru/livestreet/wiki/DeveloperDoc
я обращаюсь к той аудитории, у которой хорошая посещаемость на проектах и есть, что предложить людям, магазин будет отдельной статьёй доходов для проекта, вот примеры таких проектов www.avtoturistu.ru/, robocraft.ru это с магазинами, вот к примеру проект которому не помешает магазин turometr.ru и ещё раз повторяю на выходе получится Saas платформа
вот программное создание юзера LS

$mail = $login.'@mail.ru';
				/**
				 * Создаем юзера
				 */
				$oUser=new UserEntity_User();
				$oUser->setLogin($login);
				$oUser->setMail($mail);
				$oUser->setPassword(func_encrypt($mail));
				$oUser->setDateRegister(date("Y-m-d H:i:s"));
				$oUser->setIpRegister(func_getIp());
				$oUser->setActivate(1);
				$oUser->setActivateKey(null);
				/**
				 * Регистрируем
				 */
				if($user = $this->User_Add($oUser))
				{
					//$userId = $user->getId();
					/**
					* Создаем персональный блог
					*/
					$this->Blog_CreatePersonalBlog($oUser);
				}



ну желательно еще проверить не занят ли логин

if($user = $this->User_GetUserByLogin($login)


а вот программное создание юзера phpbb

<?php
// E-mail адрес нашего пользователя
				$email_address = $mail;
				// По умолчанию, 4 - номер группы для зарегистрированных пользователей, и
				// 5 - для COPPA-пользователей(http://coppa.org).
				$group_id = ($coppa) ? 5 : 4;
				// Но так как ID по умолчанию может смениться, то мы обязаны предварительно сделать
				// запрос к базе данных для получения идентификатора.
				// Учтите, что после первого выполнения данный запрос закешируется.
				$group_name = ($coppa) ? 'REGISTERED_COPPA' : 'REGISTERED';
				$sql = 'SELECT group_id
        FROM ' . GROUPS_TABLE . "
        WHERE group_name = '" . $db->sql_escape($group_name) . "'
            AND group_type = " . GROUP_SPECIAL;
				$result = $db->sql_query($sql);
				$row = $db->sql_fetchrow($result);
				$group_id = $row['group_id'];

				// Временная зона для пользователя, в GMT формате.
				$timezone = '-6';

				// Язык пользователя. Указывается двухбуквенное сокрашение.
				$language = 'ru';


				// Тип пользователя. Может быть USER_INACTIVE или USER_NORMAL,
				// в зависимости от того, нужно ли пользователю после его создания самостоятельно
				// активировать свой аккаунт.
				$user_type = USER_NORMAL;

				// Если мы устанавливаем пользователя, как неактивного (USER_INACTIVE),
				// то мы должны сгенерировать его активационный код.
				// Можете использовать любой алгоритм генерации, какой только сможете
				// придумать.
				$user_actkey = md5(rand(0, 100) . time());
				$user_actkey = substr($user_actkey, 0, rand(8, 12));

				// IP-адрес пользователя.
				$user_ip = $user->ip;

				// Дата регистрации пользователя в UNIX-формате.
				$registration_time = $time_post_added - rand(100,200);

				// Причина неактивности выводится в администраторском аккаунте при
				// выводе списка пользователей.
				// Может быть следующей: INACTIVE_REGISTER, INACTIVE_PROFILE,
				// INACTIVE_MANUAL and INACTIVE_REMIND.
				// Нет необходимости указывать этот параметр, если пользователь
				// станет сразу активным после регистрации.

				// Время, после которого пользователь неактивен.
				// То есть это фактически дата последнего входа в систему.
				// Указываем текущее UNIX-время.
				//$user_inactive_time = time();
				$sql = 'SELECT *
		FROM ' . USERS_TABLE . '
		ORDER BY user_id DESC LIMIT 1 ';
				$result = $db->sql_query($sql);
				$user_row = $db->sql_fetchrow($result);
				$now_id = $user_row['user_id'] +1;
				$avatar = $path_to_avatar;
				$image_size = getimagesize($avatar);
				copy($avatar,"../images/avatars/upload/".$hash."_".$now_id.".jpg");
				// Создаем непосредственно ассоциативный массив.
				$user_row = array(
				'username'              => $username,
				'user_password'         => phpbb_hash($password),
				'user_email'            => $email_address,
				'group_id'              => (int) $group_id,
				'user_timezone'         => (float) $timezone,
				'user_dst'              => $is_dst,
				'user_lang'             => $language,
				'user_type'             => $user_type,
				'user_actkey'           => $user_actkey,
				'user_ip'               => $user_ip,
				'user_regdate'          => $registration_time,
				'user_inactive_reason'  => $user_inactive_reason,
				'user_inactive_time'    => $user_inactive_time,
				'user_avatar'			=> $now_id."_".time().".jpg",
				'user_avatar_type'		=> "1",
				'user_avatar_width'     => $image_size['1'],
				'user_avatar_height'    => $image_size['0'],
				);
				// Далее система все берет на себя.
				// Пользователь будет автоматически добавлен в соответствующие
				// таблицы в базе данных.
				$user_id = user_add($user_row);
?>


по сути осталось только подгурзить нужные файлы для работы с обоими движками, ну и подправить экшен у ЖУ и функцию регистрации у BB
Это уже обсуждалось здесь livestreet.ru/blog/1692.html

идем в ( classes / blocks / BlockSteam.class.php)там пишем:


class BlockStream extends Block {
        public function Exec() {
                if ($oTopics=$this->Topic_GetTopicsLast(BLOCK_STREAM_COUNT_ROW)) {
                        $this->Viewer_Assign('oTopics',$oTopics);
                        $sTextResult=$this->Viewer_Fetch("block.stream_topic.tpl");
                        $this->Viewer_Assign('sStreamTopic',$sTextResult);
                }
        }
}


сразу после этого идем в ( templates / skin / new / block.stream.tpl)там пишем:

<div class="block stream">
        
        <div class="tl"><div class="tr"></div></div>
                <div class="cl"><div class="cr">
                       
                 <h1>{$aLang.block_stream}</h1>
                       
        <ul class="block-nav">                                          
                <li class="active"><strong></strong><a href="#" id="block_stream_topic" onclick="lsBlockStream.toggle(this,'topic_stream'); return false;">{$aLang.block_stream_topics}</a></li>
                <li><a href="#" id="block_stream_comment" onclick="lsBlockStream.toggle(this,'comment_stream'); return false;">{$aLang.block_stream_comments}</a><em></em></li>
        </ul>                                   
        
        <div class="block-content">
                {literal}
                        <script language="JavaScript" type="text/javascript">
                        var lsBlockStream;
                        window.addEvent('domready', function() { 
                                lsBlockStream=new lsBlockLoaderClass();                                                 
                        });
                        </script>
                {/literal}
                {$sStreamTopic}
       </div>
        
                 <div class="right"><a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_COMMENTS}/">{$aLang.block_stream_comments_all}</a> | <a href="{$DIR_WEB_ROOT}/{$ROUTE_PAGE_RSS}/allcomments/">RSS</a></div>

                                </div></div>
                                <div class="bl"><div class="br"></div></div>
                 </div>
  • avatar simca
  • 1
Вообщем сделал следующее.
1. В ActionTopic.class.php после:
$_REQUEST['topic_forbid_comment']=$oTopic->getForbidComment();

добавил:
$_REQUEST['topic_vip']=$oTopic->getVip();

2. В Topic.entity.class.php после:
public function getForbidComment() {
        return $this->_aData['topic_forbid_comment'];
    }

добавил:
public function getVip() {
        return $this->_aData['topic_vip'];
    }

и после:
public function setForbidComment($data) {
        $this->_aData['topic_forbid_comment']=$data;
    }

добавил:
public function setVip($data) {
        $this->_aData['topic_vip']=$data;
    }

3. В Topic.mapper.class.php добавил vip сюда:
public function AddTopic(TopicEntity_Topic $oTopic) {
		$sql = "INSERT INTO ".DB_TABLE_TOPIC." 
			(blog_id,
			user_id,
			topic_type,
			topic_title,			
			topic_tags,
			topic_date_add,
			topic_user_ip,
			topic_publish,
			topic_publish_draft,
			topic_publish_index,
			topic_cut_text,
			topic_forbid_comment,
			topic_vip,	
			topic_text_hash			
			)
			VALUES(?d,  ?d,	?,	?,	?,  ?, ?, ?d, ?d, ?d, ?, ?, ?d, ?)
		";			
		if ($iId=$this->oDb->query($sql,$oTopic->getBlogId(),$oTopic->getUserId(),$oTopic->getType(),$oTopic->getTitle(),
			$oTopic->getTags(),$oTopic->getDateAdd(),$oTopic->getUserIp(),$oTopic->getPublish(),$oTopic->getPublishDraft(),$oTopic->getPublishIndex(),$oTopic->getCutText(),$oTopic->getForbidComment(),$oTopic->getVip(),$oTopic->getTextHash())) 

и сюда:
public function UpdateTopic(TopicEntity_Topic $oTopic) {		
		$sql = "UPDATE ".DB_TABLE_TOPIC." 
			SET 
				blog_id= ?d,
				topic_title= ?,				
				topic_tags= ?,
				topic_date_add = ?,
				topic_date_edit = ?,
				topic_user_ip= ?,
				topic_publish= ?d ,
				topic_publish_draft= ?d ,
				topic_publish_index= ?d,
				topic_rating= ?f,
				topic_count_vote= ?d,
				topic_count_read= ?d,
				topic_count_comment= ?d, 
				topic_cut_text = ? ,
				topic_forbid_comment = ? ,
				topic_vip = ?d,
				topic_text_hash = ? 
			WHERE
				topic_id = ?d
		";			
		if ($this->oDb->query($sql,$oTopic->getBlogId(),$oTopic->getTitle(),$oTopic->getTags(),$oTopic->getDateAdd(),$oTopic->getDateEdit(),$oTopic->getUserIp(),$oTopic->getPublish(),$oTopic->getPublishDraft(),$oTopic->getPublishIndex(),$oTopic->getRating(),$oTopic->getCountVote(),$oTopic->getCountRead(),$oTopic->getCountComment(),$oTopic->getCutText(),$oTopic->getForbidComment(),$oTopic->getVip(),$oTopic->getTextHash(),$oTopic->getId())) {

4. Выполнил запрос в базу:
ALTER TABLE `prefix_topic` ADD `topic_vip` tinyint(1) default '0' AFTER `topic_forbid_comment`

5. В шаблоны topic.tpl и topic_list.tpl добавил:
{if $oTopic->getVip}<img src="vip.jpg>{/if}

6. В шаблон actions/ActionTopic/add.tpl добавил:
<p><label for=""><input type="checkbox" id="topic_vip" name="topic_vip" class="checkbox" value="1" {if $_aRequest.topic_vip==1}checked{/if}/> 
					— {$aLang.topic_vip}</label><br />
					<span class="form_note">{$aLang.topic_create_vip}</span></p>

В результате при создании/редактировании топика я ставлю галку на этот чекбокс, типа сделать топик vip, сохраняю, но изображение не появляется, при вторичном открытии для редактирования галки на чекбоксе нет. Что я не так сделал?
  • avatar gran
  • 1
Хук будет выглядеть так:
class Pluginимяплагина_HookИмяхука extends Hook {   
        public function RegisterHook() {
            $this->AddHook('profile_whois_show', 'ProfileTeamShow', __CLASS__, -3);
            
        }
        
        public function ProfileTeamShow($aVars) {
		$aTeamUsers=$this->PluginTeams_Teams_GetTeamUsersByUserId($aVars["oUserProfile"]->getId(),1);
        	$aTeamModerators=$this->PluginTeams_Teams_GetTeamUsersByUserId($aVars["oUserProfile"]->getId(),2);      			 										                      		
		$aTeamAdministrators=$this->PluginTeams_Teams_GetTeamUsersByUserId($aVars["oUserProfile"]->getId(),4);

        	$this->Viewer_Assign('aTeamUsers',$aTeamUsers);
        	$this->Viewer_Assign('aTeamModerators',$aTeamModerators);
        	$this->Viewer_Assign('aTeamAdministrators',$aTeamAdministrators);
 
        } 
}

А шаблон стандартно делегируется, про это написано.
пс: больше с up'ами не шали =)
  • avatar Ajaxy
  • 0
нет, его тоже необходимо делегировать, причем с указанием относительного пути от директории /templates/skin/new, т.е. так:
protected $aDelegates=array(
                'templates'=>array('topic.tpl'=>'../../../plugin/myplugin/templates/skin/default/topic.tpl')
        );
  • avatar gran
  • 1
require_once не обязательно указывать.
файл в этом случае должен лежать по пути
plugins/mytopic/classes/modules/topic/entity/

А в классе плагина должно быть прописано делегирование примерно так:

protected $aDelegates=array(
		'entity'=>array('Topic'=>'PluginMytopic_Topic_Topic')
	);
Блок из плагина указывается как и обычные, только нужно передать в него параметр 'plugin' со значением имени плагина.

$this->Viewer_AddBlock('right','category',array('plugin'=>'filepanel'));

Добавить в правый сайдбар блок PluginFilepanel_BlockCategory.
Через конфигурацию делается точно также.