Page MenuHomeIn-Portal Phabricator

in-link
No OneTemporary

File Metadata

Created
Sun, Feb 23, 11:25 PM
Index: branches/5.3.x/units/link_validation/link_validation_eh.php
===================================================================
--- branches/5.3.x/units/link_validation/link_validation_eh.php (revision 16506)
+++ branches/5.3.x/units/link_validation/link_validation_eh.php (revision 16507)
@@ -1,585 +1,578 @@
<?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.org/license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
class LinkValidationEventHandler extends kDBEventHandler {
/**
* Allows to override standard permission mapping
*
* @return void
* @access protected
* @see kEventHandler::$permMapping
*/
protected 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);
}
/**
* Define alternative event processing method names
*
* @return void
* @see kEventHandler::$eventMethods
* @access protected
*/
protected function mapEvents()
{
parent::mapEvents();
$events_map = Array (
'OnApproveLinks' => 'iterateItems',
'OnDeclineLinks' => 'iterateItems',
);
$this->eventMethods = array_merge($this->eventMethods, $events_map);
}
/**
* Checks user permission to execute given $event
*
* @param kEvent $event
* @return bool
* @access public
*/
public function CheckPermission(kEvent $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 = kEvent::erPERM_FAIL;
}
}
return $perm_value;
}
return parent::CheckPermission($event);
}
/**
* Adds calculates fields for category name
*
* @param kDBItem|kDBList $object
* @param kEvent $event
* @return void
* @access protected
*/
protected function prepareObject(&$object, kEvent $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
* @return void
* @access protected
* @see kDBEventHandler::OnListBuild()
*/
protected function SetCustomQuery(kEvent $event)
{
parent::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)
{
$config = $event->getUnitConfig();
// 1. delete previous validation results
$sql = 'SELECT ' . $config->getIDField() . '
FROM ' . $config->getTableName();
$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->emailAdmin('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 = kEvent::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 ) {
$categories_config = $this->Application->getUnitConfig('c');
$tree_indexes = $this->Application->getTreeIndex($recycle_bin);
$sql = 'SELECT ' . $categories_config->getIDField() . '
FROM ' . $categories_config->getTableName() . '
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->getUnitConfig('l-ci')->getTableName() . '
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 */
$link_config = $this->Application->getUnitConfig('l');
$sql = 'SELECT Url, ResourceId
FROM ' . $link_config->getTableName() . '
WHERE ' . $link_config->getIDField() . ' = ' . $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->lastHTTPCode = 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 = time();
$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', Array ('parent_event' => $event));
/* @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 ) {
$config = $event->getUnitConfig();
$sql = 'SELECT ' . $config->getIDField() . '
FROM ' . $config->getTableName() . '
WHERE LinkId IN (' . implode(',', $ids) . ')';
$ids = $this->Conn->GetCol($sql);
}
return $ids;
}
/**
* Approves/declines selected links
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function iterateItems(kEvent $event)
{
if ( $this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1) ) {
$event->status = kEvent::erFAIL;
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) {
- $ret = true;
$object->Load($id);
switch ( $event->Name ) {
case 'OnApproveLinks':
- $ret = $object->ApproveChanges();
+ $object->ApproveChanges();
break;
case 'OnDeclineLinks':
- $ret = $object->DeclineChanges();
+ $object->DeclineChanges();
break;
}
-
- if ( !$ret ) {
- $event->status = kEvent::erFAIL;
- $event->redirect = false;
- break;
- }
}
}
/**
* Deletes selected links
*
* @param kEvent $event
*/
function OnDeleteLinks($event)
{
if ($this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1)) {
$event->status = kEvent::erFAIL;
return;
}
$ids = $this->_getSelectedIds($event);
if (!$ids) {
return ;
}
$temp_handler = $this->Application->recallObject('l_TempHandler', 'kTempTablesHandler', Array ('parent_event' => $event));
/* @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;
}
$items_info = Array ();
$ids = $this->_getSelectedIds($event);
$id_field = $this->Application->getUnitConfig('l')->getIDField();
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
$links_config = $this->Application->getUnitConfig('l');
$sql = 'SELECT ' . $links_config->getIDField() . '
FROM ' . $links_config->getTableName() . '
WHERE LinkId NOT IN (SELECT LinkId FROM ' . $event->getUnitConfig()->getTableName() . ')';
$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;
}
/**
* [SCHEDULED TASK] Performs link validation through 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 calculated fields to go to multilingual link fields
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnAfterConfigRead(kEvent $event)
{
parent::OnAfterConfigRead($event);
$event->getUnitConfig()->addCalculatedFieldsBySpecial('', Array (
'LinkName' => 'l.l' . $this->Application->GetVar('m_lang') . '_Name',
));
}
- }
\ No newline at end of file
+ }
Index: branches/5.3.x/units/listings/listings_event_handler.php
===================================================================
--- branches/5.3.x/units/listings/listings_event_handler.php (revision 16506)
+++ branches/5.3.x/units/listings/listings_event_handler.php (revision 16507)
@@ -1,881 +1,875 @@
<?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.org/license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
class ListingsEventHandler extends kDBEventHandler {
/**
* Allows to override standard permission mapping
*
* @return void
* @access protected
* @see kEventHandler::$permMapping
*/
protected 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();
/* @var $object kDBItem */
$selected_ids = $this->Application->GetVar('selected_ids');
if ( $selected_ids['l'] ) {
$link_id = $selected_ids['l'];
$config = $this->Application->getUnitConfig('l');
$sql = 'SELECT ResourceId
FROM ' . $config->getTableName() . '
WHERE ' . $config->getIDField() . ' = ' . $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;
}
/**
* Occurs before updating item
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnBeforeItemUpdate(kEvent $event)
{
$object = $event->getObject();
/* @var $object kDBItem */
if ( $object->IgnoreValidation ) {
$object->UpdateFormattersMasterFields();
}
}
/**
* Occurs before creating item
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnBeforeItemCreate(kEvent $event)
{
parent::OnBeforeItemCreate($event);
$object = $event->getObject();
/* @var $object kDBItem */
if ( $object->IgnoreValidation ) {
$object->UpdateFormattersMasterFields();
}
}
/**
* Occurs before an item is deleted from live table when copying from temp
* (temp handler deleted all items from live and then copy over all items from temp)
* Id of item being deleted is passed as event' 'id' param
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnBeforeDeleteFromLive(kEvent $event)
{
parent::OnBeforeDeleteFromLive($event);
$object = $event->getObject();
/* @var $object kDBItem */
$sql = 'SELECT *
FROM ' . $event->getUnitConfig()->getTableName() . '
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_template = $object->GetDBField('Status') ? 'LINK.ENHANCE.APPROVE' : 'LINK.ENHANCE.DENY';
$this->notifyOwner($email_template, $object);
}
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);
}
}
/**
* Enhances link
*
* @param kDBItem $object
* @param Array $original_values
* @return bool
*/
function EnhanceLink(&$object, $original_values)
{
if ( $object->GetDBField('Status') != STATUS_ACTIVE ) {
return false;
}
if ( $object->GetDBField('ExpiresOn') < time() ) {
$object->SetDBField('Status', STATUS_PENDING);
$object->Update();
$this->ResetLink($original_values);
return false;
}
list($link_object, $listing_type_object) = $this->UpdateLink(
'OnPurchase',
$object->GetDBField('ItemResourceId'),
$object->GetDBField('ListingTypeId')
);
if ( $listing_type_object->GetDBField('OnPurchaseAddToCatEnabled') ) {
$add_to_cat = (int)$listing_type_object->GetDBField('OnPurchaseAddToCat');
$category_item_config = $this->Application->getUnitConfig('l-ci');
$sql = 'DELETE FROM ' . $category_item_config->getTableName() . '
WHERE CategoryId = ' . $add_to_cat . '
AND ItemResourceId = ' . $link_object->GetDBField('ResourceId') . '
AND PrimaryCat = 0';
$this->Conn->Query($sql);
$sql = 'INSERT INTO ' . $category_item_config->getTableName() . '
(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;
list (, $listing_type_object) = $this->UpdateLink(
'OnExpire',
$original_values['ItemResourceId'],
$original_values['ListingTypeId']
);
if ( $listing_type_object->GetDBField('OnExpireRemoveFromCatEnabled') ) {
$remove_from_cat = $listing_type_object->GetDBField('OnExpireRemoveFromCat');
$sql = 'DELETE FROM ' . $this->Application->getUnitConfig('l-ci')->getTableName() . '
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();
return array($link_object, $listtype_object);
}
/**
* Enter description here...
*
* @param kEvent $event
*/
function OnRequestEnhancement($event)
{
if ( $this->Application->prefixRegistred('ord') ) {
$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)
{
$new_processing = false;
$link_id = $listing_type_id = 0;
$object = $event->getObject( Array('skip_autoload' => true) );
/* @var $object kDBItem */
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;
}
$links_config = $this->Application->getUnitConfig('l');
// get resource_id of link being enhanced
$sql = 'SELECT ResourceId
FROM '.$links_config->getTableName().'
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->GetFieldValues();
}
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(time(), $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));
/* @var $listing_type kDBItem */
$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 = kEvent::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');
$this->notifyOwner('LINK.ENHANCE', $object);
break;
}
}
else {
$event->status = kEvent::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();
$order_items_config = $this->Application->getUnitConfig('orditems');
$orditems_idfield = $order_items_config->getIDField();
$orditems_table = $order_items_config->getTableName();
$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) );
/* @var $object kDBItem */
$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 = time() - $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', Array ('parent_event' => $event));
/* @var $temp_handler 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));
/* @var $object kDBItem */
$fields = $event->getEventParam('field_values');
$item_data = unserialize($fields['ItemData']);
$sql = 'SELECT ListingId FROM ' . $event->getUnitConfig()->getTableName() . '
WHERE ItemResourceId = ' . $item_data['LinkId'];
$listing_id = $this->Conn->GetOne($sql);
$object->Load($listing_id);
$original_values = $object->GetFieldValues();
$object->SetDBField('Status', 2);
if ( $object->Update() ) {
$event->status = kEvent::erSUCCESS;
$this->ResetLink($original_values);
}
else {
$event->status = kEvent::erFAIL;
}
}
/**
* Apply same processing to each item being selected in grid
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function iterateItems(kEvent $event)
{
$object = $event->getObject(Array ('skip_autoload' => true));
/* @var $object kDBItem */
$ids = $this->StoreSelectedIDs($event);
$links_config = $this->Application->getUnitConfig('l');
if ( $event->Name == 'OnMassApprove' ) {
foreach ($ids as $id) {
$object->Load($id);
if ( $object->GetDBField('Status') != STATUS_ACTIVE ) {
$original_values = $object->GetFieldValues();
$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->GetFieldValues();
$this->ResetLink($original_values);
$this->notifyOwner('LINK.ENHANCE.DENY', $object);
}
}
}
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));
/* @var $lst_object kDBItem */
foreach ($ids as $id) {
$object->Load($id);
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(time(), $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 = kEvent::erSUCCESS;
$event->SetRedirectParam('opener', 's');
$this->notifyOwner('LINK.ENHANCE.RENEW', $object);
}
- else {
- $event->status = kEvent::erFAIL;
- $event->redirect = false;
- break;
- }
}
else {
$this->notifyOwner('LINK.ENHANCE.APPROVE', $object);
}
}
}
}
/**
* Redirects to cancel template on front-end
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnCancel(kEvent $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->getUnitConfig('l')->getTableName().'
WHERE (LinkId = '.$link_id.') AND (CreatedById = '.$user_id.')';
$resource_id = $this->Conn->GetOne($sql);
if (!$resource_id) {
$event->status = kEvent::erFAIL;
return false;
}
$sql = 'SELECT ListingId
FROM '.$event->getUnitConfig()->getTableName().'
WHERE ItemResourceId = '.$resource_id;
return $this->Conn->GetOne($sql);
}
protected function OnExtendEnhancement(kEvent $event)
{
$listing_id = $this->verifyListingOwner($event);
if (!$listing_id) {
return ;
}
$object = $event->getObject( Array('skip_autoload' => true) );
/* @var $object kDBItem */
$object->Load($listing_id);
$object->SetDBField('PendingRenewal', 1);
$object->Update();
$event->redirect = $this->Application->GetVar('success_template');
$this->notifyOwner('LINK.ENHANCE.EXTEND', $object);
}
/**
* Cancels enhancement
*
* @param kEvent $event
*/
function OnCancelEnhancement($event)
{
$listing_id = $this->verifyListingOwner($event);
if ( !$listing_id ) {
return;
}
$object = $event->getObject(Array ('skip_autoload' => true));
/* @var $object kDBItem */
$object->Load($listing_id);
$original_values = $object->GetFieldValues();
$original_values['Status'] = 1;
$this->ResetLink($original_values);
$this->notifyOwner('LINK.ENHANCE.CANCEL', $object);
$object->Delete();
$event->redirect = $this->Application->GetVar('success_template');
}
/**
* Checks expired paid listings
*
* @param kEvent $event
*/
function OnCheckExpiredPaidListings($event)
{
$config = $event->getUnitConfig();
$links_config = $this->Application->getUnitConfig('l');
$sql = 'SELECT ListingId FROM '.$config->getTableName().'
WHERE ExpiresOn < '.time().' 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));
/* @var $object kDBItem */
foreach($expired_listings as $listing_id)
{
$object->Load($listing_id);
$original_values = $object->GetFieldValues();
$this->ResetLink($original_values);
$object->SetDBField('Status', 2);
$object->Update();
$this->notifyOwner('LINK.ENHANCE.EXPIRE', $object);
}
}
$link_id_field = $this->Application->getUnitConfig('l')->getIDField();
$sql = 'SELECT ls.ListingId, l.CreatedById, l.' . $link_id_field . ' FROM ' . $config->getTableName() . ' ls
LEFT JOIN ' . $this->Application->getUnitConfig('lst')->getTableName() . ' lst
ON ls.ListingTypeId = lst.ListingTypeId
LEFT JOIN ' . $links_config->getTableName() . ' l
ON ls.ItemResourceId = l.ResourceId
WHERE ls.Status = 1
AND ls.ExpiresOn < ' . time() . ' + 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)
{
$send_params = Array (
'PrefixSpecial' => 'l',
'item_id' => $record[$link_id_field]
);
$this->Application->emailUser('LINK.ENHANCE.RENEWAL.NOTICE', $record['CreatedById'], $send_params);
$this->Application->emailAdmin('LINK.ENHANCE.RENEWAL.NOTICE', null, $send_params);
$listing_ids[] = $record['ListingId'];
}
$sql = 'UPDATE '.$config->getTableName().'
SET RenewalReminderSent = 1
WHERE ListingId IN ('.implode(',', $listing_ids).')';
$this->Conn->Query($sql);
}
}
/**
* Removes enhancements on listing delete
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnMassDelete(kEvent $event)
{
$object = $event->getObject(Array ('skip_autoload' => true));
/* @var $object kDBItem */
$ids = $this->StoreSelectedIDs($event);
foreach ($ids as $id) {
$object->Load($id);
if ( $object->GetDBField('Status') == STATUS_ACTIVE ) {
$this->ResetLink( $object->GetFieldValues() );
}
}
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)
{
$master_config = $event->MasterEvent->getUnitConfig();
$id_field = $master_config->getIDField();
$item_table_name = $master_config->getTableName();
$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 = $event->getUnitConfig()->getTableName();
$sql = 'UPDATE '.$table_name.'
SET ItemResourceId = '.$resource_ids[$pending_id].'
WHERE ItemResourceId = '.$resource_ids[$original_id];
$this->Conn->Query($sql);
}
/**
* Notifies link owner about listing related action.
*
* @param string $email_template E-mail template.
* @param kDBItem $listing Listing.
*
* @return void
*/
protected function notifyOwner($email_template, kDBItem $listing)
{
$unit_config = $this->Application->getUnitConfig('l');
$id_field = $unit_config->getIDField();
$sql = 'SELECT CreatedById, ' . $id_field . '
FROM ' . $unit_config->getTableName() . '
WHERE ResourceId = ' . $listing->GetDBField('ItemResourceId');
$link_data = $this->Conn->GetRow($sql);
$send_params = array(
'PrefixSpecial' => 'l',
'item_id' => $link_data[$id_field],
);
$this->Application->emailUser($email_template, $link_data['CreatedById'], $send_params);
$this->Application->emailAdmin($email_template, null, $send_params);
}
/**
* Makes calculated fields to go to multilingual link fields
*
* @param kEvent $event
* @return void
* @access protected
*/
protected function OnAfterConfigRead(kEvent $event)
{
parent::OnAfterConfigRead($event);
$language_id = $this->Application->GetVar('m_lang');
$event->getUnitConfig()->addCalculatedFieldsBySpecial('', Array (
'LinkName' => 'CONCAT(item_table.l' . $language_id . '_Name, " (", item_table.Url, ")")',
));
}
}
Index: branches/5.3.x/install/upgrades.php
===================================================================
--- branches/5.3.x/install/upgrades.php (revision 16506)
+++ branches/5.3.x/install/upgrades.php (revision 16507)
@@ -1,185 +1,186 @@
<?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.org/license for copyright notices and details.
*/
defined('FULL_PATH') or die('restricted access!');
$upgrade_class = 'InLinkUpgrades';
/**
* Class, that holds all upgrade scripts for "In-Link" module
*
*/
class InLinkUpgrades extends kUpgradeHelper {
public function __construct()
{
parent::__construct();
$this->dependencies = Array (
'4.3.9' => Array ('Core' => '4.3.9'),
'5.0.0' => Array ('Core' => '5.0.0'),
'5.0.1' => Array ('Core' => '5.0.1'),
'5.0.2-B1' => Array ('Core' => '5.0.2-B1'),
'5.0.2-B2' => Array ('Core' => '5.0.2-B2'),
'5.0.2-RC1' => Array ('Core' => '5.0.2-RC1'),
'5.0.2' => Array ('Core' => '5.0.2'),
'5.0.3-B1' => Array ('Core' => '5.0.3-B1'),
'5.0.3-B2' => Array ('Core' => '5.0.3-B2'),
'5.0.3-RC1' => Array ('Core' => '5.0.3-RC1'),
'5.0.3' => Array ('Core' => '5.0.3'),
'5.0.4-B1' => Array ('Core' => '5.0.4-B1'),
'5.0.4-B2' => Array ('Core' => '5.0.4-B2'),
'5.0.4' => Array ('Core' => '5.0.4'),
'5.1.0-B1' => Array ('Core' => '5.1.0-B1'),
'5.1.0-RC1' => Array ('Core' => '5.1.0-RC1'),
'5.1.0' => Array ('Core' => '5.1.0'),
'5.1.1-B1' => Array ('Core' => '5.1.1-B1'),
'5.1.1-B2' => Array ('Core' => '5.1.1-B2'),
'5.1.1-RC1' => Array ('Core' => '5.1.1-RC1'),
'5.1.1' => Array ('Core' => '5.1.1'),
'5.1.2-B1' => Array ('Core' => '5.1.2-B1'),
'5.1.2-RC1' => Array ('Core' => '5.1.2-RC1'),
'5.1.2' => Array ('Core' => '5.1.2'),
'5.1.3-B1' => Array ('Core' => '5.1.3-B2'),
'5.1.3-RC1' => Array ('Core' => '5.1.3-RC1'),
'5.1.3-RC2' => Array ('Core' => '5.1.3-RC2'),
'5.1.3' => Array ('Core' => '5.1.3'),
'5.2.0-B1' => Array ('Core' => '5.2.0-B1'),
'5.2.0-B2' => Array ('Core' => '5.2.0-B2'),
'5.2.0-B3' => Array ('Core' => '5.2.0-B3'),
'5.2.0-RC1' => Array ('Core' => '5.2.0-RC1'),
'5.2.0' => Array ('Core' => '5.2.0'),
'5.2.1-B1' => Array ('Core' => '5.2.1-B1'),
'5.2.1-B2' => Array ('Core' => '5.2.1-B2'),
'5.2.1-RC1' => Array ('Core' => '5.2.1-RC1'),
'5.2.1' => Array ('Core' => '5.2.1'),
+ '5.2.2-B1' => Array ('Core' => '5.2.2-B1'),
'5.3.0-B1' => Array ('Core' => '5.3.0-B1'),
);
}
/**
* Changes table structure, where multilingual fields of TEXT type are present
*
* @param string $mode when called mode {before, after)
*/
function Upgrade_5_0_0($mode)
{
if ($mode == 'after') {
$categories_config = $this->Application->getUnitConfig('c');
$root_category = $this->Application->findModule('Name', 'In-Link', 'RootCat');
$sql = 'UPDATE ' . $categories_config->getTableName() . '
SET UseMenuIconUrl = 1, MenuIconUrl = "in-link/img/menu_links.gif"
WHERE ' . $categories_config->getIDField() . ' = ' . $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);
}
/**
* Update to 5.0.1
*
* @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');
// delete old events
$events_to_delete = Array ( 'LINK.OWNER.MODIFY.PENDING', 'LINK.OWNER.MODIFY' );
$sql = 'SELECT EventId FROM ' . TABLE_PREFIX . 'Events
WHERE Event IN ("' . implode('","', $events_to_delete) . '")';
$event_ids = $this->Conn->GetCol($sql);
if ($event_ids) {
$sql = 'DELETE FROM ' . TABLE_PREFIX . 'EmailMessage
WHERE EventId IN (' . implode(',', $event_ids) . ')';
$this->Conn->Query($sql);
$sql = 'DELETE FROM ' . TABLE_PREFIX . 'Events
WHERE EventId IN (' . implode(',', $event_ids) . ')';
$this->Conn->Query($sql);
$sql = 'DELETE FROM ' . TABLE_PREFIX . 'Phrase
WHERE Phrase IN ("la_event_link.owner.modify", "la_event_link.owner.modify.pending")';
$this->Conn->Query($sql);
}
}
}
/**
* Update to 5.0.4-B1
*
* @param string $mode when called mode {before, after)
*/
function Upgrade_5_0_4_B1($mode)
{
if ($mode == 'after') {
// check in-link custom fields if need to add to search config
$custom_fields = Array (
'LinkAddress' => "('CustomField', 'LinkAddress', 1, 1, 'la_fld_LinkAddress', 'lu_fld_LinkAddress', 'In-Link', 'la_section_BusinessLocation', 1, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, {CUSTOM_FIELD_ID})",
'LinkCity' => "('CustomField', 'LinkCity', 1, 1, 'la_fld_LinkCity', 'lu_fld_LinkCity', 'In-Link', 'la_section_BusinessLocation', 2, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, {CUSTOM_FIELD_ID})",
'LinkState' => "('CustomField', 'LinkState', 1, 1, 'la_fld_LinkState', 'lu_fld_LinkState', 'In-Link', 'la_section_BusinessLocation', 3, DEFAULT, 0, 'select', NULL, NULL, NULL, NULL, NULL, NULL, {CUSTOM_FIELD_ID})",
'LinkZipCode' => "('CustomField', 'LinkZipCode', 1, 1, 'la_fld_LinkZipCode', 'lu_fld_LinkZipCode', 'In-Link', 'la_section_BusinessLocation', 4, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, {CUSTOM_FIELD_ID})",
'LinkCountry' => "('CustomField', 'LinkCountry', 1, 1, 'la_fld_LinkCountry', 'lu_fld_LinkCountry', 'In-Link', 'la_section_BusinessLocation', 5, DEFAULT, 0, 'select', NULL, NULL, NULL, NULL, NULL, NULL, {CUSTOM_FIELD_ID})",
'LinkPhone' => "('CustomField', 'LinkPhone', 1, 1, 'la_fld_LinkPhone', 'lu_fld_LinkPhone', 'In-Link', 'la_section_BusinessLocation', 6, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, {CUSTOM_FIELD_ID})",
);
// get all in-link custom fields ides at once
$sql = 'SELECT CustomFieldId, FieldName
FROM ' . TABLE_PREFIX . 'CustomField
WHERE Type = 4 AND IsSystem = 0';
$custom_field_ids = $this->Conn->GetCol($sql, 'FieldName');
foreach ($custom_fields as $field_name => $custom_field_sql) {
$sql = 'SELECT FieldName
FROM ' . TABLE_PREFIX . 'SearchConfig
WHERE (FieldName = ' . $this->Conn->qstr($field_name) . ') AND (LOWER(ModuleName) = "in-link")';
$found = $this->Conn->GetOne($sql);
if (!$found) {
// replace sql and insert new search config record
$sql = str_replace('{CUSTOM_FIELD_ID}', $custom_field_ids[$field_name], $custom_field_sql);
$sql = 'INSERT INTO ' . TABLE_PREFIX . 'SearchConfig VALUES ' . $sql;
$this->Conn->Query($sql);
}
}
}
}
- }
\ No newline at end of file
+ }
Index: branches/5.3.x/install/upgrades.sql
===================================================================
--- branches/5.3.x/install/upgrades.sql (revision 16506)
+++ branches/5.3.x/install/upgrades.sql (revision 16507)
@@ -1,215 +1,217 @@
# ===== v 4.3.9 =====
INSERT INTO Events VALUES (DEFAULT, 'LINK.VALIDATION.RESULTS', NULL, 1, 0, 'In-Link', 'la_event_link.validation.results', 1);
INSERT INTO ImportScripts VALUES (DEFAULT, 'Links from CSV file [In-Link]', '', 'l', 'In-Link', '', 'CSV', '1');
UPDATE CustomField
SET ValueList = '=+||<SQL>SELECT DestAbbr AS OptionValue, DestName AS OptionName FROM <PREFIX>StdDestinations WHERE DestType = 2 AND (DestParentId = 225 OR DestParentId = 38) ORDER BY DestParentId DESC, DestAbbr ASC</SQL>'
WHERE FieldName = 'LinkState';
UPDATE CustomField
SET ValueList = '=+||<SQL>SELECT DestAbbr AS OptionValue, DestName AS OptionName FROM <PREFIX>StdDestinations WHERE DestType = 1 ORDER BY DestAbbr ASC</SQL>'
WHERE FieldName = 'LinkCountry';
# ===== v 5.0.0 =====
INSERT INTO Counters VALUES (DEFAULT, 'linkhits_count', 'SELECT ROUND(SUM(Hits)) FROM <%PREFIX%>Link', NULL, NULL, '300', '0', '|Link|');
UPDATE Category SET Template = '/in-link/designs/section' WHERE Template = 'inlink/index';
UPDATE Category SET CachedTemplate = '/in-link/designs/section' WHERE CachedTemplate = 'inlink/index';
UPDATE ConfigurationValues SET VariableValue = '/in-link/designs/section' WHERE VariableName = 'l_CategoryTemplate';
UPDATE ConfigurationValues SET VariableValue = 'in-link/designs/detail' WHERE VariableName = 'l_ItemTemplate';
INSERT INTO Permissions VALUES (DEFAULT, 'in-link:links.view', 11, 1, 1, 0);
INSERT INTO Permissions VALUES (DEFAULT, 'in-link:setting_folder.view', 11, 1, 1, 0);
DELETE FROM Permissions WHERE Permission LIKE 'in-link:inlink_general.%';
UPDATE Events SET Description = 'la_event_link.owner.modify' WHERE Description = 'la_event_link.modify.modify';
UPDATE Events SET Description = 'la_event_link.owner.modify.pending' WHERE Description = 'la_event_link.modify.modify.pending';
UPDATE Phrase SET Module = 'In-Link' WHERE ((Phrase LIKE '%Links%' OR Phrase LIKE '%Listing%') AND (Module = 'Core') AND Phrase NOT IN ('la_section_QuickLinks'));
UPDATE Phrase SET Module = 'In-Link', PhraseType = 1 WHERE ( (Phrase LIKE '%Validation%' OR Phrase LIKE 'la_title_In-Link') AND (Module = 'Core') AND Phrase NOT IN ('la_ValidationEmail', 'la_prompt_validation'));
# ===== v 5.0.1 =====
UPDATE ConfigurationValues SET VariableValue = 'in-link/links/link_detail' WHERE VariableName = 'l_ItemTemplate';
UPDATE ConfigurationAdmin SET ValueList = 'ReviewText=la_opt_CommentText,CreatedOn=la_opt_CreatedOn'
WHERE VariableName IN ('Link_ReviewsSort', 'Link_ReviewsSort2');
UPDATE ConfigurationAdmin SET ValueList = 'ASC=la_common_Ascending,DESC=la_common_Descending'
WHERE VariableName IN ('Link_ReviewsOrder', 'Link_ReviewsOrder2');
UPDATE ConfigurationAdmin SET ValueList = 'Name=la_Link_Name,Description=la_Link_Description,Url=la_Link_URL,CreatedOn=la_opt_CreatedOn,Hits=la_Link_Hits,CachedRating=la_opt_Rating,<SQL>SELECT Prompt AS OptionName, CONCAT("cust_", FieldName) AS OptionValue FROM <PREFIX>CustomField WHERE (Type = 4) AND (IsSystem = 0)</SQL>'
WHERE VariableName IN ('Link_SortField', 'Link_SortField2');
UPDATE ConfigurationAdmin
SET ValueList = '1=la_opt_Sec,60=la_opt_Min,3600=la_opt_Hour,86400=la_opt_Day,604800=la_opt_Week,2419200=la_opt_Month,29030400=la_opt_Year'
WHERE VariableName IN ('link_ReviewDelay_Interval', 'link_RatingDelay_Interval');
UPDATE CustomField SET FieldLabel = 'la_fld_cust_l_ItemTemplate', Prompt = 'la_fld_cust_l_ItemTemplate' WHERE FieldName = 'l_ItemTemplate';
INSERT INTO Events VALUES(DEFAULT, 'LINK.REVIEW.ADD.PENDING', NULL, 1, 0, NULL, 'In-Link', 'la_event_link.review.add.pending', 1);
UPDATE ConfigurationAdmin SET ValueList = 'style="width: 50px;"' WHERE VariableName IN ('link_ReviewDelay_Value', 'link_RatingDelay_Value');
# ===== v 5.0.2-B1 =====
ALTER TABLE ListingTypes CHANGE Description Description text NULL;
ALTER TABLE LinkValidation CHANGE ValidationTime ValidationTime INT NULL DEFAULT NULL;
ALTER TABLE LinkVisits CHANGE VisitTimestamp VisitTimestamp INT(11) NULL DEFAULT NULL;
# ===== v 5.0.2-B2 =====
# ===== v 5.0.2-RC1 =====
# ===== v 5.0.2 =====
# ===== v 5.0.3-B1 =====
UPDATE Phrase
SET Module = 'In-Link'
WHERE Phrase IN (
'lu_PermName_Link.Add.Pending_desc', 'lu_PermName_Link.Add_desc', 'lu_PermName_Link.Delete_desc',
'lu_PermName_Link.Modify.Pending_desc', 'lu_PermName_Link.Modify_desc', 'lu_PermName_Link.Owner.Delete_desc',
'lu_PermName_Link.Owner.Modify.Pending_desc', 'lu_PermName_Link.Owner.Modify_desc', 'lu_PermName_Link.Rate_desc',
'lu_PermName_Link.Review_Pending_desc', 'lu_PermName_Link.View_desc'
);
# ===== v 5.0.3-B2 =====
# ===== v 5.0.3-RC1 =====
# ===== v 5.0.3 =====
# ===== v 5.0.4-B1 =====
# ===== v 5.0.4-B2 =====
# ===== v 5.0.4 =====
# ===== v 5.1.0-B1 =====
UPDATE Modules SET Path = 'modules/in-link/' WHERE `Name` = 'In-Link';
DELETE FROM ConfigurationValues WHERE VariableName IN ('StartValidationTime', 'LastExpirationTime', 'Link_Root');
UPDATE CustomField
SET ValueList = '=+||<SQL+>SELECT IsoCode AS OptionValue, l%3$s_Name AS OptionName FROM <PREFIX>CountryStates WHERE Type = 2 ORDER BY StateCountryId DESC, IsoCode ASC</SQL>'
WHERE ValueList = '=+||<SQL>SELECT DestAbbr AS OptionValue, DestName AS OptionName FROM <PREFIX>StdDestinations WHERE DestType = 2 AND (DestParentId = 225 OR DestParentId = 38) ORDER BY DestParentId DESC, DestAbbr ASC</SQL>';
UPDATE CustomField
SET ValueList = '=+||<SQL+>SELECT IsoCode AS OptionValue, l%3$s_Name AS OptionName FROM <PREFIX>CountryStates WHERE Type = 1 ORDER BY IsoCode ASC</SQL>'
WHERE ValueList = '=+||<SQL>SELECT DestAbbr AS OptionValue, DestName AS OptionName FROM <PREFIX>StdDestinations WHERE DestType = 1 ORDER BY DestAbbr ASC</SQL>';
DELETE FROM Permissions WHERE Permission LIKE 'in-link:configuration_email%';
# ===== v 5.1.0-RC1 =====
# ===== v 5.1.0 =====
# ===== v 5.1.1-B1 =====
ALTER TABLE Link
CHANGE CreatedById CreatedById INT(11) NULL DEFAULT NULL ,
CHANGE ModifiedById ModifiedById INT(11) NULL DEFAULT NULL;
# ===== v 5.1.1-B2 =====
UPDATE Events
SET l<%PRIMARY_LANGUAGE%>_Body = REPLACE(l<%PRIMARY_LANGUAGE%>_Body, '<inp2:<inp2:', '<inp2:')
WHERE Event LIKE 'LINK.ADD.PENDING' AND `Type` = 1;
# ===== v 5.1.1-RC1 =====
# ===== v 5.1.1 =====
# ===== v 5.1.2-B1 =====
# ===== v 5.1.2-RC1 =====
# ===== v 5.1.2 =====
# ===== v 5.1.3-B1 =====
# ===== v 5.1.3-RC1 =====
UPDATE ConfigurationValues
SET VariableValue = 'in-link/links/link_detail'
WHERE VariableName = 'l_ItemTemplate' AND VariableValue = 'in-link/designs/detail';
# ===== v 5.1.3-RC2 =====
# ===== v 5.1.3 =====
UPDATE Phrase
SET `Module` = 'Core'
WHERE PhraseKey IN ('LA_FLD_LISTINGID', 'LA_FLD_LISTINGTYPE');
# ===== v 5.2.0-B1 =====
UPDATE SearchConfig
SET ForeignField = 'PortalUser.Username'
WHERE ForeignField = 'PortalUser.Login' AND ModuleName = 'In-Link';
UPDATE SearchConfig
SET DisplayName = REPLACE(DisplayName, 'lu_', 'lc_')
WHERE DisplayName IN ('lu_field_linkid', 'lu_field_url');
UPDATE SystemSettings
SET Section = 'in-portal:configure_advanced', ModuleOwner = 'In-Portal', Heading = 'la_section_Settings3rdPartyAPI', DisplayOrder = 80.02
WHERE VariableName = 'l_GoogleMapsAPIKey';
UPDATE SystemSettings
SET DisplayOrder = DisplayOrder - 0.01
WHERE VariableName IN ('l_EnableLinkContactForm', 'ReciprocalLinkChecking');
UPDATE LanguageLabels
SET Module = 'In-Link'
WHERE PhraseKey IN ('LA_LINK_CREATEDON', 'LA_LINK_DESCRIPTION', 'LA_LINK_HITS', 'LA_LINK_NAME', 'LA_LINK_URL');
DELETE FROM LanguageLabels
WHERE PhraseKey IN (
'LA_LINK_URLSTATUS_PROMPT', 'LA_TEXT_LINK_SEARCH', 'LA_LINK_CATCHEDRATING',
'LA_LINK_CATCHEDREVIEWSQTY', 'LA_LINK_CATCHEDVOTESQTY'
);
DELETE FROM SystemSettings
WHERE VariableName IN (
'Link_Highlight_OpenTag', 'Link_Highlight_CloseTag', 'Link_RatingToPop', 'Link_UrlStatus',
'Search_Link_CatchedRating', 'Search_Link_CatchedReviewsQty', 'Search_Link_CatchedVotesQty',
'Search_Link_CreatedOn', 'Search_Link_Description', 'Search_Link_EditorsPick', 'Search_Link_Hits',
'Search_Link_HotItem', 'Search_Link_LinkId', 'Search_Link_Name', 'Search_Link_NewItem', 'Search_Link_PopItem',
'Search_Link_Priority', 'Search_Link_ResourceId', 'Search_Link_ReviewById', 'Search_Link_Status', 'Search_Link_Url'
);
UPDATE SystemSettings
SET DisplayOrder = DisplayOrder - 0.01
WHERE VariableName IN (
'link_ReviewDelay_Value', 'link_ReviewDelay_Interval', 'link_RatingDelay_Value', 'link_RatingDelay_Interval',
'l_MaxCategories', 'l_EnableGoogleMaps', 'l_EnableLinkContactForm', 'ReciprocalLinkChecking'
);
UPDATE SearchConfig
SET ForeignField = 'Users.Username'
WHERE ForeignField = 'PortalUser.Username' AND ModuleName = 'In-Link';
# ===== v 5.2.0-B2 =====
UPDATE Link main_table
SET main_table.CachedReviewsQty = (SELECT COUNT(*) FROM <%TABLE_PREFIX%>CatalogReviews review_table WHERE review_table.ItemId = main_table.ResourceId);
# ===== v 5.2.0-B3 =====
# ===== v 5.2.0-RC1 =====
# ===== v 5.2.0 =====
INSERT INTO Permissions VALUES(DEFAULT, 'in-link:configuration_output.add', 11, 1, 1, 0);
# ===== v 5.2.1-B1 =====
# ===== v 5.2.1-B2 =====
UPDATE Modules
SET ClassNamespace = 'Intechnic\\InPortal\\Modules\\InLink'
WHERE `Name` = 'In-Link';
# ===== v 5.2.1-RC1 =====
# ===== v 5.2.1 =====
+# ===== v 5.2.2-B1 =====
+
# ===== v 5.3.0-B1 =====
UPDATE Modules
SET ClassNamespace = 'InPortal\\Modules\\InLink'
WHERE `Name` = 'In-Link';
INSERT INTO SearchConfig VALUES ('Link', 'MetaKeywords', 0, 1, '', 'lc_field_MetaKeywords', 'In-Link', 'la_text_link', 20, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO SearchConfig VALUES ('Link', 'MetaDescription', 0, 1, '', 'lc_field_MetaDescription', 'In-Link', 'la_text_link', 21, DEFAULT, 0, 'text', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
Index: branches/5.3.x/install.php
===================================================================
--- branches/5.3.x/install.php (revision 16506)
+++ branches/5.3.x/install.php (revision 16507)
@@ -1,58 +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.org/license for copyright notices and details.
*/
$module_folder = 'modules/in-link';
if ( !defined('IS_INSTALL') ) {
// separate module install
define('IS_INSTALL', 1);
define('ADMIN', 1);
define('FULL_PATH', realpath(dirname(__FILE__) . '/../..'));
include_once(FULL_PATH . '/core/kernel/startup.php');
require_once FULL_PATH . '/core/install/install_toolkit.php';
$constants_file = FULL_PATH . '/' . $module_folder . '/constants.php';
if ( file_exists($constants_file) ) {
require_once $constants_file;
}
$toolkit = new kInstallToolkit();
}
else {
// install, using installation wizard
$toolkit =& $this->toolkit;
/* @var $toolkit kInstallToolkit */
}
$application =& kApplication::Instance();
$application->Init();
if ( $application->RecallVar('user_id') != USER_ROOT ) {
die('restricted access!');
}
$category =& $toolkit->createModuleCategory('Directory', 'Link Directory', '#in-link/section_design#', 'in-link/img/menu_links.gif');
$toolkit->RunSQL('/' . $module_folder . '/install/install_schema.sql');
$toolkit->RunSQL('/' . $module_folder . '/install/install_data.sql', '{LinkCatId}', $category->GetID());
-$toolkit->ImportLanguage('/' . $module_folder . '/install/english');
+$toolkit->ImportLanguage('/' . $module_folder . '/install/english', isset($constants_file));
$toolkit->SetModuleRootCategory(basename($module_folder), $category->GetID());
$toolkit->linkCustomFields(basename($module_folder), 'l', 4); // to create Custom Fields for Links
$toolkit->linkCustomFields('KERNEL', 'c', 1); // to create ItemTemplate custom field
$toolkit->setModuleItemTemplate($category, 'l', '#in-link/item_design#');
$toolkit->finalizeModuleInstall($module_folder, true);
Index: branches/5.3.x
===================================================================
--- branches/5.3.x (revision 16506)
+++ branches/5.3.x (revision 16507)
Property changes on: branches/5.3.x
___________________________________________________________________
Modified: svn:mergeinfo
## -0,0 +0,2 ##
Merged /modules/in-link/releases/5.2.2-B1:r16499
Merged /modules/in-link/branches/5.2.x:r16441,16459,16486

Event Timeline