Index: branches/5.0.x/in-news/units/articles/articles_config.php =================================================================== --- branches/5.0.x/in-news/units/articles/articles_config.php (revision 12304) +++ branches/5.0.x/in-news/units/articles/articles_config.php (revision 12305) @@ -1,462 +1,461 @@ <?php /** * @version $Id$ * @package In-News * @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.net/license/ for copyright notices and details. */ -$config = Array( +defined('FULL_PATH') or die('restricted access!'); + + $config = Array( 'Prefix' => 'n', 'ItemClass' => Array('class' => 'kCatDBItem', 'file' => '', 'build_event' => 'OnItemBuild'), 'ListClass' => Array('class' => 'kCatDBList', 'file' => '', 'build_event' => 'OnListBuild'), 'EventHandlerClass' => Array('class' => 'ArticlesEventHandler', 'file' => 'articles_event_handler.php', 'require_classes' => Array('kCatDBEventHandler'), 'build_event' => 'OnBuild'), 'TagProcessorClass' => Array('class' => 'ArticlesTagProcessor', 'file' => 'articles_tag_processor.php', 'require_classes' => Array('kCatDBTagProcessor'), 'build_event' => 'OnBuild'), 'AutoLoad' => true, 'ConfigPriority' => 0, 'RewritePriority' => 102, 'RewriteListener' => 'ModRewriteHelper:CategoryItemRewriteListener', 'Hooks' => Array ( Array ( 'Mode' => hAFTER, 'Conditional' => false, 'HookToPrefix' => 'c', 'HookToSpecial' => '*', 'HookToEvent' => Array('OnAfterConfigRead'), 'DoPrefix' => '', 'DoSpecial' => '', 'DoEvent' => 'OnUpdateCategoryCustomFields', ), Array ( 'Mode' => hBEFORE, 'Conditional' => false, 'HookToPrefix' => '', 'HookToSpecial' => '*', 'HookToEvent' => Array('OnAfterConfigRead'), 'DoPrefix' => '#file', 'DoSpecial' => '*', 'DoEvent' => 'OnDefineFiles', ), Array ( 'Mode' => hBEFORE, 'Conditional' => false, 'HookToPrefix' => '', 'HookToSpecial' => '*', 'HookToEvent' => Array('OnAfterConfigRead'), 'DoPrefix' => 'cdata', 'DoSpecial' => '*', 'DoEvent' => 'OnDefineCustomFields', ), ), 'CatalogItem' => true, 'AdminTemplatePath' => 'articles', 'AdminTemplatePrefix' => 'articles_', 'SearchConfigPostfix' => 'articles', 'QueryString' => Array( 1 => 'id', 2 => 'Page', 3 => 'event', 4 => 'mode', ), 'RegularEvents' => Array( 'rss_category_update' => Array('EventName' => 'OnUpdateRSSAtricles', 'RunInterval' => 0, 'Type' => reBEFORE), ), 'IDField' => 'NewsId', 'StatusField' => Array('Status'), // field, that is affected by Approve/Decline events 'TitleField' => 'Title', // field, used in bluebar when editing existing item 'TitlePhrase' => 'la_Text_Article', // phrase used to specify item type in relationship list 'TitlePresets' => Array( 'default' => Array( 'new_status_labels' => Array('n' => '!la_title_AddingArticle!'), 'edit_status_labels' => Array('n' => '!la_title_EditingArticle!'), 'new_titlefield' => Array('n' => '!la_title_NewArticle!'), ), 'articles_edit' => Array('prefixes' => Array('n'), 'format' => "#n_status# '#n_titlefield#' - !la_title_General!"), 'articles_categories'=>Array('prefixes' => Array('n','n-ci_List'), 'format' => "#n_status# '#n_titlefield#' - !la_title_Categories!"), 'articles_relations'=> Array('prefixes' => Array('n'), 'format' => "#n_status# '#n_titlefield#' - !la_title_Relations!"), 'articles_images' => Array('prefixes' => Array('n'), 'format' => "#n_status# '#n_titlefield#' - !la_title_Images!"), 'articles_files' => Array('prefixes' => Array('n'), 'format' => "#n_status# '#n_titlefield#' - !la_title_Files!"), 'articles_reviews' => Array('prefixes' => Array('n'), 'format' => "#n_status# '#n_titlefield#' - !la_title_Reviews!"), 'articles_custom' => Array('prefixes' => Array('n'), 'format' => "#n_status# '#n_titlefield#' - !la_title_Custom!"), 'images_edit' => Array( 'prefixes' => Array('n', 'n-img'), 'new_status_labels' => Array('n-img'=>'!la_title_Adding_Image!'), 'edit_status_labels' => Array('n-img'=>'!la_title_Editing_Image!'), 'new_titlefield' => Array('n-img'=>'!la_title_New_Image!'), 'format' => "#n_status# '#n_titlefield#' - #n-img_status# '#n-img_titlefield#'", ), 'file_edit' => Array ( 'prefixes' => Array ('n', 'n-file'), 'new_status_labels' => Array ('n-file' => "!la_title_AddingFile!"), 'edit_status_labels' => Array ('n-file' => '!la_title_EditingFile!'), 'new_titlefield' => Array ('n-file' => '!la_title_NewFile!'), 'format' => "#n_status# '#n_titlefield#' - #n-file_status# '#n-file_titlefield#'", ), 'reviews_edit' => Array( 'prefixes' => Array('n', 'n-rev'), 'new_status_labels' => Array('n-rev'=>"!la_title_Adding_Review! '!la_title_New_Review!'"), 'edit_status_labels' => Array('n-rev'=>'!la_title_Editing_Review!'), 'format' => "#n_status# '#n_titlefield#' - #n-rev_status#", ), 'relations_edit' => Array( 'prefixes' => Array('n', 'n-rel'), 'new_status_labels' => Array('n-rel'=>"!la_title_Adding_Relationship! '!la_title_New_Relationship!'"), 'edit_status_labels' => Array('n-rel'=>'!la_title_Editing_Relationship!'), 'format' => "#n_status# '#n_titlefield#' - #n-rel_status#", ), 'tree_in-news' => Array('format' => '!la_Text_Version! '.$this->Application->findModule('Name', 'In-News', 'Version')), 'articles_export' => Array('format' => '!la_title_ArticlesExport!'), 'articles_import' => Array('format' => '!la_title_ImportArticles!'), ), 'EditTabPresets' => Array ( 'Default' => Array ( Array ('title' => 'la_tab_General', 't' => 'in-news/articles/articles_edit', 'priority' => 1), Array ('title' => 'la_tab_Categories', 't' => 'in-news/articles/articles_categories', 'priority' => 2), Array ('title' => 'la_tab_Relations', 't' => 'in-news/articles/articles_relations', 'priority' => 3), Array ('title' => 'la_tab_Images', 't' => 'in-news/articles/articles_images', 'priority' => 4), Array ('title' => 'la_tab_Files', 't' => 'in-news/articles/articles_files', 'priority' => 5), Array ('title' => 'la_tab_Reviews', 't' => 'in-news/articles/articles_reviews', 'priority' => 6), Array ('title' => 'la_tab_Custom', 't' => 'in-news/articles/articles_custom', 'priority' => 7), ), ), 'PermItemPrefix' => 'NEWS', 'PermTabText' => 'In-News', 'PermSection' => Array('main' => 'CATEGORY:in-news:articles_list', 'search' => 'in-news:configuration_search', 'email' => 'in-news:configuration_email', 'custom' => 'in-news:configuration_custom'), 'Sections' => Array( /*'in-news' => Array( 'parent' => 'in-portal:root', 'icon' => 'settings_in-newz', 'label' => 'la_title_In-News', 'url' => Array('t' => 'index', 'pass_section' => true, 'pass' => 'm'), 'permissions' => Array('view'), 'priority' => 3.2, 'container' => true, 'type' => stTREE, ),*/ 'in-news:articles' => Array( 'parent' => 'in-portal:site', 'icon' => 'settings_in-newz', 'label' => 'la_tab_Articles', 'url' => Array('t' => 'catalog/advanced_view', 'anchor' => 'tab-n.showall', 'pass' => 'm'), 'onclick' => 'setCatalogTab(\'n.showall\')', 'permissions' => Array('view'), 'priority' => 3, 'type' => stTREE, ), // article settings 'in-news:setting_folder' => Array ( 'parent' => 'in-portal:system', 'icon' => 'core:conf', 'label' => 'la_title_In-News', 'url' => Array ('t' => 'index', 'pass_section' => true, 'pass' => 'm'), 'permissions' => Array ('view'), 'priority' => 3.4, 'container' => true, 'type' => stTREE, ), /*'in-news:innews_general' => Array( 'parent' => 'in-news:setting_folder', 'icon' => 'core:settings_general', 'label' => 'la_tab_GeneralSettings', 'url' => Array('t' => 'config/config_general', 'pass_section' => true, 'pass' => 'm'), 'permissions' => Array('view', 'edit'), 'priority' => 1, 'type' => stTREE, ),*/ 'in-news:configuration_output' => Array( 'parent' => 'in-news:setting_folder', 'icon' => 'core:settings_output', 'label' => 'la_tab_ConfigOutput', 'url' => Array('t' => 'config/config_general', 'pass_section' => true, 'pass' => 'm'), 'permissions' => Array('view', 'edit'), 'priority' => 2, 'type' => stTREE, ), 'in-news:configuration_search' => Array( 'parent' => 'in-news:setting_folder', 'icon' => 'core:settings_search', 'label' => 'la_tab_ConfigSearch', 'url' => Array('t' => 'config/config_search', 'module_key' => 'articles', 'pass_section' => true, 'pass' => 'm'), 'permissions' => Array('view', 'edit'), 'priority' => 3, 'type' => stTREE, ), 'in-news:configuration_email' => Array( 'parent' => 'in-news:setting_folder', 'icon' => 'core:settings_email', 'label' => 'la_tab_ConfigE-mail', 'url' => Array('t' => 'config/config_email', 'pass_section' => true, 'pass' => 'm'), 'permissions' => Array('view', 'edit'), 'priority' => 4, 'type' => stTREE, ), 'in-news:configuration_custom' => Array( 'parent' => 'in-news:setting_folder', 'icon' => 'core:settings_custom', 'label' => 'la_tab_ConfigCustom', 'url' => Array('t' => 'custom_fields/custom_fields_list', 'cf_type' => 2, 'pass_section' => true, 'pass' => 'm,cf'), 'permissions' => Array('view', 'add', 'edit', 'delete'), 'priority' => 5, 'type' => stTREE, ), ), 'FilterMenu' => Array( 'Groups' => Array( Array('mode' => 'AND', 'filters' => Array('show_active','show_pending','show_disabled'), 'type' => WHERE_FILTER), Array('mode' => 'AND', 'filters' => Array('show_new'), 'type' => HAVING_FILTER), Array('mode' => 'AND', 'filters' => Array('show_hot'), 'type' => HAVING_FILTER), Array('mode' => 'AND', 'filters' => Array('show_pop'), 'type' => HAVING_FILTER), Array('mode' => 'AND', 'filters' => Array('show_pick'), 'type' => WHERE_FILTER), ), 'Filters' => Array( 'show_active' => Array('label' =>'la_Active', 'on_sql' => '', 'off_sql' => '%1$s.Status != 1' ), 'show_pending' => Array('label' => 'la_Pending', 'on_sql' => '', 'off_sql' => '%1$s.Status != 2' ), 'show_disabled' => Array('label' => 'la_Disabled', 'on_sql' => '', 'off_sql' => '%1$s.Status != 0' ), 's1' => Array(), 'show_new' => Array('label' => 'la_Text_New', 'on_sql' => '', 'off_sql' => '`IsNew` != 1' ), 'show_hot' => Array('label' => 'la_Text_Hot', 'on_sql' => '', 'off_sql' => '`IsHot` != 1' ), 'show_pop' => Array('label' => 'la_Text_Pop', 'on_sql' => '', 'off_sql' => '`IsPop` != 1' ), 'show_pick' => Array('label' => 'la_prompt_EditorsPick', 'on_sql' => '', 'off_sql' => '%1$s.`EditorsPick` != 1' ), ) ), 'CatalogSelectorName' => 'newslist', 'ItemPropertyMappings' => Array( 'NewDays' => 'News_CatNewDays', // number of days item to be NEW 'MinPopVotes' => 'News_MinPopVotes', // minimum number of votes for an item to be POP 'MinPopRating' => 'News_MinPopRating',// minimum rating for an item to be POP 'MaxHotNumber' => 'News_MaxHotNumber',// maximum number of HOT items 'HotLimit' => 'News_HotLimit', // variable name in inp_Cache table 'ClickField' => 'Hits', // item click count is stored here (in item table) ), 'ItemType' => 2, // this is used when relation to product is added from in-portal and via-versa 'ViewMenuPhrase' => 'la_title_Articles', 'CatalogTabIcon' => 'in-news:icon16_article.gif', 'UsePendingEditing' => true, // item editing is controlled by NEWS.ADD/EDIT, NEWS.ADD/EDIT.PENDING permissions 'StatisticsInfo' => Array( 'pending' => Array( 'icon' => 'icon16_article_pending.gif', 'label' => 'la_Text_Articles', 'js_url' => '#url#', 'url' => Array('t' => 'catalog/advanced_view', 'SetTab' => 'n', 'pass' => 'm,n.showall', 'n.showall_event' => 'OnSetFilterPattern', 'n.showall_filters' => 'show_active=0,show_pending=1,show_disabled=0,show_new=1,show_hot=1,show_pop=1,show_pick=1'), 'status' => STATUS_PENDING, ), ), 'TableName' => TABLE_PREFIX.'News', 'CalculatedFields' => Array( '' => Array ( 'UserName' => 'IF (ISNULL(u.Login), IF (%1$s.CreatedById = -1, "root", IF (%1$s.CreatedById = -2, "Guest", "n/a")), u.Login)', 'CategoryId' => TABLE_PREFIX.'%3$sCategoryItems.CategoryId', 'Filename' => TABLE_PREFIX.'%3$sCategoryItems.Filename', 'CategoryFilename' => TABLE_PREFIX.'Category.NamedParentPath', 'PrimaryCat' => TABLE_PREFIX.'%3$sCategoryItems.PrimaryCat', 'ParentPath' => TABLE_PREFIX.'Category.ParentPath', 'SameImages' => 'img.SameImages', 'LocalThumb' => 'img.LocalThumb', 'ThumbPath' => 'img.ThumbPath', 'ThumbUrl' => 'img.ThumbUrl', 'LocalImage' => 'img.LocalImage', 'LocalPath' => 'img.LocalPath', 'FullUrl' => 'img.Url', ), ), 'CacheModRewrite' => true, 'ListSQLs' => Array( ''=>' SELECT %1$s.* %2$s FROM %1$s LEFT JOIN '.TABLE_PREFIX.'%3$sCategoryItems ON '.TABLE_PREFIX.'%3$sCategoryItems.ItemResourceId = %1$s.ResourceId LEFT JOIN '.TABLE_PREFIX.'Category ON '.TABLE_PREFIX.'Category.CategoryId = '.TABLE_PREFIX.'%3$sCategoryItems.CategoryId LEFT JOIN '.TABLE_PREFIX.'Images img ON img.ResourceId = %1$s.ResourceId AND img.DefaultImg = 1 LEFT JOIN '.TABLE_PREFIX.'PermCache perm ON perm.CategoryId = '.TABLE_PREFIX.'%3$sCategoryItems.CategoryId LEFT JOIN '.TABLE_PREFIX.'PortalUser u ON %1$s.CreatedById = u.PortalUserId LEFT JOIN '.TABLE_PREFIX.'%3$sNewsCustomData cust ON %1$s.ResourceId = cust.ResourceId', ), // key - special, value - list select sql 'ListSortings' => Array( '' => Array( 'ForcedSorting' => Array('Priority' => 'desc'), 'Sorting' => Array('Title' => 'asc'), ) ), 'ItemSQLs' => Array( ''=>' SELECT %1$s.* %2$s FROM %1$s LEFT JOIN '.TABLE_PREFIX.'%3$sCategoryItems ON '.TABLE_PREFIX.'%3$sCategoryItems.ItemResourceId = %1$s.ResourceId LEFT JOIN '.TABLE_PREFIX.'Category ON '.TABLE_PREFIX.'Category.CategoryId = '.TABLE_PREFIX.'%3$sCategoryItems.CategoryId LEFT JOIN '.TABLE_PREFIX.'Images img ON img.ResourceId = %1$s.ResourceId AND img.DefaultImg = 1 LEFT JOIN '.TABLE_PREFIX.'PortalUser u ON %1$s.CreatedById = u.PortalUserId LEFT JOIN '.TABLE_PREFIX.'%3$sNewsCustomData cust ON %1$s.ResourceId = cust.ResourceId'), 'SubItems' => Array('n-rev', 'n-ci', 'n-rel', 'n-img', 'n-cdata', 'n-fav', 'n-file'), 'Fields' => Array ( 'NewsId' => Array('type' => 'int', 'not_null' => 1, 'default' => 0,), 'Title' => Array('type' => 'string', /*'formatter' => 'kMultiLanguage', */'not_null' => 1, 'required' => 1, 'default' => '', 'max_len' => 255), 'AutomaticFilename' => Array('type' => 'int', 'not_null' => 1, 'default' => 1), 'Excerpt' => Array('type' => 'string', /*'formatter' => 'kMultiLanguage',*/ 'default' => null), 'Author' => Array('type' => 'string', 'not_null' => 1, 'default' => ''), 'Body' => Array('type' => 'string', 'formatter' => 'kFormatter',/*'kMultiLanguage'*/ 'using_fck' => 1, 'required' => 1, 'default' => null), 'CreatedOn' => Array('type' => 'int', 'formatter' => 'kDateFormatter', 'required' => 1, 'not_null' => 1,'default' => '#NOW#'), 'TextFormat' => Array('type' => 'int', 'not_null' => 1, 'default' => 0), 'EndOn' => Array('type' => 'int', 'formatter' => 'kDateFormatter', 'default' => null), 'Hits' => Array('type' => 'double', 'formatter' => 'kFormatter', 'format' => '%d', 'not_null' => 1, 'default' => 0), 'CachedRating' => Array('type' => 'string', 'default' => 0), 'CachedVotesQty' => Array('type' => 'int','not_null' => 1,'default' => 0), 'CreatedById' => Array('type' => 'int', 'formatter' => 'kLEFTFormatter', 'error_msgs' => Array ('invalid_option' => '!la_error_UserNotFound!'), 'options' => Array(-1 => 'root', -2 => 'Guest'),'left_sql'=>'SELECT %s FROM '.TABLE_PREFIX.'PortalUser WHERE `%s` = \'%s\'', 'left_key_field' => 'PortalUserId', 'left_title_field' => 'Login', 'not_null' => 1, 'required' => 1, 'default' => -1), 'Priority' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0), 'Status' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Active', 2 => 'la_Pending', 0 => 'la_Disabled'), 'use_phrases' => 1, 'not_null' => 1, 'default' => 2), 'EditorsPick' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1, 'not_null' => 1, 'default' => 0), 'LeadStory' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1, 'not_null' => 1, 'default' => 0), 'LeadCatStory' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1, 'not_null' => 1, 'default' => 0), 'ResourceId' => Array('type' => 'int', 'default' => null), 'CachedReviewsQty' => Array('type' => 'int', 'not_null' => 1, 'default' => 0), 'StartDate' => Array('type' => 'int', 'formatter' => 'kDateFormatter', 'required' => 1, 'not_null' => 1, 'default' => '#NOW#'), 'NewItem' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (2 => 'la_Auto', 1 => 'la_Always', 0 => 'la_Never'), 'use_phrases' => 1, 'not_null' => 1,'default' => 2), 'PopItem' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (2 => 'la_Auto', 1 => 'la_Always', 0 => 'la_Never'), 'use_phrases' => 1, 'not_null' => 1,'default' => 2), 'HotItem' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (2 => 'la_Auto', 1 => 'la_Always', 0 => 'la_Never'), 'use_phrases' => 1, 'not_null' => 1,'default' => 2), 'Archived' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(1 => 'la_Yes', 2 => 'la_No'), 'use_phrases' => 1, 'not_null' => 1, 'default' => 0), 'Modified' => Array('type' => 'int', 'formatter' => 'kDateFormatter', 'not_null' => 1,'default' => '#NOW#'), 'ModifiedById' => Array('type' => 'int', 'formatter' => 'kLEFTFormatter', 'error_msgs' => Array ('invalid_option' => '!la_error_UserNotFound!'), 'options' => Array(-1 => 'root', -2 => 'Guest'),'left_sql'=>'SELECT %s FROM '.TABLE_PREFIX.'PortalUser WHERE `%s` = \'%s\'', 'left_key_field' => 'PortalUserId', 'left_title_field' => 'Login', 'not_null' => 1,'default' => -1), 'OrgId' => Array('type' => 'int', 'default' => null), 'MetaKeywords' => Array('type' => 'string', 'default' => null), 'MetaDescription' => Array('type' => 'string', 'formatter' => 'kFormatter', 'using_fck' => 1, 'default' => null), ), 'VirtualFields' => Array ( 'MoreCategories' => Array ('type' => 'string', 'default' => ''), 'UserName' => Array('type' => 'string', 'default' => ''), 'CategoryId' => Array ('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (), 'default' => 0), 'cust_RssOriginalURL' => Array('type' => 'string', 'default' => ''), 'cust_RssArticleCRC' => Array('type' => 'int', 'default' => 0), 'Filename' => Array('type' => 'string', 'not_null' => 1, 'default' => ''), 'CachedNavbar' => Array('type' => 'string', 'default' => ''), 'ParentPath' => Array('type' => 'string', 'default' => ''), // for primary image 'SameImages' => Array('type' => 'string', 'default' => ''), 'LocalThumb' => Array('type' => 'string', 'default' => ''), 'ThumbPath' => Array('type' => 'string', 'default' => ''), 'ThumbUrl' => Array('type' => 'string', 'default' => ''), 'LocalImage' => Array('type' => 'string', 'default' => ''), 'LocalPath' => Array('type' => 'string', 'default' => ''), 'FullUrl' => Array('type' => 'string', 'default' => ''), // export related fields: begin 'CategoryId' => Array('type' => 'int', 'default' => 0), 'ExportFormat' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(1 => 'CSV', /*2 => 'XML'*/), 'default' => 1), 'ExportFilename' => Array('type' => 'string', 'default' => ''), 'FieldsSeparatedBy' => Array('type' => 'string', 'default' => ','), 'FieldsEnclosedBy' => Array('type' => 'string', 'default' => '"'), 'LineEndings' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(1 => 'Windows', 2 => 'UNIX'), 'default' => 1), 'LineEndingsInside' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(1 => 'CRLF', 2 => 'LF'), 'default' => 2), 'IncludeFieldTitles' => Array('type' => 'int', 'default' => 1), 'ExportColumns' => Array('type' => 'string', 'formatter' => 'kOptionsFormatter', 'options' => Array()), 'AvailableColumns' => Array('type' => 'string', 'formatter' => 'kOptionsFormatter', 'options' => Array()), 'CategoryFormat' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(1 => 'la_MixedCategoryPath', 2 => 'la_SeparatedCategoryPath'), 'use_phrases' => 1, 'default' => 1), 'CategorySeparator' => Array('type' => 'string', 'default' => ':'), 'IsBaseCategory' => Array('type' => 'int', 'default' => 0), // export related fields: end // import related fields: begin 'FieldTitles' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(1 => 'la_Automatic', 2 => 'la_Manual'), 'use_phrases' => 1, 'default' => 1), 'ImportSource' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(1 => 'la_Upload', 2 => 'la_Local'), 'use_phrases' => 1, 'default' => 2), 'ImportFilename' => Array('type' => 'string', 'formatter' => 'kUploadFormatter', 'max_size' => MAX_UPLOAD_SIZE, 'upload_dir' => (defined('EXPORT_BASE_PATH') ? EXPORT_BASE_PATH : '/admin/export') . '/'), 'ImportLocalFilename' => Array('type' => 'string', 'formatter' => 'kOptionsFormatter', 'default' => ''), 'CheckDuplicatesMethod' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(1 => 'la_IDField', 2 => 'la_OtherFields'), 'use_phrases' => 1, 'default' => 1), 'ReplaceDuplicates' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(0 => 'la_No', 1 => 'la_Yes'), 'use_phrases' => 1, 'default' => 0), 'DuplicateCheckFields' => Array('type' => 'string', 'formatter' => 'kOptionsFormatter', 'options' => Array('Title' => 'TITLE'), 'default' => '|Title|'), 'SkipFirstRow' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1, 'default' => 1), // import related fields: end ), 'Grids' => Array( 'Default' => Array( 'Icons' => Array(1 => 'icon16_article.gif', 2 => 'icon16_article_pending.gif', -2 => 'icon16_article_pending.gif', 0 => 'icon16_article_disabled.gif', 'HOT' => 'icon16_article_hot.gif', 'POP' => 'icon16_article_pop.gif', 'NEW' => 'icon16_article_new.gif', 'PICK' => 'icon16_article_pick.gif'), 'Fields' => Array( 'NewsId' => Array('title' => 'la_col_Id', 'data_block' => 'grid_checkbox_td', 'filter_block' => 'grid_range_filter'), 'Title' => Array('title' => 'la_col_Title', 'data_block' => 'grid_catitem_td', 'filter_block' => 'grid_like_filter'),// 'UserName' => Array('title' => 'la_col_Author', 'filter_block' => 'grid_like_filter'), 'LeadStory' => Array('title' => 'la_col_LeadStory', 'filter_block' => 'grid_options_filter'), 'LeadCatStory' => Array('title' => 'la_col_LeadCatStory', 'filter_block' => 'grid_options_filter'), 'StartDate' => Array('title' => 'la_col_StartDate', 'filter_block' => 'grid_date_range_filter'), 'EndOn' => Array('title' => 'la_col_EndOn', 'data_block' => 'article_expire_td', 'filter_block' => 'grid_date_range_filter'), ), ), 'Radio' => Array( 'Icons' => Array(1 => 'icon16_article.gif', 2 => 'icon16_article_pending.gif', -2 => 'icon16_article_pending.gif', 0 => 'icon16_article_disabled.gif', 'HOT' => 'icon16_article_hot.gif', 'POP' => 'icon16_article_pop.gif', 'NEW' => 'icon16_article_new.gif', 'PICK' => 'icon16_article_pick.gif'), 'Selector' => 'radio', 'Fields' => Array( 'NewsId' => Array('title' => 'la_col_Id', 'data_block' => 'grid_radio_td', 'filter_block' => 'grid_range_filter'), 'Title' => Array('title' => 'la_col_Title', 'data_block' => 'grid_catitem_td', 'filter_block' => 'grid_like_filter'), 'UserName' => Array('title' => 'la_col_Author', 'filter_block' => 'grid_like_filter'), 'LeadStory' => Array('title' => 'la_col_LeadStory', 'filter_block' => 'grid_options_filter'), 'LeadCatStory' => Array('title' => 'la_col_LeadCatStory', 'filter_block' => 'grid_options_filter'), 'StartDate' => Array('title' => 'la_col_StartDate', 'filter_block' => 'grid_date_range_filter'), 'EndOn' => Array('title' => 'la_col_EndOn', 'data_block' => 'article_expire_td', 'filter_block' => 'grid_date_range_filter'), ), ), ), 'ConfigMapping' => Array( 'PerPage' => 'Perpage_News', 'ShortListPerPage' => 'Perpage_News_Short', 'ForceEditorPick' => 'News_ShowPick', 'DefaultSorting1Field' => 'News_SortField', 'DefaultSorting2Field' => 'News_SortField2', 'DefaultSorting1Dir' => 'News_SortOrder', 'DefaultSorting2Dir' => 'News_SortOrder2', 'RatingDelayValue' => 'News_RatingDelay_Value', 'RatingDelayInterval' => 'News_RatingDelay_Interval', ), - ); - - -?> \ No newline at end of file + ); \ No newline at end of file Index: branches/5.0.x/in-news/units/articles/articles_tag_processor.php =================================================================== --- branches/5.0.x/in-news/units/articles/articles_tag_processor.php (revision 12304) +++ branches/5.0.x/in-news/units/articles/articles_tag_processor.php (revision 12305) @@ -1,33 +1,33 @@ <?php /** * @version $Id$ * @package In-News * @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.net/license/ for copyright notices and details. */ + defined('FULL_PATH') or die('restricted access!'); + class ArticlesTagProcessor extends kCatDBTagProcessor { function ListRelatedArticles($params) { return $this->PrintList2($params); } function ListArticles($params) { return $this->PrintList2($params); } function ArticleLink($params) { return $this->ItemLink($params, 'article'); } - } - -?> \ No newline at end of file + } \ No newline at end of file Index: branches/5.0.x/in-news/units/articles/articles_event_handler.php =================================================================== --- branches/5.0.x/in-news/units/articles/articles_event_handler.php (revision 12304) +++ branches/5.0.x/in-news/units/articles/articles_event_handler.php (revision 12305) @@ -1,502 +1,503 @@ <?php /** * @version $Id$ * @package In-News * @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.net/license/ for copyright notices and details. */ + defined('FULL_PATH') or die('restricted access!'); + class ArticlesEventHandler extends kCatDBEventHandler { /** * Filters out archived articles * * @param kEvent $event */ function SetCustomQuery(&$event) { parent::SetCustomQuery($event); $object =& $event->getObject(); if (!$this->Application->IsAdmin()) { $where_clause = '(Archived = 0) AND (StartDate < '.adodb_mktime().' OR StartDate = 0) AND (EndOn > '.adodb_mktime().' OR EndOn IS NULL)'; $object->addFilter('archived_filter', $where_clause); } } /** * Return type clauses for list bulding on front * * @param kEvent $event * @return Array */ function getTypeClauses(&$event) { $type_clauses = parent::getTypeClauses($event); $type_clauses['site_lead']['include']='%1$s.LeadStory = 1 AND '.TABLE_PREFIX.'CategoryItems.PrimaryCat = 1'; $type_clauses['site_lead']['except']='%1$s.LeadStory <> 1 AND '.TABLE_PREFIX.'CategoryItems.PrimaryCat = 1'; $type_clauses['site_lead']['having_filter'] = false; $type_clauses['cat_lead']['include']='%1$s.LeadCatStory = 1 AND '.TABLE_PREFIX.'CategoryItems.PrimaryCat = 1'; $type_clauses['cat_lead']['except']='%1$s.LeadCatStory <> 1 AND '.TABLE_PREFIX.'CategoryItems.PrimaryCat = 1'; $type_clauses['cat_lead']['having_filter'] = false; return $type_clauses; } /** * [REGULAR EVENT] Deletes expired articles + update existing articles from rss feed with new data (key - article url) * * @param kEvent $event */ function OnUpdateRSSAtricles(&$event) { $category_table = $this->Application->getUnitOption('c', 'TableName'); $custom_table = $this->Application->getUnitOption('c-cdata', 'TableName'); $category_custom_fields = $this->getCustomColumns('c'); $article_custom_fields = $this->getCustomColumns($event->Prefix); // update categories which sould be updated $sql = 'SELECT cd.*, c.CategoryId FROM '.$category_table.' c LEFT JOIN '.$custom_table.' cd ON c.ResourceId = cd.ResourceId WHERE (IF(cd.'.$category_custom_fields['RssLastUpdated'].' IS NULL, 0, cd.'.$category_custom_fields['RssLastUpdated'].') + cd.'.$category_custom_fields['RssUpdateInterval'].' * cd.'.$category_custom_fields['RssUpdateIntervalType'].' <= '.adodb_mktime().') AND (LENGTH('.$category_custom_fields['RssSource'].') > 0)'; $categories = $this->Conn->Query($sql, 'CategoryId'); if ($categories) { $resource_ids = Array(); foreach ($categories as $category_id => $category_data) { $resource_ids[] = $category_data['ResourceId']; $event->setEventParam('source_url', $category_data[ $category_custom_fields['RssSource'] ]); $event->setEventParam('category_id', $category_id); $event->setEventParam('custom_fields', $article_custom_fields); $event->setEventParam('life_time', $category_data[ $category_custom_fields['RssDefaultExpiration'] ] * $category_data[ $category_custom_fields['RssDefaultExpirationType'] ]); $this->parseFeed($event); } $sql = 'UPDATE '.$custom_table.' SET '.$category_custom_fields['RssLastUpdated'].' = '.adodb_mktime().' WHERE ResourceId IN ('.implode(',', $resource_ids).')'; $this->Conn->Query($sql); } // delete expired articles from feed categories $sql = 'SELECT c.CategoryId, c.ResourceId FROM '.$category_table.' c LEFT JOIN '.$custom_table.' cd ON c.ResourceId = cd.ResourceId WHERE ( IF(cd.'.$category_custom_fields['RssLastExpired'].' IS NULL, 0, cd.'.$category_custom_fields['RssLastExpired'].') + cd.'.$category_custom_fields['RssExpireInterval'].' * cd.'.$category_custom_fields['RssExpireIntervalType'].' <= '.adodb_mktime().') AND (cd.'.$category_custom_fields['RssDeleteExpired'].' = 1)'; $categories = $this->Conn->GetCol($sql, 'ResourceId'); $id_field = $this->Application->getUnitOption($event->Prefix, 'IDField'); $table = $this->Application->getUnitOption($event->Prefix, 'TableName'); $ci_table = $this->Application->getUnitOption($event->Prefix.'-ci', 'TableName'); if ($categories) { $article_custom_table = $this->Application->getUnitOption($event->Prefix.'-cdata', 'TableName'); $sql = 'SELECT main_table.'.$id_field.' FROM '.$table.' main_table LEFT JOIN '.$ci_table.' ci ON main_table.ResourceId = ci.ItemResourceId LEFT JOIN '.$article_custom_table.' cd ON main_table.ResourceId = cd.ResourceId WHERE (ci.PrimaryCat = 1) AND (ci.CategoryId IN ('.implode(',', $categories).')) AND (main_table.EndOn < '.adodb_mktime().' AND main_table.EndOn IS NOT NULL) AND (LENGTH(cd.'.$article_custom_fields['RssOriginalURL'].') > 0)'; $article_ids = $this->Conn->GetCol($sql); if ($article_ids) { $temp =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler'); $temp->DeleteItems($event->Prefix, $event->Special, $article_ids); } $sql = 'UPDATE '.$custom_table.' SET '.$category_custom_fields['RssLastExpired'].' = '.adodb_mktime().' WHERE ResourceId IN ('.implode(',', array_keys($categories)).')'; $this->Conn->Query($sql); } } /** * Returns article ids & crc, that are created during feed import * * @param kEvent $event * @return Array */ function getFeedArticles(&$event) { $id_field = $this->Application->getUnitOption($event->Prefix, 'IDField'); $table = $this->Application->getUnitOption($event->Prefix, 'TableName'); $custom_table = $this->Application->getUnitOption($event->Prefix.'-cdata', 'TableName'); $crc_field = $event->getEventParam('custom_fields', 'RssArticleCRC'); $sql = 'SELECT main_table.'.$id_field.', cd.'.$crc_field.' FROM '.$table.' main_table LEFT JOIN '.$custom_table.' cd ON cd.ResourceId = main_table.ResourceId WHERE LENGTH(cd.'.$crc_field.') > 0'; return $this->Conn->GetCol($sql, $crc_field); } /** * Creates new, updates existing articles from feed url specified * * @param kEvent $event */ function parseFeed(&$event) { $source_urls = explode(',', $event->getEventParam('source_url')); if (count($source_urls) > 1) { foreach ($source_urls as $source_url) { $event->setEventParam('source_url', $source_url); $this->parseFeed($event); } return true; } $curl_helper =& $this->Application->recallObject('CurlHelper'); /* @var $curl_helper kCurlHelper */ $curl_helper->followLocation = true; $curl_helper->setOptions( Array (CURLOPT_USERAGENT => 'Wget/1.10.2') ); // otherwise FeedBurner will return HTML $xml_data = $curl_helper->Send($event->getEventParam('source_url')); if (!$xml_data) { return false; } $xml_helper =& $this->Application->recallObject('kXMLHelper'); /* @var $xml_helper kXMLHelper */ $root_node =& $xml_helper->Parse($xml_data, XML_WITH_TEXT_NODES); $feed_types = Array ( 'rss_2.0' => 'channel', 'atom' => 'feed', ); foreach ($feed_types as $feed_type => $node_name) { $article_node =& $root_node->FindChild($node_name); if (is_object($article_node)) { break; } } if (!$article_node) { return false; } $category_id = $event->getEventParam('category_id'); $backup_category_id = $this->Application->GetVar('m_cat_id'); $this->Application->SetVar('m_cat_id', $category_id); switch ($feed_type) { case 'rss_2.0': $this->parseRssFeed($article_node, $event); break; case 'atom': $this->parseAtomFeed($article_node, $event); break; } $this->Application->SetVar('m_cat_id', $backup_category_id); } /** * Returns ML field names for article record * * @return Array */ function _getMLFields() { $ml_formatter =& $this->Application->recallObject('kMultiLanguage'); /* @var $ml_formatter kMultiLanguage */ $title_field = $ml_formatter->LangFieldName('Title'); $body_field = $ml_formatter->LangFieldName('Body'); return Array ('Title', 'Body'); return Array ($title_field, $body_field); } /** * Parses RSS 2.0 feed * * @param kXMLNode $root_node * @param kEvent $event */ function parseRssFeed(&$root_node, &$event) { $current_node = $root_node->firstChild; $feed_articles = $this->getFeedArticles($event); $object =& $this->Application->recallObject($event->Prefix.'.-item', null, Array('skip_autoload' => true)); /* @var $object kDBItem */ list ($title_field, $body_field) = $this->_getMLFields(); do { // IMAGE is information about channel and is not useful here if ($current_node->Name != 'ITEM') continue; // collect item data $data = Array(); $sub_node =& $current_node->firstChild; /* @var $sub_node kXMLNode */ do { if ($sub_node->Name == 'ATOM:SUMMARY') { $data[$sub_node->Name] = $this->getNodeContent($sub_node); } else { if ($sub_node->Children) { foreach ($sub_node->Children as $child_node) { $data[$sub_node->Name].= $child_node->Data; // was $sub_node->Data; } } } } while ( ($sub_node =& $sub_node->NextSibling()) ); // create/update article $article_crc = crc32($data['LINK'].$data['TITLE']); $article_id = getArrayValue($feed_articles, $article_crc); if ($article_id) { $object->Load($article_id); } else { $object->Clear(); } $object->SetDBField($title_field, $data['TITLE']); $object->SetDBField('cust_RssOriginalURL', $data['LINK']); $object->SetDBField('cust_RssArticleCRC', $article_crc); $object->SetDBField($body_field, !array_key_exists('DESCRIPTION', $data) ? $data['ATOM:SUMMARY'] : $data['DESCRIPTION']); $expiration_time = adodb_mktime() + $event->getEventParam('life_time'); $object->SetDBField('EndOn_date', $expiration_time); $object->SetDBField('EndOn_time', $expiration_time); $object->SetDBField('Status', STATUS_ACTIVE); $object->SetDBField('Author', 'root'); $object->SetDBField('CreatedById', -1); $status = $object->isLoaded() ? $object->Update() : $object->Create(); } while (($current_node =& $current_node->NextSibling())); } /** * Returns parsed node content * * @param kXMLNode $node * @return string */ function getNodeContent(&$node) { $content_type = array_key_exists('TYPE', $node->Attributes) ? $node->Attributes['TYPE'] : false; switch ($content_type) { case 'xhtml': $data = $node->GetXML(true); break; case 'html': $data = unhtmlentities($node->firstChild->Data); // $node->Data break; default: $data = $node->firstChild->Data; // $node->Data; also for 'text' break; } return trim($data); } /** * Parses ATOM feed * * @param kXMLNode $root_node * @param kEvent $event */ function parseAtomFeed(&$root_node, &$event) { $current_node = $root_node->firstChild; $feed_articles = $this->getFeedArticles($event); $object =& $this->Application->recallObject($event->Prefix.'.-item', null, Array('skip_autoload' => true)); /* @var $object kDBItem */ list ($title_field, $body_field) = $this->_getMLFields(); do { if ($current_node->Name != 'ENTRY') continue; // collect item data $data = Array(); $sub_node =& $current_node->firstChild; /* @var $sub_node kXMLNode */ do { if ($sub_node->Name == 'LINK') { if ($sub_node->Attributes['REL'] == 'alternate') { $data[$sub_node->Name] = $sub_node->Attributes['HREF']; } } elseif ($sub_node->Name == 'CONTENT' || $sub_node->Name == 'SUMMARY' || $sub_node->Name == 'TITLE') { $data[$sub_node->Name] = $this->getNodeContent($sub_node); } else { $data[$sub_node->Name] = $sub_node->firstChild->Data; // $sub_node->Data } } while ( ($sub_node =& $sub_node->NextSibling()) ); // create/update article $article_crc = crc32($data['LINK'].$data['TITLE']); $article_id = getArrayValue($feed_articles, $article_crc); if ($article_id) { $object->Load($article_id); } else { $object->Clear(); } $object->SetDBField($title_field, $data['TITLE']); $object->SetDBField('cust_RssOriginalURL', $data['LINK']); $object->SetDBField('cust_RssArticleCRC', $article_crc); $object->SetDBField($body_field, !array_key_exists('CONTENT', $data) ? $data['SUMMARY'] : $data['CONTENT']); $expiration_time = adodb_mktime() + $event->getEventParam('life_time'); $object->SetDBField('EndOn_date', $expiration_time); $object->SetDBField('EndOn_time', $expiration_time); $object->SetDBField('Status', STATUS_ACTIVE); $object->SetDBField('Author', 'root'); $object->SetDBField('CreatedById', -1); $status = $object->isLoaded() ? $object->Update() : $object->Create(); } while (($current_node =& $current_node->NextSibling())); } function getCustomColumns($prefix) { $ml_formatter =& $this->Application->recallObject('kMultiLanguage'); $custom_fields = array_flip($this->Application->getUnitOption($prefix, 'CustomFields')); foreach ($custom_fields as $custom_name => $custom_id) { $custom_fields[$custom_name] = $ml_formatter->LangFieldName('cust_'.$custom_id); } return $custom_fields; } /** * Create missing excerpt * * @param kEvent $event */ function OnBeforeItemUpdate(&$event) { parent::OnBeforeItemUpdate($event); $this->createExcerpt($event); $this->cacheItemOwner($event, 'CreatedById', 'Author'); } /** * Create missing excerpt * * @param kEvent $event */ function OnBeforeItemCreate(&$event) { parent::OnBeforeItemCreate($event); $this->createExcerpt($event); $this->cacheItemOwner($event, 'CreatedById', 'Author'); } /** * Create excerpt if missing * * @param kEvent $event */ function createExcerpt(&$event) { $object =& $event->getObject(); if (!$object->GetField('Excerpt') || $this->Application->GetVar('generate_excerpt')) { $excerpt = strip_tags( $object->GetField('Body') ); $length = mb_strlen($excerpt); if ($length > 100) { $excerpt = mb_substr(strip_tags($excerpt), 0, 100); if (mb_substr($excerpt,-1) != ' ') { $pos = mb_strrpos($excerpt, ' '); if ($pos) { $excerpt = mb_substr($excerpt, 0, $pos); } } $excerpt .= '...'; } $ml_formatter =& $this->Application->recallObject('kMultiLanguage'); /* @var $ml_formatter kMultiLanguage */ $object->SetDBField($ml_formatter->LangFieldName('Excerpt'), $excerpt); } } /** * [HOOK] Updates category custom fields options in config * * @param kEvent $event */ function OnUpdateCategoryCustomFields(&$event) { $new_virtual_fields = Array( 'cust_RssSource' => Array('type' => 'string', 'default' => ''), 'cust_RssDefaultExpiration' => Array('type' => 'int', 'not_null' => 1, 'default' => ''), 'cust_RssDefaultExpirationType' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'use_phrases' => 1, 'options' => Array(60 => 'la_opt_min', 3600 => 'la_opt_hour', 86400 => 'la_opt_day', 2419200 => 'la_opt_month', 29030400 => 'la_opt_year'), 'default' => 60), 'cust_RssExpireInterval' => Array('type' => 'int', 'not_null' => 1, 'default' => ''), 'cust_RssExpireIntervalType' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'use_phrases' => 1, 'options' => Array(60 => 'la_opt_min', 3600 => 'la_opt_hour', 86400 => 'la_opt_day', 2419200 => 'la_opt_month'), 'default' => 60), 'cust_RssDeleteExpired' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'use_phrases' => 1, 'options' => Array(1 => 'la_Yes', 0 => 'la_No'), 'default' => 0), 'cust_RssUpdateInterval' => Array('type' => 'int', 'not_null' => 1, 'default' => ''), 'cust_RssUpdateIntervalType' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'use_phrases' => 1, 'options' => Array(60 => 'la_opt_min', 3600 => 'la_opt_hour', 86400 => 'la_opt_day', 2419200 => 'la_opt_month'), 'default' => 60), 'cust_RssLastUpdated' => Array('type' => 'int', 'formatter' => 'kDateFormatter', 'default' => ''), 'cust_RssLastExpired' => Array('type' => 'int', 'formatter' => 'kDateFormatter', 'default' => ''), ); $virtual_fields = $this->Application->getUnitOption('c', 'VirtualFields'); $virtual_fields = array_merge_recursive2($virtual_fields, $new_virtual_fields); $this->Application->setUnitOption('c', 'VirtualFields', $virtual_fields); } /** * Sets default expiration based on module setting * * @param kEvent $event */ function OnPreCreate(&$event) { parent::OnPreCreate($event); if ($event->status == erSUCCESS) { $object =& $event->getObject(); $archive_days = $this->Application->ConfigValue('News_Archive'); if ($archive_days) { $expire_date = adodb_mktime() + $archive_days * 3600 * 24; $object->SetDBField('EndOn_date', $expire_date); $object->SetDBField('EndOn_time', $expire_date); } } } - } -?> \ No newline at end of file + } \ No newline at end of file Index: branches/5.0.x/in-news/install/upgrades.php =================================================================== --- branches/5.0.x/in-news/install/upgrades.php (revision 12304) +++ branches/5.0.x/in-news/install/upgrades.php (revision 12305) @@ -1,94 +1,97 @@ <?php /** * @version $Id$ * @package In-News * @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.net/license/ for copyright notices and details. */ + + defined('FULL_PATH') or die('restricted access!'); + $upgrade_class = 'InNewsUpgrades'; /** * Class, that holds all upgrade scripts for "Core" module * */ class InNewsUpgrades extends kHelper { /** * Install toolkit instance * * @var kInstallToolkit */ var $_toolkit = null; /** * Sets common instance of installator toolkit * * @param kInstallToolkit $instance */ function setToolkit(&$instance) { $this->_toolkit =& $instance; } /** * 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') { $root_category = $this->Application->findModule('Name', 'In-News', 'RootCat'); $sql = 'UPDATE ' . $this->Application->getUnitOption('c', 'TableName') . ' SET UseMenuIconUrl = 1, MenuIconUrl = "in-news/img/menu_articles.gif" WHERE ' . $this->Application->getUnitOption('c', 'IDField') . ' = ' . $root_category; $this->Conn->Query($sql); $this->_updateDetailTemplate('n', 'innews/detail', 'in-news/designs/detail'); } } /** * Replaces deprecated detail template design with new one * * @param string $prefix * @param string $from_template * @param string $to_template */ function _updateDetailTemplate($prefix, $from_template, $to_template) { $sql = 'SELECT CustomFieldId FROM ' . TABLE_PREFIX . 'CustomField WHERE FieldName = "' . $prefix . '_ItemTemplate"'; $custom_field_id = $this->Conn->GetOne($sql); $ml_formatter =& $this->Application->recallObject('kMultiLanguage'); /* @var $ml_formatter kMultiLanguage */ $field = $ml_formatter->LangFieldName('cust_' . $custom_field_id, true); $sql = 'UPDATE ' . TABLE_PREFIX . 'CategoryCustomData SET ' . $field . ' = "' . $to_template . '" WHERE ' . $field . ' = "' . $from_template . '"'; $this->Conn->Query($sql); } /** * 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('n', 'in-news/designs/detail', 'in-news/articles/article_detail'); } } } \ No newline at end of file Index: branches/5.0.x/in-news/install/prerequisites.php =================================================================== --- branches/5.0.x/in-news/install/prerequisites.php (revision 12304) +++ branches/5.0.x/in-news/install/prerequisites.php (revision 12305) @@ -1,78 +1,79 @@ <?php /** * @version $Id$ * @package In-News * @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.net/license/ for copyright notices and details. */ + + defined('FULL_PATH') or die('restricted access!'); + $prerequisite_class = 'InNewsPrerequisites'; /** * Class, that holds all prerequisite scripts for "In-News" module * */ class InNewsPrerequisites extends kHelper { /** * Install toolkit instance * * @var kInstallToolkit */ var $_toolkit = null; /** * Sets common instance of installator toolkit * * @param kInstallToolkit $instance */ function setToolkit(&$instance) { $this->_toolkit =& $instance; } /** * Checks minimal version, that could be upgradeable * * @param string $mode when called mode {install, standalone, upgrade) */ function CheckPrerequisites($versions, $mode) { $errors = Array (); if ($mode == 'standalone') { if (!$this->Application->isModuleEnabled('In-Portal')) { $errors[] = 'Please install or enable "In-Portal" module first'; } } if ($mode == 'upgrade') { $sql = 'SELECT Version FROM ' . TABLE_PREFIX . 'Modules WHERE Name = "In-Portal"'; $inportal_version = $this->Conn->GetOne($sql); if ($inportal_version === false) { // only, when In-Portal was installed return $errors; } $min_version = '4.3.1'; $current_version = $this->_toolkit->ConvertModuleVersion($inportal_version); $needed_version = $this->_toolkit->ConvertModuleVersion($min_version); if ($current_version < $needed_version) { $errors[] = 'Please upgrade "In-Portal" to version ' . $min_version; } } return $errors; } - } - -?> \ No newline at end of file + } \ No newline at end of file