Page MenuHomeIn-Portal Phabricator

in-bulletin
No OneTemporary

File Metadata

Created
Mon, Feb 24, 1:51 PM

in-bulletin

Index: branches/5.3.x/units/topics/topics_event_handler.php
===================================================================
--- branches/5.3.x/units/topics/topics_event_handler.php (revision 15923)
+++ branches/5.3.x/units/topics/topics_event_handler.php (revision 15924)
@@ -1,306 +1,306 @@
<?php
/**
* @version $Id$
* @package In-Bulletin
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.org/license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
class TopicsEventHandler extends kCatDBEventHandler {
/**
* Checks topic lock permission
*
* @param kEvent $event
* @return bool
* @access public
*/
public function CheckPermission(kEvent $event)
{
if ( $event->Name == 'OnTopicLockToggle' ) {
$object = $event->getObject();
/* @var $object kCatDBItem */
if ( !$object->isLoaded() ) {
$event->status = kEvent::erPERM_FAIL;
return false;
}
$category_id = $object->GetDBField('CategoryId');
$perm_status = $this->Application->CheckPermission('TOPIC.LOCK', 0, $category_id);
if ( !$perm_status ) {
$event->status = kEvent::erPERM_FAIL;
}
return $perm_status;
}
if ( $event->Name == 'OnToogleCategoryTopicsSubscribe' || $event->Name == 'OnToogleTopicPostsSubscribe' ) {
return $this->Application->LoggedIn();
}
return parent::CheckPermission($event);
}
/**
* Lock or unlock topic
*
* @param kEvent $event
*/
function OnToggleLock($event)
{
$object = $event->getObject();
/* @var $object kDBItem */
$new_type = $object->GetDBField('TopicType') ? 0 : 1;
$object->SetDBField('TopicType', $new_type);
$object->Update();
}
/**
* Cache topic owner
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnBeforeItemUpdate(kEvent $event)
{
parent::OnBeforeItemUpdate($event);
$this->cacheItemOwner($event, 'OwnerId', 'PostedBy');
}
/**
* Cache topic owner
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnBeforeItemCreate(kEvent $event)
{
parent::OnBeforeItemCreate($event);
$this->cacheItemOwner($event, 'OwnerId', 'PostedBy');
$object = $event->getObject();
/* @var $object kCatDBItem */
if ( !$object->GetDBField('TodayDate') ) {
- $object->SetDBField('TodayDate', adodb_date('Y-m-d'));
+ $object->SetDBField('TodayDate', date('Y-m-d'));
}
$post_helper = $this->Application->recallObject('PostHelper');
/* @var $post_helper PostHelper */
$object->SetDBField('TopicText', $post_helper->CensorText($object->GetDBField('TopicText')));
}
/**
* Creates 1st post when topic is created
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnAfterItemCreate(kEvent $event)
{
parent::OnAfterItemCreate($event);
if ( $event->Special == '-item' ) {
// don't create first post when cloning
return ;
}
$object = $event->getObject();
/* @var $object kDBItem */
$post = $this->Application->recallObject($event->Prefix . '-post', null, Array ('skip_autoload' => true));
/* @var $post kDBItem */
$post->SetDBField('Pending', $object->GetDBField('Status') == STATUS_ACTIVE ? 0 : 1);
$post->SetDBField('Subject', '');
$post->SetDBField('PostingText', $object->GetDBField('PostingText'));
$post->SetDBField('ShowSignatures', $object->GetDBField('ShowSignatures'));
$post->SetDBField('DisableSmileys', $object->GetDBField('DisableSmileys'));
$post->SetDBField('DisableBBCodes', $object->GetDBField('DisableBBCodes'));
$post->Create();
// need to update category topic count here
}
/**
* Approves 1st post when topic got approved
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnAfterItemUpdate(kEvent $event)
{
parent::OnAfterItemUpdate($event);
if ( !$this->Application->isAdminUser ) {
return;
}
$object = $event->getObject();
/* @var $object kCatDBItem */
if ( $object->GetDBField('Posts') == 1 ) {
$post = $this->Application->recallObject($event->Prefix . '-post', null, Array ('skip_autoload' => true));
/* @var $post kDBItem */
$main_status = $object->GetDBField('Status');
$post->Load($object->GetDBField('LastPostId'));
if ( $post->isLoaded() ) {
$post->SetDBField('Pending', $main_status == STATUS_ACTIVE ? 0 : 1);
$post->Update();
}
}
}
/**
* Makes first post body field non-required when topic has posts already
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnAfterItemLoad(kEvent $event)
{
parent::OnAfterItemLoad($event);
$object = $event->getObject();
/* @var $object kCatDBItem */
if ( $object->GetDBField('Posts') > 0 || !$this->Application->isAdminUser ) {
$object->setRequired('PostingText', false);
}
}
/**
* Locks or unlocks topic
*
* @param kEvent $event
*/
function OnTopicLockToggle($event)
{
$object = $event->getObject();
/* @var $object kCatDBItem */
$topic_type = $object->GetDBField('TopicType');
$object->SetDBField('TopicType', $topic_type == 1 ? 0 : 1);
$object->Update();
}
/**
* Sets default values to posting options based on persistent session
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnAfterConfigRead(kEvent $event)
{
parent::OnAfterConfigRead($event);
$config = $event->getUnitConfig();
$fields = $config->getFields();
$fields['NotifyOwnerOnChanges']['default'] = (int)$this->Application->RecallPersistentVar('owner_notify');
$config->setFields($fields);
$virtual_fields = $config->getVirtualFields();
$virtual_fields['DisableBBCodes']['default'] = (int)!$this->Application->RecallPersistentVar('bbcode');
$virtual_fields['DisableSmileys']['default'] = (int)!$this->Application->RecallPersistentVar('smileys');
$virtual_fields['ShowSignatures']['default'] = (int)$this->Application->RecallPersistentVar('show_sig');
$config->setVirtualFields($virtual_fields);
}
/**
* [HOOK] Allows to add cloned subitem to given prefix
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnCloneSubItem(kEvent $event)
{
parent::OnCloneSubItem($event);
if ( $event->MasterEvent->Prefix == 'rev' ) {
$sub_item_prefix = $event->Prefix . '-' . $event->MasterEvent->Prefix;
$event->MasterEvent->getUnitConfig()->addClones(Array (
$sub_item_prefix => Array (
'ConfigMapping' => Array (
'PerPage' => 'Perpage_TopicReviews',
'ReviewDelayInterval' => 'topic_ReviewDelay_Interval',
'ReviewDelayValue' => 'topic_ReviewDelay_Value',
)
),
));
}
}
/**
* Subscribes/unsubscribes to new topics in given current category
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnToogleCategoryTopicsSubscribe(kEvent $event)
{
$post_helper = $this->Application->recallObject('PostHelper');
/* @var $post_helper PostHelper */
$manager = $post_helper->getSubscriptionManager('CategoryTopics');
if ( $manager->subscribed() ) {
$manager->unsubscribe();
}
else {
$manager->subscribe();
}
}
/**
* Subscribes/unsubscribes to new posts in current topic
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnToogleTopicPostsSubscribe(kEvent $event)
{
$object = $event->getObject();
/* @var $object kDBItem */
$post_helper = $this->Application->recallObject('PostHelper');
/* @var $post_helper PostHelper */
$manager = $post_helper->getSubscriptionManager('TopicPosts', Array ($object->GetID()));
if ( $manager->subscribed() ) {
$manager->unsubscribe();
}
else {
$manager->subscribe();
}
}
}
\ No newline at end of file
Index: branches/5.3.x/units/helpers/post_helper.php
===================================================================
--- branches/5.3.x/units/helpers/post_helper.php (revision 15923)
+++ branches/5.3.x/units/helpers/post_helper.php (revision 15924)
@@ -1,465 +1,465 @@
<?php
/**
* @version $Id$
* @package In-Bulletin
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.org/license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
class PostHelper extends kHelper {
var $postOptionBits = Array (
'show_sig' => 128,
'disable_bbcode' => 64,
'disable_smileys' => 32,
);
/**
* Checks if specific option is set for post
*
* @param string $option_name
* @param Array $options
* @return bool
*/
function GetPostOption($option_name, $options)
{
if (!isset($this->postOptionBits[$option_name])) {
return false;
}
$option_bit = $this->postOptionBits[$option_name];
return ($options & $option_bit) == $option_bit;
}
/**
* Sets given option bit (by name) to post options
*
* @param string $option_name
* @param int $option_value
* @param Array $options
* @return bool
*/
function SetPostOption($option_name, $option_value, &$options)
{
if (!isset($this->postOptionBits[$option_name])) {
return false;
}
$option_bit = $this->postOptionBits[$option_name];
if ($option_value) {
$options |= $option_bit;
}
else {
$options = $options &~ $option_bit;
}
return true;
}
/**
* Returns post options map to virtual field names
*
* @return Array
*/
function getOptionsMap()
{
$options_map = Array (
'show_sig' => 'ShowSignatures',
'disable_smileys' => 'DisableSmileys',
'disable_bbcode' => 'DisableBBCodes',
);
return $options_map;
}
/**
* @return void
* @param int $date
* @desc Set any field to category & all it's parent categories
*/
function PropagateCategoryField($category_id, $field_name, $field_value)
{
$categories_config = $this->Application->getUnitConfig('c');
$id_field = $categories_config->getIDField();
$table_name = $categories_config->getTableName();
$sql = 'SELECT ParentPath
FROM ' . $table_name . '
WHERE ' . $id_field . ' = ' . $category_id;
$parent_path = $this->Conn->GetOne($sql);
$parent_categories = explode('|', substr($parent_path, 1, -1));
if ( !$parent_categories ) {
return;
}
$fields_hash = Array ($field_name => $field_value);
$this->Conn->doUpdate($fields_hash, $table_name, $id_field . ' IN (' . implode(',', $parent_categories) . ')');
}
/**
* Sets today posts count & today date for topic
*
* @param kCatDBItem $object
* @param int $post_date
* @param int $increment_by
* @return bool
*/
function updateTodayPostsCount(&$object, $post_date, $increment_by = 1)
{
- $date_now = adodb_date('Y-m-d');
+ $date_now = date('Y-m-d');
- if (adodb_date('Y-m-d', $post_date) != $date_now) {
+ if ( date('Y-m-d', $post_date) != $date_now ) {
return true;
}
// last post update date was today or not
$today_posts = ($date_now == $object->GetDBField('TodayDate')) ? $object->GetDBField('TodayPosts') : 0;
$object->SetDBField('TodayDate', $date_now);
$object->SetDBField('TodayPosts', $today_posts + $increment_by);
return $object->Update();
}
function updatePostCount($topic_id, $increment = 1)
{
$topics_config = $this->Application->getUnitConfig('bb');
$id_field = $topics_config->getIDField();
$table_name = $topics_config->getTableName();
// helps in case, when 2 (or more) users tries to post in same topic at same time
$sql = 'UPDATE '.$table_name.'
SET Posts = Posts '.($increment > 0 ? '+' : '-').' '.abs($increment).'
WHERE '.$id_field.' = '.$topic_id;
$this->Conn->Query($sql);
// returns new value
$sql = 'SELECT Posts
FROM '.$table_name.'
WHERE '.$id_field.' = '.$topic_id;
return $this->Conn->GetOne($sql);
}
/**
* Replaces all special formatting in post before displaing it to user
*
* @param string $post_body
* @param int $post_options bit array of post options
* @param Array $sub_blocks block names for rendering smileys & bbcodes
* @return string
*/
function parsePostBody($post_body, $post_options, $sub_blocks)
{
// 1. escape all html sequences
$post_body = htmlspecialchars($post_body, ENT_NOQUOTES, CHARSET); // don't touch quotes in bbcode attribute values
// 2. replace censored words
$post_body = $this->CensorText($post_body);
// 3. replace bb codes
if (!$this->GetPostOption('disable_bbcode', $post_options)) {
$post_body = $this->replaceBBCodes($post_body, $sub_blocks['bbcode']);
}
// 4. replace smileys
if (!$this->GetPostOption('disable_smileys', $post_options)) {
$post_body = $this->replaceSmileys($post_body, $sub_blocks['smileys']);
}
// 5. add enters (because we don't use HTML in post body)
$post_body = nl2br($post_body);
// 6. replace quoted text
return $this->replacePostQuote($post_body, $sub_blocks['quote']);
}
function replacePostQuote($text, $render_as)
{
if (preg_match('/\[quote id=([\d]+)\](.*)\[\/quote\]/s', $text, $regs)) {
$post = $this->Application->recallObject('bb-post.-item', null, Array ('skip_autoload' => true));
/* @var $post kDBItem */
$post->Load($regs[1]);
$block_params = Array ('name' => $render_as, 'PrefixSpecial' => 'bb-post.-item', 'Prefix' => 'bb-post', 'Special' => '-item', 'strip_nl' => 2);
$parsed_quote = $this->Application->ParseBlock($block_params);
return str_replace($regs[0], $parsed_quote, $text);
}
return $text;
}
/**
* Replaces bad words with good words (censorship process)
*
* @param string $text
* @return string
*/
function CensorText($text)
{
static $censor_words = null;
if (!isset($censor_words)) {
$sql = 'SELECT Replacement, BadWord
FROM '.TABLE_PREFIX.'Censorship';
$censor_words = $this->Conn->GetCol($sql, 'BadWord');
}
foreach ($censor_words as $replace_from => $replace_to) {
$text = str_replace($replace_from, $replace_to, $text);
}
return $text;
}
function replaceSmileys($text, $smiley_element)
{
static $smileys = null;
if (!isset($smileys)) {
$sql = 'SELECT em.EmotionImage, em.KeyStroke
FROM '.TABLE_PREFIX.'Emoticon em
WHERE em.Enabled = 1
ORDER BY CHAR_LENGTH(em.KeyStroke) DESC';
$smileys = $this->Conn->GetCol($sql, 'KeyStroke');
}
$block_params = Array ('name' => $smiley_element, 'smiley_url' => '#SMILEY_URL#');
$smiley_mask = trim($this->Application->ParseBlock($block_params));
$base_url = rtrim($this->Application->BaseURL(),'/');
foreach ($smileys as $key_stoke => $image_url) {
if (strpos($text, $key_stoke) === false) {
continue;
}
$smiley_html = str_replace('#SMILEY_URL#', $base_url.SMILEYS_PATH.$image_url, $smiley_mask);
$text = str_replace($key_stoke, $smiley_html, $text);
}
return $text;
}
/**
* Sort params by name and then by length
*
* @param string $a
* @param string $b
* @return int
* @access private
*/
function CmpParams($a, $b)
{
list ($a, ) = explode(':', $a);
list ($b, ) = explode(':', $b);
$a_len = strlen($a);
$b_len = strlen($b);
if ($a_len == $b_len) return 0;
return $a_len > $b_len ? -1 : 1;
}
function replaceBBCodes($text, $bbcode_element)
{
// convert phpbb bbcodes to in-bulletin bbcodes
$text = $this->preformatBBCodes($text);
$tags_defs = explode(';', $this->Application->ConfigValue('BBTags')); // 'b:;i:;u:;ul:type|align;font:color|face|size;url:href;img:src|border';
usort($tags_defs, Array (&$this, 'CmpParams'));
foreach($tags_defs as $tag) {
list ($tag_name, $tag_params) = explode(':', $tag);
$tag_params = $tag_params ? array_flip(explode('|', $tag_params)) : 0;
$text = preg_replace('/\['.$tag_name.'(.*)\](.*)\[\/'.$tag_name.' *\]/Uise','$this->checkBBCodeAttribs("'.$tag_name.'",\'$1\',\'$2\',$tag_params);', $text);
}
// additional processing for [url], [*], [img] bbcode
$text = preg_replace('/<url>(.*)<\/url>/Usi','<url href="$1">$1</url>',$text);
$text = preg_replace('/<font>(.*)<\/font>/Usi','$1',$text); // skip empty fonts
$text = str_replace( Array('<url','</url>','[*]'),
Array('<a target="_blank"','</a>','<li>'),
$text);
// bbcode [code]xxx[/code] processing
$text = preg_replace('/\[code\](.*)\[\/code\]/Uise', "\$this->replaceCodeBBCode('$1', '".$bbcode_element."')", $text);
return $text;
}
/**
* Convert phpbb url bbcode to valid in-bulletin's format
*
* @param string $text
* @return string
*/
function preformatBBCodes($text)
{
// 1. urls
$text = preg_replace('/\[url=(.*)\](.*)\[\/url\]/Ui','[url href="$1"]$2[/url]',$text);
$text = preg_replace('/\[url\](.*)\[\/url\]/Ui','[url href="$1"]$1[/url]',$text);
// 2. images
$text = preg_replace('/\[img\](.*)\[\/img\]/Ui','[img src="$1" border="0"][/img]',$text);
// 3. color
$text = preg_replace('/\[color=(.*)\](.*)\[\/color\]/Ui','[font color="$1"]$2[/font]',$text);
// 4. size
$text = preg_replace('/\[size=(.*)\](.*)\[\/size\]/Ui','[font size="$1"]$2[/font]',$text);
// 5. lists
$text = preg_replace('/\[list(.*)\](.*)\[\/list\]/Uis','[ul]$2[/ul]',$text);
// 6. email to link
$text = preg_replace('/\[email\](.*)\[\/email\]/Ui','[url href="mailto:$1"]$1[/url]',$text);
//7. b tag
$text = preg_replace('/\[(b|i|u):(.*)\](.*)\[\/(b|i|u):(.*)\]/Ui','[$1]$3[/$4]',$text);
//8. code tag
$text = preg_replace('/\[code:(.*)\](.*)\[\/code:(.*)\]/Uis','[code]$2[/code]',$text);
return $text;
}
/**
* Removes not allowed params from tag and returns result
*
* @param string $BBCode bbcode to check
* @param string $TagParams params string entered by user
* @param string $TextInside text between opening and closing bbcode tag
* @param string $ParamsAllowed list of allowed parameter names ("|" separated)
* @return string
*/
function checkBBCodeAttribs($BBCode, $TagParams, $TextInside, $ParamsAllowed)
{
// unescape escaped quotes in tag
$TagParams = str_replace('\"', '"', $TagParams);
$TextInside = str_replace('\"', '"', $TextInside);
$params_extracted = preg_match_all('/ +([^=]*)=["\']?([^ "\']*)["\']?/is', $TagParams, $extracted_params, PREG_SET_ORDER);
if ($ParamsAllowed && $params_extracted) {
$ret = Array();
foreach ($extracted_params as $param) {
$param_name = strtolower(trim( $param[1] ));
$param_value = trim($param[2]);
// 1. prevent hacking
if ($BBCode == 'url' && $param_name == 'href') {
if (strpos(strtolower($param_value), 'script:') !== false) {
// script tag found in "href" parameter of "url" bbcode (equals to hacking) -> remove bbcode
return $TextInside;
}
}
// 2. leave only allowed params & remove all not allowed
if (isset($ParamsAllowed[$param_name])) {
$ret[] = $param_name.'="'.$param_value.'"';
}
}
$ret = count($ret) ? ' '.implode(' ', $ret) : '';
return '<'.$BBCode.$ret.'>'.$TextInside.'</'.$BBCode.'>';
}
return '<'.$BBCode.'>'.$TextInside.'</'.$BBCode.'>';
}
function highlightCode($code, $strip_tabs = 0)
{
if ($strip_tabs) {
$code = preg_replace('/(\t){'.$strip_tabs.'}(.*)/', '\\2', $code);
}
$code = str_replace( Array('\\', '/') , Array('_no_match_string_', '_n_m_s_'), $code);
$code = highlight_string('<?php'.$code.'?>', true);
$code = str_replace( Array('_no_match_string_', '_n_m_s_'), Array('\\', '/'), $code);
$code = preg_replace('/&lt;\?(.*)php(.*)\?&gt;/Us', '\\2', $code);
$code = preg_replace('/<code><font color="(.*)">([\r\n]+)/si', '<code><font color="\\1">', $code);
$code = preg_replace('/([\r\n]+)<\/font>([\r\n]+)<\/code>/si', '</font></code>', $code);
return $code;
}
/**
* Replaces [code]php code[/code] bbcode in post
*
* @param string $input_string code line to highlight
* @param string $bbcode_element block name used for bbcode descoration
* @return string
*/
function replaceCodeBBCode($input_string, $bbcode_element)
{
static $bbcode_mask = null;
if (!isset($bbcode_mask)) {
$block_params = Array ('name' => $bbcode_element, 'bb_code' => '#BB_CODE#');
$bbcode_mask = trim($this->Application->ParseBlock($block_params));
}
$input_string = trim( str_replace('\"','"', htmlspecialchars_decode($input_string)) );
$input_string = $this->highlightCode($input_string);
$input_string = preg_replace("/\r<br \/>/s", "\r", $input_string); // undo nl2br added in highlighting
$input_string = str_replace('#BB_CODE#', $input_string, $bbcode_mask);
return $input_string;
}
/**
* Returns subscription manager by name
*
* @param string $name
* @param array $arguments
* @return kSubscriptionManager
* @throws InvalidArgumentException
*/
public function getSubscriptionManager($name, $arguments = Array ())
{
if ( $name != 'CategoryTopics' && $name != 'TopicPosts' ) {
throw new InvalidArgumentException('Unknown subscription manager "' . $name . '"');
}
$manager = $this->Application->makeClass('kSubscriptionManager');
/* @var $manager kSubscriptionManager */
$fields_hash = Array ();
$user_id = isset($arguments[1]) ? $arguments[1] : $this->Application->RecallVar('user_id');
switch ( $name ) {
case 'CategoryTopics':
$category_id = isset($arguments[0]) ? $arguments[0] : $this->Application->GetVar('m_cat_id');
$fields_hash = Array (
'EmailTemplateId' => $manager->getEmailTemplateId('TOPIC.ADD.SUB'),
'UserId' => $user_id,
'CategoryId' => $category_id,
);
break;
case 'TopicPosts':
$fields_hash = Array (
'EmailTemplateId' => $manager->getEmailTemplateId('POST.ADD.SUB'),
'UserId' => $user_id,
'ParentItemId' => $arguments[0],
);
break;
}
$manager->add($fields_hash);
return $manager;
}
}
\ No newline at end of file
Index: branches/5.3.x/units/posts/post_eh.php
===================================================================
--- branches/5.3.x/units/posts/post_eh.php (revision 15923)
+++ branches/5.3.x/units/posts/post_eh.php (revision 15924)
@@ -1,449 +1,449 @@
<?php
/**
* @version $Id$
* @package In-Bulletin
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.org/license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
class PostEventHandler extends kDBEventHandler {
/**
* Checks topic-post modify and delete permissions
*
* @param kEvent $event
* @return bool
* @access public
*/
public function CheckPermission(kEvent $event)
{
$events = Array ('OnUpdate', 'OnDelete');
if ( in_array($event->Name, $events) ) {
return true;
}
return parent::CheckPermission($event);
}
/**
* Sets default values
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnBeforeItemCreate(kEvent $event)
{
parent::OnBeforeItemCreate($event);
$object = $event->getObject();
/* @var $object kDBItem */
$user_id = $this->Application->RecallVar('user_id');
- $now = adodb_mktime();
+ $now = time();
$object->SetDBField('CreatedById', $user_id);
$object->SetDBField('CreatedOn_date', $now);
$object->SetDBField('CreatedOn_time', $now);
$object->SetDBField('ModifiedById', $user_id);
$object->SetDBField('Modified_date', $now);
$object->SetDBField('Modified_time', $now);
$object->SetDBField('IPAddress', $this->Application->getClientIp());
$sql = 'SELECT Username
FROM ' . TABLE_PREFIX . 'Users
WHERE PortalUserId = ' . $user_id;
$object->SetDBField('PosterAlias', $this->Conn->GetOne($sql));
// set post options
$post_helper = $this->Application->recallObject('PostHelper');
/* @var $post_helper PostHelper */
$options_map = $post_helper->getOptionsMap();
$post_options = $object->GetDBField('Options');
foreach ($options_map as $option_name => $field_name) {
$option_value = $object->GetDBField($field_name);
$post_helper->SetPostOption($option_name, $option_value, $post_options);
}
$object->SetDBField('Options', $post_options);
$table_info = $object->getLinkedInfo($event->Special, true);
$object->SetDBField($table_info['ForeignKey'], $table_info['ParentId']);
}
/**
* Checks if user has permission on post
*
* @param kEvent $event
* @param string $permissions
*/
function checkPostPermission($event, $permissions)
{
$object = $event->getObject();
/* @var $object kDBItem */
$sql = 'SELECT ci.CategoryId, p.CreatedById
FROM '.$object->TableName.' p
LEFT JOIN '.TABLE_PREFIX.'Topic t ON t.TopicId = p.TopicId
LEFT JOIN '.TABLE_PREFIX.'CategoryItems ci ON ci.ItemResourceId = t.ResourceId AND ci.PrimaryCat = 1
WHERE p.'.$object->IDField.' = '.$object->GetID();
$post_info = $this->Conn->GetRow($sql);
$perm_helper = $this->Application->recallObject('PermissionsHelper');
/* @var $perm_helper kPermissionsHelper */
$is_owner = $post_info['CreatedById'] == $this->Application->RecallVar('user_id');
$params['permissions'] = 'TOPIC.REPLY.MODIFY|TOPIC.REPLY.OWNER.MODIFY';
$params['cat_id'] = $post_info['CategoryId'];
return $perm_helper->TagPermissionCheck($params, $is_owner);
}
/**
* Sets post options before post update
* Ensures, that only user with permission will update topic
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnBeforeItemUpdate(kEvent $event)
{
parent::OnBeforeItemUpdate($event);
$object = $event->getObject();
/* @var $object kDBItem */
$perm_status = $this->checkPostPermission($event, 'TOPIC.REPLY.MODIFY|TOPIC.REPLY.OWNER.MODIFY');
if ( !$perm_status ) {
$event->status = kEvent::erFAIL;
return;
}
$post_helper = $this->Application->recallObject('PostHelper');
/* @var $post_helper PostHelper */
$options_map = $post_helper->getOptionsMap();
$post_options = $object->GetDBField('Options');
foreach ($options_map as $option_name => $field_name) {
$option_value = $object->GetDBField($field_name);
$post_helper->SetPostOption($option_name, $option_value, $post_options);
}
$object->SetDBField('Options', $post_options);
}
/**
* Notifies admin about post change
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnAfterItemUpdate(kEvent $event)
{
parent::OnAfterItemUpdate($event);
$this->Application->emailAdmin('POST.MODIFY');
}
/**
* Checks, that user can delete post
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnBeforeItemDelete(kEvent $event)
{
parent::OnBeforeItemDelete($event);
$object = $event->getObject();
/* @var $object kDBItem */
if ( !$this->checkPostPermission($event, 'TOPIC.REPLY.OWNER.DELETE|TOPIC.REPLY.DELETE') ) {
$event->status = kEvent::erFAIL;
}
}
/**
* Sets post options to virtual fields
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnAfterItemLoad(kEvent $event)
{
parent::OnAfterItemLoad($event);
$object = $event->getObject();
/* @var $object kDBItem */
$post_helper = $this->Application->recallObject('PostHelper');
/* @var $post_helper PostHelper */
$options_map = $post_helper->getOptionsMap();
$post_options = $object->GetDBField('Options');
foreach ($options_map as $option_name => $field_name) {
$option_value = $post_helper->GetPostOption($option_name, $post_options);
$object->SetDBField($field_name, (int)$option_value);
}
}
/**
* Updates cached post counter in topic
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnAfterItemCreate(kEvent $event)
{
parent::OnAfterItemCreate($event);
$object = $event->getObject();
/* @var $object kDBItem */
$parent_prefix = $event->getUnitConfig()->getParentPrefix();
$main_object = $this->Application->recallObject($parent_prefix);
/* @var $main_object kCatDBItem */
// update user posts counter
$user_posts = $this->Application->RecallPersistentVar('bb_posts');
$this->Application->StorePersistentVar('bb_posts', $user_posts + 1);
$post_helper = $this->Application->recallObject('PostHelper');
/* @var $post_helper PostHelper */
$category_id = $this->Application->GetVar('m_cat_id');
$post_helper->PropagateCategoryField($category_id, 'Modified', $object->GetDBField('CreatedOn'));
if ( !$this->Application->isAdmin && $main_object->GetDBField('Posts') ) {
// don't send any email events when in admin OR new topic just added (0 posts)
$user_notified = false; // don't send POST.ADD event twice to same user (in case if owner adds new post)
if ( $main_object->GetDBField('NotifyOwnerOnChanges') ) {
$user_notified = $main_object->GetDBField('OwnerId');
$this->Application->emailUser('POST.ADD', $user_notified);
}
$post_owner_id = $object->GetDBField('CreatedById');
if ( ($post_owner_id > 0) && ($user_notified != $post_owner_id) ) {
$this->Application->emailUser('POST.ADD', $post_owner_id);
}
$this->Application->emailAdmin('POST.ADD');
}
$post_helper->updateTodayPostsCount($main_object, $object->GetDBField('CreatedOn'), +1);
$this->updateTopicInfo($event, $main_object);
$topic_id = $object->GetDBField('TopicId');
$posts_count = $post_helper->updatePostCount($topic_id, +1);
$main_object->SetDBField('Posts', $posts_count);
// auto-lock topic after N number of posts (if option enabled)
$auto_lock = $this->Application->ConfigValue('AutoTopicLockPosts');
if ( (int)$auto_lock > 0 ) {
if ( $posts_count >= $auto_lock ) {
// user has unlocked topic after $auto_lock and posts again -> ensure that topic will be locked again
$this->Application->HandleEvent(new kEvent($parent_prefix . ':OnTopicLockToggle'));
}
}
}
/**
* Update last post info in topic
*
* @param kEvent $event
* @param kCatDBItem $main_object
*/
function updateTopicInfo($event, &$main_object)
{
$object = $event->getObject();
/* @var $object kDBItem */
$main_object->SetDBField('Modified_date', $object->GetDBField('Modified'));
$main_object->SetDBField('Modified_time', $object->GetDBField('Modified'));
$main_object->SetDBField('LastPostId', $object->GetID());
$main_object->SetDBField('LastPostDate_date', $object->GetDBField('CreatedOn'));
$main_object->SetDBField('LastPostDate_time', $object->GetDBField('CreatedOn'));
$main_object->Update();
}
/**
* Goes to next_template after post creation
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnCreate(kEvent $event)
{
parent::OnCreate($event);
if ( $event->status == kEvent::erSUCCESS && !$this->Application->isAdmin ) {
$event->SetRedirectParam('opener', 's');
$event->redirect = $this->Application->GetVar('next_template');
}
}
/**
* Goes to next_template after post editing
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnUpdate(kEvent $event)
{
parent::OnUpdate($event);
if ($event->status == kEvent::erSUCCESS && !$this->Application->isAdmin) {
$event->SetRedirectParam('opener', 's');
$event->redirect = $this->Application->GetVar('next_template');
$event->SetRedirectParam('pass', 'm,bb');
}
}
/**
* Moves reference to last post in topic, when it is deleted
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnAfterItemDelete(kEvent $event)
{
parent::OnAfterItemDelete($event);
$object = $event->getObject();
/* @var $object kDBItem */
$topic_id = $object->GetDBField('TopicId');
if ( !$topic_id ) {
// deleting post from non-existing topic
return;
}
$post_helper = $this->Application->recallObject('PostHelper');
/* @var $post_helper PostHelper */
// update posts count in topic
$post_helper->updatePostCount($topic_id, -1);
// update post owner posts counter
$sql = 'UPDATE ' . TABLE_PREFIX . 'UserPersistentSessionData
SET VariableValue = IF (VariableValue > 0, VariableValue - 1, 0)
WHERE (PortalUserId = ' . $object->GetDBField('CreatedById') . ') AND (VariableName = "bb_posts")';
$this->Conn->Query($sql);
$main_object = $this->Application->recallObject('bb.-item', null, Array ('skip_autoload' => true));
/* @var $main_object kCatDBItem */
$main_object->Load($topic_id);
if ( !$main_object->isLoaded() ) {
// this is topic deletion proccess, when all it's posts are deleted too
return;
}
$post_helper->updateTodayPostsCount($main_object, $object->GetDBField('CreatedOn'), -1);
if ( $main_object->GetDBField('LastPostId') == $object->GetID() ) {
$sql = 'SELECT PostingId, CreatedOn
FROM ' . $object->TableName . '
WHERE TopicId = ' . $topic_id . '
ORDER BY PostingId DESC';
$last_post = $this->Conn->GetRow($sql);
$fields_hash = Array (
'LastPostId' => $last_post['PostingId'],
'LastPostDate' => $last_post['CreatedOn'],
);
$this->Conn->doUpdate($fields_hash, $main_object->TableName, $main_object->IDField . ' = ' . $topic_id);
}
}
/**
* Sets default values to posting options based on persistent session
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnAfterConfigRead(kEvent $event)
{
parent::OnAfterConfigRead($event);
$config = $event->getUnitConfig();
$virtual_fields = $config->getVirtualFields();
$virtual_fields['DisableBBCodes']['default'] = (int)!$this->Application->RecallPersistentVar('bbcode');
$virtual_fields['DisableSmileys']['default'] = (int)!$this->Application->RecallPersistentVar('smileys');
$virtual_fields['ShowSignatures']['default'] = (int)$this->Application->RecallPersistentVar('show_sig');
$config->setVirtualFields($virtual_fields);
}
/**
* Deletes items & preserves clean env
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnDelete(kEvent $event)
{
parent::OnDelete($event);
if ( $event->status == kEvent::erSUCCESS && !$this->Application->isAdmin ) {
$parent_prefix = $event->getUnitConfig()->getParentPrefix();
$event->SetRedirectParam('pass', 'm,' . $parent_prefix);
}
}
/**
* Prepares new reply form
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnNew(kEvent $event)
{
parent::OnNew($event);
$reply_to = $this->Application->GetVar('reply_to');
if ( $reply_to > 0 ) {
$object = $event->getObject();
/* @var $object kDBItem */
$source_post = $this->Application->recallObject($event->Prefix . '.-item', null, Array ('skip_autoload' => true));
/* @var $source_post kDBItem */
$source_post->Load($reply_to);
$object->SetDBField('Subject', 'Re: ' . $source_post->GetDBField('Subject'));
$object->SetDBField('PostingText', '[quote id=' . $reply_to . ']' . $source_post->GetDBField('PostingText') . '[/quote]');
}
}
}
\ No newline at end of file
Index: branches/5.3.x/units/polls/poll_eh.php
===================================================================
--- branches/5.3.x/units/polls/poll_eh.php (revision 15923)
+++ branches/5.3.x/units/polls/poll_eh.php (revision 15924)
@@ -1,179 +1,179 @@
<?php
/**
* @version $Id$
* @package In-Bulletin
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.org/license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
class PollEventHandler extends kDBEventHandler {
/**
* Allows to override standard permission mapping
*
* @return void
* @access protected
* @see kEventHandler::$permMapping
*/
protected function mapPermissions()
{
parent::mapPermissions();
$permissions = Array (
'OnResetVotes' => Array ('self' => 'edit'),
'OnMakeVote' => Array ('self' => true),
'OnItemBuild' => Array ('self' => true),
);
$this->permMapping = array_merge($this->permMapping, $permissions);
}
/**
* Applies special filter, that allows to select all poll from given date range
*
* @param kEvent $event
* @return void
* @access protected
* @see kDBEventHandler::OnListBuild()
*/
protected function SetCustomQuery(kEvent $event)
{
parent::SetCustomQuery($event);
if ( $this->Application->isAdminUser ) {
return;
}
$object = $event->getObject();
/* @var $object kDBList */
- $object->addFilter('poll_range_filter', '(%1$s.StartDate <= ' . adodb_mktime() . ') AND (%1$s.EndDate >= ' . adodb_mktime() . ' OR EndDate IS NULL)');
+ $object->addFilter('poll_range_filter', '(%1$s.StartDate <= ' . time() . ') AND (%1$s.EndDate >= ' . time() . ' OR EndDate IS NULL)');
$object->addFilter('poll_status', '(%1$s.Status = ' . STATUS_ACTIVE . ')');
}
/**
* Reset votes statistics for current poll
*
* @param kEvent $event
*/
function OnResetVotes($event)
{
$object = $event->getObject();
/* @var $object kDBItem */
$sql = 'DELETE FROM '.TABLE_PREFIX.'PollsStatistics
WHERE '.$object->IDField.' = '.$object->GetID();
$this->Conn->Query($sql);
$poll_answers_table = $this->Application->getUnitConfig('poll-answer')->getTableName();
$poll_answers_table = $this->Application->GetTempName($poll_answers_table);
$sql = 'UPDATE '.$poll_answers_table.'
SET VotesQty = 0
WHERE '.$object->IDField.' = '.$object->GetID();
$this->Conn->Query($sql);
}
/**
* Sets resource id
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnBeforeItemCreate(kEvent $event)
{
parent::OnBeforeItemCreate($event);
$object = $event->getObject();
/* @var $object kDBItem */
$object->SetDBField('ResourceId', $this->Application->NextResourceId());
}
/**
* Make vote to current poll
*
* @param kEvent $event
*/
function OnMakeVote($event)
{
$object = $event->getObject($this->Application->GetVar('poll_id'));
/* @var $object kDBItem */
$poll_answer_id = $this->Application->GetVar('option_id');
if (!$poll_answer_id) {
$event->redirect = false;
return ;
}
$ip_address = $this->Application->getClientIp();
if (!$object->GetDBField('AllowMultipleVotings')) {
$sql = 'SELECT StatisticsId
FROM '.TABLE_PREFIX.'PollsStatistics
WHERE PollId = '.$object->GetID().' AND UserIP = '.$this->Conn->qstr($ip_address);
$voted = $this->Conn->GetOne($sql) > 0;
}
if (!$voted) {
$user_id = $this->Application->RecallVar('user_id');
$fields_hash = Array (
'PollId' => $object->GetID(),
'AnswerId' => $poll_answer_id,
'UserIP' => $ip_address,
'CreatedById' => $user_id,
- 'AnswerDate' => adodb_mktime(),
+ 'AnswerDate' => time(),
);
$this->Conn->doInsert($fields_hash, TABLE_PREFIX.'PollsStatistics');
$poll_table = $this->Application->getUnitConfig('poll')->getTableName();
$sql = 'UPDATE ' . $poll_table . '
SET CachedVotesQty = CachedVotesQty + 1
WHERE PollId = ' . $object->GetID();
$this->Conn->Query($sql);
// update table with answers
$poll_answers_table = $this->Application->getUnitConfig('poll-answer')->getTableName();
$sql = 'UPDATE ' . $poll_answers_table . '
SET VotesQty = VotesQty + 1
WHERE PollId = ' . $object->GetID() . ' AND AnswerId = ' . $poll_answer_id;
$this->Conn->Query($sql);
}
$event->setEventParam('PollId', $this->Application->GetVar('poll_id'));
$event->redirect = false;
}
/**
* Cleanup by removing items from PollStatistics before Poll is deleted
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnAfterItemDelete(kEvent $event)
{
parent::OnAfterItemDelete($event);
$object = $event->getObject();
/* @var $object kDBItem */
$sql = 'DELETE FROM ' . TABLE_PREFIX . 'PollsStatistics
WHERE PollId = ' . $object->GetID();
$this->Conn->Query($sql);
}
}
\ No newline at end of file
Index: branches/5.3.x/install/upgrades.php
===================================================================
--- branches/5.3.x/install/upgrades.php (revision 15923)
+++ branches/5.3.x/install/upgrades.php (revision 15924)
@@ -1,101 +1,102 @@
<?php
/**
* @version $Id$
* @package In-Bulletin
* @copyright Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
* @license GNU/GPL
* In-Portal is Open Source software.
* This means that this software may have been modified pursuant
* the GNU General Public License, and as distributed it includes
* or is derivative of works licensed under the GNU General Public License
* or other free or open source software licenses.
* See http://www.in-portal.org/license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
$upgrade_class = 'InBulletinUpgrades';
/**
* Class, that holds all upgrade scripts for "In-Bulletin" module
*
*/
class InBulletinUpgrades extends kUpgradeHelper {
public function __construct()
{
parent::__construct();
$this->dependencies = Array (
'4.3.9' => Array ('Core' => '4.3.9'),
'5.0.0' => Array ('Core' => '5.0.0'),
'5.0.1' => Array ('Core' => '5.0.1'),
'5.0.2-B1' => Array ('Core' => '5.0.2-B1'),
'5.0.2-B2' => Array ('Core' => '5.0.2-B2'),
'5.0.2-RC1' => Array ('Core' => '5.0.2-RC1'),
'5.0.2' => Array ('Core' => '5.0.2'),
'5.0.3-B1' => Array ('Core' => '5.0.3-B1'),
'5.0.3-B2' => Array ('Core' => '5.0.3-B2'),
'5.0.3-RC1' => Array ('Core' => '5.0.3-RC1'),
'5.0.3' => Array ('Core' => '5.0.3'),
'5.0.4-B1' => Array ('Core' => '5.0.4-B1'),
'5.0.4-B2' => Array ('Core' => '5.0.4-B2'),
'5.0.4' => Array ('Core' => '5.0.4'),
'5.1.0-B1' => Array ('Core' => '5.1.0-B1'),
'5.1.0-B2' => Array ('Core' => '5.1.0-B2'),
'5.1.0-RC1' => Array ('Core' => '5.1.0-RC1'),
'5.1.0' => Array ('Core' => '5.1.0'),
'5.1.1-B1' => Array ('Core' => '5.1.1-B1'),
'5.1.1-B2' => Array ('Core' => '5.1.1-B2'),
'5.1.1-RC1' => Array ('Core' => '5.1.1-RC1'),
'5.1.1' => Array ('Core' => '5.1.1'),
'5.1.2-B1' => Array ('Core' => '5.1.2-B1'),
'5.1.2-RC1' => Array ('Core' => '5.1.2-RC1'),
'5.1.2' => Array ('Core' => '5.1.2'),
'5.1.3-B1' => Array ('Core' => '5.1.3-B1'),
'5.1.3-B2' => Array ('Core' => '5.1.3-B2'),
'5.1.3-RC1' => Array ('Core' => '5.1.3-RC1'),
'5.1.3-RC2' => Array ('Core' => '5.1.3-RC2'),
'5.1.3' => Array ('Core' => '5.1.3'),
'5.2.0-B1' => Array ('Core' => '5.2.0-B1'),
'5.2.0-B2' => Array ('Core' => '5.2.0-B2'),
'5.2.0-B3' => Array ('Core' => '5.2.0-B3'),
'5.2.0-RC1' => Array ('Core' => '5.2.0-RC1'),
'5.2.0' => Array ('Core' => '5.2.0'),
'5.2.1-B1' => Array ('Core' => '5.2.1-B1'),
'5.2.1-B2' => Array ('Core' => '5.2.1-B2'),
'5.2.1-RC1' => Array ('Core' => '5.2.1-RC1'),
+ '5.3.0-B1' => Array ('Core' => '5.3.0-B1'),
);
}
/**
* Changes table structure, where multilingual fields of TEXT type are present
*
* @param string $mode when called mode {before, after)
*/
function Upgrade_5_0_0($mode)
{
if ($mode == 'after') {
$categories_config = $this->Application->getUnitConfig('c');
$root_category = $this->Application->findModule('Name', 'In-Bulletin', 'RootCat');
$sql = 'UPDATE ' . $categories_config->getTableName() . '
SET UseMenuIconUrl = 1, MenuIconUrl = "in-bulletin/img/menu_topics.gif"
WHERE ' . $categories_config->getIDField() . ' = ' . $root_category;
$this->Conn->Query($sql);
$this->_updateDetailTemplate('bb', 'inbulletin/post_list', 'in-bulletin/designs/detail');
}
}
/**
* Update to 5.0.1, update details template
*
* @param string $mode when called mode {before, after)
*/
function Upgrade_5_0_1($mode)
{
if ($mode == 'after') {
$this->_updateDetailTemplate('bb', 'in-bulletin/designs/detail', 'in-bulletin/topics/topic_detail');
}
}
}
\ No newline at end of file
Index: branches/5.3.x/install/upgrades.sql
===================================================================
--- branches/5.3.x/install/upgrades.sql (revision 15923)
+++ branches/5.3.x/install/upgrades.sql (revision 15924)
@@ -1,275 +1,277 @@
# ===== v 4.3.9 =====
ALTER TABLE Emoticon
ADD EmotionImage VARCHAR(255) NOT NULL,
ADD INDEX (EmotionImage),
DROP ImageId;
UPDATE Emoticon SET EmotionImage = CONCAT('0_',EmoticonId,'.gif') WHERE EmoticonId < 21;
# ===== v 5.0.0 =====
CREATE TABLE Polls (
PollId int(11) NOT NULL auto_increment,
`Name` varchar(255) NOT NULL default '',
l1_Question text,
l2_Question text,
l3_Question text,
l4_Question text,
l5_Question text,
Image varchar(255) NOT NULL default '',
CreatedOn int(11) unsigned NOT NULL,
StartDate int(11) unsigned NOT NULL,
EndDate int(11) unsigned default NULL,
Priority tinyint(4) NOT NULL default '0',
RequireLogin tinyint(4) NOT NULL default '0',
AllowMultipleVotings tinyint(4) NOT NULL default '1',
AllowComments tinyint(4) NOT NULL default '1',
`Status` tinyint(4) NOT NULL default '1',
CachedVotesQty int(11) NOT NULL,
PRIMARY KEY (PollId),
KEY `Status` (`Status`),
KEY Priority (Priority),
KEY StartDate (StartDate),
KEY EndDate (EndDate)
);
CREATE TABLE PollsAnswers (
AnswerId int(11) NOT NULL auto_increment,
PollId int(11) NOT NULL,
l1_Answer text,
l2_Answer text,
l3_Answer text,
l4_Answer text,
l5_Answer text,
VotesQty int(11) NOT NULL,
Priority int(11) NOT NULL default '0',
Status tinyint(4) NOT NULL default '1',
PRIMARY KEY (AnswerId),
KEY Status (Status),
KEY Priority (Priority),
KEY VoteCount (VotesQty),
KEY PollId (PollId)
);
CREATE TABLE PollsComments (
CommentId int(11) NOT NULL auto_increment,
PollId int(11) NOT NULL,
AnswerId int(11) default NULL,
CreatedById int(11) NOT NULL default '-2',
GuestName varchar(255) NOT NULL,
GuestEmail varchar(255) NOT NULL,
CommentBody text,
CreatedOn int(11) NOT NULL,
UserIP varchar(255) NOT NULL,
Priority int(11) NOT NULL,
`Status` tinyint(4) NOT NULL default '1',
PRIMARY KEY (CommentId),
KEY `Status` (`Status`),
KEY Priority (Priority),
KEY CreatedOn (CreatedOn),
KEY AnswerId (AnswerId),
KEY PollId (PollId),
KEY CreatedById (CreatedById)
);
CREATE TABLE PollsStatistics (
StatisticsId int(11) NOT NULL auto_increment,
PollId int(11) NOT NULL default '0',
AnswerId int(11) NOT NULL default '0',
CreatedById int(11) NOT NULL default '-2',
UserIP varchar(255) NOT NULL,
AnswerDate int(10) unsigned default NULL,
PRIMARY KEY (StatisticsId),
KEY AnswerId (AnswerId,PollId),
KEY CreatedById (CreatedById),
KEY UserIP (UserIP)
);
INSERT INTO ConfigurationAdmin VALUES ('poll_CommentDelay_Value', 'la_Text_Polls', 'la_prompt_DupPollComments', 'text', '', '', 60.1, 1, 1);
INSERT INTO ConfigurationAdmin VALUES ('poll_CommentDelay_Interval', 'la_Text_Polls', 'la_prompt_DupPollComments', 'select', '', '1=la_Text_Second,60=la_Text_Minute,3600=la_Text_Hour,86400=la_Text_Day,604800=la_Text_Week,2419200=la_Text_Month,29030400=la_text_Year', 60.2, 2, 1);
INSERT INTO ConfigurationValues VALUES (DEFAULT, 'poll_CommentDelay_Interval', '60', 'In-Bulletin', 'in-bulletin:configuration_output');
INSERT INTO ConfigurationValues VALUES (DEFAULT, 'poll_CommentDelay_Value', '10', 'In-Bulletin', 'in-bulletin:configuration_output');
UPDATE Category SET Template = '/in-bulletin/designs/section' WHERE Template = 'inbulletin/index';
UPDATE Category SET CachedTemplate = '/in-bulletin/designs/section' WHERE CachedTemplate = 'inbulletin/index';
UPDATE ConfigurationValues SET VariableValue = '/in-bulletin/designs/section' WHERE VariableName = 'bb_CategoryTemplate';
UPDATE ConfigurationValues SET VariableValue = 'in-bulletin/designs/detail' WHERE VariableName = 'bb_ItemTemplate';
INSERT INTO Permissions VALUES (DEFAULT, 'in-bulletin:topics.view', 11, 1, 1, 0);
INSERT INTO Permissions VALUES (DEFAULT, 'in-bulletin:setting_folder.view', 11, 1, 1, 0);
DELETE FROM Permissions WHERE Permission LIKE 'in-bulletin:inbulletin_general.%';
UPDATE Phrase SET Module = 'In-Bulletin' WHERE ((Phrase LIKE '%Topic%' OR Phrase LIKE '%Post%' OR Phrase LIKE '%Forum%' OR Phrase LIKE '%Censor%' OR Phrase LIKE '%Smiley%' OR Phrase = 'la_title_In-Bulletin') AND (Module = 'Core'));
# ===== v 5.0.1 =====
UPDATE ConfigurationValues SET VariableValue = 'in-bulletin/topics/topic_detail' WHERE VariableName = 'bb_ItemTemplate';
UPDATE ConfigurationAdmin
SET ValueList = 'TopicText=la_opt_TopicText,Posts=la_opt_NumberOfPosts,CreatedOn=la_opt_CreatedOn,LastPostDate=la_opt_LastUpdated,Views=la_opt_TopicViews,CachedRating=la_opt_Rating,LastPoser=la_opt_LastPoster,<SQL>SELECT Prompt AS OptionName, CONCAT("cust_", FieldName) AS OptionValue FROM <PREFIX>CustomField WHERE (Type = 3) AND (IsSystem = 0)</SQL>'
WHERE VariableName IN ('Topic_SortField', 'Topic_SortField2');
UPDATE ConfigurationAdmin
SET ValueList = 'ASC=la_common_Ascending,DESC=la_common_Descending'
WHERE VariableName IN ('Topic_SortOrder', 'Topic_SortOrder2');
UPDATE ConfigurationAdmin SET ValueList = '1=la_opt_Sec,60=la_opt_Min,3600=la_opt_Hour,86400=la_opt_Day,604800=la_opt_Week,2419200=la_opt_Month,29030400=la_opt_Year' WHERE VariableName = 'topic_ReviewDelay_Interval';
UPDATE ConfigurationAdmin SET ValueList = '1=la_opt_Sec,60=la_opt_Min,3600=la_opt_Hour,86400=la_opt_Day,604800=la_opt_Week,2419200=la_opt_Month,29030400=la_opt_Year' WHERE VariableName = 'topic_RatingDelay_Interval';
UPDATE ConfigurationAdmin SET ValueList = '1=la_opt_Sec,60=la_opt_Min,3600=la_opt_Hour,86400=la_opt_Day,604800=la_opt_Week,2419200=la_opt_Month,29030400=la_opt_Year' WHERE VariableName = 'poll_CommentDelay_Interval';
UPDATE CustomField SET FieldLabel = 'la_fld_cust_bb_ItemTemplate', Prompt = 'la_fld_cust_bb_ItemTemplate' WHERE FieldName = 'bb_ItemTemplate';
INSERT INTO Events VALUES(DEFAULT, 'TOPIC.ADD', NULL, 1, 1, NULL, 'In-Bulletin', 'la_event_topic.add', 0);
INSERT INTO Events VALUES(DEFAULT, 'TOPIC.ADD.PENDING', NULL, 1, 1, NULL, 'In-Bulletin', 'la_event_topic.add.pending', 1);
INSERT INTO Events VALUES(DEFAULT, 'TOPIC.ADD.PENDING', NULL, 1, 1, NULL, 'In-Bulletin', 'la_event_topic.add.pending', 0);
INSERT INTO Events VALUES(DEFAULT, 'TOPIC.MODIFY', NULL, 1, 1, NULL, 'In-Bulletin', 'la_event_topic.modify', 1);
INSERT INTO Events VALUES(DEFAULT, 'TOPIC.MODIFY', NULL, 1, 1, NULL, 'In-Bulletin', 'la_event_topic.modify', 0);
INSERT INTO Events VALUES(DEFAULT, 'TOPIC.MODIFY.PENDING', NULL, 1, 1, NULL, 'In-Bulletin', 'la_event_topic.modify.pending', 1);
INSERT INTO Events VALUES(DEFAULT, 'TOPIC.MODIFY.PENDING', NULL, 1, 1, NULL, 'In-Bulletin', 'la_event_topic.modify.pending', 0);
INSERT INTO Events VALUES(DEFAULT, 'TOPIC.APPROVE', NULL, 1, 0, NULL, 'In-Bulletin', 'la_event_topic.approve', 0);
UPDATE ConfigurationAdmin SET ValueList = 'style="width: 50px;"' WHERE VariableName IN ('topic_ReviewDelay_Value', 'topic_RatingDelay_Value', 'poll_CommentDelay_Value');
# ===== v 5.0.2-B1 =====
ALTER TABLE PrivateMessageBody CHANGE Body Body text NULL;
ALTER TABLE Emoticon CHANGE EmotionImage EmotionImage VARCHAR(255) NOT NULL DEFAULT '';
ALTER TABLE Polls
CHANGE CreatedOn CreatedOn INT(11) UNSIGNED NULL DEFAULT NULL ,
CHANGE StartDate StartDate INT(11) UNSIGNED NULL DEFAULT NULL ,
CHANGE CachedVotesQty CachedVotesQty INT(11) NOT NULL DEFAULT '0';
ALTER TABLE PollsAnswers
CHANGE PollId PollId INT(11) NOT NULL DEFAULT '0',
CHANGE VotesQty VotesQty INT(11) NOT NULL DEFAULT '0';
ALTER TABLE PollsComments
CHANGE PollId PollId INT(11) NOT NULL DEFAULT '0',
CHANGE GuestName GuestName VARCHAR(255) NOT NULL DEFAULT '',
CHANGE GuestEmail GuestEmail VARCHAR(255) NOT NULL DEFAULT '',
CHANGE CreatedOn CreatedOn INT(11) NULL DEFAULT NULL ,
CHANGE UserIP UserIP VARCHAR(255) NOT NULL DEFAULT '',
CHANGE Priority Priority INT(11) NOT NULL DEFAULT '0';
ALTER TABLE PollsStatistics CHANGE UserIP UserIP VARCHAR(255) NOT NULL DEFAULT '';
ALTER TABLE Posting
CHANGE CreatedOn CreatedOn INT(11) NULL DEFAULT NULL,
CHANGE Modified Modified INT(11) NULL DEFAULT NULL;
ALTER TABLE PrivateMessages CHANGE CreatedOn CreatedOn INT(11) UNSIGNED NULL DEFAULT NULL;
ALTER TABLE Topic
CHANGE Modified Modified INT(11) NULL DEFAULT NULL,
CHANGE CreatedOn CreatedOn INT(11) NULL DEFAULT NULL;
# ===== v 5.0.2-B2 =====
# ===== v 5.0.2-RC1 =====
# ===== v 5.0.2 =====
# ===== v 5.0.3-B1 =====
# ===== v 5.0.3-B2 =====
# ===== v 5.0.3-RC1 =====
# ===== v 5.0.3 =====
# ===== v 5.0.4-B1 =====
# ===== v 5.0.4-B2 =====
# ===== v 5.0.4 =====
# ===== v 5.1.0-B1 =====
UPDATE Modules SET Path = 'modules/in-bulletin/' WHERE `Name` = 'In-Bulletin';
DELETE FROM ConfigurationValues WHERE VariableName IN (
'Post_Sortfield', 'Post_SortOrder', 'Perpage_PrivateMessages', 'Topic_Root',
'Topic_Background1', 'Topic_Background2', 'Post_Background1', 'Post_Background2',
'Posting_SortOrder', 'Bulletin_TopCount', 'Bulletin_CatNewDays', 'Bulletin_Pick_First'
);
UPDATE ConfigurationValues SET ModuleOwner = 'In-Bulletin' WHERE VariableName = 'BBTags';
UPDATE Phrase SET Module = 'Core' WHERE Phrase = 'la_fld_Replacement';
DELETE FROM Permissions WHERE Permission LIKE 'in-bulletin:configuration_email%';
# ===== v 5.1.0-B2 =====
# ===== v 5.1.0-RC1 =====
# ===== v 5.1.0 =====
# ===== v 5.1.1-B1 =====
ALTER TABLE PollsComments CHANGE CreatedById CreatedById INT(11) NULL DEFAULT NULL;
ALTER TABLE Topic
CHANGE OwnerId OwnerId INT( 11 ) NULL DEFAULT NULL ,
CHANGE ModifiedById ModifiedById INT( 11 ) NULL DEFAULT NULL;
UPDATE Topic SET ModifiedById = NULL WHERE ModifiedById = 0;
# ===== v 5.1.1-B2 =====
# ===== v 5.1.1-RC1 =====
# ===== v 5.1.1 =====
# ===== v 5.1.2-B1 =====
# ===== v 5.1.2-RC1 =====
# ===== v 5.1.2 =====
# ===== v 5.1.3-B1 =====
# ===== v 5.1.3-B2 =====
# ===== v 5.1.3-RC1 =====
UPDATE ConfigurationValues
SET VariableValue = 'in-bulletin/topics/topic_detail'
WHERE VariableName = 'bb_ItemTemplate' AND VariableValue = 'in-bulletin/designs/detail';
# ===== v 5.1.3-RC2 =====
# ===== v 5.1.3 =====
UPDATE Phrase
SET `Module` = 'Core'
WHERE PhraseKey = 'LA_FLD_REQUIRELOGIN';
# ===== v 5.2.0-B1 =====
UPDATE SearchConfig
SET DisplayName = REPLACE(DisplayName, 'lu_', 'lc_')
WHERE DisplayName IN (
'lu_field_notifyowneronchanges', 'lu_field_topicid', 'lu_field_ownerid',
'lu_field_topictext', 'lu_field_postedby', 'lu_field_lastpostid'
);
DELETE FROM LanguageLabels
WHERE PhraseKey IN ('LA_POSTS_NEWDAYS_PROMPT');
DELETE FROM SystemSettings
WHERE VariableName IN ('Topic_Highlight_OpenTag', 'Topic_Highlight_CloseTag', 'Posts_NewDays');
# ===== v 5.2.0-B2 =====
UPDATE Topic main_table
SET main_table.CachedReviewsQty = (SELECT COUNT(*) FROM <%TABLE_PREFIX%>CatalogReviews review_table WHERE review_table.ItemId = main_table.ResourceId);
# ===== v 5.2.0-B3 =====
INSERT INTO EmailEvents (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient, BindToSystemEvent) VALUES(DEFAULT, 'POST.ADD.SUB', NULL, 1, 0, 'In-Bulletin', 'Post Added (for subscribers)', 0, 1, 0, 'bb-post:OnCreate');
INSERT INTO EmailEvents (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient, BindToSystemEvent) VALUES(DEFAULT, 'TOPIC.ADD.SUB', NULL, 1, 0, 'In-Bulletin', 'Topic Added (for subscribers)', 0, 1, 0, 'bb:OnCreate');
# ===== v 5.2.0-RC1 =====
# ===== v 5.2.0 =====
INSERT INTO Permissions VALUES(DEFAULT, 'in-bulletin:configuration_output.add', 11, 1, 1, 0);
# ===== v 5.2.1-B1 =====
# ===== v 5.2.1-B2 =====
UPDATE Modules
SET ClassNamespace = 'Intechnic\\InPortal\\Modules\\InBulletin'
WHERE `Name` = 'In-Bulletin';
# ===== v 5.2.1-RC1 =====
+
+# ===== v 5.3.0-B1 =====

Event Timeline