Page Menu
Home
In-Portal Phabricator
Search
Configure Global Search
Log In
Files
F726743
in-link
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Mon, Jan 6, 12:05 AM
Size
156 KB
Mime Type
text/x-diff
Expires
Wed, Jan 8, 12:05 AM (1 d, 3 h ago)
Engine
blob
Format
Raw Data
Handle
536836
Attached To
rMINL Modules.In-Link
in-link
View Options
Index: branches/5.0.x/in-link/constants.php
===================================================================
--- branches/5.0.x/in-link/constants.php (revision 12303)
+++ branches/5.0.x/in-link/constants.php (revision 12304)
@@ -1,32 +1,29 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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.
*/
// link reciprocal statuses
-
define('LINK_IS_RECIPROCAL', 1);
define('LINK_IS_NOT_RECIPROCAL', 2);
-
+
// link validation constants
define('LINK_VALIDATION_NOT_VALIDATED', 0);
define('LINK_VALIDATION_VALID', 1);
define('LINK_VALIDATION_INVALID', 2);
/**
* Validate this much links on each progress bar step
*
*/
define('LINK_VALIDATION_PER_PAGE', 5); // in links
- define('LINK_VALIDATION_TIMEOUT', 10); // in seconds
-
-?>
\ No newline at end of file
+ define('LINK_VALIDATION_TIMEOUT', 10); // in seconds
\ No newline at end of file
Index: branches/5.0.x/in-link/units/links/links_event_handler.php
===================================================================
--- branches/5.0.x/in-link/units/links/links_event_handler.php (revision 12303)
+++ branches/5.0.x/in-link/units/links/links_event_handler.php (revision 12304)
@@ -1,487 +1,488 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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 LinksEventHandler extends kCatDBEventHandler {
/**
* Allows to override standart permission mapping
*
*/
function mapPermissions()
{
parent::mapPermissions();
$permissions = Array(
'OnContactFormSubmit' => Array('self' => true),
'OnProcessReciprocalLinks' => Array('self' => true),
'OnSetGrouping' => Array('self' => 'view'),
'OnStoreSelected' => Array('self' => 'view'),
'OnMerge ' => Array('self' => 'edit'),
);
$this->permMapping = array_merge($this->permMapping, $permissions);
}
/**
* Enter description here...
*
* @param kEvent $event
*/
function SetCustomQuery(&$event)
{
parent::SetCustomQuery($event);
$object =& $event->getObject();
if (!$this->Application->IsAdmin()) {
$object->addFilter('expire_filter', '(Expire > '.adodb_mktime().' OR Expire IS NULL)');
}
if (substr($event->Special, 0, 10) == 'duplicates') {
$object->removeFilter('category_filter');
$link_helper =& $this->Application->recallObject('LinkHelper');
/* @var $link_helper LinkHelper */
$grouping = $link_helper->getGrouping( $event->getPrefixSpecial() );
switch ($event->Special) {
case 'duplicates':
foreach ($grouping as $group_field) {
$object->AddGroupByField($object->TableName.'.'.$group_field);
}
$object->addFilter('has_dupes_filter', 'DupeCount > 1', AGGREGATE_FILTER, FLT_SYSTEM);
break;
case 'duplicates-sub':
$main_object =& $this->Application->recallObject($event->Prefix.'.duplicates');
foreach ($grouping as $field_index => $group_field) {
$object->addFilter('dupe_filter_'.$field_index, '%1$s.`'.$group_field.'` = '.$this->Conn->qstr($main_object->GetDBField($group_field)) );
}
break;
}
$object->addFilter('primary_filter', TABLE_PREFIX.'CategoryItems.PrimaryCat = 1');
}
}
/**
* Set groping fields for link duplicate checker
*
* @param kEvent $event
*/
function OnSetGrouping(&$event)
{
$this->Application->LinkVar($event->getPrefixSpecial(true).'_dupe_fields', $event->getPrefixSpecial().'_dupe_fields');
}
/**
* Merge duplicate links together (only categories) & delete duplicates
*
* @param kEvent $event
*/
function OnMerge(&$event)
{
$link_helper =& $this->Application->recallObject('LinkHelper');
/* @var $link_helper LinkHelper */
$grouping = $link_helper->getGrouping( $event->getPrefixSpecial() );
$ids = $this->StoreSelectedIDs($event);
if (!$ids) {
return true;
}
// check, that user has not selected multiple links from same group
$primary_links = Array();
$id_field = $this->Application->getUnitOption($event->Prefix, 'IDField');
$table_name = $this->Application->getUnitOption($event->Prefix, 'TableName');
$sql = 'SELECT *
FROM '.$table_name.'
WHERE '.$id_field.' IN ('.implode(',', $ids).')';
$links = $this->Conn->Query($sql, $id_field);
$groping_error = false;
foreach ($links as $link_id => $link_data) {
$group_key = '';
foreach ($grouping as $grouping_field) {
$group_key .= 'main_table.`'.$grouping_field.'` = '.$this->Conn->qstr($link_data[$grouping_field]).' AND ';
}
$group_key = preg_replace('/(.*) AND $/', '\\1', $group_key);
if (isset($primary_links[$group_key])) {
$groping_error = true;
break;
}
else {
$primary_links[$group_key] = $link_data['ResourceId'];
}
}
if (!$groping_error) {
$temp =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler');
$categories_sql = 'SELECT main_table.ResourceId, ci.CategoryId, main_table.'.$id_field.'
FROM '.$table_name.' main_table
LEFT JOIN '.TABLE_PREFIX.'CategoryItems ci ON main_table.ResourceId = ci.ItemResourceId
WHERE %s';
foreach ($primary_links as $group_key => $primary_resource_id) {
$categories = Array();
$group_links = Array();
$group_categories = $this->Conn->Query(sprintf($categories_sql, $group_key));
foreach ($group_categories as $category_data) {
$group_links[ $category_data['ResourceId'] ] = $category_data[$id_field];
$categories[$category_data['ResourceId'] == $primary_resource_id ? 'remove' : 'add'][] = $category_data['CategoryId'];
}
unset($group_links[$primary_resource_id]);
$categories = array_unique( array_diff($categories['add'], $categories['remove']) );
if ($categories) {
// add link to other link categories
$values_sql = '';
foreach ($categories as $category_id) {
$values_sql .= '('.$category_id.','.$primary_resource_id.',0),';
}
$values_sql = preg_replace('/(.*),$/', '\\1', $values_sql);
$insert_sql = 'INSERT INTO '.TABLE_PREFIX.'CategoryItems (CategoryId,ItemResourceId,PrimaryCat) VALUES '.$values_sql;
$this->Conn->Query($insert_sql);
}
// delete all links from group except primary
$temp->DeleteItems($event->Prefix, $event->Special, array_values($group_links));
}
}
else {
$event->status = erFAIL;
$event->redirect = false;
$this->Application->SetVar($event->getPrefixSpecial().'_error', 1);
}
}
/**
* Stores ids, that were selected in duplicate checker
*
* @param kEvent $event
*/
function OnStoreSelected(&$event)
{
$this->StoreSelectedIDs($event);
$event->SetRedirectParam('pass', 'm,' . $event->getPrefixSpecial());
}
/**
* Allows to enhance link after creation
*
* @param kEvent $event
*/
function OnCreate(&$event)
{
parent::OnCreate($event);
if ($event->status == erSUCCESS) {
$object =& $event->getObject();
/* @var $object kDBItem */
// replace 0 id in post with actual created id (used in enhancement process)
$items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) );
array_rename_key($items_info, 0, $object->GetID());
$this->Application->SetVar($event->getPrefixSpecial(true), $items_info);
// listing was created -> enhance it right away
$enhancement_event = new kEvent('ls:OnRequestEnhancement');
$this->Application->HandleEvent($enhancement_event);
if (($enhancement_event->status == erSUCCESS) && strlen($enhancement_event->redirect)) {
$event->SetRedirectParam('next_template', $event->redirect);
$event->redirect = $enhancement_event->redirect;
}
}
}
/**
* Adds free listing option to listing type selection
*
* @param kEvent $event
*/
function OnAfterConfigRead(&$event)
{
parent::OnAfterConfigRead($event);
if (defined('IS_INSTALL') && IS_INSTALL) {
return ;
}
$free_listings = $this->Application->ConfigValue('Link_AllowFreeListings');
$virtual_fields = $this->Application->getUnitOption($event->Prefix, 'VirtualFields');
$virtual_fields['ListingTypeId']['options'] = $free_listings ? Array (0 => 'lu_free_listing') : Array ();
$language_id = $this->Application->GetVar('m_lang');
$duplicate_options = array_flip($virtual_fields['DuplicateCheckFields']['options']);
$duplicate_options['NAME'] = 'l' . $language_id . '_Name';
$virtual_fields['DuplicateCheckFields']['options'] = array_flip($duplicate_options);
$default = $virtual_fields['DuplicateCheckFields']['default'];
$virtual_fields['DuplicateCheckFields']['default'] = str_replace('|Name|', '|l' . $language_id . '_Name|', $default);
$this->Application->setUnitOption($event->Prefix, 'VirtualFields', $virtual_fields);
if (!$this->Application->IsAdmin()) {
// for now only on Front-End
$this->Application->setUnitOption($event->Prefix, 'PopulateMlFields', true);
}
}
/**
* contact us form submitted on link details page
*
* @param kEvent $event
*/
function OnContactFormSubmit(&$event)
{
$fields = Array (
'ContactFormFullName', 'ContactFormEmail', 'ContactFormSubject', 'ContactFormBody', 'ContactFormCaptcha'
);
// reset errors var
$this->Application->SetVar('ContactForm_HasErrors', '');
// 1. validate form fields
$required_fields = $this->Application->GetVar('FormRequiredFields');
foreach ($fields as $field_name) {
$field_value = trim($this->Application->GetVar($field_name));
if (in_array($field_name, $required_fields)) {
// custom captcha validation
if ($field_name == 'ContactFormCaptcha') {
if (!strlen($field_value) || ($field_value != $this->Application->RecallVar($event->Prefix . '_captcha_code'))) {
$this->Application->SetVar('error_'.$field_name, 1);
$captcha_helper =& $this->Application->recallObject('CaptchaHelper');
/* @var $captcha_helper kCaptchaHelper */
$this->Application->StoreVar($event->Prefix . '_captcha_code', $captcha_helper->GenerateCaptchaCode());
$event->status = erFAIL;
$event->redirect = false;
}
}
// email validation
elseif (!strlen($field_value) || ($field_name == 'ContactFormEmail' && !preg_match('/'.REGEX_EMAIL_USER.'@'.REGEX_EMAIL_DOMAIN.'/', $field_value))) {
$this->Application->SetVar('error_'.$field_name, 1);
$event->status = erFAIL;
$event->redirect = false;
}
}
}
if ($event->status != erSUCCESS) {
// set errors var
$this->Application->SetVar('ContactForm_HasErrors', 1);
return ;
}
$object =& $event->getObject(); // get link object
/* @var $object kDBItem */
$send_params = Array(
'from_name' => $this->Application->GetVar('ContactFormFullName'),
'from_email' => $this->Application->GetVar('ContactFormEmail'),
'from_subject' => $this->Application->GetVar('ContactFormSubject'),
'message' => $this->Application->GetVar('ContactFormBody'),
'to_linkname' => $object->GetField('Name'),
);
$email_event =& $this->Application->EmailEventUser('LINK.CONTACTFORM', $object->GetDBField('CreatedById'), $send_params);
if ($email_event->status == erSUCCESS) {
$event->redirect = $this->Application->GetVar('success_template');
$redirect_params = Array (
'opener' => 's',
'pass' => 'all',
'thankyou_header' => $this->Application->GetVar('success_label_header'),
'thankyou_text' => $this->Application->GetVar('success_label_body')
);
$event->setRedirectParams($redirect_params);
$this->Application->EmailEventAdmin('LINK.CONTACTFORM', 0, $send_params);
}
else {
$this->Application->SetVar('error_ContactFormEmail', 1);
$event->status = erFAIL;
$event->redirect = false;
}
}
/**
* Makes reciprocal check on link, when it is created
*
* @param kEvent $event
*/
function OnBeforeItemCreate(&$event)
{
parent::OnBeforeItemCreate($event);
$this->_checkLink($event);
}
/**
* Makes reciprocal check on link, when it is updated
*
* @param kEvent $event
*/
function OnBeforeItemUpdate(&$event)
{
parent::OnBeforeItemUpdate($event);
$this->_checkLink($event);
}
/**
* Makes reciprocal check on link & saves results
*
* @param kEvent $event
*/
function _checkLink(&$event)
{
if (!$this->Application->ConfigValue('ReciprocalLinkChecking')) {
return ;
}
$object =& $event->getObject();
/* @var $object kDBItem */
if ($object->GetDBField('Url') != $object->GetOriginalField('Url')) {
// check only when url was changed
$link_helper =& $this->Application->recallObject('LinkHelper');
/* @var $link_helper LinkHelper */
$link_checked = $link_helper->CheckReciprocalURL($object->GetDBField('Url'));
$object->SetDBField('ReciprocalLinkFound', $link_checked ? LINK_IS_RECIPROCAL : LINK_IS_NOT_RECIPROCAL);
if (!$link_checked) {
$this->Application->EmailEventAdmin('LINK.RECIPROCAL.CHECK.FAILED');
}
}
}
/**
* Update links status by their reciprocal status
*
* @param kEvent $event
*/
function OnProcessReciprocalLinks(&$event)
{
if (!$this->Application->ConfigValue('ReciprocalLinkChecking')) {
return ;
}
$object =& $event->getObject( Array('skip_autoload' => true) );
/* @var $object kDBItem */
$link_helper =& $this->Application->recallObject('LinkHelper');
/* @var $link_helper LinkHelper */
// 1. verify all links, that were not verified previously
$sql = 'SELECT ' . $id_field . '
FROM ' . $table_name . '
WHERE (ReciprocalLinkFound = 0)';
$not_checked_links = $this->Conn->GetCol($sql);
foreach ($not_checked_links as $link_id) {
$object->Load($link_id);
$link_checked = $link_helper->CheckReciprocalURL($object->GetDBField('Url'));
$object->SetDBField('ReciprocalLinkFound', $link_checked ? LINK_IS_RECIPROCAL : LINK_IS_NOT_RECIPROCAL);
$object->Update();
if ($link_checked) {
$object->ApproveChanges();
}
else {
$object->DeclineChanges();
$this->Application->EmailEventAdmin('LINK.RECIPROCAL.CHECK.FAILED');
}
}
// 2. approve all links, that have succeeded in reciprocal check (during adding/changing on front-end)
$id_field = $this->Application->getUnitOption($event->Prefix, 'IDField');
$table_name = $this->Application->getUnitOption($event->Prefix, 'TableName');
$sql = 'SELECT ' . $id_field . '
FROM ' . $table_name . '
WHERE (ReciprocalLinkFound = ' . LINK_IS_RECIPROCAL . ') AND (Status <> ' . STATUS_ACTIVE . ')';
$verified_links = $this->Conn->GetCol($sql);
foreach ($verified_links as $link_id) {
$object->Load($link_id);
$object->ApproveChanges();
}
// 3. decline all links, that failed in reciprocal check (during adding/changing on front-end)
$sql = 'SELECT ' . $id_field . '
FROM ' . $table_name . '
WHERE (ReciprocalLinkFound = ' . LINK_IS_NOT_RECIPROCAL . ') AND (Status <> ' . STATUS_DISABLED . ')';
$not_verified_links = $this->Conn->GetCol($sql);
foreach ($not_verified_links as $link_id) {
$object->Load($link_id);
$object->DeclineChanges();
}
}
/**
* Allows to load duplicate link by special id
*
* @param kEvent $event
* @return int
*/
function getPassedID(&$event)
{
$id = parent::getPassedID($event);
if (($event->Special == 'duplicates') && !is_numeric($id)) {
$load_keys = unserialize( base64_decode($id) );
// can't return $load_keys as $id, because "kCatDBItem::GetKeyClause" will ignore them
foreach ($load_keys as $field => $value) {
$load_keys[$field] = $field . ' = ' . $this->Conn->qstr($value);
}
$sql = 'SELECT ' . $this->Application->getUnitOption($event->Prefix, 'IDField') . '
FROM ' . $this->Application->getUnitOption($event->Prefix, 'TableName') . '
WHERE (' . implode(') AND (', $load_keys) . ')';
$id = $this->Conn->GetOne($sql);
}
return $id;
}
/**
* Returns events, that require item-based (not just event-name based) permission check
*
* @return Array
*/
function _getMassPermissionEvents()
{
$events = parent::_getMassPermissionEvents();
$events[] = 'OnMerge';
return $events;
}
- }
-?>
\ No newline at end of file
+ }
\ No newline at end of file
Index: branches/5.0.x/in-link/units/links/links_config.php
===================================================================
--- branches/5.0.x/in-link/units/links/links_config.php (revision 12303)
+++ branches/5.0.x/in-link/units/links/links_config.php (revision 12304)
@@ -1,552 +1,553 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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' => 'l',
'ItemClass' => Array('class'=>'kCatDBItem','file'=>'','build_event'=>'OnItemBuild'),
'ListClass' => Array('class'=>'kCatDBList','file'=>'','build_event'=>'OnListBuild'),
'EventHandlerClass' => Array('class' => 'LinksEventHandler', 'file' => 'links_event_handler.php', 'require_classes' => Array('kCatDBEventHandler'), 'build_event'=>'OnBuild'),
'TagProcessorClass' => Array('class'=>'LinkTagProcessor','file'=>'link_tag_processor.php', 'require_classes' => Array('kCatDBTagProcessor'), 'build_event'=>'OnBuild'),
'AutoLoad' => true,
'ConfigPriority' => 0,
'RewritePriority' => 101,
'RewriteListener' => 'ModRewriteHelper:CategoryItemRewriteListener',
'Hooks' => Array (
Array (
'Mode' => hBEFORE,
'Conditional' => false,
'HookToPrefix' => '',
'HookToSpecial' => '*',
'HookToEvent' => Array('OnAfterConfigRead'),
'DoPrefix' => 'cdata',
'DoSpecial' => '*',
'DoEvent' => 'OnDefineCustomFields',
),
Array (
'Mode' => hBEFORE,
'Conditional' => false,
'HookToPrefix' => '',
'HookToSpecial' => '*',
'HookToEvent' => Array('OnAfterConfigRead'),
'DoPrefix' => '#file',
'DoSpecial' => '*',
'DoEvent' => 'OnDefineFiles',
),
Array (
'Mode' => hAFTER,
'Conditional' => false,
'HookToPrefix' => '',
'HookToSpecial' => '*',
'HookToEvent' => Array('OnAfterConfigRead'),
'DoPrefix' => 'captcha',
'DoSpecial' => '*',
'DoEvent' => 'OnPrepareCaptcha',
),
),
'QueryString' => Array(
1 => 'id',
2 => 'Page',
3 => 'event',
4 => 'mode',
),
'AggregateTags' => Array (
Array (
'AggregateTo' => 'l',
'AggregatedTagName' => 'ListLinks',
'LocalTagName' => 'PrintList2',
),
),
'CatalogItem' => true,
'AdminTemplatePath' => 'links',
'AdminTemplatePrefix' => 'links_',
'SearchConfigPostfix' => 'links',
'IDField' => 'LinkId',
'StatusField' => Array('Status'), // field, that is affected by Approve/Decline events
'ItemType' => 4,
'StatisticsInfo' => Array(
'pending' => Array(
'icon' => 'icon16_link_pending.gif',
'label' => 'la_Text_Links',
'js_url' => '#url#',
'url' => Array('t' => 'catalog/advanced_view', 'SetTab' => 'l', 'pass' => 'm,l.showall', 'l.showall_event' => 'OnSetFilterPattern', 'l.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,
),
),
'TitlePhrase' => 'la_Text_Link', // phrase used to specify item type in relationship list
'ViewMenuPhrase' => 'la_title_Links',
'CatalogTabIcon' => 'in-link:icon16_link.gif',
'UsePendingEditing' => true, // item editing is controlled by LINK.ADD/EDIT, LINK.ADD/EDIT.PENDING permissions
'CatalogSelectorName' => 'linklist', // used in old catalog section
'ItemPropertyMappings' => Array(
'NewDays' => 'Link_NewDays', // number of days item to be NEW
'MinPopVotes' => 'Link_MinPopVotes', // minimum number of votes for an item to be POP
'MinPopRating' => 'Link_MinPopRating', // minimum rating for an item to be POP
'MaxHotNumber' => 'Link_MaxHotNumber', // maximum number of HOT items
'HotLimit' => 'Link_HotLimit', // variable name in inp_Cache table
'ClickField' => 'Hits', // item click count is stored here (in item table)
),
'TitleField' => 'Name',
'TitlePresets' => Array(
'default' => Array(
'new_status_labels' => Array('l' => '!la_title_AddingLink!'),
'edit_status_labels' => Array('l'=>'!la_title_EditingLink!'),
'new_titlefield' => Array('l'=>'!la_title_NewLink!'),
),
'links_edit' => Array(
'prefixes' => Array('l'), 'format' => "#l_status# '#l_titlefield#' - !la_title_General!",
'toolbar_buttons' => Array ('select', 'cancel', 'prev', 'next'),
),
'link_list' => Array(
'prefixes' => Array('c_List', 'l_List'),
'format' => "!la_title_Categories! (#c_recordcount#) - !la_title_Links!",
'toolbar_buttons' => Array (),
),
'links_categories' => Array(
'prefixes' => Array('l','l-ci_List'), 'format' => "#l_status# '#l_titlefield#' - !la_title_Categories!",
'toolbar_buttons' => Array ('select', 'cancel', 'prev', 'next', 'new_cat', 'delete', 'primary_cat',),
),
'links_relations' => Array(
'prefixes' => Array('l'), 'format' => "#l_status# '#l_titlefield#' - !la_title_Relations!",
'toolbar_buttons' => Array ('select', 'cancel', 'prev', 'next', 'new_relation', 'edit', 'delete', 'approve', 'decline', 'view', 'dbl-click'),
),
'links_images' => Array(
'prefixes' => Array('l'), 'format' => "#l_status# '#l_titlefield#' - !la_title_Images!",
'toolbar_buttons' => Array ('select', 'cancel', 'prev', 'next', 'new_image', 'edit', 'delete', 'move_up', 'move_down', 'primary_image', 'view', 'dbl-click'),
),
'links_files' => Array(
'prefixes' => Array('l'), 'format' => "#l_status# '#l_titlefield#' - !la_title_Files!",
'toolbar_buttons' => Array ('select', 'cancel', 'prev', 'next', 'new_file', 'edit', 'delete', 'view', 'dbl-click'),
),
'links_reviews' => Array(
'prefixes' => Array('l'), 'format' => "#l_status# '#l_titlefield#' - !la_title_Reviews!",
'toolbar_buttons' => Array ('select', 'cancel', 'prev', 'next', 'new_review', 'edit', 'delete', 'approve', 'decline', 'move_up', 'move_down', 'view', 'dbl-click'),
),
'links_custom' => Array(
'prefixes' => Array('l'), 'format' => "#l_status# '#l_titlefield#' - !la_title_Custom!",
'toolbar_buttons' => Array ('select', 'cancel', 'prev', 'next'),
),
'images_edit' => Array(
'prefixes' => Array('l', 'l-img'),
'new_status_labels' => Array('l-img' => '!la_title_Adding_Image!'),
'edit_status_labels' => Array('l-img' => '!la_title_Editing_Image!'),
'new_titlefield' => Array('l-img' => '!la_title_New_Image!'),
'format' => "#l_status# '#l_titlefield#' - #l-img_status# '#l-img_titlefield#'",
'toolbar_buttons' => Array ('select', 'cancel'),
),
'file_edit' => Array (
'prefixes' => Array ('l', 'l-file'),
'new_status_labels' => Array ('l-file' => "!la_title_AddingFile!"),
'edit_status_labels' => Array ('l-file' => '!la_title_EditingFile!'),
'new_titlefield' => Array ('l-file' => '!la_title_NewFile!'),
'format' => "#l_status# '#l_titlefield#' - #l-file_status# '#l-file_titlefield#'",
'toolbar_buttons' => Array ('select', 'cancel'),
),
'reviews_edit' => Array(
'prefixes' => Array('l', 'l-rev'),
'new_status_labels' => Array('l-rev'=>"!la_title_Adding_Review! '!la_title_New_Review!'"),
'edit_status_labels' => Array('l-rev'=>'!la_title_Editing_Review!'),
'format' => "#l_status# '#l_titlefield#' - #l-rev_status#",
'toolbar_buttons' => Array ('select', 'cancel'),
),
'relations_edit' => Array(
'prefixes' => Array('l', 'l-rel'),
'new_status_labels' => Array('l-rel'=>"!la_title_Adding_Relationship! '!la_title_New_Relationship!'"),
'edit_status_labels' => Array('l-rel'=>'!la_title_Editing_Relationship!'),
'format' => "#l_status# '#l_titlefield#' - #l-rel_status#",
'toolbar_buttons' => Array ('select', 'cancel'),
),
'links_export' => Array('format' => '!la_title_LinksExport!'),
'links_import' => Array('format' => '!la_title_ImportLinks!'),
'duplicate_links' => Array(
'prefixes' => Array('l.duplicates_List'), 'format' => "!la_title_DuplicateLinks! - %s",
'toolbar_buttons' => Array ('view_item', 'view', 'dbl-click'),
),
'duplicate_links_view' => Array(
'prefixes' => Array('l.duplicates-sub_List'), 'format' => "!la_title_Links!",
'toolbar_buttons' => Array ('cancel', 'edit', 'delete', 'merge_links', 'view', 'dbl-click'),
),
'tree_in-link' => Array('format' => '!la_Text_Version! '.$this->Application->findModule('Name', 'In-Link', 'Version')),
),
'EditTabPresets' => Array (
'Default' => Array (
'general' => Array ('title' => 'la_tab_General', 't' => 'in-link/links/links_edit', 'priority' => 1),
'categories' => Array ('title' => 'la_tab_Categories', 't' => 'in-link/links/links_categories', 'priority' => 2),
'relations' => Array ('title' => 'la_tab_Relations', 't' => 'in-link/links/links_relations', 'priority' => 3),
'images' => Array ('title' => 'la_tab_Images', 't' => 'in-link/links/links_images', 'priority' => 4),
'files' => Array ('title' => 'la_tab_Files', 't' => 'in-link/links/links_files', 'priority' => 5),
'reviews' => Array ('title' => 'la_tab_Reviews', 't' => 'in-link/links/links_reviews', 'priority' => 6),
'custom' => Array ('title' => 'la_tab_Custom', 't' => 'in-link/links/links_custom', 'priority' => 7),
),
),
'PermItemPrefix' => 'LINK',
'PermTabText' => 'In-Link',
'PermSection' => Array('main' => 'CATEGORY:in-link:links_list', 'search' => 'in-link:configuration_search', 'email' => 'in-link:configuration_email', 'custom' => 'in-link:configuration_custom'),
'Sections' => Array(
'in-link' => Array(
'parent' => 'in-portal:root',
'icon' => 'settings_in-link',
'label' => 'la_title_In-Link',
'url' => Array('t' => 'index', 'pass_section' => true, 'pass' => 'm'),
'permissions' => Array('view'),
'priority' => 2.3,
'container' => true,
'type' => stTREE,
),
'in-link:links' => Array(
'parent' => 'in-link',
'icon' => 'paid_listings',
'label' => 'la_tab_Links',
'url' => Array('t' => 'catalog/advanced_view', 'anchor' => 'tab-l.showall', 'pass' => 'm'),
'onclick' => 'setCatalogTab(\'l.showall\')',
'permissions' => Array('view'),
'priority' => 1,
'type' => stTREE,
),
'in-link:duplicate_checker' => Array(
'parent' => 'in-link',
'icon' => 'duplicate_checker',
'label' => 'la_tab_DuplicateChecker',
'url' => Array('t' => 'in-link/duplicate_checker', 'pass' => 'm'),
'permissions' => Array('view', 'add', 'edit', 'delete'),
'priority' => 3,
'type' => stTREE,
),
// link settings
'in-link:setting_folder' => Array (
'parent' => 'in-portal:system',
'icon' => 'core:conf',
'label' => 'la_title_In-Link',
'url' => Array ('t' => 'index', 'pass_section' => true, 'pass' => 'm'),
'permissions' => Array ('view'),
'priority' => 3.3,
'container' => true,
'type' => stTREE,
),
/*'in-link:inlink_general' => Array(
'parent' => 'in-link: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-link:configuration_output' => Array(
'parent' => 'in-link: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-link:configuration_search' => Array(
'parent' => 'in-link:setting_folder',
'icon' => 'core:settings_search',
'label' => 'la_tab_ConfigSearch',
'url' => Array('t' => 'config/config_search', 'module_key' => 'links', 'pass_section' => true, 'pass' => 'm'),
'permissions' => Array('view', 'edit'),
'priority' => 3,
'type' => stTREE,
),
'in-link:configuration_email' => Array(
'parent' => 'in-link: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-link:configuration_custom' => Array(
'parent' => 'in-link:setting_folder',
'icon' => 'core:settings_custom',
'label' => 'la_tab_ConfigCustom',
'url' => Array('t' => 'custom_fields/custom_fields_list', 'cf_type' => 4, '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' ),
)
),
'TableName' => TABLE_PREFIX.'Link',
'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,
'AggregatedCalculatedFields' => Array(
'duplicates' => Array (
'DupeCount' => 'COUNT(*)',
),
),
'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$sLinkCustomData cust ON %1$s.ResourceId = cust.ResourceId',
), // key - special, value - list select sql
'ListSortings' => Array(
'' => Array(
'ForcedSorting' => Array('Priority' => 'desc'),
'Sorting' => Array('Name' => 'asc', 'Description' => 'desc'),
)
),
'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$sLinkCustomData cust ON %1$s.ResourceId = cust.ResourceId'),
'SubItems' => Array('l-rev', 'l-ci', 'l-rel', 'l-img', 'l-cdata', 'l-fav', 'l-file'),
'Fields' => Array (
'LinkId' => Array('type' => 'int', 'not_null' => 1, 'default' => 0,),
'Name' => Array('type' => 'string', 'formatter' => 'kMultiLanguage', 'not_null' => 1, 'required' => 1, 'max_len' => 255, 'default' => ''),
'AutomaticFilename' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1, 'not_null' => 1, 'default' => 1),
'Description' => Array('type' => 'string', 'formatter' => 'kMultiLanguage', 'using_fck' => 1, 'default' => null),
'Url' => Array('type' => 'string', 'not_null' => 1, 'required' => 1, 'default' => ''),
'CreatedOn' => Array('type' => 'int', 'formatter' => 'kDateFormatter', 'default' => '#NOW#'),
'Modified' => Array('type' => 'int', 'formatter' => 'kDateFormatter', 'default' => '#NOW#'),
'Expire' => Array('type' => 'int', 'formatter' => 'kDateFormatter', 'default' => null),
'Hits' => Array('type' => 'double', 'formatter' => 'kFormatter', 'format' => '%d', 'not_null' => 1, 'default' => 0),
'CachedRating' => Array('type' => 'string', 'not_null' => 1, 'formatter' => 'kFormatter', 'default' => 0),
'CachedVotesQty' => Array('type' => 'int', 'formatter' => 'kFormatter', 'not_null' => 1, 'default' => 0),
'CachedReviewsQty' => 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, 'default' => -1),
'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),
'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),
'ResourceId' => Array('type' => 'int', 'default' => null),
'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),
'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),
'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),
'OrgId' => Array('type' => 'int', 'default' => null),
'CustomTemplate' => Array('type' => 'string', 'not_null' => 1, 'default' => ''),
'MetaKeywords' => Array('type' => 'string', 'default' => null),
'MetaDescription' => Array('type' => 'string', 'formatter' => 'kFormatter', 'using_fck' => 1, 'default' => null),
'ReciprocalLinkFound' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter', 'options' => Array (0 => 'la_NotChecked', 1 => 'la_Yes', 2 => 'la_No'), 'use_phrases' => 1,
'not_null' => 1, 'default' => 0
),
),
'VirtualFields' => Array(
'UserName' => Array('type' => 'string', 'default' => ''),
'DupeCount' => Array('type' => 'string', 'default' => ''),
'ListingTypeId' => Array ('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options_sql' => 'SELECT %1$s FROM '.TABLE_PREFIX.'ListingTypes ORDER BY Name', 'option_title_field' => 'Name', 'option_key_field' => 'ListingTypeId', 'default' => 0),
'MoreCategories' => Array ('type' => 'string', 'default' => ''),
// export related fields: begin
'CategoryId' => Array ('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (), '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', 'error_field' => 'CategoryFormat', '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 : '/system/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('Name' => 'NAME', 'Url' => 'URL'), 'default' => '|Name|Url|'),
'SkipFirstRow' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(1 => 'la_Yes', 0 => 'la_No'), 'use_phrases' => 1, 'default' => 1),
// import related fields: end
'ThumbnailImage' => Array('type' => 'string', 'default' => ''),
'FullImage' => Array('type' => 'string', 'default' => ''),
'ImageAlt' => Array('type' => 'string', 'default' => ''),
'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' => ''),
),
'Grids' => Array (
'Default' => Array (
'Icons' => Array (0 => 'icon16_link_disabled.gif', 1 => 'icon16_link.gif', 2 => 'icon16_link_pending.gif', -2 => 'icon16_link_pending.gif', 'HOT' => 'icon16_link_hot.gif', 'POP' => 'icon16_link_pop.gif', 'NEW' => 'icon16_link_new.gif', 'PICK' => 'icon16_link_pick.gif'),
'Fields' => Array (
'LinkId' => Array ('title'=>'la_col_Id', 'data_block' => 'grid_checkbox_td', 'filter_block' => 'grid_range_filter'),
'Name' => Array ('title'=>'la_col_LinkName', 'data_block' => 'grid_catitem_td'),
'Url' => Array ('title' => 'la_col_LinkUrl'),
'Description' => Array ('title' => 'la_col_Description', 'first_chars' => 100),
'CreatedOn' => Array ('title' => 'la_col_CreatedOn', 'filter_block' => 'grid_date_range_filter'),
'Modified' => Array ('title' => 'la_col_Modified', 'filter_block' => 'grid_date_range_filter'),
'Hits' => Array ('title' => 'la_col_Hits', 'filter_block' => 'grid_range_filter'),
'CachedRating' => Array ('title' => 'la_col_Rating', 'filter_block' => 'grid_range_filter'),
'CachedVotesQty' => Array ('title' => 'la_col_VoteCount', 'filter_block' => 'grid_range_filter'),
'CachedReviewsQty' => Array ('title' => 'la_col_ReviewCount', 'filter_block' => 'grid_range_filter'),
),
),
'Radio' => Array (
'Icons' => Array (0 => 'icon16_link_disabled.gif', 1 => 'icon16_link.gif', 2 => 'icon16_link_pending.gif', -2 => 'icon16_link_pending.gif', 'HOT' => 'icon16_link_hot.gif', 'POP' => 'icon16_link_pop.gif', 'NEW' => 'icon16_link_new.gif', 'PICK' => 'icon16_link_pick.gif'),
'Selector' => 'radio',
'Fields' => Array (
'LinkId' => Array ('title'=>'la_col_Id', 'data_block' => 'grid_radio_td', 'filter_block' => 'grid_range_filter'),
'Name' => Array ('title'=>'la_col_LinkName', 'data_block' => 'grid_catitem_td'),
'Url' => Array ('title' => 'la_col_LinkUrl'),
'Description' => Array ('title' => 'la_col_Description', 'first_chars' => 100),
'CreatedOn' => Array ('title' => 'la_col_CreatedOn', 'filter_block' => 'grid_date_range_filter'),
'Modified' => Array ('title' => 'la_col_Modified', 'filter_block' => 'grid_date_range_filter'),
'Hits' => Array ('title' => 'la_col_Hits', 'filter_block' => 'grid_range_filter'),
'CachedRating' => Array ('title' => 'la_col_Rating', 'filter_block' => 'grid_range_filter'),
'CachedVotesQty' => Array ('title' => 'la_col_VoteCount', 'filter_block' => 'grid_range_filter'),
'CachedReviewsQty' => Array ('title' => 'la_col_ReviewCount', 'filter_block' => 'grid_range_filter'),
),
),
'Duplicates' => Array (
'Icons' => Array ('default' => 'icon16_link.gif'),
'Fields' => Array (
'Name' => Array ('title' => 'la_col_LinkName', 'filter_block' => 'grid_like_filter'),
'Url' => Array ('title' => 'la_col_LinkUrl', 'filter_block' => 'grid_like_filter'),
'DupeCount' => Array ('title' => 'la_col_DupeCount', 'filter_block' => 'grid_range_filter'),
),
),
),
'ConfigMapping' => Array(
'PerPage' => 'Perpage_Links',
'ShortListPerPage' => 'Perpage_Links_Short',
'ForceEditorPick' => 'Link_ShowPick',
'DefaultSorting1Field' => 'Link_SortField',
'DefaultSorting2Field' => 'Link_SortField2',
'DefaultSorting1Dir' => 'Link_SortOrder',
'DefaultSorting2Dir' => 'Link_SortOrder2',
'RatingDelayValue' => 'link_RatingDelay_Value',
'RatingDelayInterval' => 'link_RatingDelay_Interval',
),
- );
-?>
+ );
\ No newline at end of file
Index: branches/5.0.x/in-link/units/links/link_tag_processor.php
===================================================================
--- branches/5.0.x/in-link/units/links/link_tag_processor.php (revision 12303)
+++ branches/5.0.x/in-link/units/links/link_tag_processor.php (revision 12304)
@@ -1,459 +1,459 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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 LinkTagProcessor extends kCatDBTagProcessor {
/**
* Returns object used in tag processor
*
* @access public
* @return kDBBase
*/
/*function &getObject($params = Array())
{
$object =& parent::getObject($params);
// Forces item loading (compatibility with old theme)
if (is_subclass_of($object, 'kDBItem')) {
// force reload when using from old code
$id = $this->Application->GetVar($this->Prefix.'_id');
if ($object->isLoaded() && $id && ($object->GetID() != $id)) {
$object->Load($id);
}
}
return $object;
}*/
function getListingInfo($resource_id, $field = null)
{
$sql = 'SELECT *
FROM '.$this->Application->getUnitOption('ls', 'TableName').'
WHERE ItemResourceId = '.$resource_id;
$listing_info = $this->Conn->GetRow($sql);
return isset($field) ? $listing_info[$field] : $listing_info;
}
/**
* Detects listing enhancement status (enhanced or not)
*
* @param Array $params
* @return int
*/
function LinkIsEnhanced($params)
{
$object =& $this->getObject();
/* @var $object kDBItem */
if ($object->GetDBField('Status') == STATUS_PENDING || $object->GetDBField('Status') == STATUS_PENDING_EDITING) {
return false;
}
$listing_type_id = $this->getListingInfo($object->GetDBField('ResourceId'), 'ListingTypeId');
$this->Application->SetVar('lst_id', $listing_type_id); // compatibility with old-theme
return $listing_type_id ? 1 : 0;
}
/**
* Detects if enhancement is pending approval
*
* @param Array $params
* @return int
*/
function EnhancementIsPending($params)
{
$object =& $this->getObject();
/* @var $object kDBItem */
$status = $this->getListingInfo($object->GetDBField('ResourceId'), 'Status');
return $status == STATUS_PENDING ? 1 : 0;
}
function ListingTypeField($params)
{
$object =& $this->getObject();
/* @var $object kDBItem */
$lst_id = $this->getListingInfo($object->GetDBField('ResourceId'), 'ListingTypeId');
$lst_object =& $this->Application->recallObject('lst', null, Array('skip_autoload' => true));
$lst_object->Load($lst_id);
return $lst_object->GetField( $this->SelectParam($params, 'name,field') );
}
function EnhancementField($params)
{
$object =& $this->getObject();
/* @var $object kDBItem */
$listing_id = $this->getListingInfo($object->GetDBField('ResourceId'), 'ListingId');
$listing_object =& $this->Application->recallObject('ls', null, Array('skip_autoload' => true));
$listing_object->Load($listing_id);
return $listing_object->GetField( $this->SelectParam($params, 'name,field') );
}
function IsRenewalPeriod($params)
{
$object =& $this->getObject();
/* @var $object kDBItem */
$listing_info = $this->getListingInfo($object->GetDBField('ResourceId'));
$sql = 'SELECT RenewalReminder
FROM '.$this->Application->getUnitOption('lst', 'TableName').'
WHERE ListingTypeId = '.$listing_info['ListingTypeId'];
$renewal_interval = $this->Conn->GetOne($sql) * 3600 * 24;
return ($listing_info['ExpiresOn'] - adodb_mktime() < $renewal_interval) ? 1 : 0;
}
function FirstListingType($params)
{
static $first = true;
if ($first) {
$first = false;
return true;
}
else {
return false;
}
}
function IsReocurringEnhancement($params)
{
$params['name'] = 'Recurring';
return $this->ListingTypeField($params);
}
function EnhanceUsingInCommerce($params)
{
if (!$this->Application->isModuleEnabled('In-Commerce')) {
return 0;
}
$object =& $this->getObject();
/* @var $object kDBItem */
$listtype_id = $this->getListingInfo($object->GetDBField('ResourceId'), 'ListingTypeId');
$lst_object =& $this->Application->recallObject('lst', null, Array('skip_autoload' => true));
$lst_object->Load($listtype_id);
return $lst_object->GetDBField('EnableBuying');
}
function ClickLink($params)
{
$object =& $this->getObject($params);
return $this->Application->HREF($params['t'], '', Array('l_id' => $object->GetID(), 'pass'=>'all,l' ));
}
function ListRelatedLinks($params)
{
return $this->PrintList2($params);
}
function LinkLink($params)
{
return $this->ItemLink($params, 'link');
}
function ListingDescription($params)
{
$listing_type =& $this->Application->recallObject('lst');
/* @var $listing_type kDBItem */
return $listing_type->GetDBField('Description');
}
function ListingTypeDetailsLink($params)
{
$listing_type =& $this->Application->recallObject('lst', null, Array ('raise_warnings' => 0));
/* @var $listing_type kDBList */
$params['lst_id'] = $listing_type->isLoaded() ? $listing_type->GetID() : $this->Application->Parser->GetParam('key');
return $this->Application->ProcessParsedTag('m', 'Link', $params);
}
/**
* Register hit & go to link url
*
* @param Array $params
*/
function FollowLocation($params)
{
$object =& $this->getObject();
/* @var $object kCatDBItem */
if (!$object->isLoaded()) {
trigger_error('No Link ID for redirect', E_USER_ERROR);
}
$object->RegisterHit();
// save user and time
if (!$this->Application->IsAdmin() && $this->Application->LoggedIn()) {
$resource_id = $object->GetDBField('ResourceId');
$user_id = $this->Application->RecallVar('user_id');
$link_visit = $this->Application->recallObject('l-visit', null, Array ('skip_autoload' => true));
/* @var $link_visit kDBItem */
$link_visit->Load( Array ('ResourceId' => $resource_id, 'PortalUserId' => $user_id) );
if ($link_visit->isLoaded()) {
// for existing visits update date
$link_visit->SetDBField('VisitTimestamp_date', adodb_mktime());
$link_visit->SetDBField('VisitTimestamp_time', adodb_mktime());
}
else {
// for new visits set user & link, visit will be set as default value
$link_visit->SetDBField('ResourceId', $resource_id);
$link_visit->SetDBField('PortalUserId', $user_id);
}
$status = $link_visit->isLoaded() ? $link_visit->Update() : $link_visit->Create();
}
$url = $object->GetDBField('Url');
if (!preg_match('/^(http|ftp|mailto:)(.*)/U', $url)) {
$url = 'http://'.$url;
}
$this->Application->Redirect('external:'.$url);
}
/**
* Returns formatted address (from custom fields) for using with google
*
* @param Array $params
* @return string
*/
function GetGoogleAddress($params)
{
$object =& $this->getObject();
if (isset($params['display_info']) && $params['display_info']) {
$ret = $object->GetField('cust_LinkAddress') ? $object->GetField('cust_LinkAddress').'<BR/>' : '';
$ret .= $object->GetField('cust_LinkCity') ? $object->GetField('cust_LinkCity').',' : '';
$ret .= $object->GetField('cust_LinkState') ? $object->GetField('cust_LinkState') : '';
$ret .= $object->GetField('cust_LinkZipCode') ? $object->GetField('cust_LinkZipCode').'<BR/>' : '';
$ret .= $object->GetField('cust_LinkCountry') ? $object->GetField('cust_LinkCountry').'<BR/>' : '';
$ret .= $object->GetField('cust_LinkPhone') ? '<b>'.$this->Application->Phrase('lu_fld_LinkPhone').':</b> '.$object->GetField('cust_LinkPhone') : '';
return $ret;
}
$ret = $object->GetField('cust_LinkAddress') ? $object->GetField('cust_LinkAddress').',' : '';
$ret .= $object->GetField('cust_LinkCity') ? $object->GetField('cust_LinkCity').',' : '';
$ret .= $object->GetField('cust_LinkState') ? $object->GetField('cust_LinkState').',' : '';
$ret .= $object->GetField('cust_LinkZipCode') ? $object->GetField('cust_LinkZipCode').',' : '';
$ret .= $object->GetField('cust_LinkCountry') ? $object->GetField('cust_LinkCountry') : '';
return $ret;
}
/**
* Returns timestamp of last link visit for logged in users only.
*
* @param Array $params
* @return string
*/
function LastVisited($params)
{
if (!$this->Application->LoggedIn()) {
// we don't gather link visit statistics for Guests
return '';
}
static $link_visited = Array ();
$object =& $this->getObject();
/* @var $object kDBList */
if (!isset($link_visited[$this->Special])) {
$resource_ids = $object->GetCol('ResourceId');
$user_id = $this->Application->RecallVar('user_id');
$table_name = $this->Application->getUnitOption('l-visit', 'TableName');
$sql = 'SELECT VisitTimestamp, ResourceId
FROM '.$table_name.'
WHERE (PortalUserId = '.$user_id.') AND (ResourceId IN ('.implode(',', $resource_ids).'))';
$link_visited[$this->Special] = $this->Conn->GetCol($sql, 'ResourceId');
}
if (!isset($link_visited[$this->Special][$object->GetDBField('ResourceId')])) {
// link has no visit information for current user
return '';
}
$link_visit = $link_visited[$this->Special][$object->GetDBField('ResourceId')];
if (isset($params['formatted']) && $params['formatted']) {
// format the date
$lang =& $this->Application->recallObject('lang.current');
if (isset($params['display_time']) && $params['display_time']) {
$display_format = $lang->GetDBField('DateFormat').' @ '.$lang->GetDBField('TimeFormat');
}
else {
$display_format = $lang->GetDBField('DateFormat');
}
return adodb_date($display_format, $link_visit);
}
return $link_visit;
}
/**
* Checks if specified Custom Fields and condition are true
*
* @param Array $params
* @return string
*/
function HasValue($params)
{
$condition = isset($params['condition']) ? strtolower($params['condition']) : false;
$fields = isset($params['fields']) ? $params['fields'] : false;
if (!$fields || !in_array($condition, Array('or', 'and'))) {
// required parameters not passed
return false;
}
$fields = explode(',', $fields);
$object =& $this->getObject();
/* @var $object kDBList */
switch ($condition) {
case 'or':
foreach ($fields as $field) {
if (strlen($object->GetDBField($field))) {
return true;
}
}
break;
case 'and':
foreach ($fields as $field) {
if (!strlen($object->GetDBField($field))) {
return false;
}
}
break;
}
return $condition == 'and' ? true : false;
}
/**
* Gets and parses custom details template or default one
*
* @param Array $params
* @return string
*/
function DisplayDetailTemplate($params)
{
$object =& $this->getObject($params);
/* @var $object kDBItem */
$template_name = $object->GetDBField('CustomTemplate');
if (!$template_name || !$this->Application->TemplatesCache->TemplateExists($template_name)) {
$template_name = $params['default_template'];
}
$block_params['name'] = $template_name;
// parse template
return $this->Application->ParseBlock($block_params);
}
/**
* Changes title preset of "Duplicate checker" section to show current grouping
*
* @param Array $params
*/
function ModifyUnitConfig($params)
{
$grid = array_key_exists('grid', $params) ? $params['grid'] : false;
if ($grid != 'Duplicates') {
// only for "Duplicate Checker" section
return ;
}
$link_helper =& $this->Application->recallObject('LinkHelper');
/* @var $link_helper LinkHelper */
// 1. get current grouping
$grouping = $link_helper->getGrouping( $this->getPrefixSpecial() );
// 2. replace field names in grouping with their corresponding column titles
$grids = $this->Application->getUnitOption($this->Prefix, 'Grids');
foreach ($grouping as $index => $group_field) {
$group_field = preg_replace('/^l[\d]+_/', '', $group_field); // remove ml prefix
$grouping[$index] = $this->Application->Phrase($grids[$grid]['Fields'][$group_field]['title']);
}
// 3. patch resulting title preset
$concat_with = "' " . $this->Application->Phrase('la_and') . " '";
$title_presets = $this->Application->getUnitOption($this->Prefix, 'TitlePresets');
$title_presets['duplicate_links'] = str_replace('%s', "'" . implode($concat_with, $grouping) . "'", $title_presets['duplicate_links']);
$this->Application->setUnitOption($this->Prefix, 'TitlePresets', $title_presets);
}
/**
* Allows to modify block params & current list record before PrintList parses record
*
* @param kDBList $object
* @param Array $block_params
*/
function PrepareListElementParams(&$object, &$block_params)
{
$grid = array_key_exists('grid', $block_params) ? $block_params['grid'] : false;
if ($grid != 'Duplicates') {
// only for "Duplicate Checker" section
return ;
}
static $grouping = null;
if (!isset($grouping)) {
$link_helper =& $this->Application->recallObject('LinkHelper');
/* @var $link_helper LinkHelper */
// 1. get current grouping
$grouping = $link_helper->getGrouping( $this->getPrefixSpecial() );
}
$fields_hash =& $object->getCurrentRecord();
$key_fields = Array ();
foreach ($grouping as $group_field) {
$key_fields[$group_field] = $fields_hash[$group_field];
}
$fields_hash['LinkId'] = base64_encode( serialize($key_fields) );
}
-}
-
-?>
\ No newline at end of file
+}
\ No newline at end of file
Index: branches/5.0.x/in-link/units/helpers/link_helper.php
===================================================================
--- branches/5.0.x/in-link/units/helpers/link_helper.php (revision 12303)
+++ branches/5.0.x/in-link/units/helpers/link_helper.php (revision 12304)
@@ -1,77 +1,77 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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 LinkHelper extends kHelper {
/**
* Checks, that we have link to our website on given site url
*
* @param string $url
* @return bool
*/
function CheckReciprocalURL($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$html = curl_exec($ch);
if (curl_errno($ch) != 0) {
// connection error
return false;
}
$info = curl_getinfo($ch);
if ($info['http_code'] != 200) {
// http error
return false;
}
curl_close($ch);
$reciprocal_url = rtrim($this->Application->BaseURL());
if (preg_match('/<a[^<]*href=(["\']?)' . preg_quote($reciprocal_url, '/') . '[\\/]?.*(\\1).*>(.*)<\\/a.*>/sUi', $html, $ret)) {
return true;
}
return false;
}
/**
* Returns grouping fields for "Duplicate Checker" section
*
* @param string $prefix_special
* @return Array
*/
function getGrouping($prefix_special)
{
// cut "sub" postfix from special
$prefix_special = preg_replace('/(.*)-sub$/', '\\1', $prefix_special);
$grouping = $this->Application->RecallVar($prefix_special . '_dupe_fields');
if (!$grouping) {
$grouping = '|Url|';
$this->Application->StoreVar($prefix_special . '_dupe_fields', $grouping);
}
return explode('|', substr($grouping, 1, -1));
}
-
-
}
\ No newline at end of file
Index: branches/5.0.x/in-link/units/helpers/helpers_config.php
===================================================================
--- branches/5.0.x/in-link/units/helpers/helpers_config.php (revision 12303)
+++ branches/5.0.x/in-link/units/helpers/helpers_config.php (revision 12304)
@@ -1,22 +1,24 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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!');
+
$config = Array (
'Prefix' => 'in-link-helpers',
'EventHandlerClass' => Array ('class' => 'kEventHandler', 'file' => '', 'build_event' => 'OnBuild'),
'RegisterClasses' => Array (
Array ('pseudo' => 'LinkHelper', 'class' => 'LinkHelper', 'file' => 'link_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'),
),
);
\ No newline at end of file
Index: branches/5.0.x/in-link/units/link_validation/link_validation_tp.php
===================================================================
--- branches/5.0.x/in-link/units/link_validation/link_validation_tp.php (revision 12303)
+++ branches/5.0.x/in-link/units/link_validation/link_validation_tp.php (revision 12304)
@@ -1,56 +1,58 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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 LinkValidationTagProcessor extends kDBTagProcessor {
function FormatUrl($params)
{
$object =& $this->getObject($params);
$url = $object->GetDBField($params['field']);
if (!preg_match('/^(http|ftp|mailto:)(.*)/U', $url)) {
$url = 'http://' . $url;
}
return $url;
}
/**
* Show CachedNavbar of current item primary category
*
* @param Array $params
* @return string
*/
function CategoryName($params)
{
// show category cachednavbar of
$object =& $this->getObject($params);
$category_id = isset($params['cat_id']) ? $params['cat_id'] : $object->GetDBField('CategoryId');
$category_path = $this->Application->getCache('category_paths', $category_id);
if ($category_path === false) {
// not chached
if ($category_id > 0) {
$cached_navbar = preg_replace('/^(Content&\|&|Content)/i', '', $object->GetDBField('CachedNavbar'));
$category_path = trim($this->CategoryName( Array('cat_id' => 0) ).' > '.str_replace('&|&', ' > ', $cached_navbar), ' > ');
}
else {
$category_path = $this->Application->Phrase( $this->Application->ConfigValue('Root_Name') );
}
$this->Application->setCache('category_paths', $category_id, $category_path);
}
return $category_path;
}
}
\ No newline at end of file
Index: branches/5.0.x/in-link/units/link_validation/link_validation_config.php
===================================================================
--- branches/5.0.x/in-link/units/link_validation/link_validation_config.php (revision 12303)
+++ branches/5.0.x/in-link/units/link_validation/link_validation_config.php (revision 12304)
@@ -1,180 +1,182 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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!');
+
$config = Array (
'Prefix' => 'link-validation',
'ItemClass' => Array ('class' => 'kDBItem', 'file' => '', 'build_event' => 'OnItemBuild'),
'ListClass' => Array ('class' => 'kDBList', 'file' => '', 'build_event' => 'OnListBuild'),
'EventHandlerClass' => Array ('class' => 'LinkValidationEventHandler', 'file' => 'link_validation_eh.php', 'build_event' => 'OnBuild'),
'TagProcessorClass' => Array ('class' => 'LinkValidationTagProcessor', 'file' => 'link_validation_tp.php', 'build_event' => 'OnBuild'),
'AutoLoad' => true,
'Hooks' => Array (
Array (
'Mode' => hAFTER,
'Conditional' => true,
'HookToPrefix' => 'l',
'HookToSpecial' => '*',
'HookToEvent' => Array('OnAfterConfigRead'),
'DoPrefix' => '',
'DoSpecial' => '*',
'DoEvent' => 'OnPrepareLinkEditing',
),
),
'QueryString' => Array (
1 => 'id',
2 => 'Page',
3 => 'event',
4 => 'mode',
),
'RegularEvents' => Array (
'link_validation' => Array ('EventName' => 'OnCronValidation', 'RunInterval' => 3600*24, 'Type' => reAFTER),
),
'IDField' => 'LinkValidationId',
'TableName' => TABLE_PREFIX.'LinkValidation',
'StatusField' => Array ('ValidationStatus', 'LinkStatus'),
'TitlePresets' => Array (
'link_validation_list' => Array ('prefixes' => Array ('link-validation_List'), 'format' => "!la_tab_LinkValidation!"),
'link_validation_progress' => Array ('format' => '!la_tab_ValidatingLinks!'),
),
'PermSection' => Array('main' => 'in-link:link_validation'),
'Sections' => Array (
'in-link:link_validation' => Array (
'parent' => 'in-link',
'icon' => 'in-link:validate',
'label' => 'la_tab_LinkValidation',
'url' => Array('t' => 'in-link/link_validation/link_validation_list', 'pass' => 'm'),
'permissions' => Array('view', 'advanced:continue', 'advanced:restart', 'advanced:validate', 'advanced:reset'),
'priority' => 4,
'type' => stTREE,
),
),
'FilterMenu' => Array (
'Groups' => Array(
Array('mode' => 'AND', 'filters' => Array('show_valid', 'show_invalid', 'show_not_validated'), 'type' => WHERE_FILTER),
),
'Filters' => Array (
'show_valid' => Array ('label' =>'la_Text_Valid', 'on_sql' => '', 'off_sql' => '%1$s.ValidationStatus != ' . LINK_VALIDATION_VALID . ' OR %1$s.ValidationStatus IS NULL'),
'show_invalid' => Array ('label' => 'la_Text_Invalid', 'on_sql' => '', 'off_sql' => '%1$s.ValidationStatus != ' . LINK_VALIDATION_INVALID . ' OR %1$s.ValidationStatus IS NULL'),
'show_not_validated' => Array ('label' => 'la_Text_Not_Validated', 'on_sql' => '', 'off_sql' => '%1$s.ValidationStatus != ' . LINK_VALIDATION_NOT_VALIDATED . ' OR %1$s.ValidationStatus IS NOT NULL'),
)
),
'ListSQLs' => Array (
'' => ' SELECT %1$s.* %2$s
FROM ' . TABLE_PREFIX . 'Link l
LEFT JOIN %1$s ON %1$s.LinkId = l.LinkId
LEFT JOIN ' . TABLE_PREFIX . 'CategoryItems ci ON ci.ItemResourceId = l.ResourceId
LEFT JOIN '.TABLE_PREFIX.'Category c ON c.CategoryId = ci.CategoryId',
),
'ListSortings' => Array (
'' => Array (
'Sorting' => Array ('LinkValidationId' => 'desc'),
)
),
'CalculatedFields' => Array (
'' => Array (
'ForeignLinkId' => 'l.LinkId',
'LinkName' => 'l.Name',
'LinkUrl' => 'l.Url',
'LinkCreatedOn' => 'l.CreatedOn',
'LinkStatus' => 'l.Status',
'LinkValidationStatus' => 'IF(%1$s.ValidationStatus IS NULL, ' . LINK_VALIDATION_NOT_VALIDATED . ', %1$s.ValidationStatus)',
'CategoryId' => 'ci.CategoryId',
),
),
'Fields' => Array (
'LinkValidationId' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0),
'LinkId' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0),
'ValidationTime' => Array ('type' => 'float', 'formatter' => 'kDateFormatter', 'not_null' => 1, 'default' => 0),
'ValidationCode' => Array (
'type' => 'string',
'formatter' => 'kOptionsFormatter', 'options' => Array (200 => '200 OK', 301 => '301 Moved Permanently', 302 => '302 Found', 400 => '400 Bad Request', 403 => '403 Forbidden', 404 => '404 Not Found', 500 => '500 Internal Server Error'),
'max_len' => 50, 'default' => NULL
),
'ValidationStatus' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter', 'options' => Array (0 => 'la_Text_Not_Validated', 1 => 'la_Text_Valid', 2 => 'la_Text_Invalid'), 'use_phrases' => 1,
'not_null' => 1, 'default' => 0
),
),
'VirtualFields' => Array (
'ForeignLinkId' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0),
'LinkName' => Array('type' => 'string', /*'formatter' => 'kMultiLanguage',*/ 'not_null' => 1, 'max_len' => 255, 'default' => ''),
'LinkUrl' => Array ('type' => 'string', 'not_null' => 1, 'default' => ''),
'LinkCreatedOn' => Array('type' => 'int', 'formatter' => 'kDateFormatter', 'default' => '#NOW#'),
'LinkStatus' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'la_Active', 2 => 'la_Pending', 0 => 'la_Disabled'), 'use_phrases' => 1, 'not_null' => 1, 'default' => 2),
'LinkValidationStatus' => Array (
'type' => 'int',
'formatter' => 'kOptionsFormatter', 'options' => Array (0 => 'la_Text_Not_Validated', 1 => 'la_Text_Valid', 2 => 'la_Text_Invalid'), 'use_phrases' => 1,
'not_null' => 1, 'default' => 0
),
// for category path drawing
'CategoryId' => Array ('type' => 'int', 'default' => 0),
'CachedNavbar' => Array ('type' => 'string', 'default' => ''),
),
'Grids' => Array (
'Default' => Array (
'Icons' => Array (
'default' => 'icon16_custom.gif',
// for valid links
LINK_VALIDATION_VALID . '_' . STATUS_DISABLED => 'icon16_valid_disabled.gif',
LINK_VALIDATION_VALID . '_' . STATUS_ACTIVE => 'icon16_valid.gif',
LINK_VALIDATION_VALID . '_' . STATUS_PENDING => 'icon16_valid_pend.gif',
// for invalid links
LINK_VALIDATION_INVALID . '_' . STATUS_DISABLED => 'icon16_invalid_disabled.gif',
LINK_VALIDATION_INVALID . '_' . STATUS_ACTIVE => 'icon16_invalid.gif',
LINK_VALIDATION_INVALID . '_' . STATUS_PENDING => 'icon16_invalid_pend.gif',
// for not validated links
LINK_VALIDATION_NOT_VALIDATED . '_' . STATUS_DISABLED => 'icon16_not_validated_disabled.gif',
LINK_VALIDATION_NOT_VALIDATED . '_' . STATUS_ACTIVE => 'icon16_not_validated.gif',
LINK_VALIDATION_NOT_VALIDATED . '_' . STATUS_PENDING => 'icon16_not_validated_pend.gif',
'_' . STATUS_DISABLED => 'icon16_not_validated_disabled.gif',
'_' . STATUS_ACTIVE => 'icon16_not_validated.gif',
'_' . STATUS_PENDING => 'icon16_not_validated_pend.gif',
),
'Fields' => Array (
'ForeignLinkId' => Array ('title' => 'la_col_Id', 'data_block' => 'grid_checkbox_td', 'filter_block' => 'grid_range_filter', 'module' => 'In-Link' ),
'LinkName' => Array ('title' => 'la_col_LinkName', 'data_block' => 'grid_link_name_td', 'filter_block' => 'grid_like_filter', 'first_chars' => 30),
'LinkUrl' => Array ('title' => 'la_col_LinkUrl', 'data_block' => 'grid_url_td', 'filter_block' => 'grid_like_filter'),
'LinkValidationStatus' => Array ('title' => 'la_col_Status', 'filter_block' => 'grid_options_filter',),
'ValidationCode' => Array ('title' => 'la_col_ValidationCode', 'filter_block' => 'grid_options_filter',),
'ValidationTime' => Array ('title' => 'la_col_ValidatedOn', 'filter_block' => 'grid_date_range_filter',),
'LinkCreatedOn' => Array ('title' => 'la_col_CreatedOn', 'filter_block' => 'grid_date_range_filter',),
),
),
),
);
\ No newline at end of file
Index: branches/5.0.x/in-link/units/link_validation/link_validation_eh.php
===================================================================
--- branches/5.0.x/in-link/units/link_validation/link_validation_eh.php (revision 12303)
+++ branches/5.0.x/in-link/units/link_validation/link_validation_eh.php (revision 12304)
@@ -1,542 +1,544 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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 LinkValidationEventHandler extends kDBEventHandler {
/**
* Allows to override standart permission mapping
*
*/
function mapPermissions()
{
parent::mapPermissions();
$permissions = Array (
'OnResetValidationStatus' => Array ('self' => 'advanced:reset',),
'OnRestartValidation' => Array ('self' => 'advanced:restart',),
'OnContinueValidation' => Array ('self' => 'advanced:continue',),
'OnValidateSelected' => Array ('self' => 'advanced:validate',),
'OnValidateProgress' => Array ('self' => 'advanced:validate|advanced:continue|advanced:restart|advanced:reset',),
'OnCancelValidation' => Array ('self' => 'advanced:validate|advanced:continue|advanced:restart|advanced:reset',),
'OnCronValidation' => Array ('self' => 'advanced:validate|advanced:continue|advanced:restart|advanced:reset',),
);
$this->permMapping = array_merge($this->permMapping, $permissions);
}
function mapEvents()
{
parent::mapEvents();
$events_map = Array (
'OnApproveLinks' => 'iterateItems',
'OnDeclineLinks' => 'iterateItems',
);
$this->eventMethods = array_merge($this->eventMethods, $events_map);
}
/**
* Checks permissions of user
*
* @param kEvent $event
*/
function CheckPermission(&$event)
{
$check_events = Array ('OnApproveLinks', 'OnDeclineLinks', 'OnDeleteLinks');
if (in_array($event->Name, $check_events)) {
$ids = $this->_getSelectedIds($event);
$perm_value = true;
if ($ids) {
$perm_helper =& $this->Application->recallObject('PermissionsHelper');
/* @var $perm_helper kPermissionsHelper */
$items = $perm_helper->GetCategoryItemData('l', $ids);
$check_method = $event->Name == 'OnDeleteLinks' ? 'DeleteCheckPermission' : 'ModifyCheckPermission';
foreach ($items as $item_id => $item_data) {
if ($perm_helper->$check_method($item_data['CreatedById'], $item_data['CategoryId'], 'l') == 0) {
// one of items selected has no permission
$perm_value = false;
break;
}
}
if (!$perm_value) {
$event->status = erPERM_FAIL;
}
}
return $perm_value;
}
return parent::CheckPermission($event);
}
/**
* Adds calculates fields for category name
*
* @param kDBItem $object
* @param kEvent $event
*/
function prepareObject(&$object, &$event)
{
parent::prepareObject($object, $event);
$object->addCalculatedField('CachedNavbar', 'c.l'.$this->Application->GetVar('m_lang').'_CachedNavbar');
}
/**
* Allows to show only invalid links
*
* @param kEvent $event
*/
function SetCustomQuery(&$event)
{
$object =& $event->getObject();
/* @var $object kDBList */
$object->addFilter('primary_category_filter', 'ci.PrimaryCat = 1');
if ($event->Special == 'invalid') {
$object->addFilter('status_filter', '%1$s.ValidationStatus = ' . LINK_VALIDATION_INVALID);
}
}
/**
* Restarts link validation process
*
* @param kEvent $event
*/
function OnRestartValidation(&$event)
{
$this->_resetValidation($event);
$this->OnContinueValidation($event);
}
/**
* Restarts link validation process
*
* @param kEvent $event
*/
function _resetValidation(&$event)
{
// 1. delete previous validation results
$sql = 'SELECT ' . $this->Application->getUnitOption($event->Prefix, 'IDField') . '
FROM ' . $this->Application->getUnitOption($event->Prefix, 'TableName');
$ids = $this->Conn->GetCol($sql);
if ($ids) {
$temp_handler =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler');
/* @var $temp_handler kTempTablesHandler */
$temp_handler->DeleteItems($event->Prefix, $event->Special, $ids);
}
}
/**
* Validates only selected links
*
* @param kEvent $event
*/
function OnValidateSelected(&$event)
{
$link_ids = $this->_getSelectedIds($event);
if (!$link_ids) {
return ;
}
$validation_data = Array (
'processed' => 0,
'total' => count($link_ids),
'items' => $link_ids,
);
$this->Application->StoreVar($event->Prefix . '_status', serialize($validation_data));
$event->redirect = $this->Application->GetVar('progress_template');
}
/**
* Validates only links, that were not previously validated
*
* @param kEvent $event
*/
function OnContinueValidation(&$event)
{
$have_data = $this->_prepareValidation($event);
if ($have_data) {
$event->redirect = $this->Application->GetVar('progress_template');
}
}
/**
* Performs validation
*
* @param kEvent $event
* @param bool $from_ajax
*/
function _validate(&$event, $from_ajax = true)
{
$validation_data = unserialize( $this->Application->RecallVar($event->Prefix . '_status') );
$i = 0;
$link_ids = $validation_data['items'];
$per_page = count($link_ids) >= LINK_VALIDATION_PER_PAGE ? LINK_VALIDATION_PER_PAGE : count($link_ids);
while ($i < $per_page) {
$this->_validateLink($link_ids[$i]);
$i++;
}
// remove processed links from array
array_splice($link_ids, 0, LINK_VALIDATION_PER_PAGE);
// store validation progress
$validation_data['processed'] += $i;
$validation_data['items'] = $link_ids;
if ($validation_data['processed'] >= $validation_data['total']) {
// finished
$this->Application->EmailEventAdmin('LINK.VALIDATION.RESULTS');
$this->Application->RemoveVar($event->Prefix . '_status');
return true;
}
// show progress, proceed to next step
$this->Application->StoreVar($event->Prefix . '_status', serialize($validation_data));
if ($from_ajax) {
echo $validation_data['processed'] / $validation_data['total'] * 100;
$event->status = erSTOP;
}
return false;
}
/**
* Performs validation of links (called from AjaxProgressBar)
*
* @param kEvent $event
*/
function OnValidateProgress(&$event)
{
$done = $this->_validate($event, true);
if ($done) {
$this->Application->Redirect( $this->Application->GetVar('finish_template') );
}
}
/**
* Returns categories, that are located inside recycle bin category
*
* @return Array
*/
function _getRecycleBinCategories()
{
$recycle_bin = $this->Application->ConfigValue('RecycleBinFolder');
if (!is_numeric($recycle_bin)) {
return Array ();
}
$recycle_categories = $this->Application->RecallVar('recycle_categories');
if ($recycle_categories === false) {
$tree_indexes = $this->Application->getTreeIndex($recycle_bin);
$sql = 'SELECT ' . $this->Application->getUnitOption('c', 'IDField') . '
FROM ' . $this->Application->getUnitOption('c', 'TableName') . '
WHERE TreeLeft BETWEEN ' . $tree_indexes['TreeLeft'] . ' AND ' . $tree_indexes['TreeRight'];
$recycle_categories = serialize( $this->Conn->GetCol($sql) );
// store recycle bin categories in session to prevent query below happening on each link validation step
$this->Application->StoreVar('recycle_categories', $recycle_categories);
}
return unserialize($recycle_categories);
}
/**
* Checks, that link is located in one of RecycleBin subcategories
*
* @param unknown_type $resource_id
* @return unknown
*/
function _inRecycleBin($resource_id)
{
static $recycle_bin = null;
if (!isset($recycle_bin)) {
$recycle_bin = $this->_getRecycleBinCategories();
}
if (!$recycle_bin) {
// Recycle Bin not used in system -> link is 100% not there
return false;
}
$sql = 'SELECT CategoryId
FROM ' . $this->Application->getUnitOption('l-ci', 'TableName') . '
WHERE ItemResourceId = ' . $resource_id . ' AND PrimaryCat = 1';
return in_array( $this->Conn->GetOne($sql), $recycle_bin);
}
function _validateLink($link_id)
{
$curl_helper =& $this->Application->recallObject('CurlHelper');
/* @var $curl_helper kCurlHelper */
$sql = 'SELECT Url, ResourceId
FROM ' . $this->Application->getUnitOption('l', 'TableName') . '
WHERE ' . $this->Application->getUnitOption('l', 'IDField') . ' = ' . $link_id;
$link_data = $this->Conn->GetRow($sql);
if (!preg_match('/^(http|https):\/\/(.*)/U', $link_data['Url']) || $this->_inRecycleBin($link_data['ResourceId'])) {
return ;
}
$curl_helper->timeout = LINK_VALIDATION_TIMEOUT;
$result = $curl_helper->Send($link_data['Url']);
if ($result === false || $curl_helper->lastErrorMsg != '') {
$curl_helper->lastErrorCode = 500;
}
$link_validation =& $this->Application->recallObject($this->Prefix . '.-item', null, Array ('skip_autoload' => true));
/* @var $link_validation kDBItem */
$link_validation->Load($link_id, 'LinkId');
$now = adodb_mktime();
$fields_hash = Array (
'LinkId' => $link_id,
'ValidationTime_date' => $now,
'ValidationTime_time' => $now,
'ValidationCode' => $curl_helper->lastHTTPCode,
'ValidationStatus' => $curl_helper->lastHTTPCode < 400 ? LINK_VALIDATION_VALID : LINK_VALIDATION_INVALID,
);
$link_validation->SetDBFieldsFromHash($fields_hash);
return $link_validation->isLoaded() ? $link_validation->Update() : $link_validation->Create();
}
/**
* Cancels validation (from validation progress bar)
*
* @param kEvent $event
*/
function OnCancelValidation(&$event)
{
$this->Application->RemoveVar($event->Prefix . '_status');
}
/**
* Resets validation status for selected
*
* @param kEvent $event
*/
function OnResetValidationStatus(&$event)
{
$ids = $this->_getSelectedIds($event, true);
if (!$ids) {
return ;
}
$temp_handler =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler');
/* @var $temp_handler kTempTablesHandler */
$temp_handler->DeleteItems($event->Prefix, $event->Special, $ids);
}
/**
* Returns ids, that user has checked in grid
*
* @param kEvent $event
* @param bool $transform convert link ids to link validation ids
* @return Array
*/
function _getSelectedIds(&$event, $transform = false)
{
$ids = Array();
$items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) );
if ($items_info) {
foreach ($items_info as $id => $field_values) {
if ( getArrayValue($field_values, 'ForeignLinkId') ) {
// we are not gathering ids by unit idfield here!
array_push($ids, $id);
}
}
}
if ($transform && $ids) {
$sql = 'SELECT ' . $this->Application->getUnitOption($event->Prefix, 'IDField') . '
FROM ' . $this->Application->getUnitOption($event->Prefix, 'TableName') . '
WHERE LinkId IN (' . implode(',', $ids) . ')';
$ids = $this->Conn->GetCol($sql);
}
return $ids;
}
/**
* Approves/declines selected links
*
* @param kEvent $event
*/
function iterateItems(&$event)
{
if ($this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1)) {
return;
}
$ids = $this->_getSelectedIds($event);
if (!$ids) {
return ;
}
$object =& $this->Application->recallObject('l.-item', null, Array ('skip_autoload' => true));
/* @var $object kCatDBItem */
foreach ($ids as $id) {
$object->Load($id);
switch ($event->Name) {
case 'OnApproveLinks':
$ret = $object->ApproveChanges();
break;
case 'OnDeclineLinks':
$ret = $object->DeclineChanges();
break;
}
if (!$ret) {
$event->status = erFAIL;
$event->redirect = false;
break;
}
}
}
/**
* Deletes selected links
*
* @param kEvent $event
*/
function OnDeleteLinks(&$event)
{
if ($this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1)) {
return;
}
$ids = $this->_getSelectedIds($event);
if (!$ids) {
return ;
}
$temp_handler =& $this->Application->recallObject('l_TempHandler', 'kTempTablesHandler');
/* @var $temp_handler kTempTablesHandler */
$temp_handler->DeleteItems('l', '', $ids);
}
/**
* [HOOK] Allows to edit links, used in selected link validation records
*
* @param kEvent $event
*/
function OnPrepareLinkEditing(&$event)
{
// hook to OnAfterConfigRead instead of OnEdit, because fake ids should be available in CheckPermission
if ($this->Application->GetVar('l_event') != 'OnEdit') {
return ;
}
$ids = $this->_getSelectedIds($event);
$id_field = $this->Application->getUnitOption('l', 'IDField');
$items_info = Array ();
foreach ($ids as $id) {
$items_info[$id][$id_field] = 'on';
}
$this->Application->SetVar('l', $items_info);
}
/**
* Gets all links, that are not yet validated and prepare data
*
* @param kEvent $event
*
* @return bool
*/
function _prepareValidation(&$event)
{
// 2. get ids of all links and put them into validation queue
$id_field = $this->Application->getUnitOption('l', 'IDField');
$sql = 'SELECT ' . $id_field . '
FROM ' . $this->Application->getUnitOption('l', 'TableName') . '
WHERE LinkId NOT IN (SELECT LinkId FROM ' . $this->Application->getUnitOption($event->Prefix, 'TableName') . ')';
$link_ids = $this->Conn->GetCol($sql);
if ($link_ids) {
$validation_data = Array (
'processed' => 0,
'total' => count($link_ids),
'items' => $link_ids,
);
$this->Application->StoreVar($event->Prefix . '_status', serialize($validation_data)); // 4K links will be 78KB serialized
return true;
}
return false;
}
/**
* [REGULAR EVENT] Performs link validation throught cron
*
* @param kEvent $event
*/
function OnCronValidation(&$event)
{
$this->_resetValidation($event); // remove this for continuing to non validated before links
$have_data = $this->_prepareValidation($event);
if ($have_data) {
do {
$done = $this->_validate($event, false);
} while (!$done);
}
}
/**
* Makes calcualated fields to go to multilingual link fields
*
* @param kEvent $event
*/
function OnAfterConfigRead(&$event)
{
parent::OnAfterConfigRead($event);
$calculated_fields = $this->Application->getUnitOption($event->Prefix, 'CalculatedFields');
$calculated_fields['']['LinkName'] = 'l.l' . $this->Application->GetVar('m_lang') . '_Name';
$this->Application->setUnitOption($event->Prefix, 'CalculatedFields', $calculated_fields);
}
}
\ No newline at end of file
Index: branches/5.0.x/in-link/units/l-visits/l-visits_config.php
===================================================================
--- branches/5.0.x/in-link/units/l-visits/l-visits_config.php (revision 12303)
+++ branches/5.0.x/in-link/units/l-visits/l-visits_config.php (revision 12304)
@@ -1,85 +1,85 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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!');
+
$config = Array (
'Prefix' => 'l-visit',
'ItemClass' => Array('class' => 'kDBItem', 'file' => '', 'build_event' => 'OnItemBuild'),
'EventHandlerClass' => Array('class' => 'LinkVisitEventHandler', 'file' => 'l-visit_eh.php', 'build_event' => 'OnBuild'),
'AutoLoad' => true,
'Hooks' => Array (
Array (
'Mode' => hAFTER,
'Conditional' => false,
'HookToPrefix' => 'u',
'HookToSpecial' => '-item', // from OnMassDelete event
'HookToEvent' => Array('OnAfterItemDelete'),
'DoPrefix' => '',
'DoSpecial' => '*',
'DoEvent' => 'OnDeleteVisits',
),
Array (
'Mode' => hAFTER,
'Conditional' => false,
'HookToPrefix' => 'l',
'HookToSpecial' => '-item', // from "Catalog"
'HookToEvent' => Array('OnAfterItemDelete'),
'DoPrefix' => '',
'DoSpecial' => '*',
'DoEvent' => 'OnDeleteVisits',
),
Array (
'Mode' => hAFTER,
'Conditional' => false,
'HookToPrefix' => 'l',
'HookToSpecial' => 'showall-item', // from "Advanced View"
'HookToEvent' => Array('OnAfterItemDelete'),
'DoPrefix' => '',
'DoSpecial' => '*',
'DoEvent' => 'OnDeleteVisits',
),
),
'QueryString' => Array (
1 => 'id',
2 => 'page',
3 => 'event',
),
'IDField' => 'VisitId',
'TableName' => TABLE_PREFIX.'LinkVisits',
'AutoDelete' => true,
'ListSQLs' => Array ('' => 'SELECT * FROM %s'),
'ItemSQLs' => Array ('' => 'SELECT * FROM %s'),
'ListSortings' => Array (
'' => Array(
'Sorting' => Array('VisitTimestamp' => 'desc'),
)
),
'Fields' => Array (
'VisitId' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0),
'ResourceId' => Array ('type' => 'int', 'default' => NULL),
'PortalUserId' => Array ('type' => 'int', 'not_null' => 1, 'default' => 0),
'VisitTimestamp' => Array ('type' => 'int', 'formatter' => 'kDateFormatter', 'not_null' => 1, 'default' => '#NOW#'),
),
- );
-
-?>
+ );
\ No newline at end of file
Index: branches/5.0.x/in-link/units/l-visits/l-visit_eh.php
===================================================================
--- branches/5.0.x/in-link/units/l-visits/l-visit_eh.php (revision 12303)
+++ branches/5.0.x/in-link/units/l-visits/l-visit_eh.php (revision 12304)
@@ -1,34 +1,35 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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 LinkVisitEventHandler extends kDBEventHandler {
/**
* Deletes visits when user/link got deleted
*
* @param kEvent $event
*/
function OnDeleteVisits(&$event)
{
$key_field = $event->MasterEvent->Prefix == 'u' ? 'PortalUserId' : 'ResourceId';
$table_name = $this->Application->getUnitOption($this->Prefix, 'TableName');
$object =& $event->MasterEvent->getObject();
$sql = 'DELETE FROM '.$table_name.'
WHERE '.$key_field.' = '.$object->GetDBField($key_field);
$this->Conn->Query($sql);
}
-}
-?>
+}
\ No newline at end of file
Index: branches/5.0.x/in-link/units/listings/listings_event_handler.php
===================================================================
--- branches/5.0.x/in-link/units/listings/listings_event_handler.php (revision 12303)
+++ branches/5.0.x/in-link/units/listings/listings_event_handler.php (revision 12304)
@@ -1,773 +1,775 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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 ListingsEventHandler extends kDBEventHandler {
/**
* Allows to override standart permission mapping
*
*/
function mapPermissions()
{
parent::mapPermissions();
$permissions = Array(
// front
'OnRequestEnhancement' => Array ('self' => true),
'OnCancelEnhancement' => Array ('self' => true),
'OnExtendEnhancement' => Array ('self' => true),
);
$this->permMapping = array_merge($this->permMapping, $permissions);
}
/**
* Adds selected link to listing
*
* @param kEvent $event
*/
function OnProcessSelected(&$event)
{
$object =& $event->getObject();
$selected_ids = $this->Application->GetVar('selected_ids');
if ($selected_ids['l']) {
$link_id = $selected_ids['l'];
$sql = 'SELECT ResourceId
FROM '.$this->Application->getUnitOption('l', 'TableName').'
WHERE '.$this->Application->getUnitOption('l', 'IDField').' = '.$link_id;
$object->SetDBField($this->Application->RecallVar('dst_field'), $this->Conn->GetOne($sql));
$object->IgnoreValidation = true;
// $this->RemoveRequiredFields($object);
$object->Update();
}
$this->finalizePopup($event);
}
function OnPreSaveListing(&$event)
{
$event->redirect=false;
$object =& $event->getObject( Array('skip_autoload' => true) );
$object->IgnoreValidation = true;
// $this->RemoveRequiredFields($object);
$event->CallSubEvent('OnPreSave');
$this->Application->SetVar($event->getPrefixSpecial(true).'_id', $object->GetId());
return;
}
function OnBeforeItemUpdate(&$event)
{
$object =& $event->getObject();
if($object->IgnoreValidation)
{
$object->UpdateFormattersMasterFields();
}
}
function OnBeforeItemCreate(&$event)
{
$object =& $event->getObject();
if($object->IgnoreValidation)
{
$object->UpdateFormattersMasterFields();
}
}
/**
* Enter description here...
*
* @param kEvent $event
*/
function OnBeforeDeleteFromLive(&$event)
{
$object =& $event->getObject();
$sql = 'SELECT * FROM '.$this->Application->getUnitOption($event->Prefix, 'TableName').'
WHERE ListingId = '.$object->GetId();
$original_values = $this->Conn->GetRow($sql);
$type_modified = ($object->GetDBField('ListingTypeId') != $original_values['ListingTypeId']);
$link_modified = ($object->GetDBField('ItemResourceId') != $original_values['ItemResourceId']);
$status_modified = ($object->GetDBField('Status') != $original_values['Status']);
if($status_modified)
{
$email_event = $object->GetDBField('Status') ? 'LINK.ENHANCE.APPROVE' : 'LINK.ENHANCE.APPROVE';
$sql = 'SELECT CreatedById FROM '.$this->Application->getUnitOption('l', 'TableName').'
WHERE ResourceId = '.$object->GetDBField('ItemResourceId');
$email_event_user =& $this->Application->EmailEventUser($email_event, $this->Conn->GetOne($sql));
$email_event_admin =& $this->Application->EmailEventAdmin($email_event);
}
if( $type_modified || $link_modified )
{
$this->ResetLink($original_values);
}
if( $status_modified || $type_modified || $link_modified )
{
$this->EnhanceLink($object, $original_values);
}
if( $status_modified && !($type_modified || $link_modified) )
{
$this->ResetLink($original_values);
}
}
function EnhanceLink(&$object, $original_values)
{
if ($object->GetDBField('Status') != STATUS_ACTIVE) {
return false;
}
if ($object->GetDBField('ExpiresOn') < adodb_mktime()) {
$object->SetDBField('Status', STATUS_PENDING);
$object->Update();
$this->ResetLink($original_values);
return false;
}
$this->UpdateLink('OnPurchase', $object->GetDBField('ItemResourceId'), $object->GetDBField('ListingTypeId'));
$listtype_object =& $this->Application->recallObject('lst');
if( $listtype_object->GetDBField('OnPurchaseAddToCatEnabled') )
{
$link_object =& $this->Application->recallObject('l');
$add_to_cat = (int)$listtype_object->GetDBField('OnPurchaseAddToCat');
$sql = 'DELETE FROM '.$this->Application->getUnitOption('l-ci', 'TableName').'
WHERE CategoryId = '.$add_to_cat.'
AND ItemResourceId = '.$link_object->GetDBField('ResourceId').'
AND PrimaryCat = 0';
$this->Conn->Query($sql);
$sql = 'INSERT INTO '.$this->Application->getUnitOption('l-ci', 'TableName').'
(CategoryId, ItemResourceId, PrimaryCat)
VALUES ('.$add_to_cat.', '.$link_object->GetDBField('ResourceId').', 0)';
$this->Conn->Query($sql);
}
}
function ResetLink($original_values)
{
static $has_been_reset = Array();
if( $original_values['Status'] != STATUS_ACTIVE ||
getArrayValue($has_been_reset, $original_values['ListingId']) )
{
return;
}
$has_been_reset[$original_values['ListingId']] = 1;
$this->UpdateLink('OnExpire', $original_values['ItemResourceId'], $original_values['ListingTypeId']);
$listtype_object =& $this->Application->recallObject('lst');
if( $listtype_object->GetDBField('OnExpireRemoveFromCatEnabled') )
{
$remove_from_cat = $listtype_object->GetDBField('OnExpireRemoveFromCat');
$sql = 'DELETE FROM '.$this->Application->getUnitOption('l-ci', 'TableName').'
WHERE ItemResourceId = '.$original_values['ItemResourceId'].'
AND CategoryId = '.$remove_from_cat.'
AND PrimaryCat = 0';
$this->Conn->Query($sql);
}
}
function UpdateLink($action_prefix, $resource_id, $listtype_id)
{
$link_object =& $this->Application->recallObject('l', null, Array('skip_autoload' => true));
$link_object->Load($resource_id, 'ResourceId');
// "-item", because can be called as regular after event, and just "lst" recalls list instead
$listtype_object =& $this->Application->recallObject('lst.-item', null, Array('skip_autoload' => true));
$listtype_object->Load($listtype_id);
$action_fields = Array( 'EdPick' => 'EditorsPick',
'New' => 'NewItem',
'Hot' => 'HotItem',
'Pop' => 'PopItem',
'Status' => 'Status',
'CustomTemplate' => 'CustomTemplate',
);
// $action_prefix = 'OnPurchase';
foreach($action_fields as $action => $field)
{
$action_value = $listtype_object->GetDBField($action_prefix.$action);
if( $action_value != 3 )
{
$link_object->SetDBField($field, $action_value);
}
}
$priority_value = $listtype_object->GetDBField($action_prefix.'PriorityValue');
switch( $listtype_object->GetDBField($action_prefix.'PriorityAction') )
{
case 1: // equal
$link_object->SetDBField('Priority', $priority_value);
break;
case 2: // increase
$original_priority = $link_object->GetDBField('Priority');
$link_object->SetDBField('Priority', $original_priority + $priority_value);
break;
case 3: // decrease
$original_priority = $link_object->GetDBField('Priority');
$link_object->SetDBField('Priority', $original_priority - $priority_value);
break;
default:
}
$link_object->Update();
}
/**
* Enter description here...
*
* @param kEvent $event
*/
function OnRequestEnhancement(&$event)
{
if ($this->Application->isModuleEnabled('In-Commerce')) {
$l_info = $this->Application->GetVar('l');
if (!$l_info) {
return false;
}
list ($link_id, $link_info) = each($l_info);
$listing_type_id = $link_info['ListingTypeId'];
$listing_type =& $this->Application->recallObject('lst', null, Array('skip_autoload' => true));
$listing_type->Load($listing_type_id);
if ($listing_type->GetDBField('EnableBuying')) {
$add_to_cart_event = new kEvent('ord:OnAddVirtualProductToCart');
$this->Application->HandleEvent($add_to_cart_event);
if ($add_to_cart_event->redirect) {
$event->SetRedirectParam('pass', 'm');
$event->redirect = $add_to_cart_event->redirect;
}
return true;
}
}
$event->CallSubEvent('OnListingCreate');
}
/**
* Create listing or extend existing listing period
*
* @param kEvent $event
*/
function OnListingCreate(&$event)
{
$object =& $event->getObject( Array('skip_autoload' => true) );
switch ($event->Name) {
case 'EnhanceLinkAfterOrderApprove':
case 'EnhancedLinkOnCompleteOrder':
// when order with listing virtual product is approved
$fields = $event->getEventParam('field_values');
$item_data = unserialize($fields['ItemData']);
$listing_type_id = $item_data['ListingTypeId'];
$link_id = $item_data['LinkId'];
$new_processing = getArrayValue($item_data, 'HasNewProcessing');
break;
case 'OnListingCreate':
// when requesting enhancement from front (and not via in-commerce)
$links_info = $this->Application->GetVar('l');
if (!$links_info) return false;
$event->redirect = false;
list($link_id, $link_info) = each($links_info);
$listing_type_id = $link_info['ListingTypeId'];
$new_processing = false;
break;
}
if (!$listing_type_id) {
// free or invalid listing type selected
return false;
}
// get resource_id of link beeing enhanced
$sql = 'SELECT ResourceId
FROM '.$this->Application->getUnitOption('l', 'TableName').'
WHERE LinkId = '.$link_id;
$resource_id = $this->Conn->GetOne($sql);
// get listing by link's resource_id
$object->Load($resource_id, 'ItemResourceId');
if ($object->isLoaded()) {
$original_values = $object->FieldValues;
}
else {
// set initial fields to listing
$object->SetDBField('ListingTypeId', $listing_type_id);
$object->SetDBField('ItemResourceId', $resource_id);
if ($event->Name == 'OnListingCreate' || $new_processing) {
$item_status = STATUS_PENDING;
}
else {
$item_status = STATUS_ACTIVE;
}
$object->SetDBField('Status', $item_status);
}
// set date of purchase for new listings
$purchased_on = max(adodb_mktime(), $object->GetDBField('ExpiresOn'));
if (!$object->isLoaded()) {
$object->SetDBField('PurchasedOn_date', $purchased_on);
$object->SetDBField('PurchasedOn_time', $purchased_on);
}
// set expiration time for listing
$listing_type =& $this->Application->recallObject('lst', null, Array('skip_autoload' => true));
$listing_type->Load($listing_type_id);
$dur_type_mapping = Array( 1 => 1,
2 => 60,
3 => 3600,
4 => 3600*24,
5 => 3600*24*7,
6 => 3600*24*365/12,
7 => 3600*24*365
);
$duration = $listing_type->GetDBField('Duration');
$duration_type = $listing_type->GetDBField('DurationType');
$expiration_interval = $duration * $dur_type_mapping[$duration_type];
$expiration_date = $purchased_on + $expiration_interval;
$object->SetDBField('ExpiresOn_date', $expiration_date);
$object->SetDBField('ExpiresOn_time', $expiration_date);
// when extending enhancement mark listing as non-received renewal reminder
$object->SetDBField('RenewalReminderSent', 0);
$action = $object->isLoaded() ? 'Update' : 'Create';
if ($object->$action()) {
$event->status = erSUCCESS;
switch ($event->Name) {
case 'EnhanceLinkAfterOrderApprove':
case 'EnhancedLinkOnCompleteOrder':
// when order with listing virtual product is approved
if (getArrayValue($original_values, 'Status') != STATUS_ACTIVE) {
$this->EnhanceLink($object, Array());
}
break;
case 'OnListingCreate':
// when requesting enhancement from front (and not via in-commerce)
$event->redirect = $this->Application->GetVar('success_template');
$sql = 'SELECT CreatedById FROM '.$this->Application->getUnitOption('l', 'TableName').'
WHERE ResourceId = '.$object->GetDBField('ItemResourceId');
$email_event_user =& $this->Application->EmailEventUser('LINK.ENHANCE', $this->Conn->GetOne($sql));
$email_event_admin =& $this->Application->EmailEventAdmin('LINK.ENHANCE');
break;
}
}
else {
$event->status = erFAIL;
}
}
/**
* Enter description here...
*
* @param kEvent $event
*/
function EnhancedLinkOnCompleteOrder(&$event)
{
// create enhancement, but pending
$this->OnListingCreate($event);
// save created listing_id back to itemdata
$object =& $event->getObject( Array('skip_autoload' => true) );
$fields = $event->getEventParam('field_values');
$item_data = unserialize($fields['ItemData']);
unset($item_data['ListingTypeId']);
$item_data['ListingId'] = $object->GetID();
$orditems_idfield = $this->Application->getUnitOption('orditems', 'IDField');
$orditems_table = $this->Application->getUnitOption('orditems', 'TableName');
$this->Conn->doUpdate( Array('ItemData' => serialize($item_data)), $orditems_table, $orditems_idfield.' = '.$fields['OrderItemId'] );
}
/**
* Enter description here...
*
* @param kEvent $event
*/
function EnhanceLinkAfterOrderApprove(&$event)
{
$object =& $event->getObject( Array('skip_autoload' => true) );
$fields = $event->getEventParam('field_values');
$item_data = unserialize($fields['ItemData']);
if ( getArrayValue($item_data, 'HasNewProcessing') ) {
// new processing: just approve created listing here
$listing_id = $item_data['ListingId'];
$object->Load($listing_id);
// moved enhancement period to time admin approved enhancement
$time_diff = adodb_mktime() - $object->GetDBField('PurchasedOn');
$object->SetDBField('PurchasedOn_date', $object->GetDBField('PurchasedOn_date') + $time_diff);
$object->SetDBField('PurchasedOn_time', $object->GetDBField('PurchasedOn_time') + $time_diff);
$object->SetDBField('ExpiresOn_date', $object->GetDBField('ExpiresOn_date') + $time_diff);
$object->SetDBField('ExpiresOn_time', $object->GetDBField('ExpiresOn_time') + $time_diff);
$object->SetDBField('Status', STATUS_ACTIVE);
$object->Update();
$this->EnhanceLink($object, Array());
return true;
}
else {
// create listing & approve it at the same time
$this->OnListingCreate($event);
}
}
/**
* Delete listing
*
* @param kEvent $event
*/
function EnhanceLinkAfterOrderDeny(&$event)
{
$object =& $event->getObject( Array('skip_autoload' => true) );
$fields = $event->getEventParam('field_values');
$item_data = unserialize($fields['ItemData']);
$listing_id = $item_data['ListingId'];
$temp_handler =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler');
$temp_handler->DeleteItems($event->Prefix, $event->Special, Array($listing_id));
}
/**
* Enter description here...
*
* @param kEvent $event
*/
function ExpireLink(&$event)
{
$object =& $event->getObject( Array('skip_autoload' => true) );
$fields = $event->getEventParam('field_values');
$item_data = unserialize($fields['ItemData']);
$sql = 'SELECT ListingId FROM '.$this->Application->getUnitOption($event->Prefix, 'TableName').'
WHERE ItemResourceId = '.$item_data['LinkId'];
$listing_id = $this->Conn->GetOne($sql);
$object->Load($listing_id);
$original_values = $object->FieldValues;
$object->SetDBField('Status', 2);
if($object->Update())
{
$event->status = erSUCCESS;
$this->ResetLink($original_values);
}
else
{
$event->status = erFAIL;
}
}
function iterateItems(&$event)
{
$object =& $event->getObject( Array('skip_autoload' => true) );
$ids = $this->StoreSelectedIDs($event);
if ($event->Name == 'OnMassApprove') {
foreach ($ids as $id) {
$object->Load($id);
if ($object->GetDBField('Status') != STATUS_ACTIVE) {
$original_values = $object->FieldValues;
$object->SetDBField('Status', STATUS_ACTIVE);
$this->EnhanceLink($object, $original_values);
}
}
}
if ($event->Name == 'OnMassDecline') {
foreach ($ids as $id) {
$object->Load($id);
if ($object->GetDBField('Status') == STATUS_ACTIVE) {
$original_values = $object->FieldValues;
$this->ResetLink($original_values);
$sql = 'SELECT CreatedById
FROM '.$this->Application->getUnitOption('l', 'TableName').'
WHERE ResourceId = '.$object->GetDBField('ItemResourceId');
$email_event_user =& $this->Application->EmailEventUser('LINK.ENHANCE.DENY', $this->Conn->GetOne($sql));
$email_event_admin =& $this->Application->EmailEventAdmin('LINK.ENHANCE.DENY');
}
}
}
parent::iterateItems($event);
// extend period for pending/renewal links (if owner has agreed)
if ($event->Name == 'OnMassApprove') {
$lst_object =& $this->Application->recallObject('lst', null, Array('skip_autoload' => true));
foreach ($ids as $id) {
$object->Load($id);
$sql = 'SELECT CreatedById
FROM '.$this->Application->getUnitOption('l', 'TableName').'
WHERE ResourceId = '.$object->GetDBField('ItemResourceId');
$owner_id = $this->Conn->GetOne($sql);
if ($object->GetDBField('PendingRenewal') == 1) {
$lst_object->Load( $object->GetDBField('ListingTypeId') );
$dur_type_mapping = Array( 1 => 1,
2 => 60,
3 => 3600,
4 => 3600*24,
5 => 3600*24*7,
6 => 3600*24*365/12,
7 => 3600*24*365
);
$duration = $lst_object->GetDBField('Duration');
$duration_type = $lst_object->GetDBField('DurationType');
$expiration_interval = $duration * $dur_type_mapping[$duration_type];
$renewal_begins = max( adodb_mktime(), $object->GetDBField('ExpiresOn') );
$expiration_date = $renewal_begins + $expiration_interval;
$object->SetDBField('ExpiresOn_date', $expiration_date);
$object->SetDBField('ExpiresOn_time', $expiration_date);
$object->SetDBField('RenewalReminderSent', 0);
$object->SetDBField('PendingRenewal', 0);
if ($object->Update()) {
$event->status = erSUCCESS;
$event->redirect_params = Array('opener' => 's'); //stay!
$email_event_user =& $this->Application->EmailEventUser('LINK.ENHANCE.RENEW', $owner_id);
$email_event_admin =& $this->Application->EmailEventAdmin('LINK.ENHANCE.RENEW');
}
else {
$event->status=erFAIL;
$event->redirect=false;
break;
}
}
else {
$email_event_user =& $this->Application->EmailEventUser('LINK.ENHANCE.APPROVE', $owner_id);
$email_event_admin =& $this->Application->EmailEventAdmin('LINK.ENHANCE.APPROVE');
}
}
}
}
/**
* Redirects to cancel template on front-end
*
* @param kEvent $event
*/
function OnCancel(&$event)
{
parent::OnCancel($event);
if (!$this->Application->IsAdmin()) {
$event->SetRedirectParam('opener', 's');
$event->redirect = $this->Application->GetVar('cancel_template');
}
}
/**
* Checks that user is owner of link & returns listing id if permissions are ok
*
* @param kEvent $event
* @return mixed
*/
function verifyListingOwner(&$event)
{
$link_id = $this->Application->GetVar('l_id');
$user_id = $this->Application->RecallVar('user_id');
$sql = 'SELECT ResourceId
FROM '.$this->Application->getUnitOption('l', 'TableName').'
WHERE (LinkId = '.$link_id.') AND (CreatedById = '.$user_id.')';
$resource_id = $this->Conn->GetOne($sql);
if (!$resource_id) {
$event->status = erFAIL;
return false;
}
$sql = 'SELECT ListingId
FROM '.$this->Application->getUnitOption($event->Prefix, 'TableName').'
WHERE ItemResourceId = '.$resource_id;
return $this->Conn->GetOne($sql);
}
function OnExtendEnhancement(&$event)
{
$listing_id = $this->verifyListingOwner($event);
if (!$listing_id) {
return ;
}
$object =& $event->getObject( Array('skip_autoload' => true) );
$object->Load($listing_id);
$object->SetDBField('PendingRenewal', 1);
$object->Update();
$event->redirect = $this->Application->GetVar('success_template');
$sql = 'SELECT CreatedById FROM '.$this->Application->getUnitOption('l', 'TableName').'
WHERE ResourceId = '.$object->GetDBField('ItemResourceId');
$email_event_user =& $this->Application->EmailEventUser('LINK.ENHANCE.EXTEND', $this->Conn->GetOne($sql));
$email_event_admin =& $this->Application->EmailEventAdmin('LINK.ENHANCE.EXTEND');
}
function OnCancelEnhancement(&$event)
{
$listing_id = $this->verifyListingOwner($event);
if (!$listing_id) {
return ;
}
$object =& $event->getObject( Array('skip_autoload' => true) );
$object->Load($listing_id);
$original_values = $object->FieldValues;
$original_values['Status'] = 1;
$this->ResetLink($original_values);
$sql = 'SELECT CreatedById FROM '.$this->Application->getUnitOption('l', 'TableName').'
WHERE ResourceId = '.$object->GetDBField('ItemResourceId');
$email_event_user =& $this->Application->EmailEventUser('LINK.ENHANCE.CANCEL', $this->Conn->GetOne($sql));
$email_event_admin =& $this->Application->EmailEventAdmin('LINK.ENHANCE.CANCEL');
$object->Delete();
$event->redirect = $this->Application->GetVar('success_template');
}
function OnCheckExpiredPaidListings(&$event)
{
$sql = 'SELECT ListingId FROM '.$this->Application->getUnitOption($event->Prefix, 'TableName').'
WHERE ExpiresOn < '.adodb_mktime().' AND Status = 1';
$expired_listings = $this->Conn->GetCol($sql);
if(is_array($expired_listings) && count($expired_listings) > 0)
{
$object =& $this->Application->recallObject($event->Prefix.'.-item', null, Array('skip_autoload' => true));
foreach($expired_listings as $listing_id)
{
$object->Load($listing_id);
$original_values = $object->FieldValues;
$this->ResetLink($original_values);
$object->SetDBField('Status', 2);
$object->Update();
$sql = 'SELECT CreatedById FROM '.$this->Application->getUnitOption('l', 'TableName').'
WHERE ResourceId = '.$object->GetDBField('ItemResourceId');
$email_event_user =& $this->Application->EmailEventUser('LINK.ENHANCE.EXPIRE', $this->Conn->GetOne($sql));
$email_event_admin =& $this->Application->EmailEventAdmin('LINK.ENHANCE.EXPIRE');
}
}
$sql = 'SELECT ls.ListingId, l.CreatedById FROM '.$this->Application->getUnitOption($event->Prefix, 'TableName').' ls
LEFT JOIN '.$this->Application->getUnitOption('lst', 'TableName').' lst
ON ls.ListingTypeId = lst.ListingTypeId
LEFT JOIN '.$this->Application->getUnitOption('l', 'TableName').' l
ON ls.ItemResourceId = l.ResourceId
WHERE ls.Status = 1
AND ls.ExpiresOn < '.adodb_mktime().' + lst.RenewalReminder * 3600 *24
AND ls.RenewalReminderSent = 0';
$res = $this->Conn->Query($sql);
if(is_array($res) && count($res) > 0)
{
$listing_ids = Array();
foreach($res as $record)
{
$email_event_user =& $this->Application->EmailEventUser('LINK.ENHANCE.RENEWAL.NOTICE', $record['CreatedById']);
$email_event_admin =& $this->Application->EmailEventAdmin('LINK.ENHANCE.RENEWAL.NOTICE');
$listing_ids[] = $record['ListingId'];
}
$sql = 'UPDATE '.$this->Application->getUnitOption($event->Prefix, 'TableName').'
SET RenewalReminderSent = 1
WHERE ListingId IN ('.implode(',', $listing_ids).')';
$this->Conn->Query($sql);
}
}
function OnMassDelete(&$event)
{
$object =& $event->getObject( Array('skip_autoload' => true) );
$ids = $this->StoreSelectedIDs($event);
foreach($ids as $id)
{
$object->Load($id);
if($object->GetDBField('Status') == 1)
{
$original_values = $object->FieldValues;
$this->ResetLink($original_values);
}
}
parent::OnMassDelete($event);
}
/**
* Moves enhancement from original link to it's pending copy, that is going to be approved
*
* @param kEvent $event
*/
function OnMoveEnhancement(&$event)
{
$id_field = $this->Application->getUnitOption($event->MasterEvent->Prefix, 'IDField');
$item_table_name = $this->Application->getUnitOption($event->MasterEvent->Prefix, 'TableName');
$pending_id = $event->MasterEvent->getEventParam('id');
$original_id = $event->MasterEvent->getEventParam('original_id');
$sql = 'SELECT ResourceId, '.$id_field.'
FROM '.$item_table_name.'
WHERE '.$id_field.' IN ('.$pending_id.','.$original_id.')';
$resource_ids = $this->Conn->GetCol($sql, $id_field);
$table_name = $this->Application->getUnitOption($event->Prefix, 'TableName');
$sql = 'UPDATE '.$table_name.'
SET ItemResourceId = '.$resource_ids[$pending_id].'
WHERE ItemResourceId = '.$resource_ids[$original_id];
$this->Conn->Query($sql);
}
/**
* Makes calcualated fields to go to multilingual link fields
*
* @param kEvent $event
*/
function OnAfterConfigRead(&$event)
{
parent::OnAfterConfigRead($event);
$language_id = $this->Application->GetVar('m_lang');
$calculated_fields = $this->Application->getUnitOption($event->Prefix, 'CalculatedFields');
$calculated_fields['']['LinkName'] = 'CONCAT(item_table.l' . $language_id . '_Name, " (", item_table.Url, ")")';
$this->Application->setUnitOption($event->Prefix, 'CalculatedFields', $calculated_fields);
}
}
\ No newline at end of file
Index: branches/5.0.x/in-link/units/listings/listings_config.php
===================================================================
--- branches/5.0.x/in-link/units/listings/listings_config.php (revision 12303)
+++ branches/5.0.x/in-link/units/listings/listings_config.php (revision 12304)
@@ -1,156 +1,156 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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' => 'ls',
'ItemClass' => Array('class'=>'kDBItem','file'=>'','build_event'=>'OnItemBuild'),
'ListClass' => Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'),
'EventHandlerClass' => Array('class'=>'ListingsEventHandler','file'=>'listings_event_handler.php','build_event'=>'OnBuild'),
'TagProcessorClass' => Array('class'=>'ListingsTagProcessor','file'=>'listings_tag_processor.php','build_event'=>'OnBuild'),
'AutoLoad' => true,
'Hooks' => Array(
Array(
'Mode' => hAFTER,
'Conditional' => false,
'HookToPrefix' => 'l',
'HookToSpecial' => '*',
'HookToEvent' => Array('OnBeforeDeleteOriginal'),
'DoPrefix' => '',
'DoSpecial' => '*',
'DoEvent' => 'OnMoveEnhancement',
),
),
'QueryString' => Array(
1 => 'id',
2 => 'page',
3 => 'event',
4 => 'mode',
),
'RegularEvents' => Array(
'listings_expiration' => Array('EventName' => 'OnCheckExpiredPaidListings', 'RunInterval' => 1800, 'Type' => reAFTER),
),
'IDField' => 'ListingId',
'StatusField' => Array('Status', 'PendingRenewal'),
'TitleField' => 'LinkName',
'TitlePresets' => Array(
'default' => Array( 'new_status_labels' => Array('ls'=>'!la_title_AddingListing!'),
'edit_status_labels' => Array('ls'=>'!la_title_EditingListing!'),
'new_titlefield' => Array('ls'=>'!la_title_NewListing!'),
),
'listing_list' => Array('prefixes' => Array('ls_List'), 'format' => "!la_title_PaidListings!",),
'listing_edit' => Array('prefixes' => Array('ls'), 'format' => "#ls_status# '#ls_titlefield#' - !la_title_General!",),
),
'PermSection' => Array('main' => 'in-link:paid_listings'),
'Sections' => Array(
'in-link:paid_listings_folder' => Array(
'parent' => 'in-link',
'icon' => 'paid_listings',
'label' => 'la_tab_PaidListings',
'permissions' => Array(),
'priority' => 2,
'type' => stTREE,
),
'in-link:paid_listings' => Array(
'parent' => 'in-link:paid_listings_folder',
'icon' => 'paid_listings',
'label' => 'la_tab_Listings',
'url' => Array('t' => 'in-link/paid_listings/paid_listings_list', 'pass' => 'm'),
'permissions' => Array('view', 'add', 'edit', 'delete', 'advanced:approve', 'advanced:decline'),
'priority' => 2.1,
'type' => stTAB,
),
),
'TableName' => TABLE_PREFIX.'Listings',
'ListSQLs' => Array( ''=>' SELECT %1$s.* %2$s
FROM %1$s
LEFT JOIN '.TABLE_PREFIX.'Link item_table ON item_table.ResourceId = %1$s.ItemResourceId
LEFT JOIN '.TABLE_PREFIX.'PortalUser u ON u.PortalUserId = item_table.CreatedById'),
'ItemSQLs' => Array( ''=>' SELECT %1$s.* %2$s
FROM %1$s
LEFT JOIN '.TABLE_PREFIX.'Link item_table ON item_table.ResourceId = %1$s.ItemResourceId
LEFT JOIN '.TABLE_PREFIX.'PortalUser u ON u.PortalUserId = item_table.CreatedById'),
'ListSortings' => Array(
'' => Array(
'Sorting' => Array('PurchasedOn' => 'desc'),
)
),
'CalculatedFields' => Array (
'' => Array (
'LinkName' => 'CONCAT(item_table.Name, " (", item_table.Url, ")")',
'LinkOwner' => 'IF (ISNULL(u.Login), IF (item_table.CreatedById = -1, "root", IF (item_table.CreatedById = -2, "Guest", "n/a")), u.Login)',
),
),
'Fields' => Array
(
'ListingId' => Array('type' => 'int', 'not_null' => 1, 'default' => 0,),
'ListingTypeId' => Array('type' => 'int', 'formatter'=>'kOptionsFormatter', 'options_sql'=>'SELECT %s FROM '.TABLE_PREFIX.'ListingTypes ORDER BY Name', 'option_key_field'=>'ListingTypeId', 'option_title_field'=>'Name', 'default' => 0,),
'ItemResourceId' => Array('type' => 'int', 'required' => 1, 'unique' => Array('ItemResourceId'), 'error_field' => 'LinkName', 'default' => NULL),
'PurchasedOn' => Array('type' => 'int', 'formatter'=>'kDateFormatter','default'=>'#NOW#'),
'ExpiresOn' => Array('type' => 'int', 'formatter'=>'kDateFormatter','default' => '#NOW#','required'=>1),
'Status' => Array('type' => 'int', 'not_null' => 1, 'default' => 2, 'formatter'=>'kOptionsFormatter','options' => Array(1 => 'la_Active', 2 => 'la_Pending', 0 => 'la_Disabled'),'use_phrases' => 1),
'PendingRenewal' => Array('type' => 'int','formatter'=>'kOptionsFormatter','options' => Array(0 => 'la_NotPendingRenewal', 1 => 'la_PendingRenewal'),'use_phrases' => 1, 'not_null' => 1, 'default' => 0),
'RenewalReminderSent' => Array('type' => 'int', 'not_null' => 1, 'default' => 0),
),
'VirtualFields' => Array (
'LinkName' => Array ('type' => 'string'),
'LinkOwner' => Array ('type' => 'string'),
),
'FilterMenu' => Array(
'Groups' => Array(
Array('mode' => 'AND', 'filters' => Array(0,1,2), 'type' => WHERE_FILTER),
Array('mode' => 'AND', 'filters' => Array(3), 'type' => WHERE_FILTER),
),
'Filters' => Array(
0 => Array('label' =>'la_Enabled', 'on_sql' => '', 'off_sql' => '%1$s.Status != 1' ),
1 => Array('label' => 'la_Disabled', 'on_sql' => '', 'off_sql' => '%1$s.Status != 0' ),
2 => Array('label' => 'la_Pending', 'on_sql' => '', 'off_sql' => '%1$s.Status != 2' ),
3 => Array('label' => 'la_PendingRenewal', 'on_sql' => '', 'off_sql' => '%1$s.PendingRenewal != 1' ),
)
),
'Grids' => Array(
'Default' => Array(
'Icons' => Array('default'=>'icon17_custom.gif','1_0'=>'icon16_listing.gif','0_0'=>'icon16_listing_disabled.gif','2_0'=>'icon16_listing_pending.gif', '1_1'=>'icon16_listing_pending.gif','0_1'=>'icon16_listing_disabled.gif','2_1'=>'icon16_listing_pending.gif'),
'Fields' => Array(
'ListingId' => Array( 'title'=>'la_col_Id' , 'data_block' => 'grid_checkbox_td', 'filter_block' => 'grid_range_filter'),
'ListingTypeId' => Array( 'title'=>'la_col_ListingTypeName' , 'data_block' => 'listing_type_td', 'filter_block' => 'grid_like_filter'),
'LinkName' => Array( 'title'=>'la_col_LinkName' , 'data_block' => 'link_td', 'filter_block' => 'grid_like_filter'),
'LinkOwner' => Array( 'title'=>'la_col_LinkOwner', 'filter_block' => 'grid_like_filter'),
'PendingRenewal' => Array( 'title'=>'la_col_PendingRenewal', 'filter_block' => 'grid_options_filter'),
'PurchasedOn' => Array( 'title'=>'la_col_PurchasedOn', 'filter_block' => 'grid_date_range_filter'),
'ExpiresOn' => Array( 'title'=>'la_col_ExpiresOn', 'filter_block' => 'grid_date_range_filter'),
),
),
),
- );
-
-?>
\ No newline at end of file
+ );
\ No newline at end of file
Index: branches/5.0.x/in-link/units/listings/listings_tag_processor.php
===================================================================
--- branches/5.0.x/in-link/units/listings/listings_tag_processor.php (revision 12303)
+++ branches/5.0.x/in-link/units/listings/listings_tag_processor.php (revision 12304)
@@ -1,104 +1,104 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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 ListingsTagProcessor extends kDBTagProcessor {
/**
* Returns a link for editing product
*
* @param Array $params
* @return string
*/
function ListingTypeLink($params)
{
$object =& $this->Application->recallObject($this->getPrefixSpecial(), $this->Prefix, $params);
-
+
return $this->Application->HREF($params['edit_template'],'', Array(
'm_opener' => 'd',
'lst_mode' => 't',
'lst_event' => 'OnEdit',
'lst_id' => $object->GetDBField('ListingTypeId'),
'pass' => 'all,lst'
), 'index.php');
}
-
+
function LinkEditLink($params)
{
$object =& $this->Application->recallObject( $this->getPrefixSpecial(), $this->Prefix, $params );
-
+
$sql = 'SELECT '.$this->Application->getUnitOption('l', 'IDField').'
FROM '.$this->Application->getUnitOption('l', 'TableName').'
WHERE ResourceId = '.$object->GetDBField('ItemResourceId');
-
+
return $this->Application->HREF($params['edit_template'],'', Array(
'm_opener' => 'd',
'l_mode' => 't',
'l_event' => 'OnEdit',
'l_id' => $this->Conn->GetOne($sql),
'pass' => 'all,l'
));
}
-
+
function ExpirationDate($params)
{
$object =& $this->Application->recallObject( $this->getPrefixSpecial(), $this->Prefix, $params );
$listing_type =& $this->Application->recallObject( 'lst', 'lst', $params );
-
+
$dur_type_mapping = Array( 1 => 1,
2 => 60,
3 => 3600,
4 => 3600*24,
5 => 3600*24*7,
6 => 3600*24*365/12,
7 => 3600*24*365
);
$duration = $listing_type->GetDBField('Duration');
$duration_type = $listing_type->GetDBField('DurationType');
$expiration_interval = $duration * $dur_type_mapping[$duration_type];
$expiration_date = adodb_mktime() + $expiration_interval;
-
+
$lang =& $this->Application->recallObject('lang.current');
$format = $lang->GetDBField('DateFormat');
$expiration_date = adodb_date($format, $expiration_date);
return $expiration_date;
}
-
+
function ExpirationTime($params)
{
$object =& $this->Application->recallObject( $this->getPrefixSpecial(), $this->Prefix, $params );
$listing_type =& $this->Application->recallObject( 'lst', 'lst', $params );
-
+
$dur_type_mapping = Array( 1 => 1,
2 => 60,
3 => 3600,
4 => 3600*24,
5 => 3600*24*7,
6 => 3600*24*365/12,
7 => 3600*24*365
);
$duration = $listing_type->GetDBField('Duration');
$duration_type = $listing_type->GetDBField('DurationType');
$expiration_interval = $duration * $dur_type_mapping[$duration_type];
$expiration_date = adodb_mktime() + $expiration_interval;
-
+
$lang =& $this->Application->recallObject('lang.current');
$format = $lang->GetDBField('TimeFormat');
$expiration_date = adodb_date($format, $expiration_date);
return $expiration_date;
}
-}
-
-?>
\ No newline at end of file
+}
\ No newline at end of file
Index: branches/5.0.x/in-link/units/listing_types/listing_types_event_handler.php
===================================================================
--- branches/5.0.x/in-link/units/listing_types/listing_types_event_handler.php (revision 12303)
+++ branches/5.0.x/in-link/units/listing_types/listing_types_event_handler.php (revision 12304)
@@ -1,85 +1,84 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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.
*/
-class ListingTypesEventHandler extends kDBEventHandler {
+ defined('FULL_PATH') or die('restricted access!');
- /**
- * Allows to override standart permission mapping
- *
- */
- function mapPermissions()
- {
- parent::mapPermissions();
- $permissions = Array(
- 'OnItemBuild' => Array('self' => true),
- );
-
- $this->permMapping = array_merge($this->permMapping, $permissions);
- }
-
- /**
- * Set's selected category to listing type
- *
- * @param kEvent $event
- */
- function OnProcessSelected(&$event)
- {
- $object =& $event->getObject();
- $selected_ids = $this->Application->GetVar('selected_ids');
-
- $object->SetDBField($this->Application->RecallVar('dst_field'), $selected_ids['c']);
- $this->RemoveRequiredFields($object);
- $object->Update();
-
- $this->finalizePopup($event);
- }
-
-
- function OnPreSaveListingType(&$event)
- {
- $event->redirect = false;
- $object =& $event->getObject( Array('skip_autoload' => true) );
- $this->RemoveRequiredFields($object);
- $event->CallSubEvent('OnPreSave');
- $this->Application->SetVar($event->getPrefixSpecial(true).'_id', $object->GetID());
- }
-
- function OnPreSave(&$event)
- {
- $object =& $event->getObject();
- $item_info = $this->Application->GetVar($event->Prefix);
- if(is_array($item_info))
+ class ListingTypesEventHandler extends kDBEventHandler {
+
+ /**
+ * Allows to override standart permission mapping
+ *
+ */
+ function mapPermissions()
{
- $item_info = array_shift($item_info);
- if( getArrayValue($item_info, 'EnableBuying') )
- {
- $options = $object->GetFieldOptions('ShopCartName');
- $options['required'] = 1;
- $object->SetFieldOptions('ShopCartName', $options);
- }
+ parent::mapPermissions();
+ $permissions = Array(
+ 'OnItemBuild' => Array('self' => true),
+ );
+
+ $this->permMapping = array_merge($this->permMapping, $permissions);
+ }
+
+ /**
+ * Set's selected category to listing type
+ *
+ * @param kEvent $event
+ */
+ function OnProcessSelected(&$event)
+ {
+ $object =& $event->getObject();
+ $selected_ids = $this->Application->GetVar('selected_ids');
+
+ $object->SetDBField($this->Application->RecallVar('dst_field'), $selected_ids['c']);
+ $this->RemoveRequiredFields($object);
+ $object->Update();
+
+ $this->finalizePopup($event);
}
- parent::OnPreSave($event);
- }
- function OnEdit(&$event)
- {
- if ($this->Application->prefixRegistred('p')) {
- $this->Application->recallObject('p', null, Array('skip_autoload' => true));
+
+ function OnPreSaveListingType(&$event)
+ {
+ $event->redirect = false;
+ $object =& $event->getObject( Array('skip_autoload' => true) );
+ $this->RemoveRequiredFields($object);
+ $event->CallSubEvent('OnPreSave');
+ $this->Application->SetVar($event->getPrefixSpecial(true).'_id', $object->GetID());
}
- parent::OnEdit($event);
- }
-}
+ function OnPreSave(&$event)
+ {
+ $object =& $event->getObject();
+ $item_info = $this->Application->GetVar($event->Prefix);
+ if(is_array($item_info))
+ {
+ $item_info = array_shift($item_info);
+ if( getArrayValue($item_info, 'EnableBuying') )
+ {
+ $options = $object->GetFieldOptions('ShopCartName');
+ $options['required'] = 1;
+ $object->SetFieldOptions('ShopCartName', $options);
+ }
+ }
+ parent::OnPreSave($event);
+ }
-?>
\ No newline at end of file
+ function OnEdit(&$event)
+ {
+ if ($this->Application->prefixRegistred('p')) {
+ $this->Application->recallObject('p', null, Array('skip_autoload' => true));
+ }
+ parent::OnEdit($event);
+ }
+ }
\ No newline at end of file
Index: branches/5.0.x/in-link/units/listing_types/listing_types_config.php
===================================================================
--- branches/5.0.x/in-link/units/listing_types/listing_types_config.php (revision 12303)
+++ branches/5.0.x/in-link/units/listing_types/listing_types_config.php (revision 12304)
@@ -1,147 +1,147 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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' => 'lst',
'ItemClass' => Array('class'=>'kDBItem','file'=>'','build_event'=>'OnItemBuild'),
'ListClass' => Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'),
'EventHandlerClass' => Array('class'=>'ListingTypesEventHandler','file'=>'listing_types_event_handler.php','build_event'=>'OnBuild'),
'TagProcessorClass' => Array('class'=>'ListingTypesTagProcessor','file'=>'listing_types_tag_processor.php','build_event'=>'OnBuild'),
'AutoLoad' => true,
'AggregateTags' => Array(
Array(
'AggregateTo' => 'l',
'AggregatedTagName' => 'ListListingTypes',
'LocalTagName' => 'PrintList',
),
Array(
'AggregateTo' => 'l',
'AggregatedTagName' => 'ListingTypeField',
'LocalTagName' => 'Field',
),
),
'Hooks' => Array(),
'QueryString' => Array(
1 => 'id',
2 => 'page',
3 => 'event',
4 => 'mode',
),
'IDField' => 'ListingTypeId',
'TitleField' => 'Name',
'TitlePresets' => Array(
'default' => Array( 'new_status_labels' => Array('lst'=>'!la_title_AddingPaidListingType!'),
'edit_status_labels' => Array('lst'=>'!la_title_EditingPaidListingType!'),
'new_titlefield' => Array('lst'=>'!la_title_NewPaidListingType!'),
),
'listing_type_list'=>Array( 'prefixes' => Array('lst_List'),
'format' => "!la_title_PaidListingTypes!",
),
'listing_type_edit'=>Array( 'prefixes' => Array('lst'),
'new_titlefield' => Array('lst'=>'!la_title_NewPaidListingType!'),
'format' => "#lst_status# '#lst_titlefield#' - !la_title_General!",
),
'listing_type_shop_cart'=>Array( 'prefixes' => Array('lst'),
'new_titlefield' => Array('lst'=>'!la_title_NewPaidListingType!'),
'format' => "#lst_status# '#lst_titlefield#' - !la_title_ShopCartEntry!",
),
),
'EditTabPresets' => Array (
'Default' => Array (
'general' => Array ('title' => 'la_tab_General', 't' => 'in-link/paid_listings/paid_listing_type_edit', 'priority' => 1),
),
),
'PermSection' => Array('main' => 'in-link:listing_types'),
'Sections' => Array(
'in-link:listing_types' => Array(
'parent' => 'in-link:paid_listings_folder',
'icon' => 'paid_listings',
'label' => 'la_tab_ListingTypes',
'url' => Array('t' => 'in-link/paid_listings/paid_listing_types_list', 'pass' => 'm'),
'permissions' => Array('view', 'add', 'edit', 'delete'),
'priority' => 2.2,
'type' => stTAB,
),
),
'TableName' => TABLE_PREFIX.'ListingTypes',
'ListSQLs' => Array( ''=>'SELECT * FROM %s',), // key - special, value - list select sql
'ItemSQLs' => Array( ''=>'SELECT * FROM %s',),
'ListSortings' => Array(
'' => Array(
'Sorting' => Array('ListingTypeId' => 'asc'),
)
),
'Fields' => Array
(
'ListingTypeId' => Array('type' => 'int', 'not_null' => 1, 'default' => 0,),
'Name' => Array('type' => 'string','not_null' => '1','default' => '','required' => '1'),
'Description' => Array('type' => 'string', 'formatter' => 'kFormatter', 'not_null' => 1, 'using_fck' => 1, 'default' => ''),
'Duration' => Array('type' => 'int', 'not_null' => 1, 'default' => 0),
'DurationType' => Array('type' => 'int', 'not_null' => 1, 'default' => 0, 'formatter'=>'kOptionsFormatter','use_phrases' => 1,'options' => Array(1 => 'la_opt_sec', 2 => 'la_opt_min', 3 => 'la_opt_hour', 4 => 'la_opt_day', 5 => 'la_opt_week', 6 => 'la_opt_month', 7 => 'la_opt_year')),
'OnPurchaseEdPick' => Array('type' => 'int','not_null' => '1','formatter'=>'kOptionsFormatter','use_phrases' => 1,'options' => Array(3 => 'la_Unchanged', 1 => 'la_On', 0 => 'la_Off'), 'default' => 3),
'OnPurchaseStatus' => Array('type' => 'int','not_null' => '1','formatter'=>'kOptionsFormatter','use_phrases' => 1,'options' => Array(3 => 'la_Unchanged', 1 => 'la_Enabled', 0 => 'la_Disabled', 2 => 'la_Pending'),'default' => 3),
'OnPurchaseNew' => Array('type' => 'int','not_null' => '1','formatter'=>'kOptionsFormatter','use_phrases' => 1,'options' => Array(3 => 'la_Unchanged', 1 => 'la_On', 0 => 'la_Off', 2 => 'la_Auto'),'default' => 3),
'OnPurchasePop' => Array('type' => 'int','not_null' => '1','formatter'=>'kOptionsFormatter','use_phrases' => 1,'options' => Array(3 => 'la_Unchanged', 1 => 'la_On', 0 => 'la_Off', 2 => 'la_Auto'),'default' => 3),
'OnPurchaseHot' => Array('type' => 'int','not_null' => '1','formatter'=>'kOptionsFormatter','use_phrases' => 1,'options' => Array(3 => 'la_Unchanged', 1 => 'la_On', 0 => 'la_Off', 2 => 'la_Auto'),'default' => 3),
'OnPurchasePriorityAction' => Array('type' => 'int','not_null' => '1','formatter'=>'kOptionsFormatter','use_phrases' => 1,'options' => Array(0 => 'la_DontChange', 1 => 'la_SetEqualTo', 2 => 'la_IncreaseBy', 3 => 'la_DecreaseBy'),'default' => 0),
'OnPurchasePriorityValue' => Array('type' => 'int','not_null' => '1','default' => 1),
'OnPurchaseAddToCatEnabled' => Array('type' => 'int','not_null' => '1','default' => 0),
'OnPurchaseAddToCat' => Array('type' => 'int','not_null' => '1','default' => 0),
'OnPurchaseCustomTemplate' => Array('type' => 'string','not_null' => 1,'default' => ''),
'OnExpireEdPick' => Array('type' => 'int','formatter'=>'kOptionsFormatter','use_phrases' => 1,'options' => Array(3 => 'la_Unchanged', 1 => 'la_On', 0 => 'la_Off'),'not_null' => '1','default' => 3),
'OnExpireNew' => Array('type' => 'int','not_null' => '1','formatter'=>'kOptionsFormatter','use_phrases' => 1,'options' => Array(3 => 'la_Unchanged', 1 => 'la_On', 0 => 'la_Off', 2 => 'la_Auto'),'default' => 3),
'OnExpirePop' => Array('type' => 'int','not_null' => '1','formatter'=>'kOptionsFormatter','use_phrases' => 1,'options' => Array(3 => 'la_Unchanged', 1 => 'la_On', 0 => 'la_Off', 2 => 'la_Auto'),'default' => 3),
'OnExpireHot' => Array('type' => 'int','not_null' => '1','formatter'=>'kOptionsFormatter','use_phrases' => 1,'options' => Array(3 => 'la_Unchanged', 1 => 'la_On', 0 => 'la_Off', 2 => 'la_Auto'),'default' => 3),
'OnExpirePriorityAction' => Array('type' => 'int','not_null' => '1','formatter'=>'kOptionsFormatter','use_phrases' => 1,'options' => Array(0 => 'la_DontChange', 1 => 'la_SetEqualTo', 2 => 'la_IncreaseBy', 3 => 'la_DecreaseBy'),'default' => 0),
'OnExpirePriorityValue' => Array('type' => 'int','not_null' => '1','default' => 1),
'OnExpireRemoveFromCatEnabled' => Array('type' => 'int','not_null' => '1','default' => 0),
'OnExpireRemoveFromCat' => Array('type' => 'int','not_null' => '1','default' => 0),
'OnExpireCustomTemplate' => Array('type' => 'string','not_null' => 1,'default' => ''),
'OnExpireStatus' => Array('type' => 'int','not_null' => '1','formatter'=>'kOptionsFormatter','use_phrases' => 1,'options' => Array(3 => 'la_Unchanged', 1 => 'la_Enabled', 0 => 'la_Disabled', 2 => 'la_Pending'),'default' => 3),
'RenewalReminder' => Array('type' => 'int','not_null' => '1','default' => 0),
'EnableBuying' => Array('type' => 'int','not_null' => '1','default' => 0),
'ShopCartName' => Array('type' => 'string', 'default' => null),
'Price' => Array('type' => 'double','default' => ''),
'Recurring' => Array('type' => 'int','not_null' => '1','default' => 0),
'VirtualProductId' => Array('type' => 'int','not_null' => '1','default' => 0),
),
'Grids' => Array(
'Default' => Array(
'Icons' => Array('default'=>'icon16_listing_type.gif'),
'Fields' => Array(
'ListingTypeId' => Array( 'title'=>'la_col_Id' , 'data_block' => 'grid_checkbox_td', 'filter_block' => 'grid_range_filter'),
'Name' => Array( 'title'=>'la_col_Name', 'filter_block' => 'grid_like_filter'),
'Duration' => Array( 'title'=>'la_col_Duration' , 'data_block' => 'duration_td', 'filter_block' => 'grid_like_filter'),
),
),
),
- );
-
-?>
\ No newline at end of file
+ );
\ No newline at end of file
Index: branches/5.0.x/in-link/units/listing_types/listing_types_tag_processor.php
===================================================================
--- branches/5.0.x/in-link/units/listing_types/listing_types_tag_processor.php (revision 12303)
+++ branches/5.0.x/in-link/units/listing_types/listing_types_tag_processor.php (revision 12304)
@@ -1,47 +1,46 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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.
*/
-class ListingTypesTagProcessor extends kDBTagProcessor {
+ defined('FULL_PATH') or die('restricted access!');
- function CategoryPath($params)
- {
- $object =& $this->getObject($params);
- $params['cat_id'] = $object->GetDBField($params['field']);
-
- return $this->Application->ProcessParsedTag('c', 'CategoryPath', $params);
- }
-
- /**
- * Makes 1st listing type default
- *
- * @param Array $params
- * @return bool
- */
- function IsDefault($params)
- {
- static $listing_type_id = null;
+ class ListingTypesTagProcessor extends kDBTagProcessor {
- $object =& $this->getObject();
- /* @var $object kDBItem */
+ function CategoryPath($params)
+ {
+ $object =& $this->getObject($params);
+ $params['cat_id'] = $object->GetDBField($params['field']);
- if (!isset($listing_type_id)) {
- $listing_type_id = $object->GetID();
+ return $this->Application->ProcessParsedTag('c', 'CategoryPath', $params);
}
- return $listing_type_id == $object->GetID();
- }
-}
+ /**
+ * Makes 1st listing type default
+ *
+ * @param Array $params
+ * @return bool
+ */
+ function IsDefault($params)
+ {
+ static $listing_type_id = null;
+
+ $object =& $this->getObject();
+ /* @var $object kDBItem */
+
+ if (!isset($listing_type_id)) {
+ $listing_type_id = $object->GetID();
+ }
-
-?>
\ No newline at end of file
+ return $listing_type_id == $object->GetID();
+ }
+ }
\ No newline at end of file
Index: branches/5.0.x/in-link/install/upgrades.php
===================================================================
--- branches/5.0.x/in-link/install/upgrades.php (revision 12303)
+++ branches/5.0.x/in-link/install/upgrades.php (revision 12304)
@@ -1,116 +1,119 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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 = 'InLinkUpgrades';
/**
* Class, that holds all upgrade scripts for "Core" module
*
*/
class InLinkUpgrades 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-Link', 'RootCat');
$sql = 'UPDATE ' . $this->Application->getUnitOption('c', 'TableName') . '
SET UseMenuIconUrl = 1, MenuIconUrl = "in-link/img/menu_links.gif"
WHERE ' . $this->Application->getUnitOption('c', 'IDField') . ' = ' . $root_category;
$this->Conn->Query($sql);
$this->_updateDetailTemplate('l', 'inlink/detail', 'in-link/designs/detail');
// copy link name and description to their multilingual equivalents
$this->_copyToMultilingual();
}
}
/**
* Copy link values from normal fields to multilingual
*
*/
function _copyToMultilingual()
{
$fields = Array ('Name', 'Description');
$primary_language = $this->Application->GetDefaultLanguageId();
$set_clause = Array ();
foreach ($fields as $field) {
$set_clause[] = 'l' . $primary_language . '_' . $field . ' = ' . $field;
}
$sql = 'UPDATE ' . TABLE_PREFIX . 'Link
SET ' . implode(', ', $set_clause);
$this->Conn->Query($sql);
}
/**
* 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('l', 'in-link/designs/detail', 'in-link/links/link_detail');
}
}
}
\ No newline at end of file
Index: branches/5.0.x/in-link/install/prerequisites.php
===================================================================
--- branches/5.0.x/in-link/install/prerequisites.php (revision 12303)
+++ branches/5.0.x/in-link/install/prerequisites.php (revision 12304)
@@ -1,78 +1,79 @@
<?php
/**
* @version $Id$
* @package In-Link
* @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 = 'InLinkPrerequisites';
/**
* Class, that holds all prerequisite scripts for "In-Link" module
*
*/
class InLinkPrerequisites 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
Event Timeline
Log In to Comment