Index: branches/5.0.x/core/units/general/helpers/rating_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/rating_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/rating_helper.php (nonexistent) @@ -1,195 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 RatingHelper extends kHelper { - - /** - * One star width/height in pixels - * - * @var int - */ - var $ratingUnitWidth = 25; - var $ratingSmallUnitWidth = 20; - - /** - * Maximal star count - * - * @var int - */ - var $ratingMaximal = 5; - - var $_phrases = Array ( - 'current_rating' => 'lu_CurrentRating', - 'vote_title' => 'lu_VoteTitle', - 'vote_count' => 'lu_VoteCount', - 'invalid_rating' => 'lu_InvalidRating', - 'already_voted' => 'lu_AlreadyVoted', - 'thanks_for_voting' => 'lu_ThanksForVoting', - ); - - /** - * Draws rating bar for a given category item - * - * @param kDBItem $object - * @param bool $show_div - * @param string $additional_msg - * @return string - */ - function ratingBar(&$object, $show_div = true, $additional_msg = '', $additional_style = '') - { - $perm_prefix = $this->Application->getUnitOption($object->Prefix, 'PermItemPrefix'); - $static = !$this->Application->CheckPermission($perm_prefix . '.RATE', 0, $object->GetDBField('CategoryId')); - - $total_votes = $object->GetDBField('CachedVotesQty'); - $total_rating = $object->GetDBField('CachedRating') * $total_votes; - - $spam_helper =& $this->Application->recallObject('SpamHelper'); - /* @var $spam_helper SpamHelper */ - - $config_mapping = $this->Application->getUnitOption($object->Prefix, 'ConfigMapping'); - $review_settings = $config_mapping['RatingDelayValue'].':'.$config_mapping['RatingDelayInterval']; - $spam_helper->InitHelper($object->GetDBField('ResourceId'), 'Rating', $review_settings); - - $user_voted = $spam_helper->InSpamControl(); - - // now draw the rating bar - $unit_selected_width = $additional_style? $this->ratingSmallUnitWidth : $this->ratingUnitWidth; - $rating_width = $total_votes ? @number_format($total_rating / $total_votes, 2) * $unit_selected_width : 0; - $rating1 = $total_votes ? @number_format($total_rating / $total_votes, 1) : 0; - $rating2 = $total_votes ? @number_format($total_rating / $total_votes, 2) : 0; - - $rater = '<span class="inline-rating"> - <ul class="star-rating '.$additional_style.'" style="width: ' . $unit_selected_width * $this->ratingMaximal . 'px;"> - <li class="current-rating" style="width: ' . $rating_width . 'px;">' . $this->_replaceInPhrase('current_rating', Array ('<strong>' . $rating2 . '</strong>', $this->ratingMaximal)) . '</li>'."\n";; - - if (!$static && !$user_voted) { - // allow to set rating when not static and user not voted before - for ($ncount = 1; $ncount <= $this->ratingMaximal; $ncount++) { - $rater .= '<li><a href="#vote-' . $ncount . '" onclick="aRatingManager.makeVote(' . $ncount . ', \'' . $object->Prefix . '\', ' . $object->GetID() . ', \''.$additional_style.'\'); return false;" title="' . $this->_replaceInPhrase('vote_title', Array ($ncount, $this->ratingMaximal)) . '" class="r' . $ncount . '-unit rater" rel="nofollow">' . $ncount . '</a></li>'."\n"; - } - } - - $msg_class = Array (); - - if ($static) { - $msg_class[] = 'static'; - } - - if ($user_voted) { - $msg_class[] = 'voted'; - } - - $rater .= ' </ul></span>'; - - // this part is disabled for now, will be addressed once properly review -// $rater .= ' <p class="' . implode(' ', $msg_class) . '">' . - $this->_replaceInPhrase('vote_title', Array('<strong>'.$rating1.'</strong>', $this->ratingMaximal)) . ' ('. $this->_replaceInPhrase('vote_count', Array($total_votes)) . ') </p>'; - - $rater .= ' <span class="' . implode(' ', $msg_class) . '">'.$additional_msg.'</span>'; - - if ($show_div) { - // adds div around rating stars (when drawing rating first time) - $rater = '<div class="inline-rating" id="page_rating_' . $object->GetID() . '">' . $rater . '</div>'; - } - - return $rater; - } - - /** - * Saves user's vote, when allowed - * - * @param kDBItem $object - * @return string - */ - function makeVote(&$object) - { - $spam_helper =& $this->Application->recallObject('SpamHelper'); - /* @var $spam_helper SpamHelper */ - - $config_mapping = $this->Application->getUnitOption($object->Prefix, 'ConfigMapping'); - $review_settings = $config_mapping['RatingDelayValue'].':'.$config_mapping['RatingDelayInterval']; - $spam_helper->InitHelper($object->GetDBField('ResourceId'), 'Rating', $review_settings); - - if (!$object->isLoaded() || $spam_helper->InSpamControl()) { - return '@err:' . $this->_replaceInPhrase('already_voted'); - } - - $perm_prefix = $this->Application->getUnitOption($object->Prefix, 'PermItemPrefix'); - $can_rate = $this->Application->CheckPermission($perm_prefix . '.RATE', 0, $object->GetDBField('CategoryId')); - $rating = (int)$this->Application->GetVar('rating'); // not numeric rating is from GoogleBot :( - $additional_style = $this->Application->GetVar('size'); - - if (($rating <= 0) || ($rating > $this->ratingMaximal) || !$can_rate) { - return '@err:' . $this->_replaceInPhrase('invalid_rating'); - } - - // save current rating - $fields_hash = Array ( - 'ItemId' => $object->GetID(), - 'RatingValue' => $rating, - 'IPAddress' => $_SERVER['REMOTE_ADDR'], - 'CreatedOn' => adodb_mktime(), - ); - $this->Conn->doInsert($fields_hash, TABLE_PREFIX.'ItemRating'); - - // recalculate average rating - $votes_count = $object->GetDBField('CachedVotesQty'); - $avg_rating = $object->GetDBField('CachedRating'); - - $avg_rating = round((($votes_count * $avg_rating) + $rating) / ($votes_count + 1), 2); - $object->SetDBField('CachedRating', "$avg_rating"); - $object->Update(); - - $sql = 'UPDATE '.$object->TableName.' - SET CachedVotesQty = CachedVotesQty + 1 - WHERE '.$object->IDField.' = '.$object->GetID(); - $this->Conn->Query($sql); - - $object->SetDBField('CachedVotesQty', $object->GetDBField('CachedVotesQty') + 1); // for using in template - - // prevent user from voting too quickly - $spam_helper->AddToSpamControl(); - - return $this->ratingBar($object, false, '<span class="thanks">' . $this->_replaceInPhrase('thanks_for_voting') . '</span>', $additional_style); - } - - /*function purgeVotes() - { - $expired = adodb_mktime() - 86400 * $this->Application->ConfigValue('Timeout_Rating'); // 3600 - - $sql = 'DELETE FROM ' . TABLE_PREFIX . 'ItemRating - WHERE CreatedOn < ' . $expired; - $this->Conn->Query($sql); - }*/ - - /** - * Performs sprintf on phrase translation using given variables - * - * @param string $phrase - * @param Array $arguments - * @return string - */ - function _replaceInPhrase($phrase, $arguments = Array ()) - { - $value = $this->Application->Phrase($this->_phrases[$phrase]); - - if ($arguments) { - return vsprintf($value, $arguments); - } - - return $value; - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/rating_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.1.2.6 \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/multilanguage.php =================================================================== --- branches/5.0.x/core/units/general/helpers/multilanguage.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/multilanguage.php (nonexistent) @@ -1,306 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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!'); - - /** - * Performs action on multilingual fields - * - */ - class kMultiLanguageHelper extends kHelper { - - /** - * Maximal language id - * - * @var int - */ - var $languageCount = 0; - - /** - * Languages created in system - * - * @var Array - */ - var $languagesIDs = Array (); - - /** - * Structure of table, that is currently processed - * - * @var Array - */ - var $curStructure = Array(); - - /** - * Field, to get structure information from - * - * @var string - */ - var $curSourceField = false; - - /** - * Indexes used in table of 32 - * - * @var int - */ - var $curIndexCount = 0; - - /** - * Fields from config, that are currently used - * - * @var Array - */ - var $curFields = Array(); - - function kMultiLanguageHelper() - { - parent::kHelper(); - $this->languageCount = $this->getLanguageCount(); - } - - /** - * Checks if language with specified id is created - * - * @param int $language_id - * @return bool - */ - function LanguageFound($language_id) - { - return in_array($language_id, $this->languagesIDs) || $language_id <= 5; - } - - /** - * Returns language count in system (always is divisible by 5) - * - */ - function getLanguageCount() - { - $id_field = $this->Application->getUnitOption('lang', 'IDField'); - $table_name = $this->Application->getUnitOption('lang', 'TableName'); - - $this->languagesIDs = $this->Conn->GetCol('SELECT '.$id_field.' FROM '.$table_name); - - $languages_count = $this->Conn->GetOne('SELECT MAX('.$id_field.') FROM '.$table_name); - - return max($languages_count, 5); - } - - - function scanTable($mask) - { - $i = 0; - $fields_found = 0; - $fields = array_keys($this->curStructure); - - foreach ($fields as $field_name) { - if (preg_match($mask, $field_name)) { - $fields_found++; - } - } - return $fields_found; - } - - function readTableStructure($table_name, $refresh = false) - { -// if ($refresh || !getArrayValue($structure_status, $prefix.'.'.$table_name)) { - $this->curStructure = $this->Conn->Query('DESCRIBE '.$table_name, 'Field'); - $this->curIndexCount = count($this->Conn->Query('SHOW INDEXES FROM '.$table_name)); -// } - } - - /** - * Creates missing multilanguage fields in table by specified prefix - * - * @param string $prefix - * @param bool $refresh Forces config field structure to be re-read from database - */ - function createFields($prefix, $refresh = false) - { - if ($refresh && preg_match('/(.*)-cdata$/', $prefix, $regs)) { - // call main item config to clone cdata table - $this->Application->UnitConfigReader->loadConfig($regs[1]); - $this->Application->HandleEvent( new kEvent($prefix.':OnAfterConfigRead') ); - } - - $table_name = $this->Application->getUnitOption($prefix, 'TableName'); - $this->curFields = $this->Application->getUnitOption($prefix, 'Fields'); - - if (!($table_name && $this->curFields) || ($table_name && !$this->Conn->TableFound($table_name))) { - // invalid config found or prefix not found - return true; - } - - $sqls = Array(); - $this->readTableStructure($table_name, $refresh); - - foreach($this->curFields as $field_name => $field_options) - { - if (getArrayValue($field_options, 'formatter') == 'kMultiLanguage') { - if (isset($field_options['master_field'])) { - unset($this->curFields[$field_name]); - continue; - } - - $this->setSourceField($field_name); - if ($this->languageCount > 0) { - // `l77_Name` VARCHAR( 255 ) NULL DEFAULT '0'; - $field_mask = Array(); - $field_mask['name'] = 'l%s_'.$field_name; - $field_mask['null'] = getArrayValue($field_options, 'not_null') ? 'NOT NULL' : 'NULL'; - - if ($this->curSourceField) { - $default_value = $this->getFieldParam('Default') != 'NULL' ? $this->Conn->qstr($this->getFieldParam('Default')) : $this->getFieldParam('Default'); - $field_mask['type'] = $this->getFieldParam('Type'); - } - else { - $default_value = is_null($field_options['default']) ? 'NULL' : $this->Conn->qstr($field_options['default']); - $field_mask['type'] = $field_options['db_type']; - } - $field_mask['default'] = 'DEFAULT '.$default_value; - - if (strtoupper($field_mask['type']) == 'TEXT') { - // text fields in mysql doesn't have default value - $field_mask = $field_mask['name'].' '.$field_mask['type'].' '.$field_mask['null']; - } - else { - $field_mask = $field_mask['name'].' '.$field_mask['type'].' '.$field_mask['null'].' '.$field_mask['default']; - } - - $alter_sqls = $this->generateAlterSQL($field_mask, 1, $this->languageCount); - if ($alter_sqls) { - $sqls[] = 'ALTER TABLE '.$table_name.' '.$alter_sqls; - } - } - } - } - - foreach ($sqls as $sql_query) { - $this->Conn->Query($sql_query); - } - } - - function deleteField($prefix, $custom_id) - { - $table_name = $this->Application->getUnitOption($prefix, 'TableName'); - $sql = 'DESCRIBE '.$table_name.' "l%_cust_'.$custom_id.'"'; - $fields = $this->Conn->GetCol($sql); - - $sql = 'ALTER TABLE '.$table_name.' '; - $sql_template = 'DROP COLUMN %s, '; - foreach ($fields as $field_name) { - $sql .= sprintf($sql_template, $field_name); - } - $sql = preg_replace('/(.*), $/', '\\1', $sql); - $this->Conn->Query($sql); - } - - /** - * Returns parameter requested of current source field - * - * @param string $param_name - * @return string - */ - function getFieldParam($param_name) - { - return $this->curStructure[$this->curSourceField][$param_name]; - } - - /** - * Detects field name to create other fields from - * - * @param string $field_name - */ - function setSourceField($field_name) - { - $ret = $this->scanTable('/^l[\d]+_'.preg_quote($field_name, '/').'$/'); - if (!$ret) { - // no multilingual fields at all (but we have such field without language prefix) - $original_found = $this->scanTable('/'.preg_quote($field_name, '/').'/'); - $this->curSourceField = $original_found ? $field_name : false; - } - else { - $this->curSourceField = 'l1_'.$field_name; - } - } - - /** - * Returns ALTER statement part for adding required fields to table - * - * @param string $field_mask sql mask for creating field with correct definition (type & size) - * @param int $start_index add new fields starting from this index - * @param int $create_count create this much new multilingual field translations - * @return string - */ - function generateAlterSQL($field_mask, $start_index, $create_count) - { - static $single_lang = null; - if (!isset($single_lang)) { - // if single language mode, then create indexes only on primary columns - $table_name = $this->Application->getUnitOption('lang', 'TableName'); - $sql = 'SELECT COUNT(*) - FROM '.$table_name.' - WHERE Enabled = 1'; - // if language count = 0, then assume it's multi language mode - $single_lang = $this->Conn->GetOne($sql) == 1; - } - - $ret = ''; - $ml_field = preg_replace('/l(.*?)_(.*?) (.*)/', '\\2', $field_mask); - - $i_count = $start_index + $create_count; - while ($start_index < $i_count) { - - if (isset($this->curStructure['l'.$start_index.'_'.$ml_field]) || (!$this->LanguageFound($start_index)) ) { - $start_index++; - continue; - } - - $prev_index = $start_index - 1; - do { - list($prev_field,$type) = explode(' ', sprintf($field_mask, $prev_index) ); - } while ($prev_index > 0 && !$this->LanguageFound($prev_index--)); - - if (substr($prev_field, 0, 3) == 'l0_') { - $prev_field = substr($prev_field, 3, strlen($prev_field)); - if (!$this->curSourceField) { - // get field name before this one - $fields = array_keys($this->curFields); -// $prev_field = key(end($this->curStructure)); - $prev_field = $fields[array_search($prev_field, $fields) - 1]; - if (getArrayValue($this->curFields[$prev_field], 'formatter') == 'kMultiLanguage') { - $prev_field = 'l'.$this->languageCount.'_'.$prev_field; - } - } - } - - $field_expression = sprintf($field_mask, $start_index); - $ret .= 'ADD COLUMN '.$field_expression.' AFTER `'.$prev_field.'`, '; - - if ($this->curIndexCount < 32 && ($start_index == $this->Application->GetDefaultLanguageId() || !$single_lang)) { - // create index for primary language column + for all others (if multiple languages installed) - list($field_name, $field_params) = explode(' ', $field_expression, 2); - - $index_type = isset($this->curFields[$ml_field]['index_type']) ? $this->curFields[$prev_field]['index_type'] : 'string'; - - $ret .= $index_type == 'string' ? 'ADD INDEX (`'.$field_name.'` (5) ), ' : 'ADD INDEX (`'.$field_name.'`), '; - $this->curIndexCount++; - } - - $start_index++; - } - return preg_replace('/, $/', ';', $ret); - } - } - - -?> \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/multilanguage.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.15.2.1 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/captcha_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/captcha_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/captcha_helper.php (nonexistent) @@ -1,176 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 kCaptchaHelper extends kHelper { - - var $width; - var $height; - - function GenerateCaptchaCode($len = 5) - { - $chars = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - $s = ''; - for ($i = 0; $i < $len; $i++) { - $s .= $chars[ rand(0, strlen($chars)-1) ]; - } - return $s; - } - - function graphics($w, $h) - { - $this->width = $w; - $this->height = $h; - } - - function GenerateCaptchaImage($rand, $width, $height, $filter_blur = false) - { - global $site_font_path; - global $site_font_validation; - - $image = imagecreate($width, $height); - $bgColor = imagecolorallocate ($image, 255, 255, 255); - $textColor = imagecolorallocate ($image, 0, 0, 0); - - // add random noise - for ($i = 0; $i < 20; $i++) { - $rx1 = rand(0, $width); - $rx2 = rand(0, $width); - $ry1 = rand(0, $height); - $ry2 = rand(0, $height); - $rcVal = rand(0, 255); - $rc1 = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(100, 255)); - imageline($image, $rx1, $ry1, $rx2, $ry2, $rc1); - } - - // write the random number - - $dimensions = imagettfbbox($height*0.75, 0, KERNEL_PATH.'/fonts/monofont.ttf', $rand ); - - imagettftext($image, $height*0.75, 0, floor(($width - $dimensions[4])/2), floor(($height - $dimensions[5])/2), $textColor, KERNEL_PATH.'/fonts/monofont.ttf', $rand); - - // $font = imageloadfont(KERNEL_PATH.'/fonts/monofont.ttf'); - // imagestring($image, $font, 3, 0, $rand, $textColor); - - if ($filter_blur) $this->blur($image, 3); - - // send several headers to make sure the image is not cached - // date in the past - header("Expires: Mon, 23 Jul 1993 05:00:00 GMT"); - - // always modified - header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); - - // HTTP/1.1 - header("Cache-Control: no-store, no-cache, must-revalidate"); - header("Cache-Control: post-check=0, pre-check=0", false); - - // HTTP/1.0 - header("Pragma: no-cache"); - - // send the content type header so the image is displayed properly - header('Content-type: image/jpeg'); - - imagejpeg($image); - imagedestroy($image); - } - - function blur(&$gdimg, $radius = 5.0) - { - // Taken from Torstein H�nsi's phpUnsharpMask (see phpthumb.unsharp.php) - - $radius = round(max(0, min($radius, 50)) * 2); - if (!$radius) { - return false; - } - - $w = ImageSX($gdimg); - $h = ImageSY($gdimg); - if ($imgBlur = ImageCreateTrueColor($w, $h)) { - // Gaussian blur matrix: - // 1 2 1 - // 2 4 2 - // 1 2 1 - - // Move copies of the image around one pixel at the time and merge them with weight - // according to the matrix. The same matrix is simply repeated for higher radii. - for ($i = 0; $i < $radius; $i++) { - ImageCopy ($imgBlur, $gdimg, 0, 0, 1, 1, $w - 1, $h - 1); // up left - ImageCopyMerge($imgBlur, $gdimg, 1, 1, 0, 0, $w, $h, 50.00000); // down right - ImageCopyMerge($imgBlur, $gdimg, 0, 1, 1, 0, $w - 1, $h, 33.33333); // down left - ImageCopyMerge($imgBlur, $gdimg, 1, 0, 0, 1, $w, $h - 1, 25.00000); // up right - ImageCopyMerge($imgBlur, $gdimg, 0, 0, 1, 0, $w - 1, $h, 33.33333); // left - ImageCopyMerge($imgBlur, $gdimg, 1, 0, 0, 0, $w, $h, 25.00000); // right - ImageCopyMerge($imgBlur, $gdimg, 0, 0, 0, 1, $w, $h - 1, 20.00000); // up - ImageCopyMerge($imgBlur, $gdimg, 0, 1, 0, 0, $w, $h, 16.666667); // down - ImageCopyMerge($imgBlur, $gdimg, 0, 0, 0, 0, $w, $h, 50.000000); // center - ImageCopy ($gdimg, $imgBlur, 0, 0, 0, 0, $w, $h); - } - return true; - } - return false; - } - - /** - * Generates captcha code for showing on form - * - * @param kEvent $event - */ - function prepareCode(&$event) - { - if ($this->Application->IsAdmin() || $this->Application->RecallVar($event->getPrefixSpecial() . '_captcha_code')) { - // when code found don't generate it 2nd time - return ; - } - - $this->Application->StoreVar($event->getPrefixSpecial() . '_captcha_code', $this->GenerateCaptchaCode()); - } - - /** - * Validates captcha code on form - * - * @param kEvent $event - * @param bool $check_request - * @return bool - */ - function validateCode(&$event, $check_request = true) - { - if ($this->Application->IsAdmin()) { - // no captcha codes in admin - return true; - } - - if ($check_request) { - // perform validation only when field is found on form - list ($id, $field_values) = each($this->Application->GetVar($event->getPrefixSpecial())); - if (!array_key_exists('Captcha', $field_values)) { - // when captcha code not submitted - return true; - } - } - - $object =& $event->getObject(); - /* @var $object kDBItem */ - - if ($object->GetDBField('Captcha') != $this->Application->RecallVar($event->getPrefixSpecial() . '_captcha_code')) { - $object->SetError('Captcha', 'captcha_error', 'lu_captcha_error'); - - $this->Application->StoreVar($event->getPrefixSpecial() . '_captcha_code', $this->GenerateCaptchaCode()); - return false; - } - - return true; - } -} \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/captcha_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.3.2.1 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/clipboard_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/clipboard_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/clipboard_helper.php (nonexistent) @@ -1,59 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 kClipboardHelper extends kHelper { - - /** - * Set's clipboard mode - * - * @param kEvent $event - * @param string $mode - */ - function setClipboard(&$event, $mode, $ids) - { - // clipboard = { prefix1 = { cut = {idsA}, copy = {idsB} }, ... prefixN = { cut = {idsC}, copy = {idsD} } } - $object = $event->getObject(); - - $clipboard = $this->Application->RecallVar('clipboard'); - $clipboard = $clipboard ? unserialize($clipboard) : Array(); - - $prefix = $event->getPrefixSpecial(); - - // 1. add $ids to mode key for prefix (make sure the unique) - $this_mode_ids =& $clipboard[$prefix][$mode]; - if (!is_array($this_mode_ids)) { - $this_mode_ids = $ids; - } - else { - $this_mode_ids = array_unique( array_merge($this_mode_ids, $ids) ); - } - - // 2. remove that ids from all other modes - $other_mode_ids =& $clipboard[$prefix][$mode == 'cut' ? 'copy' : 'cut']; - if (!is_array($other_mode_ids)) { - $other_mode_ids = Array(); - } - else { - $other_mode_ids = array_diff($other_mode_ids, $this_mode_ids); - } - - $this->Application->StoreVar('clipboard', serialize($clipboard)); - - /*// do not go up - STAY - $event->SetRedirectParam('opener', 's'); - $event->SetRedirectParam('pass_events', true);*/ - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/clipboard_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.2 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/recursive_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/recursive_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/recursive_helper.php (nonexistent) @@ -1,223 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 kRecursiveHelper extends kHelper { - - function DeleteCategory($category_id, $prefix='c') - { - $id_field = $this->Application->getUnitOption($prefix, 'IDField'); - $table_name = $this->Application->getUnitOption($prefix, 'TableName'); - - $sql = 'SELECT '.$id_field.' - FROM '.$table_name.' - WHERE ParentId = '.$category_id; - - $sub_categories = $this->Conn->GetCol($sql); - if ($sub_categories) { - foreach ($sub_categories as $sub_category_id) { - $this->DeleteCategory($sub_category_id); - } - } - - $ci_table = $this->Application->getUnitOption('ci', 'TableName'); - // 1. remove category items from this category if it is supplemental (non-primary) category to them - $sql = 'DELETE FROM '.$ci_table.' - WHERE ('.$id_field.' = '.$category_id.') AND (PrimaryCat = 0)'; - $this->Conn->Query($sql); - - $temp_handler =& $this->Application->recallObject($prefix.'_TempHandler', 'kTempTablesHandler'); - - // 2. delete items this have this category as primary - $delete_ids = $this->getCategoryItems($category_id, true); - - foreach ($delete_ids as $item_prefix => $resource_ids) { - if (!$item_prefix) { - // not ItemPrefix filled -> old categoryitem linking - continue; - } - $item_ids = $this->GetItemIDs($item_prefix, $resource_ids); - $temp_handler->BuildTables($item_prefix, $item_ids); - $temp_handler->DeleteItems($item_prefix, '', $item_ids); - } - - // 3. delete this category - $temp_handler->BuildTables($prefix, Array($category_id)); - $temp_handler->DeleteItems($prefix, '', Array($category_id)); - } - - /** - * Converts resource ids list to id field list for given prefix - * - * @param string $prefix - * @param Array $resource_ids - * @return Array - */ - function GetItemIDs($prefix, $resource_ids) - { - if (!$resource_ids) { - return Array(); - } - - $id_field = $this->Application->getUnitOption($prefix, 'IDField'); - $table_name = $this->Application->getUnitOption($prefix, 'TableName'); - - $sql = 'SELECT '.$id_field.' - FROM '.$table_name.' - WHERE ResourceId IN ('.implode(',', $resource_ids).')'; - return $this->Conn->GetCol($sql); - } - - // moves selected categories to destination category - function MoveCategories($category_ids, $dest_category_id) - { - if (!$category_ids) return ; - - $id_field = $this->Application->getUnitOption('c', 'IDField'); - $table_name = $this->Application->getUnitOption('c', 'TableName'); - - // do not move categories into their children - $sql = 'SELECT ParentPath - FROM '.$table_name.' - WHERE '.$id_field.' = '.$dest_category_id; - $dest_parent_path = explode('|', substr($this->Conn->GetOne($sql), 1, -1)); - - $child_categories = array_intersect($dest_parent_path, $category_ids); // get categories, then can't be moved - $category_ids = array_diff($category_ids, $child_categories); // remove them from movable categories list - - if ($category_ids) { - $sql = 'UPDATE '.$table_name.' - SET ParentId = '.$dest_category_id.' - WHERE '.$id_field.' IN ('.implode(',', $category_ids).')'; - $this->Conn->Query($sql); - } - } - - /** - * Complete cloning or category with subcategories and subitems - * - * @param int $category_id - */ - function PasteCategory($category_id, $prefix = 'c') - { - $backup_category_id = $this->Application->GetVar('m_cat_id'); - - $src_parent_path = $this->_getParentPath($category_id); - $dst_parent_path = $this->_getParentPath($backup_category_id); - - if (substr($dst_parent_path, 0, strlen($src_parent_path)) == $src_parent_path) { - // target path contains source path -> recursion - return ; - } - - // 1. clone category - $temp_handler =& $this->Application->recallObject($prefix.'_TempHandler', 'kTempTablesHandler'); - /* @var $temp_handler kTempTablesHandler*/ - $temp_handler->BuildTables($prefix, Array($category_id)); - $new_category_id = array_pop( $temp_handler->CloneItems($prefix, '', Array($category_id)) ); - $this->Application->SetVar('m_cat_id', $new_category_id); - - $id_field = $this->Application->getUnitOption($prefix, 'IDField'); - $table_name = $this->Application->getUnitOption($prefix, 'TableName'); - - // 2. assign supplemental items to current category to new category - $paste_ids = $this->getCategoryItems($category_id, false); - - foreach ($paste_ids as $item_prefix => $resource_ids) { - if (!$item_prefix) { - // not ItemPrefix filled -> old categoryitem linking - continue; - } - - $item_object =& $this->Application->recallObject($item_prefix.'.-item', null, Array('skip_autoload' => true)); - foreach ($resource_ids as $item_resource_id) { - $item_object->Load($item_resource_id, 'ResourceId'); - $item_object->assignToCategory($new_category_id, false); - } - } - - // 3. clone items that have current category as primary - $paste_ids = $this->getCategoryItems($category_id, true); - - foreach ($paste_ids as $item_prefix => $resource_ids) { - if (!$item_prefix) { - // not ItemPrefix filled -> old categoryitem linking - continue; - } - - // 2. clone items from current category (for each prefix separately) - $item_ids = $this->GetItemIDs($item_prefix, $resource_ids); - $temp_handler->BuildTables($item_prefix, $item_ids); - $temp_handler->CloneItems($item_prefix, '', $item_ids); - } - - // 4. do same stuff for each subcategory - $sql = 'SELECT '.$id_field.' - FROM '.$table_name.' - WHERE ParentId = '.$category_id; - - $sub_categories = $this->Conn->GetCol($sql); - if ($sub_categories) { - foreach ($sub_categories as $sub_category_id) { - $this->PasteCategory($sub_category_id, $prefix); - } - } - - $this->Application->SetVar('m_cat_id', $backup_category_id); - } - - /** - * Returns grouped category items - * - * @param int $category_id - * @param bool $item_primary_category - * @return Array - */ - function getCategoryItems($category_id, $item_primary_category = true) - { - $ci_table = $this->Application->getUnitOption('ci', 'TableName'); - - $sql = 'SELECT ItemPrefix, ItemResourceId - FROM '.$ci_table.' - WHERE (CategoryId = '.$category_id.') AND (PrimaryCat = '.($item_primary_category ? 1 : 0).')'; - $category_items = $this->Conn->GetCol($sql, 'ItemResourceId'); - - $item_ids = Array(); - foreach ($category_items as $resource_id => $item_prefix) { - $item_ids[$item_prefix][] = $resource_id; - } - return $item_ids; - } - - /** - * Returns parent path for given category - * - * @param int $category_id - * @return Array - */ - function _getParentPath($category_id) - { - static $cache = Array (); - - if (!array_key_exists($category_id, $cache)) { - $sql = 'SELECT ParentPath - FROM ' . TABLE_PREFIX . 'Category - WHERE CategoryId = ' . $category_id; - $cache[$category_id] = $this->Conn->GetOne($sql); - } - - return $cache[$category_id]; - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/recursive_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.6 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/json_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/json_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/json_helper.php (nonexistent) @@ -1,167 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 JSONHelper extends kHelper { - -// var $match = Array ('\\', "\n", "\t", "\r", "\b", "\f", '"'); -// var $replace = Array ('\\\\', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'); - -// \x{2028} is some strange char found in GTA responses... it breaks javascript - var $match = Array ('/\\\\/u', '/\\"/u', '/\\t/u', '/\\n/u', '/\\r/u', '/\\x{2028}/u'); - var $replace = Array ('\\\\\\\\', '\\"', '\\t', '\\n', '\\r', ''); - - /** - * Object constructor - * - * @return JSONHelper - */ - function JSONHelper() { - - } - - /** - * Parse structure to JSON - * - * @param mixed $data - * @return string - */ - function parse($data) - { - return '('.$this->encode($data).')'; - } - - /** - * Converts PHP variable to JSON string - * Can convert any PHP variable with any content to correct JSON structure - * - * @param mixed $data Data to convert - * @return string - */ - function encode($data) - { - $type = $this->getType($data); - - switch ($type) { - case 'object': - $data = '{'.$this->processData($data, $type).'}'; - break; - case 'array': - $data = '['.$this->processData($data, $type).']'; - break; - default: - if (is_int($data) || is_float($data)) { - $data = (string)$data; - } elseif (is_string($data)) { - $data = '"'.$this->escape($data).'"'; - } elseif (is_bool($data)) { - $data = $data ? 'true' : 'false'; - } else { - $data = 'null'; - } - } - return $data; - } - - /** - * Enter description here... - * - * @param unknown_type $input - * @param unknown_type $type - * @return unknown - */ - function processData($data, $type) - { - $output = Array(); - // If data is an object - it should be converted as a key => value pair - - if ($type == 'object'){ - foreach($data as $key => $value) { - $output[] = '"'.$key.'": '.$this->encode($value); - } - } else { - foreach($data as $key => $value) { - $output[] = $this->encode($value); - } - } - return implode(',', $output);; - } - - /** - * Function determines type of variable - * - * @param unknown_type $data - * @return unknown - */ - function getType(&$data) - { - if (is_object($data)) { - $type = 'object'; - } elseif (is_array($data)) { - // If array is assoc it should be processed as an object - if($this->is_assoc($data)) { - $type = 'object'; - } else { - $type = 'array'; - } - } elseif (is_numeric($data)) { - $type = 'number'; - } elseif(is_string($data)) { - $type = 'string'; - } elseif(is_bool($data)) { - $type = 'boolean'; - } elseif(is_null($data)) { - $type = 'null'; - } else { - $type = 'string'; - } - return $type; - } - - /** - * Function determines if array is associative - * - * @param array $array - * @return bool - */ - function is_assoc($array) - { -// Arrays are defined as integer-indexed arrays starting at index 0, where -// the last index is (count($array) -1); any deviation from that is -// considered an associative array, and will be encoded as such (from Zend Framework). - - return !empty($array) && (array_keys($array) !== range(0, count($array) - 1)); - } - - /** - * Escapes special characters - * Function escapes ", \, /, \n and \r symbols so that not to cause JavaScript error or - * data loss - * - * @param string $string - * @return string - */ - function escape($string) - { - $string = preg_replace($this->match, $this->replace, $string); - - return $string; - - // Escape certain ASCII characters: - // 0x08 => \b - // 0x0c => \f -// return str_replace(array(chr(0x08), chr(0x0C)), array('\b', '\f'), $string); - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/json_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.1.2.2 \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/mailing_list_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/mailing_list_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/mailing_list_helper.php (nonexistent) @@ -1,284 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 MailingListHelper extends kHelper { - - var $_mailingId = false; - - /** - * Adds new email from given mailing to emails queue - * - * @param string $email - * @param int $mailing_id - * @param Array $mailing_data - */ - function queueEmail($email, $mailing_id, &$mailing_data) - { - $esender =& $this->Application->recallObject('EmailSender'); - /* @var $esender kEmailSendingHelper */ - - if ($this->_mailingId != $mailing_id) { - if (is_numeric($this->_mailingId)) { - // clear fields after previous mailing processing - $esender->Clear(); - } - - // 1. set headers same for all emails - list ($mailing_data['FromName'], $mailing_data['FromEmail']) = $this->_getSenderData($mailing_data); - $esender->SetFrom($mailing_data['FromEmail'], $mailing_data['FromName']); - - $esender->SetSubject($mailing_data['Subject']); - $esender->SetBody($mailing_data['MessageHtml'], $mailing_data['MessageText']); - - // 2. add attachment if any - $attachments = $mailing_data['Attachments'] ? explode('|', $mailing_data['Attachments']) : Array (); - - foreach ($attachments as $attachment) { - $esender->AddAttachment(FULL_PATH . ITEM_FILES_PATH . $attachment); - } - - $this->_mailingId = $mailing_id; - } - - // 3. set recipient specific fields - $esender->SetTo($email, $email); - $esender->Deliver(null, $mailing_id, false); - - // 4. write to log - $log_fields_hash = Array ( - 'fromuser' => $mailing_data['FromName'] . '<' . $mailing_data['FromEmail'] . '>', - 'addressto' => $email, - 'subject' => $mailing_data['Subject'], - 'timestamp' => adodb_mktime(), - 'EventParams' => serialize( Array ('MailingId' => $mailing_id) ), - ); - - $this->Conn->doInsert($log_fields_hash, TABLE_PREFIX . 'EmailLog'); - } - - /** - * Returns mass mail sender name & email - * - * @return Array - */ - function _getSenderData(&$mailing_data) - { - $is_root = true; - if ($mailing_data['PortalUserId'] > 0) { - $sender =& $this->Application->recallObject('u.-item', null, Array ('skip_autoload' => true)); - /* @var $sender UsersItem */ - - $sender->Load($mailing_data['PortalUserId']); - - $email_address = $sender->GetDBField('Email'); - $name = trim( $sender->GetDBField('FirstName') . ' ' . $sender->GetDBField('LastName') ); - $is_root = false; - } - - if ($is_root || !$email_address) { - $email_address = $this->Application->ConfigValue('Smtp_AdminMailFrom'); - } - - if ($is_root || !$name) { - $name = strip_tags( $this->Application->ConfigValue('Site_Name') ); - } - - return Array ($name, $email_address); - } - - /** - * Generates recipients emails based on "To" field value - * - * @param int $id - * @param Array $fields_hash - */ - function generateRecipients($id, $fields_hash) - { - $recipients = explode(';', $fields_hash['To']); - - // 1. group recipients by types - $recipients_grouped = Array (); - foreach ($recipients as $recipient) { - if (strpos($recipient, '_') !== false) { - list ($recipient_type, $recipient_id) = explode('_', $recipient); - } - else { - $recipient_type = 'direct'; - $recipient_id = $recipient; - } - - if (!array_key_exists($recipient_type, $recipients_grouped)) { - $recipients_grouped[$recipient_type] = Array (); - } - - $recipients_grouped[$recipient_type][] = $recipient_id; - } - - // for each group convert ids to names - $recpient_emails = Array (); - foreach ($recipients_grouped as $recipient_type => $group_recipients) { - $recpient_emails = array_merge($recpient_emails, $this->_getRecipientEmails($recipient_type, $group_recipients)); - } - - $recpient_emails = array_unique($recpient_emails); - - return Array ( - 'ToParsed' => serialize($recpient_emails), - 'EmailsTotal' => count($recpient_emails), - ); - } - - function _getRecipientEmails($recipient_type, $recipient_ids) - { - if (strpos($recipient_type, '.') !== false) { - // remove special - list ($recipient_type, ) = explode('.', $recipient_type); - } - - if ($recipient_type != 'u' && $recipient_type != 'g') { - // theese are already emails - return $recipient_ids; - } - - switch ($recipient_type) { - case 'u': - $sql = 'SELECT Email - FROM ' . TABLE_PREFIX . 'PortalUser - WHERE (PortalUserId IN (' . implode(',', $recipient_ids) . ')) AND (Email <> "")'; - break; - - case 'g': - $sql = 'SELECT u.Email - FROM ' . TABLE_PREFIX . 'UserGroup ug - LEFT JOIN ' . TABLE_PREFIX . 'PortalUser u ON u.PortalUserId = ug.PortalUserId - WHERE (ug.GroupId IN (' . implode(',', $recipient_ids) . ')) AND (u.Email <> "")'; - break; - } - - return $this->Conn->GetCol($sql); - } - - function getRecipientNames($recipient_type, $recipient_ids) - { - if (strpos($recipient_type, '.') !== false) { - // remove special - list ($recipient_type, ) = explode('.', $recipient_type); - } - - switch ($recipient_type) { - case 'u': - $title_field = 'Email'; - break; - - case 'g': - $title_field = 'Name'; - break; - - default: - $title_field = false; - break; - } - - if ($title_field === false || !$recipient_ids) { - return $recipient_ids; - } - - $id_field = $this->Application->getUnitOption($recipient_type, 'IDField'); - $table_name = $this->Application->getUnitOption($recipient_type, 'TableName'); - - $sql = 'SELECT ' . $title_field . ' - FROM ' . $table_name . ' - WHERE ' . $id_field . ' IN (' . implode(',', $recipient_ids) . ')'; - return $this->Conn->GetCol($sql); - } - - /** - * Updates information about sent email count based on given totals by mailings - * - * @param Array $mailing_totals - */ - function _updateSentTotals($mailing_totals) - { - if (array_key_exists(0, $mailing_totals)) { - // don't update sent email count for mails queued directly (not via mailing lists) - unset($mailing_totals[0]); - } - - $id_field = $this->Application->getUnitOption('mailing-list', 'IDField'); - $table_name = $this->Application->getUnitOption('mailing-list', 'TableName'); - - // update sent email count for each processed mailing - foreach ($mailing_totals as $mailing_id => $mailing_total) { - $sql = 'UPDATE ' . $table_name . ' - SET EmailsSent = EmailsSent + ' . $mailing_total . ' - WHERE ' . $id_field . ' = ' . $mailing_id; - $this->Conn->Query($sql); - } - - // mark mailings, that were processed completely - $sql = 'UPDATE ' . $table_name . ' - SET Status = ' . MAILING_LIST_PROCESSED . ' - WHERE (Status = ' . MAILING_LIST_PARTIALLY_PROCESSED . ') AND (EmailsSent = EmailsTotal)'; - $this->Conn->Query($sql); - } - - /** - * Sent given messages from email queue - * - * @param Array $messages - */ - function processQueue(&$messages) - { - $esender =& $this->Application->recallObject('EmailSender'); - /* @var $esender kEmailSendingHelper */ - - $queue_table = $this->Application->getUnitOption('email-queue', 'TableName'); - - $i = 0; - $message = Array (); - $mailing_totals = Array (); - $message_count = count($messages); - - while ($i < $message_count) { - $message[0] = unserialize($messages[$i]['MessageHeaders']); - $message[1] =& $messages[$i]['MessageBody']; - $delivered = $esender->Deliver($message, true); // immediate send! - - if ($delivered) { - // send succseeded, delete from queue - $sql = 'DELETE FROM ' . $queue_table . ' - WHERE EmailQueueId = ' . $messages[$i]['EmailQueueId']; - $this->Conn->Query($sql); - - $mailing_id = $messages[$i]['MailingId']; - if (!array_key_exists($mailing_id, $mailing_totals)) { - $mailing_totals[$mailing_id] = 0; - } - $mailing_totals[$mailing_id]++; - } - else { - // send failed, increment retries counter - $sql = 'UPDATE ' . $queue_table . ' - SET SendRetries = SendRetries + 1, LastSendRetry = ' . adodb_mktime() . ' - WHERE EmailQueueId = ' . $messages[$i]['EmailQueueId']; - $this->Conn->Query($sql); - } - $i++; - } - - $this->_updateSentTotals($mailing_totals); - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/mailing_list_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.1.2.2 \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/spam_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/spam_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/spam_helper.php (nonexistent) @@ -1,144 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 SpamHelper extends kHelper { - - /** - * Table name where spam control information is keeped - * - * @var string - */ - var $TableName; - - /** - * RecourceId field of current item - * - * @var int - */ - var $ResourceId = 0; - - /** - * Type of information to put into spam control - * - * @var string - */ - var $DataType = ''; - - /** - * Default spam control record expiration - * - * @var int - */ - var $Expiration = 0; - - function SpamHelper() - { - parent::kHelper(); - $this->TableName = TABLE_PREFIX.'SpamControl'; - } - - /** - * Initializes helper for concrete item - * - * @param int $resource_id - * @param string $data_type - * @param int $expiration - */ - function InitHelper($resource_id, $data_type, $expiration) - { - $this->ResourceId = $resource_id; - $this->DataType = $data_type; - - if (preg_match('/(.*):(.*)/', $expiration, $regs)) { - $delay_value = $this->Application->ConfigValue($regs[1]); - $delay_interval = $this->Application->ConfigValue($regs[2]); - $expiration = $delay_value * $delay_interval; - } - - $this->Expiration = adodb_mktime() + $expiration; - } - - /** - * Returns WHERE clause that identified each spam control record - * - * @param bool $as_array return result as array, not string - * - * @return string - */ - function GetKeyClause($as_array = false) - { - $user_id = $this->Application->RecallVar('user_id'); - - if ($user_id == 0) { - $user_id = -2; - } - - $keys = Array ( - 'ItemResourceId' => $this->ResourceId, - 'IPaddress' => $_SERVER['REMOTE_ADDR'], - 'PortalUserId' => $user_id, - 'DataType' => $this->DataType, - ); - - if ($as_array) { - return $keys; - } - - $ret = ''; - foreach ($keys as $field_name => $field_value) { - $ret .= '('.$field_name.' = '.$this->Conn->qstr($field_value).') AND '; - } - - return preg_replace('/(.*) AND $/', '\\1', $ret); - } - - /** - * Allows to add current item in spam control - * - */ - function AddToSpamControl() - { - $fields_hash = $this->GetKeyClause(true); - - $fields_hash['Expire'] = $this->Expiration; - $this->Conn->doInsert($fields_hash, $this->TableName); - } - - /** - * Allows to check if current item is in spam control - * - * @return bool - */ - function InSpamControl() - { - $key_clause = $this->GetKeyClause(); - - $sql = 'SELECT Expire - FROM '.$this->TableName.' - WHERE '.$key_clause; - $expires = $this->Conn->GetOne($sql); - - if ($expires && $expires < adodb_mktime()) { - // spam control record is expired - $sql = 'DELETE FROM '.$this->TableName.' - WHERE '.$key_clause; - $this->Conn->Query($sql); - return false; - } - - return $expires ? true : false; - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/spam_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.1 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/permissions_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/permissions_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/permissions_helper.php (nonexistent) @@ -1,680 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 kPermissionsHelper extends kHelper { - - /** - * Current set of permissions for group being edited - * - * @var Array - */ - var $Permissions = Array(); - - function LoadPermissions($group_id, $cat_id, $type = 1, $prefix = '') - { - $perm_table = $this->Application->getUnitOption('perm', 'TableName'); - $perm_table = $this->Application->GetTempName($perm_table, 'prefix:'.$prefix); - $sql = 'SELECT * - FROM '.$perm_table.' - WHERE (GroupId = '.$group_id.') AND (CatId = '.$cat_id.') AND (Type = '.$type.')'; - $permissions = $this->Conn->Query($sql, 'Permission'); - - $this->Permissions = Array(); - foreach ($permissions as $perm_name => $perm_options) { - $perm_record['value'] = $perm_options['PermissionValue']; - $perm_record['id'] = $perm_options['PermissionId']; - $this->Permissions[$perm_name] = $perm_record; - } - } - - function getPermissionValue($perm_name) - { - return isset($this->Permissions[$perm_name]) ? $this->Permissions[$perm_name]['value'] : 0; - } - - function getPermissionID($perm_name) - { - return isset($this->Permissions[$perm_name]) ? $this->Permissions[$perm_name]['id'] : 0; - } - - /** - * This is old permission like ADMIN or LOGIN - * - * @param string $section_name - * @param string $perm_name - * @return bool - */ - function isOldPermission($section_name, $perm_name) - { - return $section_name == 'in-portal:root' && $perm_name != 'view'; - } - - /** - * Returns permission names to check based on event name and item prefix (main item or subitem) - * - * @param kEvent $event - * @return Array - */ - function getPermissionByEvent(&$event, $perm_mapping) - { - $top_prefix = $event->getEventParam('top_prefix'); - - $pefix_type = ($top_prefix == $event->Prefix) ? 'self' : 'subitem'; - $perm_mapping = getArrayValue($perm_mapping, $event->Name); - - if (!$perm_mapping[$pefix_type]) { - trigger_error('Permission mappings not defined for event <b>'.$top_prefix.' <- '.$event->Prefix.':'.$event->Name.'</b>', E_USER_ERROR); - } - - if ($perm_mapping[$pefix_type] === true) { - // event is defined in mapping but is not checked by permissions - return true; - } - - return explode('|', $perm_mapping[$pefix_type]); - } - - /** - * Common event permission checking method - * - * @param kEvent $event - */ - function CheckEventPermission(&$event, $perm_mapping) - { - $section = $event->getSection(); - if (preg_match('/^CATEGORY:(.*)/', $section)) { - return $this->CheckEventCategoryPermission($event, $perm_mapping); - } - - $top_prefix = $event->getEventParam('top_prefix'); - $check_perms = $this->getPermissionByEvent($event, $perm_mapping); - - if ($check_perms === true) { - // event is defined in mapping but is not checked by permissions - return true; - } - - $perm_status = false; - foreach ($check_perms as $perm_name) { - // check if at least one of required permissions is set - $perm_name = $section.'.'.$perm_name; - $perm_status = $this->CheckPermission($perm_name, 1); - if (($perm_name == $section.'.add') && $perm_status && ($top_prefix == $event->Prefix)) { - // main item, add permission allowed, but ID is > 0, then deny permission - // how to get id here - } - - if ($perm_status) { - return $perm_status; - } - } - - return $this->finalizePermissionCheck($event, $perm_status); - } - - /** - * Returns owner + primary category for each item (used for permission checking) - * - * @param string $prefix - * @param string $ids - * @param bool $temp_mode - * @return Array - * @author Alex - */ - function GetCategoryItemData($prefix, $ids, $temp_mode = false) - { - if (is_array($ids)) { - $ids = implode(',', $ids); - } - $id_field = $this->Application->getUnitOption($prefix, 'IDField'); - $table_name = $this->Application->getUnitOption($prefix, 'TableName'); - $ci_table = $this->Application->getUnitOption('ci', 'TableName'); - - if ($temp_mode) { - $table_name = $this->Application->GetTempName($table_name, 'prefix:' . $prefix); - $ci_table = $this->Application->GetTempName($ci_table, 'prefix:' . $prefix); - } - - $owner_field = $this->Application->getUnitOption($prefix, 'OwnerField'); - if (!$owner_field) { - $owner_field = 'CreatedById'; - } - - $sql = 'SELECT item_table.'.$id_field.', item_table.'.$owner_field.' AS CreatedById, ci.CategoryId - FROM '.$table_name.' item_table - LEFT JOIN '.$ci_table.' ci ON ci.ItemResourceId = item_table.ResourceId - WHERE item_table.'.$id_field.' IN ('.$ids.') AND (ci.PrimaryCat = 1)'; - return $this->Conn->Query($sql, $id_field); - } - - /** - * Check category-based permissions for category items - * - * @param kEvent $event - */ - function _frontCheckEventCategoryPermission(&$event, $event_perm_mapping) - { - // mapping between specific permissions and common permissions - static $perm_mapping = Array( - 'add' => 'ADD', 'add.pending' => 'ADD.PENDING', 'edit' => 'MODIFY', - 'edit.pending' => 'MODIFY.PENDING', 'delete' => 'DELETE', 'view' => 'VIEW' - ); - - $top_prefix = $event->getEventParam('top_prefix'); - $event_handler =& $this->Application->recallObject($event->Prefix.'_EventHandler'); - /* @var $event_handler kCatDBEventHandler */ - - $raise_warnings = $event->getEventParam('raise_warnings'); - $event->setEventParam('raise_warnings', 0); - if ($event->Prefix != $top_prefix) { - $top_event = new kEvent($top_prefix.':'.$event->Name); - $id = $event_handler->getPassedID($top_event); - } - else { - $id = $event_handler->getPassedID($event); - } - $event->setEventParam('raise_warnings', $raise_warnings); - - $owner_id = -1; // owner is root if not detected - if (!$id) { - // item being created -> check by current (before editing started, saved in OnPreCreate event) category permissions - // note: category in session is placed on catalog data import start - $category_id = $this->Application->IsAdmin() ? $this->Application->RecallVar('m_cat_id') : $this->Application->GetVar('m_cat_id'); - } - elseif ($top_prefix == 'c' || $top_prefix == 'st') { - $category_id = $id; - } - else { - // item being edited -> check by it's primary category permissions - $items_info = $this->GetCategoryItemData($top_prefix, $id); - $category_id = $items_info[$id]['CategoryId']; - $owner_id = $items_info[$id]['CreatedById']; - } - - // specific permission check for pending & owner permissions: begin - $uploader_events = Array ('OnUploadFile', 'OnDeleteFile', 'OnViewFile'); - if (in_array($event->Name, $uploader_events)) { - // don't recall target object during uploader-related, because OnItemLoad will use incorrect - // $user_id in Firefox (during Flash problems session will be used from Internet Exploere) - $new_item = false; - } - else { - $new_item = $this->Application->IsAdmin() && $event_handler->isNewItemCreate($event) ? true : false; - $check_status = $this->checkCombinedPermissions($event, $owner_id, (int)$category_id, $new_item); - } - - if (isset($check_status)) { - return $this->finalizePermissionCheck($event, $check_status); - } - // specific permission check for pending & owner permissions: end - - $perm_status = false; - $check_perms = $this->getPermissionByEvent($event, $event_perm_mapping); - - if ($check_perms === true) { - // event is defined in mapping but is not checked by permissions - return true; - } - - $item_prefix = $this->Application->getUnitOption($top_prefix, 'PermItemPrefix'); - foreach ($check_perms as $perm_name) { - // check if at least one of required permissions is set - if (!isset($perm_mapping[$perm_name])) { - // not mapped permission (e.g. advanced:approve) -> skip - continue; - } - $perm_name = $item_prefix.'.'.$perm_mapping[$perm_name]; - $perm_status = $this->CheckPermission($perm_name, 0, (int)$category_id); - - if ($perm_status) { - return $perm_status; - } - } - - return $this->finalizePermissionCheck($event, $perm_status); - } - - /** - * Finalizes permission checking (with additional debug output, when in debug mode) - * - * @param kEvent $event - * @param bool $perm_status - * @return bool - */ - function finalizePermissionCheck(&$event, $perm_status) - { - if (!$perm_status) { - if ($this->Application->isDebugMode()) { - // for debugging purposes - $event->SetRedirectParam('section', $event->getSection()); - $event->SetRedirectParam('main_prefix', $event->getEventParam('top_prefix')); - $event->SetRedirectParam('event_name', $event->Name); - $event->SetRedirectParam('next_template', $this->Application->GetVar('t')); - } - - $event->status = erPERM_FAIL; - } - - return $perm_status; - } - - /** - * Allows to check combined permissions (*.owner, *.pending) for add/modify/delete operations from admin & front-end - * - * @param kEvent $event - * @param int $owner_id - * @param int $category_id - * @param bool $new_item - * @return mixed - */ - function checkCombinedPermissions(&$event, $owner_id, $category_id, $new_item = false) - { - $ret = null; // true/false when used, null when not used - $top_prefix = $event->getEventParam('top_prefix'); - - // check admin permission - if (substr($event->Name, 0, 9) == 'OnPreSave') { - if ($new_item) { - $ret = $this->AddCheckPermission($category_id, $top_prefix); - } - else { - // add & modify because $new_item is false, when item is aready created & then saved in temp table (even with 0 id) - $ret = $this->AddCheckPermission($category_id, $top_prefix) || - $this->ModifyCheckPermission($owner_id, $category_id, $top_prefix); - } - } - - // check front-end permissions - switch ($event->Name) { - case 'OnCreate': - $ret = $this->AddCheckPermission($category_id, $top_prefix); - break; - - case 'OnUpdate': - $ret = $this->ModifyCheckPermission($owner_id, $category_id, $top_prefix); - break; - - case 'OnDelete': - case 'OnMassDelete': - $ret = $this->DeleteCheckPermission($owner_id, $category_id, $top_prefix); - break; - } - - if ($ret === 0) { - // permission check failed (user has no permission) - $event->status = erPERM_FAIL; - } - - return $ret; - } - - /** - * Simplified permission check for category items, when adding/editing them from advanced view. - * - * @param kEvent $event - * @return mixed - */ - function CheckEventCategoryPermission(&$event, $event_perm_mapping) - { - if (!$this->Application->IsAdmin()) { - // check front-end permission by old scheme - return $this->_frontCheckEventCategoryPermission($event, $event_perm_mapping); - } - - if (substr($event->Name, 0, 9) == 'OnPreSave') { - // check separately, because permission mapping is not defined for OnPreSave* events - $check_perms = Array ('add', 'edit'); - } - else { - $check_perms = $this->getPermissionByEvent($event, $event_perm_mapping); - } - - if ($check_perms === true) { - // event is defined in mapping but is not checked by permissions - return true; - } - - // 1. most of events does require admin login only - $perm_status = $this->Application->LoggedIn() && $this->Application->IsAdmin(); - - // 2. in case, when event require more, then "view" right, then restrict it to temporary tables only - if (!in_array('view', $check_perms)) { - $perm_status = $perm_status && $this->Application->IsTempMode($event->Prefix, $event->Special); - } - - return $this->finalizePermissionCheck($event, $perm_status); - } - - function TagPermissionCheck($params, $is_owner = false) - { - $perm_prefix = getArrayValue($params, 'perm_prefix'); - $perm_event = getArrayValue($params, 'perm_event'); - $permission_groups = getArrayValue($params, 'permissions'); - - if ($permission_groups && !$perm_event) { - // check permissions by permission names in current category - $permission_groups = explode('|', $permission_groups); - $group_has_permission = false; - - $perm_category = isset($params['cat_id']) ? $params['cat_id'] : $this->Application->GetVar('m_cat_id'); - - if ($perm_prefix) { - // use primary category of item with id from {perm_prefix}_id as base for permission checking - $perm_category = $this->getPrimaryCategory($perm_prefix); - } - - $is_system = isset($params['system']) && $params['system'] ? 1 : 0; - foreach ($permission_groups as $permission_group) { - $permissions = explode(',', $permission_group); - $has_permission = true; - foreach ($permissions as $permission) { - $owner_checked = (strpos($permission, '.OWNER.') !== false) ? $is_owner : true; - $has_permission = $has_permission && $this->CheckPermission($permission, $is_system, $perm_category) && $owner_checked; - } - $group_has_permission = $group_has_permission || $has_permission; - - if ($group_has_permission) { - return true; - } - } - return false; - } - elseif ($perm_event) { - // check permission by event name - list ($prefix, $event) = explode(':', $perm_event); - $event_handler =& $this->Application->recallObject($prefix.'_EventHandler'); - return $event_handler->CheckPermission( new kEvent($perm_event) ); - } - - return true; - } - - /** - * Returns item's primary category (get item_id from request) - * - * @param string $prefix - * @return int - */ - function getPrimaryCategory($prefix) - { - $id_field = $this->Application->getUnitOption($prefix, 'IDField'); - $table_name = $this->Application->getUnitOption($prefix, 'TableName'); - $id = $this->Application->GetVar($prefix.'_id'); - - if (!$id) return $this->Application->GetVar('m_cat_id'); - - $sql = 'SELECT ResourceId - FROM '.$table_name.' - WHERE '.$id_field.' = '.$id; - $resource_id = $this->Conn->GetOne($sql); - - $sql = 'SELECT CategoryId - FROM '.$this->Application->getUnitOption('ci', 'TableName').' - WHERE ItemResourceId = '.$resource_id.' AND PrimaryCat = 1'; - return $this->Conn->GetOne($sql); - } - - /** - * Returns no permission template to redirect to - * - * @param Array $params - * @return Array - */ - function getPermissionTemplate($params) - { - $t = $this->Application->GetVar('t'); - if ($next_t = getArrayValue($params, 'next_template')) { - $t = $next_t; - } - - $redirect_params = $this->Application->HttpQuery->getRedirectParams(true); - - if (array_key_exists('pass_category', $params)) { - $redirect_params['pass_category'] = $params['pass_cateogry']; - } - - if (!$this->Application->LoggedIn()) { - $redirect_template = array_key_exists('login_template', $params) ? $params['login_template'] : ''; - if (!$redirect_template && $this->Application->IsAdmin()) { - $redirect_template = 'login'; - } - $redirect_params['next_template'] = $t; - } - else { - if (isset($params['no_permissions_template'])) { - $redirect_template = $params['no_permissions_template']; - } - else { - $redirect_template = $this->Application->IsAdmin() ? 'no_permission' : $this->Application->ConfigValue('NoPermissionTemplate'); - } - - if ($this->Application->isDebugMode()) { - $redirect_params['from_template'] = 1; - $redirect_params['perms'] = $params[ isset($params['permissions']) ? 'permissions' : 'perm_event' ]; - $redirect_params['next_template'] = $t; - } - } - - if (isset($params['index_file']) && $params['index_file']) { - $redirect_params['index_file'] = $params['index_file']; - } - - return Array($redirect_template, $redirect_params); - } - - /** - * Check current user permissions based on it's group permissions in specified category (for non-system permissions) or just checks if system permission is set - * - * @param string $name permission name - * @param int $cat_id category id, current used if not specified - * @param int $type permission type {1 - system, 0 - per category} - * @return int - */ - function CheckPermission($name, $type = 1, $cat_id = null) - { - $user_id = $this->Application->RecallVar('user_id'); - return $this->CheckUserPermission($user_id, $name, $type, $cat_id); - } - - function CheckUserPermission($user_id, $name, $type = 1, $cat_id = null) - { - if ($user_id == -1) { - // "root" is allowed anywhere - return $name == 'SYSTEM_ACCESS.READONLY' ? 0 : 1; - } - - if ($type == 1) { - // "system" permission are always checked per "Home" category (ID = 0) - $cat_id = 0; - } - - if (!isset($cat_id)) { - $cat_id = $this->Application->GetVar('m_cat_id'); - } - - $cache_key = $name.'|'.$type.'|'.$cat_id; - $perm_value = $this->Application->getCache('permissions', $cache_key); - if ($perm_value !== false) { - return $perm_value; - } - - // perm cache is build only based on records in db, that's why if permission is not explicitly denied, then - // that (perm cache creator) code thinks that it is allowed & adds corresponding record and code below will - // return incorrect results - - if ($user_id == $this->Application->RecallVar('user_id')) { - $groups = explode(',', $this->Application->RecallVar('UserGroups')); - } - else { // checking not current user - $sql = 'SELECT GroupId - FROM '.TABLE_PREFIX.'UserGroup - WHERE (PortalUserId = '.$user_id.') AND ( (MembershipExpires IS NULL) OR ( MembershipExpires >= UNIX_TIMESTAMP() ) )'; - $groups = $this->Conn->GetCol($sql); - array_push($groups, $this->Application->ConfigValue('User_LoggedInGroup') ); - } - - if (preg_match('/(.*)\.VIEW$/', $name) && ($type == 0)) { - // cached view permission of category: begin - if (strpos($cat_id, '|') !== false) { - $category_path = explode('|', substr($cat_id, 1, -1)); - $cat_id = end($category_path); - } - - $sql = 'SELECT PermissionConfigId - FROM '.TABLE_PREFIX.'PermissionConfig - WHERE PermissionName = '.$this->Conn->qstr($name); - $perm_id = $this->Conn->GetOne($sql); - - $sql = 'SELECT PermId - FROM '.TABLE_PREFIX.'PermCache - WHERE (PermId = '.$perm_id.') AND (CategoryId = '.$cat_id.')'; - - $view_filters = Array(); - foreach ($groups as $group) { - $view_filters[] = 'FIND_IN_SET('.$group.', ACL)'; - } - $sql .= ' AND ('.implode(' OR ', $view_filters).')'; - $perm_value = $this->Conn->GetOne($sql) ? 1 : 0; - - $this->Application->setCache('permissions', $cache_key, $perm_value); - return $perm_value; - // cached view permission of category: end - } - - if (is_numeric($cat_id) && $cat_id == 0) { - $cat_hierarchy = Array(0); - } - else { - if (strpos($cat_id, '|') !== false) { - $cat_hierarchy = $cat_id; - } - else { - $sql = 'SELECT ParentPath - FROM '.$this->Application->getUnitOption('c', 'TableName').' - WHERE CategoryId = '.$cat_id; - $cat_hierarchy = $this->Conn->GetOne($sql); - if ($cat_hierarchy === false) { - // category was deleted, but refrence to it stays in other tables -> data integrity is broken - $cat_hierarchy = '|' . $this->Application->findModule('Name', 'Core', 'RootCat') . '|'; - } - } - - $cat_hierarchy = explode('|', substr($cat_hierarchy, 1, -1)); - $cat_hierarchy = array_reverse($cat_hierarchy); - array_push($cat_hierarchy, 0); - } - - $perm_value = 0; - $groups = implode(',',$groups); - foreach ($cat_hierarchy as $category_id) { - $sql = 'SELECT SUM(PermissionValue) - FROM '.TABLE_PREFIX.'Permissions - WHERE Permission = "'.$name.'" AND CatId = '.$category_id.' AND GroupId IN ('.$groups.') AND Type = '.$type; - $res = $this->Conn->GetOne($sql); - if ($res !== false && !is_null($res)) { - $perm_value = $res ? 1 : 0; - break; - } - } - - $this->Application->setCache('permissions', $cache_key, $perm_value); - return $perm_value; - } - - /** - * Allows to check MODIFY & OWNER.MODFY +/- PENDING permission combinations on item - * - * @param int $owner_id user_id, that is owner of the item - * @param int $category_id primary category of item - * @param string $prefix prefix of item - * @return int {0 - no MODIFY permission, 1 - has MODIFY permission, 2 - has MODIFY.PENDING permission} - */ - function ModifyCheckPermission($owner_id, $category_id, $prefix) - { - $perm_prefix = $this->Application->getUnitOption($prefix, 'PermItemPrefix'); - - $live_modify = $this->CheckPermission($perm_prefix.'.MODIFY', ptCATEGORY, $category_id); - if ($live_modify) { - return 1; - } - else if ($this->CheckPermission($perm_prefix.'.MODIFY.PENDING', ptCATEGORY, $category_id)) { - return 2; - } - - if ($owner_id == $this->Application->RecallVar('user_id')) { - // user is item's OWNER -> check this permissions first - $live_modify = $this->CheckPermission($perm_prefix.'.OWNER.MODIFY', ptCATEGORY, $category_id); - if ($live_modify) { - return 1; - } - else if ($this->CheckPermission($perm_prefix.'.OWNER.MODIFY.PENDING', ptCATEGORY, $category_id)) { - return 2; - } - } - - return 0; - } - - /** - * Allows to check DELETE & OWNER.DELETE permission combinations on item - * - * @param int $owner_id user_id, that is owner of the item - * @param int $category_id primary category of item - * @param string $prefix prefix of item - * @return int {0 - no DELETE permission, 1 - has DELETE/OWNER.DELETE permission} - */ - function DeleteCheckPermission($owner_id, $category_id, $prefix) - { - $perm_prefix = $this->Application->getUnitOption($prefix, 'PermItemPrefix'); - - $live_delete = $this->CheckPermission($perm_prefix.'.DELETE', ptCATEGORY, $category_id); - if ($live_delete) { - return 1; - } - - if ($owner_id == $this->Application->RecallVar('user_id')) { - // user is item's OWNER -> check this permissions first - $live_delete = $this->CheckPermission($perm_prefix.'.OWNER.DELETE', ptCATEGORY, $category_id); - if ($live_delete) { - return 1; - } - } - - return 0; - } - - /** - * Allows to check ADD +/- PENDING permission combinations on item - * - * @param int $category_id primary category of item - * @param string $prefix prefix of item - * @return int {0 - no ADD permission, 1 - has ADD permission, 2 - has ADD.PENDING permission} - */ - function AddCheckPermission($category_id, $prefix) - { - $perm_prefix = $this->Application->getUnitOption($prefix, 'PermItemPrefix'); - - $live_add = $this->CheckPermission($perm_prefix.'.ADD', ptCATEGORY, $category_id); - if ($live_add) { - return 1; - } - else if ($this->CheckPermission($perm_prefix.'.ADD.PENDING', ptCATEGORY, $category_id)) { - return 2; - } - - return 0; - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/permissions_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.32.2.9 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/col_picker_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/col_picker_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/col_picker_helper.php (nonexistent) @@ -1,204 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 kColumnPickerHelper extends kHelper { - - var $PickerData; - var $GridName; - var $UseFreezer; - - function Init($prefix,$special,$event_params=null) - { - parent::Init($prefix, $special, $event_params); - $this->UseFreezer = $this->Application->ConfigValue('UseColumnFreezer'); - } - - function LoadColumns($prefix) - { - $view_name = $this->Application->RecallVar($prefix.'_current_view'); - $val = $this->Application->RecallPersistentVar($prefix.'_columns_.'.$view_name, ALLOW_DEFAULT_SETTINGS); - - if (!$val) { - $cols = $this->RebuildColumns($prefix); - } - else { - $cols = unserialize($val); - $current_cols = $this->GetColumns($prefix); - - if ($cols === false || $cols['crc'] != $current_cols['crc']) - { - $cols = $this->RebuildColumns($prefix, $cols); - } - } - return $cols; - } - - function PreparePicker($prefix, $grid_name) - { - $this->SetGridName($grid_name); - $this->PickerData = $this->LoadColumns($prefix); - } - - function ApplyPicker($prefix, &$fields, $grid_name) - { - $this->PreparePicker($prefix, $grid_name); - uksort($fields, array($this, 'CmpElems')); - $this->RemoveHiddenColumns($fields); - } - - function SetGridName($grid_name) - { - $this->GridName = $grid_name; - } - - function CmpElems($a, $b) - { - $a_index = array_search($a, $this->PickerData['order']); - $b_index = array_search($b, $this->PickerData['order']); - - if ($a_index == $b_index) { - return 0; - } - return ($a_index < $b_index) ? -1 : 1; - } - - function RebuildColumns($prefix, $current=null) - { - $cols = $this->GetColumns($prefix); - - if (is_array($current)) { - //get common fields both in db and xml - $common = array_intersect($current['order'], $cols['order']); - - //get added columns - present in xml, but not in db - $added = array_diff($cols['order'], $current['order']); - if (in_array('__FREEZER__', $added)) { - array_unshift($common, '__FREEZER__'); - unset($added[array_search('__FREEZER__', $added)]); - } - - $cols['order'] = array_merge($common, $added); - $cols['hidden_fields'] = array_intersect($current['order'], $current['hidden_fields']); - foreach($common as $col) { - $cols['widths'][$col] = isset($current['widths'][$col]) ? $current['widths'][$col] : 100; - } - $this->SetCRC($cols); - } - $this->StoreCols($prefix, $cols); - - return $cols; - } - - function StoreCols($prefix, $cols) - { - $view_name = $this->Application->RecallVar($prefix.'_current_view'); - $this->Application->StorePersistentVar($prefix.'_columns_.'.$view_name, serialize($cols)); - } - - function GetColumns($prefix) - { - $splited = $this->Application->processPrefix($prefix); - $grids = $this->Application->getUnitOption($splited['prefix'], 'Grids'); - $conf_fields = $this->UseFreezer ? array_merge_recursive( - array('__FREEZER__' => array('title' => '__FREEZER__')), - $grids[$this->GridName]['Fields'] - ) : $grids[$this->GridName]['Fields']; -// $conf_fields = $grids[$this->GridName]['Fields']; - - // we NEED to recall dummy here to apply fields changes imposed by formatters, - // such as replacing multilingual field titles etc. - $dummy =& $this->Application->recallObject($prefix, null, array('skip_autoload'=>1)); - - $counter = 0; - $hidden = array(); - $fields = array(); - $titles = array(); - $widths = array(); - foreach ($conf_fields as $name => $options) { - $fields[$counter] = $name; - $titles[$name] = $options['title']; - $widths[$name] = array_key_exists('width', $options) ? $options['width'] : 100; // only once per grid ! - if (isset($options['hidden']) && $options['hidden']) - { - $hidden[$counter] = $name; - } - $counter++; - } - $sorted_fields = $fields; - sort($sorted_fields); - $cols = array( - 'order' => $fields, - 'titles' => $titles, - 'hidden_fields' => $hidden, - 'widths' => $widths, - ); - $this->SetCRC($cols); - return $cols; - } - - function SetCRC(&$cols) - { - $sorted_fields = $cols['order']; - $sorted_titles = $cols['titles']; - asort($sorted_fields); - asort($sorted_titles); - $cols['crc'] = crc32(implode(',', $sorted_fields).implode(',', $sorted_titles)); - } - - function RemoveHiddenColumns(&$fields) - { - $to_remove = array(); - foreach ($fields as $name => $options) { - if (array_search($name, $this->PickerData['hidden_fields']) !== false) { - $to_remove[] = $name; - } - } - foreach ($to_remove as $name) { - unset($fields[$name]); - } - } - - function SaveColumns($prefix, $picked, $hidden) - { - $order = $picked ? explode('|', $picked) : array(); - $hidden = $hidden ? explode('|', $hidden) : array(); - $order = array_merge($order, $hidden); - - $cols = $this->LoadColumns($prefix); - $cols['order'] = $order; - $cols['hidden_fields'] = $hidden; - - $this->SetCRC($cols); - $this->StoreCols($prefix, $cols); - } - - function SaveWidths($prefix, $widths) - { - if (!is_array($widths)) $widths = explode(':', $widths); - array_shift($widths); // removing first col (checkbox col) width - $i = 0; - foreach ($this->PickerData['order'] as $ord => $field) { - if ($field == '__FREEZER__') continue; - $this->PickerData['widths'][$field] = $widths[$i++]; - } - $this->StoreCols($prefix, $this->PickerData); - } - - function GetWidth($field) - { - return isset($this->PickerData['widths'][$field]) ? $this->PickerData['widths'][$field] : false; - } -} \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/col_picker_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.2.2.4 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/count_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/count_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/count_helper.php (nonexistent) @@ -1,259 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 kCountHelper extends kHelper { - - function kCountHelper() - { - parent::kHelper(); - - // reset expired counts - $sql = 'UPDATE '.TABLE_PREFIX.'Counters - SET CountValue = NULL - WHERE (LifeTime > 0) AND (LastCounted < '.adodb_mktime().' - LifeTime)'; - $this->Conn->Query($sql); - } - - /** - * Returns counter value - * - * @param string $name counter name - * @param Array $params counter parameters - * @param string $query_name specify query name directly (don't generate from parmeters) - * @param bool $multiple_results - * @return mixed - */ - function getCounter($name, $params = Array (), $query_name = null, $multiple_results = false) - { - $clone_counter = false; - $query_name = isset($query_name) ? $query_name : rtrim($name.'-'.implode('-', array_values($params)), '-'); - $sql = 'SELECT * - FROM '.TABLE_PREFIX.'Counters - WHERE Name = '.$this->Conn->qstr($query_name); - $count_data = $this->Conn->GetRow($sql); - - if (!$count_data && ($query_name != $name)) { - // cloned record not found -> search for origial one - $sql = 'SELECT * - FROM '.TABLE_PREFIX.'Counters - WHERE Name = '.$this->Conn->qstr($name); - $count_data = $this->Conn->GetRow($sql); - $clone_counter = true; - } - - if (is_null($count_data['CountValue'])) { - $params['PREFIX'] = TABLE_PREFIX; - $count_sql = $count_data['CountQuery']; - - foreach ($params as $replace_from => $replace_to) { - $count_sql = str_replace('<%'.$replace_from.'%>', $replace_to, $count_sql); - } - - if ($multiple_results) { - $count_data['CountValue'] = serialize($this->Conn->GetCol($count_sql)); - } - else { - $count_data['CountValue'] = $this->Conn->GetOne($count_sql); - } - - if ($clone_counter && !$count_data['IsClone']) { - // don't clone clones - $count_data['CounterId'] = 0; - $count_data['Name'] = $query_name; - $count_data['IsClone'] = 1; - } - - $count_data['LastCounted'] = adodb_mktime(); - $this->Conn->doInsert($count_data, TABLE_PREFIX.'Counters', 'REPLACE'); - } - - return $multiple_results ? unserialize($count_data['CountValue']) : $count_data['CountValue']; - } - - /** - * Resets counter, whitch are affected by one of specified tables - * - * @param string $tables comma separated tables list used in counting sqls - */ - function resetCounters($tables) - { - $tables = explode(',', $tables); - $prefix_length = strlen(TABLE_PREFIX); - foreach ($tables as $index => $table) { - // remove prefixes - if (substr($table, 0, $prefix_length) == TABLE_PREFIX) { - $table = substr($table, $prefix_length); - } - $tables[$index] = '(TablesAffected LIKE "%|'.$table.'|%")'; - } - - $sql = 'UPDATE '.TABLE_PREFIX.'Counters - SET CountValue = NULL - WHERE '.implode(' OR ', $tables); - - $this->Conn->Query($sql); - } - - /** - * Counts items (of specific type) in category & subcategories - * - * @param string $prefix - * @param Array $params - * @param mixed $count_sql - * @return int - */ - function CategoryItemCount($prefix, $params, $count_sql = null) - { - if (!$this->Application->findModule('Var', $prefix)) { - // this is not module item - return $this->Application->ProcessParsedTag($prefix, 'CategoryItemCount', $params); - } - - // 1. get root category for counting - $category_id = isset($params['cat_id']) ? $params['cat_id'] : false; - if (!is_numeric($category_id)) { - $category_id = $this->Application->GetVar('m_cat_id'); - } - - if (!isset($count_sql)) { - $count_sql = 'COUNT(*)'; - } - - $where_clauses = Array (); - $table_name = $this->Application->getUnitOption($prefix, 'TableName'); - - // 1. count category items - $sql = 'SELECT '.$count_sql.' - FROM '.$table_name.' item_table - INNER JOIN '.TABLE_PREFIX.'CategoryItems ci ON (ci.ItemResourceId = item_table.ResourceId) - INNER JOIN '.TABLE_PREFIX.'Category c ON (ci.CategoryId = c.CategoryId)'; - - // 2. count items from subcategories - if ($category_id > 0) { - // get subcategories of required category - $tmp_sql = 'SELECT TreeLeft, TreeRight - FROM '.TABLE_PREFIX.'Category - WHERE CategoryId = '.$category_id; - $tree_info = $this->Conn->GetRow($tmp_sql); - $where_clauses[] = 'c.TreeLeft BETWEEN '.$tree_info['TreeLeft'].' AND '.$tree_info['TreeRight']; - } - $where_clauses[] = 'item_table.Status = '.STATUS_ACTIVE; - - if (isset($params['today']) && $params['today']) { - $today = adodb_mktime(0,0,0, adodb_date('m'), adodb_date('d'), adodb_date('Y')); - $where_clauses[] = 'item_table.CreatedOn >= '.$today; - } - - $sql .= ' WHERE ('.implode(') AND (', $where_clauses).')'; - - return (int)$this->Conn->GetOne($sql); - } - - /** - * Counts items (of specific type) from all categories - * - * @param string $prefix - * @param bool $today - * @return int - */ - function ItemCount($prefix, $today = false, $count_sql = null) - { - $table_name = $this->Application->getUnitOption($prefix, 'TableName'); - - if (!isset($count_sql)) { - $count_sql = 'COUNT(*)'; - } - - $sql = 'SELECT '.$count_sql.' - FROM '.$table_name.' item_table - INNER JOIN '.TABLE_PREFIX.'CategoryItems ci ON ci.ItemResourceId = item_table.ResourceId - INNER JOIN '.TABLE_PREFIX.'Category c ON c.CategoryId = ci.CategoryId - INNER JOIN '.TABLE_PREFIX.'PermCache perm_cache ON ci.CategoryId = perm_cache.CategoryId'; - - list ($view_perm, $view_filter) = $this->GetPermissionClause($prefix, 'perm_cache'); - $where_clauses = Array ( - $view_filter, 'perm_cache.PermId = '.$view_perm, 'ci.PrimaryCat = 1', 'c.Status = '.STATUS_ACTIVE, - ); - - if ($today) { - $today_date = adodb_mktime(0, 0, 0, adodb_date('m'), adodb_date('d'), adodb_date('Y')); - $where_clauses[] = 'item_table.CreatedOn >= '.$today_date; - } - - $sql .= ' WHERE ('.implode(') AND (', $where_clauses).')'; - - return (int)$this->Conn->GetOne($sql); - } - - /** - * Returns categories count in system - * - * @param bool $today - * @return int - */ - function CategoryCount($today = false) - { - $table_name = $this->Application->getUnitOption('c', 'TableName'); - - $sql = 'SELECT COUNT(*) - FROM '.$table_name.' c - INNER JOIN '.TABLE_PREFIX.'PermCache perm_cache ON c.CategoryId = perm_cache.CategoryId'; - - list ($view_perm, $view_filter) = $this->GetPermissionClause('c', 'perm_cache'); - $where_clauses = Array ( - $view_filter, 'perm_cache.PermId = '.$view_perm, 'c.Status = '.STATUS_ACTIVE, - ); - - if ($today) { - $today_date = adodb_mktime(0, 0, 0, adodb_date('m'), adodb_date('d'), adodb_date('Y')); - $where_clauses[] = 'c.CreatedOn >= '.$today_date; - } - - $sql .= ' WHERE ('.implode(') AND (', $where_clauses).')'; - - return $this->Conn->GetOne($sql); - } - - /** - * Returns permission limitation clause for category item lists - * - * @param string $prefix - * @param string $table_alias - * @return Array - */ - function GetPermissionClause($prefix, $table_alias) - { - $view_perm = $this->Application->getCache(__CLASS__ . __FUNCTION__, $prefix); - if ($view_perm === false) { - $sql = 'SELECT PermissionConfigId - FROM '.TABLE_PREFIX.'PermissionConfig - WHERE PermissionName = "'.$this->Application->getUnitOption($prefix, 'PermItemPrefix').'.VIEW"'; - $view_perm = $this->Conn->GetOne($sql); - - $this->Application->setCache(__CLASS__ . __FUNCTION__, $prefix, $view_perm); - } - - $groups = explode(',', $this->Application->RecallVar('UserGroups')); - foreach ($groups as $group) { - $view_filters[] = 'FIND_IN_SET('.$group.', '.$table_alias.'.acl)'; - } - - $view_filter = implode(' OR ', $view_filters); - - return Array ($view_perm, $view_filter); - } - - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/count_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.4.4.4 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/sections_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/sections_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/sections_helper.php (nonexistent) @@ -1,306 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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!'); - - /** - * Processes sections info from the configs - * - */ - class kSectionsHelper extends kHelper { - - /** - * Holds information about all sections - * - * @var Array - */ - var $Tree = Array(); - - /** - * Set's prefix and special - * - * @param string $prefix - * @param string $special - * @access public - */ - function Init($prefix, $special, $event_params = null) - { - parent::Init($prefix, $special, $event_params); - $this->BuildTree(); - } - - /** - * Builds xml for tree in left frame in admin - * - * @param Array $params - */ - function BuildTree() - { - if (!isset($this->Application->Memcached) || !($data = $this->Application->Memcached->get('master:sections_parsed'))) { - $data = $this->Conn->GetOne('SELECT Data FROM '.TABLE_PREFIX.'Cache WHERE VarName = "sections_parsed"'); - } - if ($data) { - $this->Tree = unserialize($data); - return ; - } - - if (!(defined('IS_INSTALL') && IS_INSTALL)) { - // don't reread all configs during install, because they are reread on every install step - $this->Application->UnitConfigReader->ReReadConfigs(); - } - - $this->Tree = Array (); - - // 1. build base tree (don't update parent with children list yet) - - // 1.1. process prefixes without priority - $prioritized_prefixes = Array (); - $prefixes = array_keys($this->Application->UnitConfigReader->configData); - - foreach ($prefixes as $prefix) { - $config =& $this->Application->UnitConfigReader->configData[$prefix]; - - if (array_key_exists('ConfigPriority', $config)) { - $prioritized_prefixes[$prefix] = $config['ConfigPriority']; - continue; - } - $this->_processPrefixSections($prefix); - } - - // 2. process prefixes with priority - asort($prioritized_prefixes); - foreach ($prioritized_prefixes as $prefix => $priority) { - $this->_processPrefixSections($prefix); - } - - // 2. apply section ajustments - foreach ($prefixes as $prefix) { - $config =& $this->Application->UnitConfigReader->configData[$prefix]; - $section_ajustments = getArrayValue($config, 'SectionAdjustments'); - if (!$section_ajustments) continue; - - foreach ($section_ajustments as $section_name => $ajustment_params) { - if (is_array($ajustment_params)) { - if (!array_key_exists($section_name, $this->Tree)) { - // don't process ajustments for non-existing sections - continue; - } - - $this->Tree[$section_name] = array_merge_recursive2($this->Tree[$section_name], $ajustment_params); - } - else { - // then remove section - unset($this->Tree[$section_name]); - } - } - } - - // 3. - foreach ($this->Tree as $section_name => $section_params) { - // 3.1. update parent -> children references - $parent_section = $section_params['parent']; - $section_order = "{$section_params['priority']}"; - - if (!isset($parent_section)) { - // don't process parent section of "in-portal:root" section - continue; - } - - if (!array_key_exists('children', $this->Tree[$parent_section])) { - $this->Tree[$parent_section]['children'] = Array (); - } - - if (array_key_exists($section_order, $this->Tree[$parent_section]['children'])) { - trigger_error( - 'Section "<strong>' . $section_name . '</strong>" has replaced section "<strong>' . - $this->Tree[$parent_section]['children'][$section_order] . - '</strong>" (parent section: "<strong>' . $parent_section . - '</strong>"; duplicate priority: <strong>' . $section_order . '</strong>)', - E_USER_WARNING - ); - } - - $this->Tree[$parent_section]['children'][$section_order] = $section_name; - - if ($section_params['type'] == stTAB) { - // if this is tab, then mark parent section as TabOnly - $this->Tree[$parent_section]['tabs_only'] = true; - } - - // 3.2. process icons here, because they also can be ajusted - if (isset($section_params['icon']) && preg_match('/([^:]+):(.*)/', $section_params['icon'], $regs)) { - $this->Tree[$section_name]['icon'] = $regs[2]; - $this->Tree[$section_name]['icon_module'] = $regs[1]; // set "icon_module" used in "combined_header" block - $module_folder = trim( $this->Application->findModule('Name', $regs[1], 'Path'), '/'); - if ($module_folder == '') { - $module_folder = 'core'; - } - } - else { - $module_folder = $this->Application->getUnitOption($section_params['SectionPrefix'], 'ModuleFolder'); - if (!array_key_exists('icon_module', $section_params)) { - $this->Tree[$section_name]['icon_module'] = $module_folder; // set "icon_module" used in "combined_header" block - } - } - - // this is to display HELP icon instead of missing one.. can be replaced with some other icon to draw attention - $icon_file = $module_folder.'/admin_templates/img/icons/icon24_'.$this->Tree[$section_name]['icon']; - - /*$core_file = FULL_PATH.'/core/admin_templates/img/icons/icon24_' . $this->Tree[$section_name]['icon'].'.gif'; - if ($module_folder != 'core' && file_exists($core_file) && file_exists(FULL_PATH.'/'.$icon_file.'.gif')) { - if (crc32(file_get_contents($core_file)) == crc32(file_get_contents(FULL_PATH.'/'.$icon_file.'.gif'))) { - trigger_error('Section "<strong>' . $section_name . '</strong>" uses icon copy from "Core" module', E_USER_NOTICE); - } - }*/ - - if (!file_exists(FULL_PATH.'/'.$icon_file.'.gif')) { - $this->Tree[$section_name]['icon'] = 'help'; - $this->Tree[$section_name]['icon_module'] = 'core'; - } - } - $this->Application->HandleEvent( new kEvent('adm:OnAfterBuildTree') ); - - if (isset($this->Application->Memcached)) { - $this->Application->Memcached->set('master:sections_parsed',serialize($this->Tree), 0, 0); - return; - } - - $this->Conn->Query('REPLACE '.TABLE_PREFIX.'Cache (VarName, Data, Cached) VALUES ("sections_parsed", '.$this->Conn->qstr(serialize($this->Tree)).', '.adodb_mktime().')'); - } - - function _processPrefixSections($prefix) - { - $config =& $this->Application->UnitConfigReader->configData[$prefix]; - $sections = getArrayValue($config, 'Sections'); - if (!$sections) { - return ; - } - -// echo 'Prefix: ['.$prefix.'] has ['.count($sections).'] sections<br />'; - - foreach ($sections as $section_name => $section_params) { - // we could also skip not allowed sections here in future - if ( isset($section_params['SectionPrefix']) ) { - $section_prefix = $section_params['SectionPrefix']; - } - elseif ( $this->Application->getUnitOption($prefix, 'SectionPrefix') ) { - $section_prefix = $this->Application->getUnitOption($prefix, 'SectionPrefix'); - } - else { - $section_prefix = $prefix; - } - $section_params['SectionPrefix'] = $section_prefix; - $section_params['url']['m_opener'] = 'r'; - $section_params['url']['no_pass_through'] = 1; - $pass_section = getArrayValue($section_params, 'url', 'pass_section'); - - if ($pass_section) { - unset($section_params['url']['pass_section']); - $section_params['url']['section'] = $section_name; - if (!isset($section_params['url']['module'])) { - $module_name = $this->Application->findModule('Path', $config['ModuleFolder'].'/', 'Name'); - $section_params['url']['module'] = $module_name; - } - } - - if (!isset($section_params['url']['t'])) { - $section_params['url']['t'] = 'index'; - } - - if (!isset($section_params['onclick'])) { - $section_params['onclick'] = 'checkEditMode()'; - } - - if (!isset($section_params['container'])) { - $section_params['container'] = 0; // for js tree printing to xml - } - - $current_data = isset($this->Tree[$section_name]) ? $this->Tree[$section_name] : Array(); - - if ($current_data) { - trigger_error('Section "<strong>' . $section_name . '</strong>" declaration (originally defined in "<strong>' . $current_data['SectionPrefix'] . '</strong>") was overwriten from "<strong>' . $prefix . '</strong>"', E_USER_NOTICE); - } - - $this->Tree[$section_name] = array_merge_recursive2($current_data, $section_params); - } - } - - /** - * Returns details information about section - * - * @param string $section_name - * @return Array - */ - function &getSectionData($section_name) - { - if (isset($this->Tree[$section_name])) { - $ret =& $this->Tree[$section_name]; - } - else { - $ret = Array(); - } - return $ret; - } - - /** - * Returns first child, that is not a folder - * - * @param string $section_name - * @param Array $tree - * @return stirng - */ - function getFirstChild($section_name, $check_permission = false) - { - $section_data =& $this->getSectionData($section_name); - - $children = isset($section_data['children']) && $section_data['children'] ? $section_data['children'] : false; - if ($children) { - // get 1st child - ksort($children, SORT_NUMERIC); - foreach ($children as $child_priority => $child_section) { - $section_data =& $this->getSectionData($child_section); - - $perm_section = $this->getPermSection($child_section); - $perm_status = $check_permission ? $this->Application->CheckPermission($perm_section.'.view') : true; - if ((isset($section_data['show_mode']) && $section_data['show_mode']) || !$perm_status) { - continue; - } - - break; - } - - return $this->getFirstChild($child_section, $check_permission); - } - - return $section_name; - } - - /** - * Returns section for permission checking based on given section - * - * @param string $section_name - * @return string - */ - function getPermSection($section_name) - { - $ret = $section_name; - $section_data =& $this->getSectionData($section_name); - - if ($section_data && isset($section_data['perm_prefix'])) { - // this section uses other section permissions - $ret = $this->Application->getUnitOption($section_data['perm_prefix'].'.main', 'PermSection'); - } - return $ret; - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/sections_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.12.2.11 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/filenames_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/filenames_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/filenames_helper.php (nonexistent) @@ -1,158 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 kFilenamesHelper extends kHelper { - - /** - * Character, that should replace disallowed symbols in filename - * - * @var string - */ - var $_escapeChar = '_'; - - /** - * Sequences, that should be replaced with mathing sequences from _filenameReplaceTo property - * - * @var Array - */ - var $_filenameReplaceFrom = Array (); - - /** - * Sequences, that will replace matching sequences from _filenameReplaceFrom property - * - * @var Array - */ - var $_filenameReplaceTo = Array (); - - - function kFilenamesHelper() - { - parent::kHelper(); - - $this->_escapeChar = $this->Application->ConfigValue('FilenameSpecialCharReplacement'); - - $language =& $this->Application->recallObject('lang.current'); - /* @var $language kDBItem */ - - $replacements = $language->GetDBField('FilenameReplacements'); - if ($replacements) { - $replacements = explode("\r\n", $replacements); - foreach ($replacements as $replacement) { - list ($replace_from, $replace_to) = explode('=', $replacement); - $this->_filenameReplaceFrom[] = trim($replace_from); - $this->_filenameReplaceTo[] = trim($replace_to); - } - } - } - - function replaceSequences($filename) - { - $not_allowed = Array ( - ' ', '\\', '/', ':', '*', '?', '"', '<', '>', '|', '`', - '~', '!', '@', '#', '$', '%', '^', '&', '(', ')', '~', - '+', '=', '-', '{', '}', ']', '[', "'", ';', '.', ',', "\r", "\n" - ); - - if ($this->_filenameReplaceFrom) { - // replace predefined sequences - $filename = str_replace($this->_filenameReplaceFrom, $this->_filenameReplaceTo, $filename); - } - - $filename = str_replace($not_allowed, $this->_escapeChar, $filename); - $filename = preg_replace('/(' . $this->_escapeChar . '+)/', $this->_escapeChar, $filename); - return trim($filename, $this->_escapeChar); // remove trailing escape chars - } - - /** - * replace not allowed symbols with "_" chars + remove duplicate "_" chars in result - * - * @param string $string - * @return string - */ - function stripDisallowed($table, $id_field, $item_id, $filename) - { - $filename = $this->replaceSequences($filename); - - return $this->checkAutoFilename($table, $id_field, $item_id, $filename); - } - - function checkAutoFilename($table, $id_field, $item_id, $filename) - { - if(!$filename) return $filename; - - $item_id = !$item_id ? 0 : $item_id; - - if ($table == TABLE_PREFIX.'CategoryItems') { - $item_categories_cur = $this->Conn->GetCol('SELECT CategoryId FROM '.$table.' WHERE ItemResourceId = '.$item_id); - $item_categories_live = $this->Application->IsTempTable($table) ? $this->Conn->GetCol('SELECT CategoryId FROM '.$this->Application->GetLiveName($table).' WHERE ItemResourceId = '.$item_id) : array(); - - $item_categories = array_unique(array_merge($item_categories_cur, $item_categories_live)); - if (!$item_categories) { - $item_categories = array($this->Application->GetVar('m_cat_id')); // this may happen when creating new item - } - $cat_filter = ' AND CategoryId IN ('.implode(',', $item_categories).')'; - } - else { - $cat_filter = ''; - } - - // check current table (temp or live) - $sql_temp = 'SELECT '.$id_field.' FROM '.$table.' WHERE Filename = '.$this->Conn->qstr($filename).$cat_filter; - $found_temp_ids = $this->Conn->GetCol($sql_temp); - - // check live table if current is temp - if ( $this->Application->IsTempTable($table) ) { - $sql_live = 'SELECT '.$id_field.' FROM '.$this->Application->GetLiveName($table).' WHERE Filename = '.$this->Conn->qstr($filename).$cat_filter; - $found_live_ids = $this->Conn->GetCol($sql_live); - } - else { - $found_live_ids = array(); - } - - $found_item_ids = array_unique( array_merge($found_temp_ids, $found_live_ids) ); - - $has_page = preg_match('/(.*)_([\d]+)([a-z]*)$/', $filename, $rets); - - $duplicates_found = (count($found_item_ids) > 1) || ($found_item_ids && $found_item_ids[0] != $item_id); - if ($duplicates_found || $has_page) // other category has same filename as ours OR we have filename, that ends with _number - { - $append = $duplicates_found ? '_a' : ''; - if($has_page) - { - $filename = $rets[1].'_'.$rets[2]; - $append = $rets[3] ? $rets[3] : '_a'; - } - - // check live & temp table - $sql_cur = 'SELECT '.$id_field.' FROM '.$table.' WHERE (Filename = %s) AND ('.$id_field.' != '.$item_id.')'.$cat_filter; - $sql_live = $this->Application->IsTempTable($table) ? 'SELECT '.$id_field.' FROM '.$this->Application->GetLiveName($table).' WHERE (Filename = %s) AND ('.$id_field.' != '.$item_id.')'.$cat_filter : false; - while ( $this->Conn->GetOne( sprintf($sql_cur, $this->Conn->qstr($filename.$append)) ) > 0 || - ( $sql_live - && - ( $this->Conn->GetOne( sprintf($sql_live, $this->Conn->qstr($filename.$append)) ) > 0 ) - ) - ) - { - if (mb_substr($append, -1) == 'z') $append .= 'a'; - $append = mb_substr($append, 0, mb_strlen($append) - 1) . chr( ord( mb_substr($append, -1) ) + 1 ); - } - - return $filename.$append; - } - - return $filename; - } -} \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/filenames_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.3.2.2 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/skin_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/skin_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/skin_helper.php (nonexistent) @@ -1,208 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 SkinHelper extends kHelper { - - /** - * Allows to read some skin fields and build link to admin skin file. - * Will automatically compile skin file, when missing. - * - * @param Array $params - * @return string - */ - function AdminSkinTag($params) - { - if (array_key_exists('type', $params)) { - // returns given field of skin - return $this->_getStyleField( $params['type'] ); - } - - $style_info = $this->_getStyleInfo(); - - if (file_exists( $this->getSkinPath() )) { - // returns last compiled skin - $ret = $this->getSkinPath(true); - } - else { - // search for previously compiled skin - $last_compiled = $this->_getLastCompiled( mb_strtolower($style_info['Name']) ); - if ($last_compiled) { - // found - $ret = $this->getSkinPath(true, $last_compiled); - } - else { - // not found (try to compile on the fly) - $skin =& $this->Application->recallObject('skin.-item', null, Array ('skip_autoload' => true)); - /* @var $skin kDBItem */ - - $skin->Load(1, 'IsPrimary'); - $last_compiled = $this->compile($skin); - $ret = $last_compiled ? $this->getSkinPath(true, $last_compiled) : ''; - } - } - - if (array_key_exists('file_only', $params) && $params['file_only']) { - return $ret; - } - - return '<link rel="stylesheet" rev="stylesheet" href="' . $ret . '" type="text/css" media="screen"/>'; - } - - /** - * Compiles given skin object - * - * @param kDBItem $object - */ - function compile(&$object) - { - $ret = $object->GetDBField('CSS'); - $options = $object->GetDBField('Options'); - $options = unserialize($options); - $options['base_url'] = Array ('Value' => rtrim($this->Application->BaseURL(), '/')); - - foreach ($options as $key => $row) { - $ret = str_replace('@@' . $key . '@@', $row['Value'], $ret); - } - - $compile_ts = adodb_mktime(); - $css_file = $this->_getStylesheetPath() . DIRECTORY_SEPARATOR . 'admin-' . mb_strtolower($object->GetDBField('Name')) . '-' . $compile_ts . '.css'; - - $fp = fopen($css_file, 'w'); - if (!$fp) { - return false; - } - - $prev_css = $this->_getStylesheetPath() . '/admin-' . mb_strtolower($object->GetDBField('Name')) . '-' . $object->GetDBField('LastCompiled') . '.css'; - if (file_exists($prev_css)) { - unlink($prev_css); - } - - fwrite($fp, $ret); - fclose($fp); - - $sql = 'UPDATE ' . $object->TableName . ' - SET LastCompiled = ' . $compile_ts . ' - WHERE ' . $object->IDField . ' = ' . $object->GetID(); - $this->Conn->Query($sql); - - return $compile_ts; - } - - /** - * Returns fields of primary admin skin - * - * @return Array - */ - function _getStyleInfo() - { - static $style = null; - - if (!isset($style)) { - $sql = 'SELECT * - FROM ' . TABLE_PREFIX . 'Skins - WHERE IsPrimary = 1'; - $style = $this->Conn->GetRow($sql); - } - - return $style; - } - - /** - * Returns requested field value of primary admin skin - * - * @param string $field - * @return string - */ - function _getStyleField($field) - { - if ($field == 'logo') { - // old style method of calling - $field = 'Logo'; - } - - $style_info = $this->_getStyleInfo(); - - if (!$style_info[$field]) { - return ''; - } - - $image_fields = Array ('Logo', 'LogoBottom', 'LogoLogin'); - if (in_array($field, $image_fields)) { - return $this->_getStylesheetPath(true) . '/' . $style_info[$field]; - } - - return $style_info[$field]; - } - - /** - * Returns path, where compiled skin and it's image files are stored - * - * @param bool $url - * @return string - */ - function _getStylesheetPath($url = false) - { - if ($url) { - return $this->Application->BaseURL( str_replace(DIRECTORY_SEPARATOR, '/', WRITEBALE_BASE) ) . 'user_files'; - } - - return WRITEABLE . DIRECTORY_SEPARATOR . 'user_files'; - } - - /** - * Returns full path to primary admin skin using given or last compiled date - * - * @param unknown_type $url - * @param unknown_type $compile_date - * @return unknown - */ - function getSkinPath($url = false, $compile_date = null) - { - $style_info = $this->_getStyleInfo(); - - if (!isset($compile_date)) { - $compile_date = $style_info['LastCompiled']; - } - - $style_name = 'admin-' . mb_strtolower($style_info['Name']) . '-' . $compile_date . '.css'; - - return $this->_getStylesheetPath($url) . ($url ? '/' : DIRECTORY_SEPARATOR) . $style_name; - } - - /** - * Returns maximal compilation date for given skin name - * - * @param string $style_name - * @return int - */ - function _getLastCompiled($style_name) - { - $last_compiled = 0; - $dh = dir($this->_getStylesheetPath() . DIRECTORY_SEPARATOR); - - while (false !== ($file = $dh->read())) { - if ( preg_match('/admin-(.*)-([\d]+).css/', $file, $rets) ) { - if ($rets[1] == $style_name && $rets[2] > $last_compiled) { - $last_compiled = $rets[2]; - } - } - } - - $dh->close(); - - return $last_compiled; - } - } \ No newline at end of file Index: branches/5.0.x/core/units/general/helpers/search_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/search_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/search_helper.php (nonexistent) @@ -1,706 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 kSearchHelper extends kHelper { - - - /** - * Splits search phrase into keyword using quotes,plus and minus sings and spaces as split criteria - * - * @param string $keyword - * @return string - */ - function splitKeyword($keyword) - { - if ($this->Application->ConfigValue('CheckStopWords')) { - $keyword_after_remove = $this->_removeStopWords($keyword); - if ($keyword_after_remove) { - // allow to search through stop word grid - $keyword = $keyword_after_remove; - } - } - - $quotes_re = '/([+\-]?)"(.*?)"/'; - $no_quotes_re = '/([+\-]?)([^ ]+)/'; - - $quoted_kw = preg_match_all($quotes_re, $keyword, $res); - foreach ($res[2] as $index => $kw) $final[$kw] = $res[1][$index]; - $keyword = preg_replace($quotes_re, '', $keyword); - $not_quoted_kw = preg_match_all($no_quotes_re, $keyword, $res); - foreach ($res[2] as $index => $kw) $final[$kw] = $res[1][$index]; - - return $final; - } - - function getPositiveKeywords($keyword) - { - $keywords = $this->splitKeyword($keyword); - - $ret = Array(); - foreach ($keywords as $keyword => $sign) { - if ($sign == '+' || $sign == '') { - $ret[] = $keyword; - } - } - return $ret; - } - - function buildWhereClause($keyword, $fields) - { - $keywords = $this->splitKeyword($keyword); - - $normal_conditions = Array(); - $plus_conditions = Array(); - $minus_conditions = Array(); - - foreach ($keywords as $keyword => $sign) { - switch ($sign) { - case '+': - $plus_conditions[] = implode(' LIKE "%'.$keyword.'%" OR ', $fields).' LIKE "%'.$keyword.'%"'; - break; - - case '-': - foreach ($fields as $field) { - $condition[] = $field.' NOT LIKE "%'.$keyword.'%" OR '.$field.' IS NULL'; - } - $minus_conditions[] = '('.implode(') AND (', $condition).')'; - break; - - case '': - $keyword = str_replace('"', '\"', $keyword); - $normal_conditions[] = implode(' LIKE "%'.$keyword.'%" OR ', $fields).' LIKE "%'.$keyword.'%"'; - break; - } - } - - // building where clause - if ($normal_conditions) { - $where_clause = '('.implode(') OR (', $normal_conditions).')'; - } - else { - $where_clause = '1'; - } - - if ($plus_conditions) { - $where_clause = '('.$where_clause.') AND ('.implode(') AND (', $plus_conditions).')'; - } - - if ($minus_conditions) { - $where_clause = '('.$where_clause.') AND ('.implode(') AND (', $minus_conditions).')'; - } - - return $where_clause; - } - - /** - * Returns additional information about search field - * - * @param kDBList $object - * @param string $field_name - * @return Array - */ - function _getFieldInformation(&$object, $field_name) - { - $sql_filter_type = isset($object->VirtualFields[$field_name]) ? 'having' : 'where'; - $field_type = isset($object->Fields[$field_name]['type']) ? $object->Fields[$field_name]['type'] : 'string'; - - if (preg_match('/(.*)\.(.*)/', $field_name, $regs)) { - $table_name = '`'.$regs[1].'`.'; // field from external table - $field_name = $regs[2]; - } - elseif ($sql_filter_type == 'where') { - $table_name = '`'.$object->TableName.'`.'; // field from local table - } - - $table_name = ($sql_filter_type == 'where') ? $table_name : ''; - - // replace wid inside table name to WID_MARK constant value - $is_temp_table = preg_match('/(.*)'.TABLE_PREFIX.'ses_'.$this->Application->GetSID().'(_[\d]+){0,1}_edit_(.*)/', $table_name, $regs); - if ($is_temp_table) { - $table_name = $regs[1].TABLE_PREFIX.'ses_'.EDIT_MARK.'_edit_'.$regs[3]; // edit_mark will be replaced with sid[_main_wid] in AddFilters - } - - return Array ($field_name, $field_type, $table_name, $sql_filter_type); - } - - /** - * Removes stop words from keyword - * - * @param string $keyword - * @return string - */ - function _removeStopWords($keyword) - { - static $stop_words = Array (); - - if (!$stop_words) { - $sql = 'SELECT StopWord - FROM ' . $this->Application->getUnitOption('stop-word', 'TableName') . ' - ORDER BY LENGTH(StopWord) DESC, StopWord ASC'; - $stop_words = $this->Conn->GetCol($sql); - - foreach ($stop_words as $index => $stop_word) { - $stop_words[$index] = '/(^| )' . preg_quote($stop_word, '/') . '( |$)/'; - } - } - - $keyword = preg_replace($stop_words, ' ', $keyword); - - return trim( preg_replace('/[ ]+/', ' ', $keyword) ); - } - - /** - * Enter description here... - * - * @param kEvent $event - */ - function performSearch(&$event) - { - $object =& $event->getObject(); - - // process search keyword - $search_keyword = $this->Application->GetVar( $event->getPrefixSpecial(true).'_search_keyword'); - $this->Application->StoreVar( $event->getPrefixSpecial().'_search_keyword', $search_keyword); - $search_keyword = str_replace('*', '%', $search_keyword); - - $custom_filter = $this->processCustomFilters($event); - - if(!$search_keyword && $custom_filter === false) { - $this->resetSearch($event); - return true; - } - - if ($search_keyword) { - $this->processAutomaticFilters($event, $search_keyword, $custom_filter); - } - } - - - function processAutomaticFilters(&$event, $search_keyword, $custom_filter) - { - $grid_name = $this->Application->GetVar('grid_name'); - $grids = $this->Application->getUnitOption($event->Prefix, 'Grids'); - $search_fields = array_keys($grids[$grid_name]['Fields']); - - $search_filter = Array(); - $object =& $event->getObject(); - - foreach ($search_fields as $search_field) { - $custom_search = isset($custom_filter[$search_field]); - - $filter_data = $this->getSearchClause($object, $search_field, $search_keyword, $custom_search); - - if ($filter_data) { - $search_filter[$search_field] = $filter_data; - } - else { - unset($search_filter[$search_field]); - } - } - $this->Application->StoreVar($event->getPrefixSpecial().'_search_filter', serialize($search_filter) ); - } - - /** - * Returns search clause for any particular field - * - * @param kDBList $object - * @param string $search_field - * @param string $search_keyword what we are searching (false, when building custom filter clause) - * @param string $custom_search already found using custom filter - * @return Array - */ - function getSearchClause(&$object, $field_name, $search_keyword, $custom_search) - { - if (array_key_exists($field_name, $object->VirtualFields) && !array_key_exists($field_name, $object->CalculatedFields)) { - // Virtual field, that is shown in grid, but it doesn't have corresponding calculated field. - // Happens, when field value is calculated on the fly (during grid display) and it is not searchable. - return ''; - } - - $search_keywords = $this->splitKeyword($search_keyword); - - list ($field_name, $field_type, $table_name, $sql_filter_type) = $this->_getFieldInformation($object, $field_name); - - $filter_value = ''; - - // get field clause by formatter name and/or parameters - $formatter = getArrayValue($object->Fields[$field_name], 'formatter'); - switch ($formatter) { - case 'kOptionsFormatter': - $search_keys = Array(); - - if ($custom_search === false) { - // if keywords passed through simple search filter (on each grid) - $use_phrases = getArrayValue($object->Fields[$field_name], 'use_phrases'); - $field_options = $object->GetFieldOptions($field_name); - $multiple = array_key_exists('multiple', $field_options) && $field_options['multiple']; - - foreach ($field_options['options'] as $key => $val) { - foreach ($search_keywords as $keyword => $sign) { - $pattern = '#'.$keyword.'#i'; - if (!preg_match($pattern, $use_phrases ? $this->Application->Phrase($val) : $val)) { - if ($sign == '+') { - $filter_value = $table_name.'`'.$field_name.'` = NULL'; - break; - } - else { - continue; - } - } - - if ($sign == '+' || $sign == '') { - // don't add single quotes to found option ids when multiselect (but escape string anyway) - $search_keys[$key] = $multiple ? mysql_real_escape_string($key) : $this->Conn->qstr($key); - } - elseif($sign == '-') { - // if same value if found as exclusive too, then remove from search result - unset($search_keys[$key]); - } - } - } - } - - if ($search_keys) { - if ($multiple) { - $filter_value = $table_name.'`'.$field_name.'` LIKE "%|' . implode('|%" OR ' . $table_name.'`'.$field_name.'` LIKE "%|', $search_keys) . '|%"'; - } - else { - $filter_value = $table_name.'`'.$field_name.'` IN ('.implode(',', $search_keys).')'; - } - } - - $field_processed = true; - break; - - case 'kDateFormatter': - // if date is searched using direct filter, then do nothing here, otherwise search using LIKE clause - $field_processed = ($custom_search !== false) ? true : false; - break; - - default: - $field_processed = false; - break; - } - - // if not already processed by formatter, then get clause by field type - if (!$field_processed && $search_keywords) { - switch($field_type) - { - case 'int': - case 'integer': - case 'numeric': - $search_keys = Array(); - foreach ($search_keywords as $keyword => $sign) { - if (!is_numeric($keyword) || ($sign == '-')) continue; - $search_keys[] = $this->Conn->qstr($keyword); - } - - if ($search_keys) { - $filter_value = $table_name.'`'.$field_name.'` IN ('.implode(',', $search_keys).')'; - } - break; - - case 'double': - case 'float': - case 'real': - $search_keys = Array(); - foreach ($search_keywords as $keyword => $sign) { - $keyword = str_replace(',', '.', $keyword); - if (!is_numeric($keyword) || ($sign == '-')) continue; - $search_keys[] = 'ABS('.$table_name.'`'.$field_name.'` - '.$this->Conn->qstr($keyword).') <= 0.0001'; - } - - if ($search_keys) { - $filter_value = '('.implode(') OR (', $search_keys).')'; - } - break; - - case 'string': - $filter_value = $this->buildWhereClause($search_keyword, Array($table_name.'`'.$field_name.'`')); - break; - } - } - - if ($filter_value) { - return Array('type' => $sql_filter_type, 'value' => $filter_value); - } - - return false; - } - - /** - * Processes custom filters from submit - * - * @param KEvent $event - * @return bool - */ - function processCustomFilters(&$event) - { - $grid_name = $this->Application->GetVar('grid_name'); - - // update "custom filter" with values from submit: begin - $view_name = $this->Application->RecallVar($event->getPrefixSpecial().'_current_view'); - $custom_filters = $this->Application->RecallPersistentVar($event->getPrefixSpecial().'_custom_filter.'.$view_name/*, ALLOW_DEFAULT_SETTINGS*/); - if ($custom_filters) { - $custom_filters = unserialize($custom_filters); - $custom_filter = isset($custom_filters[$grid_name]) ? $custom_filters[$grid_name] : Array (); - } - else { - $custom_filter = Array (); - } - - // submit format custom_filters[prefix_special][field] - $submit_filters = $this->Application->GetVar('custom_filters'); - if ($submit_filters) { - $submit_filters = getArrayValue($submit_filters, $event->getPrefixSpecial(), $grid_name); - if ($submit_filters) { - foreach ($submit_filters as $field_name => $field_options) { - list ($filter_type, $field_value) = each($field_options); - $is_empty = strlen(is_array($field_value) ? implode('', $field_value) : $field_value) == 0; - if ($is_empty) { - if (isset($custom_filter[$field_name])) { - // use isset, because non-existing key will cause "php notice"! - unset($custom_filter[$field_name][$filter_type]); // remove filter - - if (!$custom_filter[$field_name]) { - // if no filters left for field, then delete record at all - unset($custom_filter[$field_name]); - } - } - } - else { - $custom_filter[$field_name][$filter_type]['submit_value'] = $field_value; - } - } - } - } - - if ($custom_filter) { - $custom_filters[$grid_name] = $custom_filter; - } - else { - unset($custom_filters[$grid_name]); - } - // update "custom filter" with values from submit: end - - if (!$custom_filter) { - // in case when no filters specified, there are nothing to process - $this->Application->StorePersistentVar($event->getPrefixSpecial().'_custom_filter.'.$view_name, serialize($custom_filters) ); - return false; - } - - $object =& $event->getObject(); // don't recall it each time in getCustomFilterSearchClause - $grid_info = $this->Application->getUnitOption($event->Prefix.'.'.$grid_name, 'Grids'); - foreach ($custom_filter as $field_name => $field_options) { - list ($filter_type, $field_options) = each($field_options); - $field_options['grid_options'] = $grid_info['Fields'][$field_name]; - $field_options = $this->getCustomFilterSearchClause($object, $field_name, $filter_type, $field_options); - if ($field_options['value']) { - unset($field_options['grid_options']); - $custom_filter[$field_name][$filter_type] = $field_options; - } - } - - $custom_filters[$grid_name] = $custom_filter; - $this->Application->StorePersistentVar($event->getPrefixSpecial().'_custom_filter.'.$view_name, serialize($custom_filters) ); - return $custom_filter; - } - - /** - * Checks, that range filters "To" part is defined for given grid - * - * @param string $prefix_special - * @param string $grid_name - * @return bool - */ - function rangeFiltersUsed($prefix_special, $grid_name) - { - static $cache = Array (); - $cache_key = $prefix_special . $grid_name; - - if (array_key_exists($cache_key, $cache)) { - return $cache[$cache_key]; - } - - $view_name = $this->Application->RecallVar($prefix_special . '_current_view'); - $custom_filters = $this->Application->RecallPersistentVar($prefix_special . '_custom_filter.' . $view_name/*, ALLOW_DEFAULT_SETTINGS*/); - if (!$custom_filters) { - // filters not defined for given prefix - $cache[$cache_key] = false; - return false; - } - - $custom_filters = unserialize($custom_filters); - if (!array_key_exists($grid_name, $custom_filters)) { - // filters not defined for given grid - $cache[$cache_key] = false; - return false; - } - - $range_filter_defined = false; - - $custom_filter = $custom_filters[$grid_name]; - foreach ($custom_filter as $field_name => $field_options) { - list ($filter_type, $field_options) = each($field_options); - - if (strpos($filter_type, 'range') === false) { - continue; - } - - $to_value = (string)$field_options['submit_value']['to']; - if ($to_value !== '') { - $range_filter_defined = true; - break; - } - } - - $cache[$cache_key] = $range_filter_defined; - return $range_filter_defined; - } - - /** - * Return numeric range filter value + checking that it's number - * - * @param Array $value array containing range filter value - * @return unknown - */ - function getRangeValue($value) - { - return strlen($value) && is_numeric($value) ? $this->Conn->qstr($value) : false; - } - - function getCustomFilterSearchClause(&$object, $field_name, $filter_type, $field_options) - { - // this is usually used for mutlilingual fields and date fields - if (isset($field_options['grid_options']['sort_field'])) { - $field_name = $field_options['grid_options']['sort_field']; - } - list ($field_name, $field_type, $table_name, $sql_filter_type) = $this->_getFieldInformation($object, $field_name); - - $filter_value = ''; - - switch ($filter_type) { - case 'range': - $from = $this->getRangeValue($field_options['submit_value']['from']); - $to = $this->getRangeValue($field_options['submit_value']['to']); - - if ($from !== false && $to !== false) { - // add range filter - $filter_value = $table_name.'`'.$field_name.'` >= '.$from.' AND '.$table_name.'`'.$field_name.'` <= '.$to; - } - elseif ($from !== false) { - // add equals filter on $from - $filter_value = $table_name.'`'.$field_name.'` = '.$from; - } - elseif ($to !== false) { - // add equals filter on $to - $filter_value = $table_name.'`'.$field_name.'` = '.$to; - } - break; - - case 'float_range': - // MySQL can't compare values in "float" type columns using "=" operator - $from = $this->getRangeValue($field_options['submit_value']['from']); - $to = $this->getRangeValue($field_options['submit_value']['to']); - - if ($from !== false && $to !== false) { - // add range filter - $filter_value = $table_name.'`'.$field_name.'` >= '.$from.' AND '.$table_name.'`'.$field_name.'` <= '.$to; - } - elseif ($from !== false) { - // add equals filter on $from - $filter_value = 'ABS('.$table_name.'`'.$field_name.'` - '.$from.') <= 0.0001'; - } - elseif ($to !== false) { - // add equals filter on $to - $filter_value = 'ABS('.$table_name.'`'.$field_name.'` - '.$to.') <= 0.0001'; - } - break; - - case 'date_range': - $from = $this->processRangeField($object, $field_name, $field_options['submit_value'], 'from'); - $to = $this->processRangeField($object, $field_name, $field_options['submit_value'], 'to'); - - $day_seconds = 23 * 60 * 60 + 59 * 60 + 59; - if ($from !== false && $to === false) { - $from = strtotime(date('Y-m-d', $from) . ' 00:00:00', $from); // reset to morning - $to = $from + $day_seconds; - } - elseif ($from === false && $to !== false) { - $to = strtotime(date('Y-m-d', $to) . ' 23:59:59', $to); // reset to evening - $from = $to - $day_seconds; - } - - if ($from !== false && $to !== false) { - $filter_value = $table_name.'`'.$field_name.'` >= '.$from.' AND '.$table_name.'`'.$field_name.'` <= '.$to; - } - break; - - case 'equals': - case 'options': - $field_value = strlen($field_options['submit_value']) ? $this->Conn->qstr($field_options['submit_value']) : false; - if ($field_value) { - $filter_value = $table_name.'`'.$field_name.'` = '.$field_value; - } - break; - - case 'picker': - $field_value = strlen($field_options['submit_value']) ? $field_options['submit_value'] : false; - if ($field_value) { - $filter_value = $table_name.'`'.$field_name.'` LIKE "%|'.$field_value.'|%"'; - } - break; - - case 'like': - $filter_value = $this->buildWhereClause($field_options['submit_value'], Array($table_name.'`'.$field_name.'`')); - break; - - default: - break; - } - - $field_options['sql_filter_type'] = $sql_filter_type; - $field_options['value'] = $filter_value; - - return $field_options; - } - - /** - * Enter description here... - * - * @param kdbItem $object - * @param string $search_field - * @param string $value - * @param string $type - */ - function processRangeField(&$object, $search_field, $value, $type) - { - if (!strlen($value[$type])) { - return false; - } - - $options = $object->GetFieldOptions($search_field); - $dt_separator = array_key_exists('date_time_separator', $options) ? $options['date_time_separator'] : ' '; - $value[$type] = trim($value[$type], $dt_separator); // trim any - - $tmp_value = explode($dt_separator, $value[$type], 2); - if (count($tmp_value) == 1) { - $time_format = $this->_getInputTimeFormat($options); - if ($time_format) { - // time is missing, but time format available -> guess time and add to date - $time = ($type == 'from') ? adodb_mktime(0, 0, 0) : adodb_mktime(23, 59, 59); - $time = adodb_date($time_format, $time); - $value[$type] .= $dt_separator . $time; - } - } - - $formatter =& $this->Application->recallObject($object->Fields[$search_field]['formatter']); - - $value_ts = $formatter->Parse($value[$type], $search_field, $object); - $pseudo = getArrayValue($object->FieldErrors, $search_field, 'pseudo'); - if ($pseudo) { - unset($object->FieldErrors[$search_field]); // remove error! - // invalid format -> ignore this date in search - return false; - } - return $value_ts; - } - - /** - * Returns InputTimeFormat using given field options - * - * @param Array $field_options - * @return string - */ - function _getInputTimeFormat($field_options) - { - if (array_key_exists('input_time_format', $field_options)) { - return $field_options['input_time_format']; - } - - $lang_current =& $this->Application->recallObject('lang.current'); - return $lang_current->GetDBField('InputTimeFormat'); - } - - /** - * Resets current search - * - * @param kEvent $event - */ - function resetSearch(&$event) - { - $this->Application->RemoveVar($event->getPrefixSpecial().'_search_filter'); - $this->Application->RemoveVar($event->getPrefixSpecial().'_search_keyword'); - - $view_name = $this->Application->RecallVar($event->getPrefixSpecial().'_current_view'); - $this->Application->RemovePersistentVar($event->getPrefixSpecial().'_custom_filter.'.$view_name); - } - - /** - * Creates filters based on "types" & "except" parameters from PrintList - * - * @param kEvent $event - * @param Array $type_clauses - * @param string $types - * @param string $except_types - */ - function SetComplexFilter(&$event, &$type_clauses, $types, $except_types) - { - $includes_or_filter =& $this->Application->makeClass('kMultipleFilter', FLT_TYPE_OR); - $excepts_and_filter =& $this->Application->makeClass('kMultipleFilter', FLT_TYPE_AND); - - $includes_or_filter_h =& $this->Application->makeClass('kMultipleFilter', FLT_TYPE_OR); - $excepts_and_filter_h =& $this->Application->makeClass('kMultipleFilter', FLT_TYPE_AND); - - if ($types) { - $types = explode(',', $types); - foreach ($types as $type) { - $type = trim($type); - - if (isset($type_clauses[$type])) { - if ($type_clauses[$type]['having_filter']) { - $includes_or_filter_h->addFilter('filter_'.$type, $type_clauses[$type]['include']); - } else { - $includes_or_filter->addFilter('filter_'.$type, $type_clauses[$type]['include']); - } - } - } - } - - if ($except_types) { - $except_types = explode(',', $except_types); - foreach ($except_types as $type) { - $type = trim($type); - - if (isset($type_clauses[$type])) { - if ($type_clauses[$type]['having_filter']) { - $excepts_and_filter_h->addFilter('filter_'.$type, $type_clauses[$type]['except']); - } else { - $excepts_and_filter->addFilter('filter_'.$type, $type_clauses[$type]['except']); - } - } - } - } - - $object =& $event->getObject(); - - $object->addFilter('includes_filter', $includes_or_filter); - $object->addFilter('excepts_filter', $excepts_and_filter); - - $object->addFilter('includes_filter_h', $includes_or_filter_h, HAVING_FILTER); - $object->addFilter('excepts_filter_h', $excepts_and_filter_h, HAVING_FILTER); - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/search_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.10.2.8 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/modules.php =================================================================== --- branches/5.0.x/core/units/general/helpers/modules.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/modules.php (nonexistent) @@ -1,435 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 kModulesHelper extends kHelper { - - function getWhereClause() - { - $where_clause = Array('Loaded = 1'); - - if (!$this->Application->IsAdmin()) return implode(' AND ', $where_clause); - - $modules = $this->_GetModules(); - if ($modules) { - foreach ($modules as $module_index => $module) { - $modules[$module_index] = $this->Conn->qstr($module); - } - $where_clause[] = 'Name IN ('.implode(',', $modules).')'; - } - - return implode(' AND ', $where_clause); - } - - function _EnableCookieSID() - { - $session =& $this->Application->recallObject('Session'); - return $session->CookiesEnabled; - } - - function _IsSpider($UserAgent) - { - global $robots; - $lines = file(FULL_PATH.'/robots_list.txt'); - - if (!is_array($robots)) { - $robots = Array(); - for($i = 0; $i < count($lines); $i++) { - $l = $lines[$i]; - $p = explode("\t", $l, 3); - $robots[] = $p[2]; - } - } - return in_array($UserAgent, $robots); - } - - function _MatchIp($ip1, $ip2) - { - $matched = TRUE; - - $ip = explode('.', $ip1); - $MatchIp = explode('.', $ip2); - for ($i = 0; $i < count($ip); $i++) { - if($i == count($MatchIp)) break; - if (trim($ip[$i]) != trim($MatchIp[$i]) || trim($ip[$i]) == '*') { - $matched = FALSE; - break; - } - } - return $matched; - } - - function _IpAccess($IpAddress, $AllowList, $DenyList) - { - $allowed = explode(',', $AllowList); - $denied = explode(',', $DenyList); - - $MatchAllowed = FALSE; - for ($x = 0; $x < count($allowed); $x++) { - $ip = explode('.', $allowed[$x]); - - $MatchAllowed = $this->_MatchIp($IpAddress, $allowed[$x]); - if ($MatchAllowed) - break; - } - $MatchDenied = FALSE; - for ($x = 0; $x < count($denied); $x++) { - $ip = explode('.', $denied[$x]); - - $MatchDenied = $this->_MatchIp($IpAddress, $denied[$x]); - if ($MatchDenied) - break; - } - - $Result = (($MatchAllowed && !$MatchDenied) || (!$MatchAllowed && !$MatchDenied) || - ($MatchAllowed && $MatchDenied)); - return $Result; - } - - /** - * Leaves only domain part from hostname (e.g. extract "intechnic.lv" from "test.intechnic.lv") - * Used for admin login license check - * - * @param string $d - * @return string - */ - function _StripDomainHost($d) - { - $IsIp = false; - $dotcount = substr_count($d, '.'); - if ($dotcount == 3) { - $IsIp = true; - for ($x = 0; $x < strlen($d); $x++) { - if (!is_numeric(substr($d, $x, 1)) && substr($d, $x, 1) != '.') - { - $IsIp = false; - break; - } - } - } - - if ($dotcount > 1 && !$IsIp) { - $p = explode('.', $d); - $ret = $p[count($p) - 2].'.'.$p[count($p) - 1]; - } - else { - $ret = $d; - } - return $ret; - } - - /** - * When logging into admin then check only last 2 parts of host name VS domain in license - * - * @param string $user_domain - * @param string $license_domain - * @return int - */ - function _CheckDomain($user_domain, $license_domain) - { - if ($this->Application->IsAdmin()) { - $user_domain = $this->_StripDomainHost($user_domain); - return preg_match('/(.*)'.preg_quote($user_domain, '/').'$/', $license_domain); - } - else { - return preg_match('/(.*)'.preg_quote($license_domain, '/').'$/', $user_domain); - } - } - - /** - * Returns modules list, that are in license - * - * @return Array - */ - function _GetModules() - { - static $modules = null; - - if (isset($modules)) { - return $modules; - } - - $modules = Array(); - $vars = parse_portal_ini(FULL_PATH . DIRECTORY_SEPARATOR . 'config.php'); - $license = array_key_exists('License', $vars) ? base64_decode($vars['License']) : false; - if ($license) { - list ( , , $i_Keys) = $this->_ParseLicense($license); - $domain = $this->_GetDomain($vars); - if (!$this->_IsLocalSite($domain)) { - for ($x = 0; $x < count($i_Keys); $x++) { - $key = $i_Keys[$x]; - if ($this->_CheckDomain($domain, $key['domain'])) { - // used hostname is subdomain or matches domain from license - $modules = explode(',', $key['mod']); - } - } - } - else { - // all already installed modules are licensed for localhost - $modules = array_keys($this->Application->ModuleInfo); - } - } - - // all modules starting from "in-" doesn't require license - $base_modules = Array ('Core', 'In-Portal', 'Custom'); - $modules = array_merge($modules, $base_modules, $this->_getFreeModules($vars)); - $modules = array_unique( array_map('strtolower', $modules) ); - - return $modules; - } - - /** - * Get all modules, that don't require licensing - * - * @return Array - */ - function _getFreeModules($vars) - { - $skip_modules = Array ('.', '..'); - $domain = $this->_GetDomain($vars); - - if (!$this->_IsLocalSite($domain)) { - array_push($skip_modules, 'in-commerce', 'in-auction'); - } - - $folder = dir(MODULES_PATH); - - $ret = Array (); - while (($entry = $folder->read()) !== false) { - $entry_lowercased = strtolower($entry); - if (!is_dir($folder->path . '/' . $entry) || in_array($entry_lowercased, $skip_modules) || (substr($entry_lowercased, 0, 3) != 'in-')) { - continue; - } - - $ret[] = $entry_lowercased; - } - - $folder->close(); - - return $ret; - } - - /** - * Allows to determine if module is licensed - * - * @param string $name - * @return bool - */ - function _ModuleLicensed($name) - { - $modules = $this->_GetModules(); - return in_array($name, $modules); - } - - /** - * Returns domain from licences (and direct in case of install script) - * - * @return string - */ - function _GetDomain($vars) - { - $config_domain = array_key_exists('Domain', $vars) ? $vars['Domain'] : false; - return $this->Application->ConfigValue('DomainDetect') ? $_SERVER['HTTP_HOST'] : $config_domain; - } - - function _keyED($txt, $encrypt_key) - { - $encrypt_key = md5($encrypt_key); - $ctr = 0; - $tmp = ''; - for ($i = 0; $i < strlen($txt); $i++) { - if ($ctr == strlen($encrypt_key)) $ctr = 0; - $tmp .= substr($txt, $i, 1) ^ substr($encrypt_key, $ctr, 1); - $ctr++; - } - return $tmp; - } - - - function _decrypt($txt, $key) - { - $txt = $this->_keyED($txt,$key); - $tmp = ''; - for ($i = 0; $i < strlen($txt); $i++) { - $md5 = substr($txt, $i, 1); - $i++; - $tmp .= (substr($txt, $i, 1) ^ $md5); - } - return $tmp; - } - - function LoadFromRemote() - { - return ''; - } - - function DLid() - { - die($GLOBALS['lid']."\n"); - } - - function _LoadLicense($LoadRemote = false) - { - $f = FULL_PATH.'/intechnic.php'; - if ($this->_falseIsLocalSite($f)) $ret = true; - if (file_exists($f)) { - $contents = file($f); - $data = base64_decode($contents[1]); - } - else { - if ($LoadRemote) return $LoadFromRemote; - } - return $data; - } - - function _VerifyKey($domain, $k) - { - $key = md5($domain); - $lkey = substr($key, 0, strlen($key) / 2); - $rkey = substr($key, strlen($key) / 2); - $r = $rkey.$lkey; - if ($k == $r) return true; - return false; - } - - function _ParseLicense($txt) - { -// global $i_User, $i_Pswd, $i_Keys; - - if (!$this->_falseIsLocalSite($txt)) { - $nah = false; - } - - $data = $this->_decrypt($txt, 'beagle'); - $i_User = $i_Pswd = ''; - $i_Keys = Array(); - $lines = explode("\n", $data); - for ($x = 0; $x < count($lines); $x++) { - $l = $lines[$x]; - $p = explode('=', $l, 2); - switch($p[0]) { - case 'Username': - $i_User = $p[1]; - break; - - case 'UserPass': - $i_Pswd = $p[1]; - break; - - default: - if (substr($p[0], 0, 3) == 'key') { - $parts = explode('|', $p[1]); - if ($this->_VerifyKey($parts[0], $parts[1])) { - unset($K); - $k['domain'] = $parts[0]; - $k['key'] = $parts[1]; - $k['desc'] = $parts[2]; - $k['mod'] = $parts[3]; - $i_Keys[] = $k; - } - } - break; - } - } - - return Array ($i_User, $i_Pswd, $i_Keys); - } - - function _GetObscureValue($i) - { - if ($i == 'x') return 0254; $z = ''; - if ($i == 'z') return 0x7F.'.'; - if ($i == 'c') return '--code--'; - if ($i >= 5 && $i < 7) return $this->_GetObscureValue($z)*$this->_GetObscureValue('e'); - if ($i > 30) return Array(0x6c,0x6f,0x63,0x61,0x6c,0x68,0x6f,0x73,0x74); - if ($i > 20) return 99; - if ($i > 10) return '.'.($this->_GetObscureValue(6.5)+1); - if ($i == 'a') return 0xa; - } - - function _Chr($val) - { - $x = $this->_GetObscureValue(25); - $f = chr($x).chr($x+5).chr($x+15); - return $f($val); - } - - function _IsLocalSite($domain) - { - $ee = $this->_GetObscureValue(35); $yy = ''; - foreach ($ee as $e) $yy .= $this->_Chr($e); - $localb = FALSE; - if(substr($domain,0,3)==$this->_GetObscureValue('x')) - { - $b = substr($domain,0,6); - $p = explode(".",$domain); - $subnet = $p[1]; - if($p[1]>15 && $p[1]<32) - $localb=TRUE; - } - $zz = $this->_GetObscureValue('z').$this->_GetObscureValue(5).'.'.(int)$this->_GetObscureValue(7).$this->_GetObscureValue(12); - $ff = $this->_GetObscureValue('z')+65; - $hh = $ff-0x18; - if($domain==$yy || $domain==$zz || substr($domain,0,7)==$ff.$this->_Chr(46).$hh || - substr($domain,0,3)==$this->_GetObscureValue('a').$this->_Chr(46) || $localb || strpos($domain,".")==0) - { - return TRUE; - } - return FALSE; - } - - function _falseIsLocalSite($domain) - { - $localb = FALSE; - if(substr($domain,0,3)=="172") - { - $b = substr($domain,0,6); - $p = explode(".",$domain); - $subnet = $p[1]; - if($p[1]>15 && $p[1]<32) - $localb=TRUE; - } - if($domain=="localhost" || $domain=="127.0.0.1" || substr($domain,0,7)=="192.168" || - substr($domain,0,3)=="10." || $localb || strpos($domain,".")==0) - { - return TRUE; - } - return FALSE; - } - - function verifyLicense($license_hash) - { - $license_hash = base64_decode($license_hash); - list ($license_user, $license_password, ) = $this->_ParseLicense($license_hash); - return strlen($license_user) && strlen($license_password); - } - - function moduleInstalled($module_name) - { - static $modules = null; - - if (is_null($modules)) { - $sql = 'SELECT LOWER(Name) - FROM ' . $this->Application->getUnitOption('mod', 'TableName'); - $modules = $this->Conn->GetCol($sql); - } - - if ($module_name == 'kernel') { - $module_name = 'in-portal'; - } - - return in_array(strtolower($module_name), $modules); - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/modules.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.10.2.5 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/fck_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/fck_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/fck_helper.php (nonexistent) @@ -1,294 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 fckFCKHelper extends kHelper { - - var $Config = Array(); - - function fckFCKHelper() - { - parent::kHelper(); - - $this->Config['AllowedExtensions']['Files'] = array('jpg','gif','jpeg','png','swf','fla','jpg','gif','jpeg','png','avi','mpg','mpeg','zip','rar','arj','gz','tar','doc','pdf','ppt','rdp','swf','swt','txt','vsd','xls','csv','odt') ; - $this->Config['DeniedExtensions']['Files'] = array('php','asp','aspx','ascx','jsp','cfm','cfc','pl','bat','exe','dll','reg') ; - $this->Config['AllowedExtensions']['Images'] = array('jpg','gif','jpeg','png', 'bmp') ; - $this->Config['DeniedExtensions']['Images'] = array('php','asp','aspx','ascx','jsp','cfm','cfc','pl','bat','exe','dll','reg'); - $this->Config['AllowedExtensions']['Flash'] = array('swf','fla') ; - $this->Config['DeniedExtensions']['Flash'] = array('php','asp','aspx','ascx','jsp','cfm','cfc','pl','bat','exe','dll','reg') ; - $this->Config['AllowedExtensions']['Media'] = array('asf','asx','avi','wav','wax','wma','wm','wmv','m3u','mp2v','mpg','mpeg','m1v','mp2','mp3','mpa','mpe','mpv2','mp4','mid','midi','rmi','qt','aif','aifc','aiff','mov','flv','rm','svcd','swf','vcd') ; - $this->Config['DeniedExtensions']['Media'] = array('php','asp','aspx','ascx','jsp','cfm','cfc','pl','bat','exe','dll','reg'); - $this->Config['AllowedExtensions']['Documents'] = array('doc','pdf','ppt','rdp','swf','swt','txt','vsd','xls','csv','zip','odt') ; - $this->Config['DeniedExtensions']['Documents'] = array('php','asp','aspx','ascx','jsp','cfm','cfc','pl','bat','exe','dll','reg'); - - } - - function CreateFolder($folder = '') - { - if (!$folder) { - return false; - } - - $folderPath = WRITEABLE . '/user_files/' . $folder; - - if (file_exists($folderPath) && is_dir($folderPath)) { - return true; - } - - $permissions = defined('FCK_FOLDERS_PERMISSIONS') ? FCK_FOLDERS_PERMISSIONS : '0777'; - return mkdir($folderPath); // , $permissions - } - - function IsAllowedExtension($folder, $file_name) - { - $base_folder = $this->getBaseFolder($folder); - eregi("(\.[a-zA-Z0-9]{1,10})$", $file_name, $regs); - $ext = strtolower(ltrim($regs[1],".")); - if (isset($this->Config['DeniedExtensions'][$folder])) { - if (in_array($ext, $this->Config['DeniedExtensions'][$folder])) { - return false; - } - } - if (isset($this->Config['AllowedExtensions'][$folder])) { - if (!in_array($ext, $this->Config['AllowedExtensions'][$folder])) { - return false; - } - } - return true; - } - - function getBaseFolder($folder) - { - $end = strpos("/", $folder); - if ($end) { - return substr($folder, 0, $end); - } - return $folder; - } - - function ReadFolders($files_dir) - { - $aFolders = array(); - $oCurrentFolder = opendir($files_dir) ; - $KernelSystemFolders = defined('KERNEL_SYSTEM_FOLDERS') ? KERNEL_SYSTEM_FOLDERS : array('icons', 'CVS', '.svn'); - while ( $sFile = readdir( $oCurrentFolder ) ) - { - if (is_dir($files_dir . $sFile ) && !in_array($sFile,$KernelSystemFolders) && $sFile != '.' && $sFile != '..') { - $aFolders[] = $sFile; - } - } - closedir( $oCurrentFolder ) ; - return $aFolders; - } - - - function ReadFiles($files_dir) - { - $aFiles = array(); - $oCurrentFolder = opendir($files_dir) ; - while ( $sFile = readdir( $oCurrentFolder ) ) - { - if (!is_dir($files_dir . $sFile )) { - $aFiles[] = $sFile; - } - } - closedir( $oCurrentFolder ) ; - return $aFiles; - } - - - function PrintFolders() - { - $order_by = $this->Application->GetVar('order_by'); - $sort_by = $this->Application->GetVar('sort_by'); - $folder = $this->Application->GetVar('folder'); - $files_dir = WRITEABLE."/user_files/".$folder."/"; - $aFolders = $this->ReadFolders($files_dir); - $ret = ''; - $order_by = $this->Application->GetVar('order_by'); - $sort_by = $this->Application->GetVar('sort_by'); - natcasesort($aFolders); - foreach ($aFolders as $k => $v) { - $ret .= '<folder2 path="'.$folder."/".$v.'">'.$v.'</folder2>'."\n"; - } - - if ($sort_by == 'name' && $order_by == '_desc') { - $aFolders = array_reverse($aFolders); - } - foreach ($aFolders as $k => $v) { - $ret .= '<folder path="'.$folder."/".$v.'">'.$v.'</folder>'."\n"; - } - return $ret; - } - - function CalculateFileSize($size) - { - if ( $size > 0 ) { - $size = round( $size / 1024 ); - $size = ($size < 1)? 1:$size;// round( $iFileSize / 1024 ) ; - } - return $size; - } - - function CheckIconType($v) - { - $a_ext = Array('ai','avi','bmp','cs','dll','doc','exe','fla','gif','htm','html','jpg','js','mdb','mp3','pdf','png','ppt','rdp','swf','swt','txt','vsd','xls','xml','zip'); - - eregi("(\.[a-zA-Z0-9]{1,10})$", $v, $regs); - $ext = strtolower(ltrim($regs[1],".")); - if (in_array($ext, $a_ext)) - { - $icon = $ext; - } else { - $icon = 'default.icon'; - } - return $icon; - } - - function GetXmlString($size,$url,$icon,$date,$file_name) - { - return '<file size="'.$size.'" url="'.$url.'" icon="'.$icon.'" date="'.$date.'">'.$file_name.'</file>'."\n"; - } - - function PrintFiles() - { - $order_by = $this->Application->GetVar('order_by'); - $sort_by = $this->Application->GetVar('sort_by'); - - $folder = $this->Application->GetVar('folder'); - $files_dir = WRITEABLE . "/user_files/" . $folder."/"; - $files_url = BASE_PATH . WRITEBALE_BASE . "/user_files/" . $folder . "/"; - $aFiles = $this->ReadFiles($files_dir); - $ret = ''; - $date_format = "m/d/Y h:i A"; - natcasesort($aFiles); - if ($sort_by == 'name' && $order_by == '_desc') { - $aFiles = array_reverse($aFiles,TRUE); - } - - foreach ($aFiles as $k => $v) - { - $aFilesSize[$k] = filesize( $files_dir . $v); - $aFilesDate[$k] = filectime( $files_dir . $v); - } - if ($sort_by == 'name') { - foreach ($aFiles as $k => $file) { - $size = $this->CalculateFileSize($aFilesSize[$k]); - $date = date($date_format, $aFilesDate[$k]); - $icon = $this->CheckIconType($file); - $ret .= $this->GetXmlString($size,$files_url.$file,$icon,$date,$file); - } - } - if ($sort_by == 'date') { - asort($aFilesDate); - if($order_by == '_desc') { - $aFilesDate = array_reverse($aFilesDate,TRUE); - } - foreach ($aFilesDate as $k => $date) { - $size = $this->CalculateFileSize($aFilesSize[$k]); - $file = $aFiles[$k]; - $date = date($date_format, $date); - $icon = $this->CheckIconType($file); - $ret .= $this->GetXmlString($size,$files_url.$file,$icon,$date,$file); - } - } - if ($sort_by == 'size') { - asort($aFilesSize); - if($order_by == '_desc') { - $aFilesSize = array_reverse($aFilesSize,TRUE); - } - foreach ($aFilesSize as $k => $size) { - $size = $this->CalculateFileSize($size); - $file = $aFiles[$k]; - $date = date($date_format, $aFilesDate[$k]); - $icon = $this->CheckIconType($file); - $ret .= $this->GetXmlString($size,$files_url.$file,$icon,$date,$file); - } - } - return $ret; - } - - function UploadFile() - { - $Extensions['Allowed']['Files'] = array('jpg','gif','jpeg','png','swf','fla','jpg','gif','jpeg','png','avi','mpg','mpeg','zip','rar','arj','gz','tar','doc','pdf','ppt','rdp','swf','swt','txt','vsd','xls','csv','odt') ; - $Extensions['Allowed']['Images'] = array('jpg','gif','jpeg','png', 'bmp') ; - $Extensions['Allowed']['Flash'] = array('swf','fla') ; - $Extensions['Allowed']['Media'] = array('asf','asx','avi','wav','wax','wma','wm','wmv','m3u','mp2v','mpg','mpeg','m1v','mp2','mp3','mpa','mpe','mpv2','mp4','mid','midi','rmi','qt','aif','aifc','aiff','mov','flv','rm','svcd','swf','vcd') ; - $Extensions['Allowed']['Documents'] = array('doc','pdf','ppt','rdp','swf','swt','txt','vsd','xls','csv','zip','odt') ; - - $upload_dir = $this->Application->GetVar('upload_dir'); - $type = explode("/",$upload_dir); - $type = $type[0]; - $sServerDir = WRITEABLE."/user_files/".$upload_dir."/"; - - $aUpFile = $_FILES['NewFile']; - $sFileName = $aUpFile['name']; - $sOriginalFileName = $aUpFile['name']; - $sExtension = strtolower(substr( $sFileName, ( strrpos($sFileName, '.') + 1 ) ) ); - $sErrorNumber = 0; - if ( isset( $_FILES['NewFile'] ) && !is_null( $_FILES['NewFile']['tmp_name'] ) ) - { - if (in_array($sExtension,$Extensions['Allowed'][$type])) - { - - if (!$aUpFile['error']) { - $iCounter = 0 ; - while ( true ) - { - $sFilePath = $sServerDir . $sFileName ; - if ( is_file( $sFilePath ) ) - { - $iCounter++ ; - $sFileName = $this->RemoveExtension( $sOriginalFileName ) . '(' . $iCounter . ').' . $sExtension ; - $sErrorNumber = '201' ; - } - else - { - // Turn off all error reporting. - error_reporting( 0 ) ; - // Enable error tracking to catch the error. - ini_set( 'track_errors', '1' ) ; - move_uploaded_file( $aUpFile['tmp_name'], $sFilePath ) ; - $sErrorMsg = $php_errormsg ; - // Restore the configurations. - ini_restore( 'track_errors' ) ; - ini_restore( 'error_reporting' ) ; - - if ( is_file( $sFilePath ) ) - { - $oldumask = umask(0) ; - chmod( $sFilePath, 0666 ) ; - umask( $oldumask ) ; - } - break ; - } - } - } - } else { - $sErrorNumber = '203'; - } - } else { - $sErrorNumber = '202' ; - } - echo '<script type="text/javascript">' ; - echo 'window.parent.frames["frmUpload"].OnUploadCompleted(' . $sErrorNumber . ',"' . str_replace( '"', '\\"', $sFileName ) . '") ;' ; - echo '</script>' ; - } - - function RemoveExtension( $fileName ) - { - return substr( $fileName, 0, strrpos( $fileName, '.' ) ) ; - } -} \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/fck_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.1.2.1 \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/helpers_config.php =================================================================== --- branches/5.0.x/core/units/general/helpers/helpers_config.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/helpers_config.php (nonexistent) @@ -1,52 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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' => 'helpers', - 'EventHandlerClass' => Array ('class' => 'kEventHandler', 'file' => '', 'build_event' => 'OnBuild'), - - 'RegisterClasses' => Array ( - Array ('pseudo' => 'kMultiLanguageHelper', 'class' => 'kMultiLanguageHelper', 'file' => 'multilanguage.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'SearchHelper', 'class' => 'kSearchHelper', 'file' => 'search_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'SectionsHelper', 'class' => 'kSectionsHelper', 'file' => 'sections_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'PermissionsHelper', 'class' => 'kPermissionsHelper', 'file' => 'permissions_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'ModulesHelper', 'class' => 'kModulesHelper', 'file' => 'modules.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'ModRewriteHelper', 'class' => 'kModRewriteHelper', 'file' => 'mod_rewrite_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'RecursiveHelper', 'class' => 'kRecursiveHelper', 'file' => 'recursive_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'FilenamesHelper', 'class' => 'kFilenamesHelper', 'file' => 'filenames_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'ClipboardHelper', 'class' => 'kClipboardHelper', 'file' => 'clipboard_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'ColumnPickerHelper', 'class' => 'kColumnPickerHelper', 'file' => 'col_picker_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'ThemesHelper', 'class' => 'kThemesHelper', 'file' => 'themes_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'CaptchaHelper', 'class' => 'kCaptchaHelper', 'file' => 'captcha_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'PriorityHelper', 'class' => 'kPriorityHelper', 'file' => 'priority_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'CurlHelper', 'class' => 'kCurlHelper', 'file' => 'curl_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'CountHelper', 'class' => 'kCountHelper', 'file' => 'count_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - - Array ('pseudo' => 'ImageHelper', 'class' => 'ImageHelper', 'file' => 'image_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'FileHelper', 'class' => 'FileHelper', 'file' => 'file_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'CategoryHelper', 'class' => 'CategoryHelper', 'file' => 'category_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'CSVHelper', 'class' => 'kCSVHelper', 'file' => 'csv_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'ChartHelper', 'class' => 'kChartHelper', 'file' => 'chart_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'RatingHelper', 'class' => 'RatingHelper', 'file' => 'rating_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'FCKHelper', 'class' => 'fckFCKHelper', 'file' => 'fck_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'SpamHelper', 'class' => 'SpamHelper', 'file' => 'spam_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'TemplateHelper', 'class' => 'TemplateHelper', 'file' => 'template_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'MailingListHelper', 'class' => 'MailingListHelper', 'file' => 'mailing_list_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'JSONHelper', 'class' => 'JSONHelper', 'file' => 'json_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'LanguageImportHelper', 'class' => 'LanguageImportHelper', 'file' => 'language_import_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - Array ('pseudo' => 'SkinHelper', 'class' => 'SkinHelper', 'file' => 'skin_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), - ), - ); \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/helpers_config.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.9.2.10 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/csv_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/csv_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/csv_helper.php (nonexistent) @@ -1,374 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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!'); - - safeDefine('EXPORT_STEP', 100); // export by 100 items - safeDefine('IMPORT_STEP', 10); - - class kCSVHelper extends kHelper { - - var $PrefixSpecial; - var $grid; - - var $delimiter_mapping = Array(0 => "\t", 1 => ',', 2 => ';', 3 => ' ', 4 => ':'); - var $enclosure_mapping = Array(0 => '"', 1 => "'"); - var $separator_mapping = Array(0 => "\n", 1 => "\r\n"); - - function ExportStep() - { - $export_data = $this->Application->RecallVar('export_data'); - $export_rand = $this->Application->RecallVar('export_rand'); - $get_rand = $this->Application->GetVar('export_rand'); - - if($export_data && $export_rand == $get_rand) { - $export_data = unserialize($export_data); - $first_step = false; - } - else { - // first step - $export_data = Array(); - $export_data['prefix'] = $this->PrefixSpecial; - $export_data['grid'] = $this->grid; - $export_data['file_name'] = EXPORT_PATH.'/'.$this->ValidateFileName(EXPORT_PATH, 'export_'.$export_data['prefix'].'.csv'); - $export_data['step'] = EXPORT_STEP; - $export_data['delimiter'] = $this->delimiter_mapping[(int)$this->Application->ConfigValue('CSVExportDelimiter')]; - $export_data['enclosure'] = $this->enclosure_mapping[(int)$this->Application->ConfigValue('CSVExportEnclosure')]; - $export_data['record_separator'] = $this->separator_mapping[(int)$this->Application->ConfigValue('CSVExportSeparator')]; - $export_data['page'] = 1; - - $lang_object =& $this->Application->recallObject('lang.current'); - /* @var $lang_object LanguagesItem */ - $export_data['source_encoding'] = strtoupper( $lang_object->GetDBField('Charset') ); - $export_data['encoding'] = $this->Application->ConfigValue('CSVExportEncoding') ? false : 'UTF-16LE'; - - $this->Application->StoreVar('export_rand', $get_rand); - - $first_step = true; - } - - $file = fopen($export_data['file_name'], $first_step ? 'w' : 'a'); - - $prefix_elems = split('\.|_', $export_data['prefix']); - $grids = $this->Application->getUnitOption($prefix_elems[0], 'Grids'); - $grid_config = $grids[ $export_data['grid'] ]['Fields']; - - $list_params = Array('per_page' => $export_data['step'], 'grid' => $export_data['grid']); - $list =& $this->Application->recallObject(rtrim(implode('.', $prefix_elems), '.'), $prefix_elems[0].'_List', $list_params); - /* @var $list kDBList */ - $list->SetPage($export_data['page']); - - $list->Query(); - $list->GoFirst(); - - $picker_helper =& $this->Application->RecallObject('ColumnPickerHelper'); - /* @var $picker_helper kColumnPickerHelper */ - $picker_helper->ApplyPicker(rtrim(implode('.', $prefix_elems), '.'), $grid_config, $export_data['grid']); - - if($first_step) { - // if UTF-16, write Unicode marker - if($export_data['encoding'] == 'UTF-16LE') { - fwrite($file, chr(0xFF).chr(0xFE)); - } - - // inserting header line - $headers = Array(); - foreach($grid_config as $field_name => $field_data) { - $header = $this->Application->Phrase( $field_data['title'] ); - array_push($headers, $header); - } - $csv_line = getcsvline($headers, $export_data['delimiter'], $export_data['enclosure'], $export_data['record_separator']); - if($export_data['encoding']) { - $csv_line = mb_convert_encoding($csv_line, $export_data['encoding'], $export_data['source_encoding']); - } - fwrite($file, $csv_line); - } - - while(!$list->EOL()) - { - $data = Array(); - foreach($grid_config as $field_name => $field_data) { - if(isset($field_data['export_field'])) { - $field_name = $field_data['export_field']; - } - $value = $list->GetField($field_name, isset($field_data['format']) ? $field_data['format'] : null); - $value = str_replace("\r\n", "\n", $value); - $value = str_replace("\r", "\n", $value); - array_push($data, $value); - } - if($export_data['encoding'] == 'UTF-16LE') { - fwrite($file, chr(0xFF).chr(0xFE)); - } - $csv_line = getcsvline($data, $export_data['delimiter'], $export_data['enclosure'], $export_data['record_separator']); - if($export_data['encoding']) { - $csv_line = mb_convert_encoding($csv_line, $export_data['encoding'], $export_data['source_encoding']); - } - fwrite($file, $csv_line); - - $list->GoNext(); - } - - $records_processed = $export_data['page'] * $export_data['step']; - $percent_complete = min($records_processed / $list->RecordsCount * 100, 100); - - fclose($file); - - if ($records_processed >= $list->RecordsCount) { - $this->Application->StoreVar('export_data', serialize($export_data)); - $this->Application->Redirect($this->Application->GetVar('finish_template')); - } - - echo $percent_complete; - - $export_data['page']++; - $this->Application->StoreVar('export_data', serialize($export_data)); - } - - function ValidateFileName($path, $name) - { - $parts = pathinfo($name); - $ext = '.'.$parts['extension']; - $filename = mb_substr($parts['basename'], 0, -mb_strlen($ext)); - $new_name = $filename.$ext; - while ( file_exists($path.'/'.$new_name) ) - { - if ( preg_match('/('.preg_quote($filename, '/').'_)([0-9]*)('.preg_quote($ext, '/').')/', $new_name, $regs) ) { - $new_name = $regs[1].($regs[2]+1).$regs[3]; - } - else { - $new_name = $filename.'_1'.$ext; - } - } - return $new_name; - } - - function ExportData($name) - { - $export_data = unserialize($this->Application->RecallVar('export_data')); - return isset($export_data[$name]) ? $export_data[$name] : false; - } - - function GetCSV() - { - safeDefine('DBG_SKIP_REPORTING', 1); - - $export_data = unserialize($this->Application->RecallVar('export_data')); - header('Content-type: text/csv'); - $filename = rtrim(basename($export_data['file_name']), '.csv').'.csv'; - header('Content-Disposition: attachment; filename="'.$filename.'"'); - readfile($export_data['file_name']); - die(); - } - - function ImportStart($filename) - { - if(!file_exists($filename) || !is_file($filename)) return 'cant_open_file'; - - $import_data = Array(); - - $lang_object =& $this->Application->recallObject('lang.current'); - /* @var $lang_object LanguagesItem */ - $import_data['source_encoding'] = strtoupper( $lang_object->GetDBField('Charset') ); - $import_data['encoding'] = $this->Application->ConfigValue('CSVExportEncoding') ? false : 'UTF-16LE'; - $import_data['errors'] = ''; - - // convert file in case of UTF-16LE - if($import_data['source_encoding'] != $import_data['encoding']) { - copy($filename, $filename.'.orginal'); - $file_content = file_get_contents($filename); - $file = fopen($filename, 'w'); - fwrite($file, mb_convert_encoding(str_replace(chr(0xFF).chr(0xFE), '', $file_content), $import_data['source_encoding'], $import_data['encoding'])); - fclose($file); - - } - - $import_data['prefix'] = $this->PrefixSpecial; - $import_data['grid'] = $this->grid; - $import_data['file'] = $filename; - $import_data['total_lines'] = count(file($filename)); - if(!$import_data['total_lines']) $import_data['total_lines'] = 1; - unset($file_content); - $import_data['lines_processed'] = 0; - $import_data['delimiter'] = $this->delimiter_mapping[(int)$this->Application->ConfigValue('CSVExportDelimiter')]; - $import_data['enclosure'] = $this->enclosure_mapping[(int)$this->Application->ConfigValue('CSVExportEnclosure')]; - $import_data['step'] = IMPORT_STEP; - $import_data['not_imported_lines'] = ''; - $import_data['added'] = 0; - $import_data['updated'] = 0; - - $file = fopen($filename, 'r'); - // getting first line for headers - $headers = fgetcsv($file, 8192, $import_data['delimiter'], $import_data['enclosure']); - fclose($file); - - $prefix_elems = split('\.|_', $import_data['prefix']); - $grids = $this->Application->getUnitOption($prefix_elems[0], 'Grids'); - $grid_config = $grids[ $import_data['grid'] ]['Fields']; - - $field_list = Array(); - foreach($grid_config as $field_name => $field_data) { - if(isset($field_data['export_field'])) { - $field_name = $field_data['export_field']; - } - $field_label = $this->Application->Phrase( $field_data['title'] ); - $field_pos = array_search($field_label, $headers); - if($field_pos !== false) { - $field_list[$field_pos] = $field_name; - } - } - - if(!count($field_list)) return 'no_matching_columns'; - $import_data['field_list'] = $field_list; - - // getting key list - $field_positions = Array(); - $config_key_list = $this->Application->getUnitOption($prefix_elems[0], 'ImportKeys'); - if(!$config_key_list) $config_key_list = Array(); - array_unshift($config_key_list, Array($this->Application->getUnitOption($prefix_elems[0], 'IDField'))); - - $key_list = Array(); - foreach($config_key_list as $arr_key => $import_key) { - $key_list[$arr_key] = is_array($import_key) ? $import_key : Array($import_key); - - foreach($key_list[$arr_key] as $key_field) { - $field_positions[$key_field] = array_search($key_field, $import_data['field_list']); - if($field_positions[$key_field] === false) { - // no such key field combination in imported file - unset($key_list[$arr_key]); - break; - } - } - } - $import_data['key_list'] = $key_list; - $import_data['field_positions'] = $field_positions; - - $this->Application->StoreVar('import_data', serialize($import_data)); - return true; - } - - function ImportStep() - { - $import_data = unserialize($this->Application->RecallVar('import_data')); - $prefix_elems = split('\.|_', $import_data['prefix']); - - $object =& $this->Application->recallObject($prefix_elems[0].'.-csvimport', $prefix_elems[0], Array('skip_autoload' => true, 'populate_ml_fields' => true)); - /* @var $object kDBItem */ - - $file = fopen($import_data['file'], 'r'); - $eof = false; - // skipping lines that has been already imported - for($i = 0; $i < $import_data['lines_processed'] + 1; $i++) { - if(feof($file)) break; - fgets($file, 8192); - } - - $import_event = new kEvent($prefix_elems[0].'.-csvimport:OnBeforeCSVLineImport'); - - for($i = 0; $i < $import_data['step']; $i++) { - if(feof($file)) break; - $data = fgetcsv($file, 8192, $import_data['delimiter'], $import_data['enclosure']); - if(!$data) continue; - - $object->Clear(); - $action = 'Create'; - - // 1. trying to load object by keys - foreach($import_data['key_list'] as $key) { - $fail = false; - $key_array = Array(); - foreach($key as $key_field) { - if(!isset($data[ $import_data['field_positions'][$key_field] ])) { - $fail = true; - break; - } - $key_array[$key_field] = $data[ $import_data['field_positions'][$key_field] ]; - } - if($fail) continue; - if($object->Load($key_array)) { - $action = 'Update'; - break; - } - } - - // 2. set object fields - foreach($import_data['field_list'] as $position => $field_name) { - if(isset($data[$position])) { - $object->SetField($field_name, $data[$position]); - } - } - - // 3. validate item and run event - $status = $object->Validate(); - $import_event->status = $status ? erSUCCESS : erFAIL; - $this->Application->HandleEvent($import_event); - - if($import_event->status == erSUCCESS && $object->$action()) { - $import_data[ ($action == 'Create') ? 'added' : 'updated' ]++; - } - else { - $msg = ''; - foreach ($object->FieldErrors as $field => $info) { - if (!$info['pseudo']) continue; - $msg .= "$field: {$info['pseudo']} "; - } - $import_data['errors'] .= ($i + $import_data['lines_processed'] + 1).": $msg\n"; - $import_data['not_imported_lines'] .= ','.($i + $import_data['lines_processed'] + 1); - } - } - - $import_data['lines_processed'] += $import_data['step']; - - $import_data['not_imported_lines'] = ltrim($import_data['not_imported_lines'], ','); - $this->Application->StoreVar('import_data', serialize($import_data)); - - $feof = feof($file); - fclose($file); - - if($feof) { - $this->Application->Redirect($this->Application->GetVar('finish_template')); - } - else { - $percent_complete = floor($import_data['lines_processed'] / $import_data['total_lines'] * 100); - if($percent_complete > 99) $percent_complete = 99; - echo $percent_complete; - } - } - - function ImportData($name) - { - $import_data = unserialize($this->Application->RecallVar('import_data')); - return isset($import_data[$name]) ? $import_data[$name] : false; - } - - function GetNotImportedLines() - { - $import_data = unserialize($this->Application->RecallVar('import_data')); - - if(!$import_data['not_imported_lines']) return false; - $line_numbers = explode(',', $import_data['not_imported_lines']); - $line_numbers[] = 0; // include header row in output - - $file = fopen($import_data['file'], 'r'); - $eof = false; - $result = ''; - for($i = 0; $i <= max($line_numbers); $i++) { - if(feof($file)) break; - $line = fgets($file, 8192); - if(in_array($i, $line_numbers)) { - $result .= $i.':'.$line; - } - } - return $result."\n\n".$import_data['errors']; - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/csv_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.1.4.4 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/geocode_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/geocode_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/geocode_helper.php (nonexistent) @@ -1,186 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 GeoCodeHelper extends kHelper { - - /** - * Returns Longitude & Latitude by US address provided - * - * @param Array $data - * @return Array - */ - function QueryCoordinates($address, $city, $state, $zip) - { - $user = $this->Application->ConfigValue('GeoCodeUser'); - $pass = $this->Application->ConfigValue('GeoCodePass'); - - $rie_path = sprintf(FULL_PATH.'/tools/rie/rie -u %s -p %s -g "%s" -l', - $user, - $pass, - $address.'|'.$city.'|'.$state.'|'.$zip - ); - - exec($rie_path, $geo_array, $code); - - if ($code == 0) { - $out_data = explode('|', $geo_array[2]); - -// include_once(FULL_PATH.'/compat/array_combine.php'); - $assoc_data = array_combine(explode('|', $geo_array[1]), $out_data); - - $lon = abs($out_data[8]); // set to positive, because required by SQL formula - $lat = $out_data[7]; - - $zip4 = $out_data[9]; - $dpbc = $out_data[10]; - $carrier = $out_data[11]; - } - else { - $lon = ''; - $lat = ''; - $zip4 = ''; - $dpbc = ''; - $carrier = ''; - $assoc_data = Array(); - } - - return Array($lon, $lat, $zip4, $dpbc, $carrier, serialize($assoc_data)); - } - - function getTag($tag, $xml) - { - $open_tag_pos = strpos($xml, '<'.$tag.'>'); - $close_tag_pos = strpos($xml, '</'.$tag.'>'); - if (!$open_tag_pos || !$close_tag_pos) - { - return ''; - } - $tag_length = strlen($tag) + 2; - return substr($xml, $open_tag_pos + $tag_length, $close_tag_pos - $open_tag_pos - $tag_length); - } - - function QueryCoordinatesFromGoogle($address, $city, $state, $zip) - { - // 1908 Pike pl, Seattle, WA - // http://maps.google.com/maps/geo? - // ABQIAAAAzNbTbxHki-PAnXzsrA7z2hR0fs2_a3JecCfKmMFhGT8VtEjV7xRV8rMK1czaEH2ZG3eiYJMuej_vnQ - - $qaddress = $address.', '.$city.', '.$state; - $request_url = $this->Application->ConfigValue('GoogleMapsURL').'output=xml&key='. - $this->Application->ConfigValue('GoogleMapsKey').'&q='.urlencode($qaddress); - - $curl_helper =& $this->Application->recallObject('CurlHelper'); - /* @var $curl_helper kCurlHelper */ - - $delay = 0; - while (true) - { - $xml = $curl_helper->Send($request_url); - - if (strpos($xml, '<code>620</code>')) { - $delay += 100000; - } elseif (strpos($xml, '<code>200</code>')) { - // get latitude, longitude and zip from xml-answer - $a_coords = explode(',', $this->getTag('coordinates', $xml)); - $lat = $a_coords[1]; - $lon = abs($a_coords[0]); // set to positive, because required by SQL formula - $zip4 = $this->getTag('PostalCodeNumber', $xml); - $dpbc = ''; - $carrier = ''; - $assoc_data = Array(); - break; - } else { - $lon = ''; - $lat = ''; - $zip4 = ''; - $dpbc = ''; - $carrier = ''; - $assoc_data = Array(); - break; - } - usleep($delay); - } - - return Array($lon, $lat, $zip4, $dpbc, $carrier, serialize($assoc_data)); - - } - - /** - * Try to find lon, lat by address return false if failed - * - * @param string $address - * @param string $city - * @param string $state - * @param int $zip - * @return Array (lon, lat) - */ - function GetCoordinates($address, $city, $state, $zip, $no_cache = false, $force_cache = false) - { - if (!$zip && !$state) { - // if state or zip missing then do nothing - return false; - } - - $zip_info = $no_cache ? false : $this->GetFromCache($address, $city, $state, $zip); -// $zip_info = $this->GetFromCache($address, $city, $state, $zip); - - if (!$zip_info && !$force_cache) { - list($lon, $lat, $zip4, $dpbc, $carrier, $geocode_answer) = $this->QueryCoordinatesFromGoogle($address, $city, $state, $zip); - - if ($lon != '' && $lat != '') { - // valid position returned by geocode => add to cache - $fields_hash = Array( - 'zipcode' => $zip4, - 'address' => $address, - 'city' => $city, - 'state' => $state, - 'lat' => $lat, - 'lon' => $lon, - 'zip4' => $zip4, - 'dpbc' => $dpbc, - 'carrier' => $carrier, - 'geocode_answer' => $geocode_answer, - ); - $this->Conn->doInsert($fields_hash, TABLE_PREFIX.'ZipCodes'); - return Array($lon, $lat, $zip4, $dpbc, $carrier); - } - else { - // bad case, rie call failed => no data retrieved - return false; - } - } - - return Array($zip_info['lon'], $zip_info['lat'], getArrayValue($zip_info, 'zip4'), getArrayValue($zip_info, 'dpbc'), getArrayValue($zip_info, 'carrier')); - } - - /** - * Try to find cached lon, lat by address - * - * @param string $address - * @param string $city - * @param string $state - * @param int $zip - * @return Array (lon, lat) - */ - function GetFromCache($address, $city, $state, $zip) - { - $zip = substr($zip, 0, 5); // use only first 5 digits - $sql = 'SELECT lon, lat - FROM '.TABLE_PREFIX.'ZipCodes - WHERE zipcode = '.$this->Conn->qstr($zip); - return $this->Conn->GetRow($sql); - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/geocode_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.1.72.2 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/themes_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/themes_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/themes_helper.php (nonexistent) @@ -1,392 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 kThemesHelper extends kHelper { - - /** - * Where all themes are located - * - * @var string - */ - var $themesFolder = ''; - - /** - * List of theme names, found on system - * - * @var Array - */ - var $_themeNames = Array (); - - /** - * Temporary array when all theme files from db are stored - * - * @var Array - */ - var $themeFiles = Array (); - - function kThemesHelper() - { - parent::kHelper(); - $this->themesFolder = FULL_PATH.'/themes'; - } - - /** - * Updates file system changes to database for selected theme - * - * @param string $theme_name - * - * @return mixed returns ID of created/used theme or false, if none created - */ - function refreshTheme($theme_name) - { - if (!file_exists($this->themesFolder . '/' . $theme_name)) { - // requested theme was not found on hdd - return false; - } - - $id_field = $this->Application->getUnitOption('theme', 'IDField'); - $table_name = $this->Application->getUnitOption('theme', 'TableName'); - - $sql = 'SELECT ' . $id_field . ', Enabled - FROM ' . $table_name . ' - WHERE Name = ' . $this->Conn->qstr($theme_name); - $theme_info = $this->Conn->GetRow($sql); - - if ($theme_info) { - $theme_id = $theme_info[$id_field]; - $theme_enabled = $theme_info['Enabled']; - } - else { - $theme_id = $theme_enabled = false; - } - - $this->themeFiles = Array (); - if ($theme_id) { - if (!$theme_enabled) { - // don't process existing theme files, that are disabled - return $theme_id; - } - - // reset found mark for every themes file (if theme is not new) - $sql = 'UPDATE '.TABLE_PREFIX.'ThemeFiles - SET FileFound = 0 - WHERE ThemeId = '.$theme_id; - $this->Conn->Query($sql); - - // get all theme files from db - $sql = 'SELECT FileId, CONCAT(FilePath, "/", FileName) AS FullPath - FROM '.TABLE_PREFIX.'ThemeFiles - WHERE ThemeId = '.$theme_id; - $this->themeFiles = $this->Conn->GetCol($sql, 'FullPath'); - } - else { - // theme was not found in db, but found on hdd -> create new - $fields_hash = Array ( - 'Name' => $theme_name, - 'Enabled' => 0, - 'Description' => $theme_name, - 'PrimaryTheme' => 0, - 'CacheTimeout' => 3600, // not in use right now - 'StylesheetId' => 0, // not in use right now - ); - - $this->Conn->doInsert($fields_hash, $table_name); - $theme_id = $this->Conn->getInsertID(); - - if (!$theme_enabled) { - // don't process newly created theme files, because they are disabled - return $theme_id; - } - } - - $this->_themeNames[$theme_id] = $theme_name; - $theme_path = $this->themesFolder.'/'.$theme_name; - $this->FindThemeFiles('', $theme_path, $theme_id); // search from base theme directory - - // delete file records from db, that were not found on hdd - $sql = 'DELETE FROM '.TABLE_PREFIX.'ThemeFiles - WHERE ThemeId = '.$theme_id.' AND FileFound = 0'; - $this->Conn->Query($sql); - - return $theme_id; - } - - /** - * Searches for new templates (missing in db) in spefied folder - * - * @param string $folder_path subfolder of searchable theme - * @param string $theme_path theme path from web server root - * @param int $theme_id id of theme we are scanning - */ - function FindThemeFiles($folder_path, $theme_path, $theme_id, $auto_structure_mode = 1) - { - $fh = opendir($theme_path.$folder_path.'/'); - - // always ingore design and element templates - $ignore = Array ('^CVS$', '^\.svn$', '\.des\.tpl$', '\.elm\.tpl$'); - - $sms_ingore = $theme_path . $folder_path . '/.smsignore'; - - if (file_exists($sms_ingore)) { - $ignore = array_merge($ignore, file($sms_ingore)); - } - - while (($filename = readdir($fh))) { - if ($filename == '.' || $filename == '..') continue; - - $auto_structure = $auto_structure_mode; - foreach ($ignore as $pattern) { - if (preg_match('/'.str_replace('/', '\\/', trim($pattern)).'/', $filename)) { - $auto_structure = 2; - break; - } - } - - $full_path = $theme_path.$folder_path.'/'.$filename; - if (is_dir($full_path)) { - $this->FindThemeFiles($folder_path.'/'.$filename, $theme_path, $theme_id, $auto_structure); - } - elseif (substr($filename, -4) == '.tpl') { - $file_path = $folder_path.'/'.$filename; - - $meta_info = $this->_getTemplateMetaInfo(trim($file_path, '/'), $theme_id); - $file_id = isset($this->themeFiles[$file_path]) ? $this->themeFiles[$file_path] : false; - $file_description = array_key_exists('desc', $meta_info) ? $meta_info['desc'] : ''; - - if ($file_id) { - // file was found in db & on hdd -> mark as existing - $fields_hash = Array ( - 'FileFound' => 1, - 'Description' => $file_description, - 'FileType' => $auto_structure, - 'FileMetaInfo' => serialize($meta_info), - ); - - $this->Conn->doUpdate($fields_hash, TABLE_PREFIX . 'ThemeFiles', 'FileId = ' . $file_id); - } - else { - // file was found on hdd, but missing in db -> create new file record - $fields_hash = Array ( - 'ThemeId' => $theme_id, - 'FileName' => $filename, - 'FilePath' => $folder_path, - 'Description' => $file_description, - 'FileType' => $auto_structure, // 1 - built-in, 0 - custom (not in use right now), 2 - skipped in structure - 'FileMetaInfo' => serialize($meta_info), - 'FileFound' => 1, - ); - - $this->Conn->doInsert($fields_hash, TABLE_PREFIX.'ThemeFiles'); - $this->themeFiles[$file_path] = $this->Conn->getInsertID(); - } -// echo 'FilePath: [<strong>'.$folder_path.'</strong>]; FileName: [<strong>'.$filename.'</strong>]; IsNew: [<strong>'.($file_id > 0 ? 'NO' : 'YES').'</strong>]<br />'; - } - - } - } - - /** - * Returns template information (name, description, path) from it's header comment - * - * @param string $template - * @param int $theme_id - * @return Array - */ - function _getTemplateMetaInfo($template, $theme_id) - { - static $init_made = false; - if (!$init_made) { - $this->Application->InitParser(true); - $init_made = true; - } - - $template = 'theme:' . $this->_themeNames[$theme_id] . '/' . $template; - $template_file = $this->Application->TemplatesCache->GetRealFilename($template); // ".tpl" was added before - - return $this->parseTemplateMetaInfo($template_file); - } - - function parseTemplateMetaInfo($template_file) - { - if (!file_exists($template_file)) { - // when template without info it's placed in top category - return Array (); - } - - $template_data = file_get_contents($template_file); - - if (substr($template_data, 0, 6) == '<!--##') { - // template starts with comment in such format - /*<!--## - <NAME></NAME> - <DESC></DESC> - <SECTION>||</SECTION> - ##-->*/ - - $comment_end = strpos($template_data, '##-->'); - if ($comment_end === false) { - // badly formatted comment - return Array (); - } - - $comment = trim( substr($template_data, 6, $comment_end - 6) ); - if (preg_match_all('/<(NAME|DESC|SECTION)>(.*?)<\/(NAME|DESC|SECTION)>/is', $comment, $regs)) { - $ret = Array (); - foreach ($regs[1] as $param_order => $param_name) { - $ret[ strtolower($param_name) ] = trim($regs[2][$param_order]); - } - - if (array_key_exists('section', $ret) && $ret['section']) { - $category_path = explode('||', $ret['section']); - $category_path = array_map('trim', $category_path); - $ret['section'] = implode('||', $category_path); - } - - return $ret; - } - } - - return Array (); - } - - /** - * Updates file system changes to database for all themes (including new ones) - * - */ - function refreshThemes() - { - $themes_found = Array(); - $skip_filenames = Array ('.', '..', 'CVS', '.svn'); - - $fh = opendir($this->themesFolder.'/'); - while (($filename = readdir($fh))) { - if (in_array($filename, $skip_filenames)) { - continue; - } - - if (is_dir($this->themesFolder.'/'.$filename)) { - $theme_id = $this->refreshTheme($filename); - if ($theme_id) { - $themes_found[] = $theme_id; - } - } - } - - $id_field = $this->Application->getUnitOption('theme', 'IDField'); - $table_name = $this->Application->getUnitOption('theme', 'TableName'); - - // 1. only one theme found -> enable it and make primary - /*if (count($themes_found) == 1) { - $sql = 'UPDATE ' . $table_name . ' - SET Enabled = 1, PrimaryTheme = 1 - WHERE ' . $id_field . ' = ' . current($themes_found); - $this->Conn->Query($sql); - }*/ - - // 2. if none themes found -> delete all from db OR delete all except of found themes - $sql = 'SELECT '.$id_field.' - FROM '.$table_name; - if ($themes_found) { - $sql .= ' WHERE '.$id_field.' NOT IN ('.implode(',', $themes_found).')'; - } - $theme_ids = $this->Conn->GetCol($sql); - $this->deleteThemes($theme_ids); - - } - - /** - * Deletes themes with ids passed from db - * - * @param Array $theme_ids - */ - function deleteThemes($theme_ids) - { - if (!$theme_ids) { - return ; - } - - $id_field = $this->Application->getUnitOption('theme', 'IDField'); - $table_name = $this->Application->getUnitOption('theme', 'TableName'); - - $sql = 'DELETE FROM '.$table_name.' - WHERE '.$id_field.' IN ('.implode(',', $theme_ids).')'; - $this->Conn->Query($sql); - - $sql = 'DELETE FROM '.TABLE_PREFIX.'ThemeFiles - WHERE '.$id_field.' IN ('.implode(',', $theme_ids).')'; - $this->Conn->Query($sql); - } - - /** - * Returns current theme (also works in admin) - * - * @return int - */ - function getCurrentThemeId() - { - static $theme_id = null; - - if (isset($theme_id)) { - return $theme_id; - } - - if ($this->Application->IsAdmin()) { - // get theme, that user selected in catalog - $theme_id = $this->Application->RecallVar('theme_id'); - - if ($theme_id === false) { - // query, because "m_theme" is always empty in admin - $id_field = $this->Application->getUnitOption('theme', 'IDField'); - $table_name = $this->Application->getUnitOption('theme', 'TableName'); - - $sql = 'SELECT ' . $id_field . ' - FROM ' . $table_name . ' - WHERE (PrimaryTheme = 1) AND (Enabled = 1)'; - $theme_id = $this->Conn->GetOne($sql); - } - - return $theme_id; - } - - // use current theme, because it's available on Front-End - $theme_id = $this->Application->GetVar('m_theme'); - if (!$theme_id) { - // happens in mod-rewrite mode, then requested template is not found - $theme_id = $this->Application->GetDefaultThemeId(); - } - - return $theme_id; - } - - /** - * Returns page id based on given template - * - * @param string $template - * @return int - */ - function getPageByTemplate($template) - { - $sql = 'SELECT ' . $this->Application->getUnitOption('c', 'IDField') . ' - FROM ' . $this->Application->getUnitOption('c', 'TableName') . ' - WHERE - ( - (NamedParentPath = ' . $this->Conn->qstr('Content/' . $template) . ') OR - (IsSystem = 1 AND CachedTemplate = ' . $this->Conn->qstr($template) . ') - ) - AND (ThemeId = ' . $this->getCurrentThemeId() . ' OR ThemeId = 0)'; - return $this->Conn->GetOne($sql); - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/themes_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.4.2.5 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/image_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/image_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/image_helper.php (nonexistent) @@ -1,594 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 ImageHelper extends kHelper { - - /** - * Parses format string into array - * - * @param string $format sample format: "resize:300x500;wm:inc/wm.png|c|-20" - * @return Array sample result: Array('max_width' => 300, 'max_height' => 500, 'wm_filename' => 'inc/wm.png', 'h_margin' => 'c', 'v_margin' => -20) - */ - function parseFormat($format) - { - $res = Array (); - - $format_parts = explode(';', $format); - foreach ($format_parts as $format_part) { - if (preg_match('/resize:(\d*)x(\d*)/', $format_part, $regs)) { - $res['max_width'] = $regs[1]; - $res['max_height'] = $regs[2]; - } - elseif (preg_match('/wm:([^\|]*)\|([^\|]*)\|([^\|]*)/', $format_part, $regs)) { - $res['wm_filename'] = FULL_PATH.THEMES_PATH.'/'.$regs[1]; - $res['h_margin'] = strtolower($regs[2]); - $res['v_margin'] = strtolower($regs[3]); - } - elseif (preg_match('/crop:([^\|]*)\|([^\|]*)/', $format_part, $regs)) { - $res['crop_x'] = strtolower($regs[1]); - $res['crop_y'] = strtolower($regs[2]); - } - elseif ($format_part == 'img_size' || $format_part == 'img_sizes') { - $res['image_size'] = true; - } - elseif (preg_match('/fill:(.*)/', $format_part, $regs)) { - $res['fill'] = $regs[1]; - } - } - - return $res; - } - - /** - * Resized given image to required dimensions & saves resized image to "resized" subfolder in source image folder - * - * @param string $src_image full path to image (on server) - * @param mixed $max_width maximal allowed resized image width or false if no limit - * @param mixed $max_height maximal allowed resized image height or false if no limit - * @return string direct url to resized image - */ - function ResizeImage($src_image, $max_width, $max_height = null) - { - $image_size = false; - - if(isset($max_height)) { - $params['max_height'] = $max_height; - $params['max_width'] = $max_width; - } - else { - $params = $this->parseFormat($max_width); - - if (array_key_exists('image_size', $params)) { - // image_size param shouldn't affect resized file name (crc part) - $image_size = $params['image_size']; - unset($params['image_size']); - } - } - - if ($params['max_width'] > 0 || $params['max_height'] > 0) { - list ($params['target_width'], $params['target_height'], $needs_resize) = $this->GetImageDimensions($src_image, $params['max_width'], $params['max_height'], $params); - - if (!is_numeric($params['max_width'])) { - $params['max_width'] = $params['target_width']; - } - - if (!is_numeric($params['max_height'])) { - $params['max_height'] = $params['target_height']; - } - - $src_path = dirname($src_image); - - if ($needs_resize || array_key_exists('wm_filename', $params) && $params['wm_filename']) { - // resize required OR watermarking required -> change resulting image name ! - $dst_image = preg_replace('/^'.preg_quote($src_path, '/').'(.*)\.(.*)$/', $src_path . DIRECTORY_SEPARATOR . 'resized\\1_' . crc32(serialize($params)) . '.\\2', $src_image); - if (!file_exists($dst_image) || filemtime($src_image) > filemtime($dst_image)) { - // resized image not available OR should be recreated due source image change - $params['dst_image'] = $dst_image; - $image_resized = $this->ScaleImage($src_image, $params); - if (!$image_resized) { - // resize failed, because of server error - $dst_image = $src_image; - } - } - - // resize/watermarking ok - $src_image = $dst_image; - } - } - - if ($image_size) { - // return only image size (resized or not) - $image_info = $this->getImageInfo($src_image); - return $image_info ? $image_info[3] : ''; - } - - $base_url = rtrim($this->Application->BaseURL(), '/'); - return str_replace(DIRECTORY_SEPARATOR, '/', preg_replace('/^'.preg_quote(FULL_PATH, '/').'(.*)/', $base_url.'\\1', $src_image)); - } - - /** - * Proportionally resizes given image to destination dimensions - * - * @param string $src_image full path to source image (already existing) - * @param string $dst_image full path to destination image (will be created) - * @param int $dst_width destination image width (in pixels) - * @param int $dst_height destination image height (in pixels) - */ - function ScaleImage($src_image, $params) - { - $image_info = $this->getImageInfo($src_image); - if (!$image_info) { - return false; - } - - /*list ($params['max_width'], $params['max_height'], $resized) = $this->GetImageDimensions($src_image, $params['max_width'], $params['max_height'], $params); - if (!$resized) { - // image dimensions are smaller or equals to required dimensions - return false; - }*/ - - if (!$this->Application->ConfigValue('ForceImageMagickResize') && function_exists('imagecreatefromjpeg')) { - // try to resize using GD - $resize_map = Array ( - 'image/jpeg' => 'imagecreatefromjpeg:imagejpeg:jpg', - 'image/gif' => 'imagecreatefromgif:imagegif:gif', - 'image/png' => 'imagecreatefrompng:imagepng:png', - 'image/bmp' => 'imagecreatefrombmp:imagejpeg:bmp', - ); - - $mime_type = $image_info['mime']; - if (!isset($resize_map[$mime_type])) { - return false; - } - - list ($read_function, $write_function, $file_extension) = explode(':', $resize_map[$mime_type]); - - $src_image_rs = @$read_function($src_image); - if ($src_image_rs) { - // when source image has large dimensions (over 1MB filesize), then 16M is not enough - set_time_limit(0); - ini_set('memory_limit', -1); - - $dst_image_rs = imagecreatetruecolor($params['target_width'], $params['target_height']); // resize target size - - if ($file_extension == 'png') { - // preserve transparency of PNG images - $transparent_color = imagecolorallocate($dst_image_rs, 0, 0, 0); - imagecolortransparent($dst_image_rs, $transparent_color); - } - - // 1. resize - imagecopyresampled($dst_image_rs, $src_image_rs, 0, 0, 0, 0, $params['target_width'], $params['target_height'], $image_info[0], $image_info[1]); - - $watermark_size = 'target'; - - if (array_key_exists('crop_x', $params) || array_key_exists('crop_y', $params)) { - // 2.1. crop image to given size - $dst_image_rs =& $this->_cropImage($dst_image_rs, $params); - $watermark_size = 'max'; - } elseif (array_key_exists('fill', $params)) { - // 2.2. fill image margins from resize with given color - $dst_image_rs =& $this->_applyFill($dst_image_rs, $params); - $watermark_size = 'max'; - } - - // 3. apply watermark - $dst_image_rs =& $this->_applyWatermark($dst_image_rs, $params[$watermark_size . '_width'], $params[$watermark_size . '_height'], $params); - - return @$write_function($dst_image_rs, $params['dst_image'], 100); - } - } - else { - // try to resize using ImageMagick - // TODO: implement crop and watermarking using imagemagick - exec('/usr/bin/convert '.$src_image.' -resize '.$params['target_width'].'x'.$params['target_height'].' '.$params['dst_image'], $shell_output, $exec_status); - return $exec_status == 0; - } - - return false; - } - - /** - * Fills margins (if any) of resized are with given color - * - * @param resource $src_image_rs resized image resource - * @param Array $params crop parameters - * @return resource - */ - function &_applyFill(&$src_image_rs, $params) - { - $x_position = round(($params['max_width'] - $params['target_width']) / 2); // center - $y_position = round(($params['max_height'] - $params['target_height']) / 2); // center - - // crop resized image - $fill_image_rs = imagecreatetruecolor($params['max_width'], $params['max_height']); - - $fill = $params['fill']; - - if (substr($fill, 0, 1) == '#') { - // hexdecimal color - $color = imagecolorallocate($fill_image_rs, hexdec( substr($fill, 1, 2) ), hexdec( substr($fill, 3, 2) ), hexdec( substr($fill, 5, 2) )); - } - else { - // for now we don't support color names, but we will in future - return $src_image_rs; - } - - imagefill($fill_image_rs, 0, 0, $color); - imagecopy($fill_image_rs, $src_image_rs, $x_position, $y_position, 0, 0, $params['target_width'], $params['target_height']); - - return $fill_image_rs; - } - - /** - * Crop given image resource using given params and return resulting image resource - * - * @param resource $src_image_rs resized image resource - * @param Array $params crop parameters - * @return resource - */ - function &_cropImage(&$src_image_rs, $params) - { - if ($params['crop_x'] == 'c') { - $x_position = round(($params['max_width'] - $params['target_width']) / 2); // center - } - elseif ($params['crop_x'] >= 0) { - $x_position = $params['crop_x']; // margin from left - } - else { - $x_position = $params['target_width'] - ($params['max_width'] - $params['crop_x']); // margin from right - } - - if ($params['crop_y'] == 'c') { - $y_position = round(($params['max_height'] - $params['target_height']) / 2); // center - } - elseif ($params['crop_y'] >= 0) { - $y_position = $params['crop_y']; // margin from top - } - else { - $y_position = $params['target_height'] - ($params['max_height'] - $params['crop_y']); // margin from bottom - } - - // crop resized image - $crop_image_rs = imagecreatetruecolor($params['max_width'], $params['max_height']); - $crop_image_rs =& $this->_applyFill($crop_image_rs, $params); - - imagecopy($crop_image_rs, $src_image_rs, $x_position, $y_position, 0, 0, $params['target_width'], $params['target_height']); - - return $crop_image_rs; - } - - /** - * Apply watermark (transparent PNG image) to given resized image resource - * - * @param resource $src_image_rs - * @param int $max_width - * @param int $max_height - * @param Array $params - * @return resource - */ - function &_applyWatermark(&$src_image_rs, $max_width, $max_height, $params) - { - $watermark_file = array_key_exists('wm_filename', $params) ? $params['wm_filename'] : false; - - if (!$watermark_file || !file_exists($watermark_file)) { - // no watermark required, or provided watermark image is missing - return $src_image_rs; - } - - $watermark_img_rs = imagecreatefrompng($watermark_file); - list ($watermark_width, $watermark_height) = $this->getImageInfo($watermark_file); - - imagealphablending($src_image_rs, true); - - if ($params['h_margin'] == 'c') { - $x_position = round($max_width / 2 - $watermark_width / 2); // center - } - elseif ($params['h_margin'] >= 0) { - $x_position = $params['h_margin']; // margin from left - } - else { - $x_position = $max_width - ($watermark_width - $params['h_margin']); // margin from right - } - - if ($params['v_margin'] == 'c') { - $y_position = round($max_height / 2 - $watermark_height / 2); // center - } - elseif ($params['v_margin'] >= 0) { - $y_position = $params['v_margin']; // margin from top - } - else { - $y_position = $max_height - ($watermark_height - $params['v_margin']); // margin from bottom - } - - imagecopy($src_image_rs, $watermark_img_rs, $x_position, $y_position, 0, 0, $watermark_width, $watermark_height); - - return $src_image_rs; - } - - /** - * Returns destination image size without actual resizing (useful for <img .../> HTML tag) - * - * @param string $src_image full path to source image (already existing) - * @param int $dst_width destination image width (in pixels) - * @param int $dst_height destination image height (in pixels) - * @param Array $params - * @return Array resized image dimensions (0 - width, 1 - height) - */ - function GetImageDimensions($src_image, $dst_width, $dst_height, $params) - { - $image_info = $this->getImageInfo($src_image); - if (!$image_info) { - return false; - } - - $orig_width = $image_info[0]; - $orig_height = $image_info[1]; - - $too_large = is_numeric($dst_width) ? ($orig_width > $dst_width) : false; - $too_large = $too_large || (is_numeric($dst_height) ? ($orig_height > $dst_height) : false); - - if ($too_large) { - $width_ratio = $dst_width ? $dst_width / $orig_width : 1; - $height_ratio = $dst_height ? $dst_height / $orig_height : 1; - - if (array_key_exists('crop_x', $params) || array_key_exists('crop_y', $params)) { - // resize by smallest inverted radio - $resize_by = $this->_getCropImageMinRatio($image_info, $dst_width, $dst_height); - $ratio = $resize_by == 'width' ? $width_ratio : $height_ratio; - } - else { - $ratio = min($width_ratio, $height_ratio); - } - - $width = ceil($orig_width * $ratio); - $height = ceil($orig_height * $ratio); - } - else { - $width = $orig_width; - $height = $orig_height; - } - - return Array ($width, $height, $too_large); - } - - /** - * Returns ratio type with smaller relation of original size to target size - * - * @param Array $image_info image information from "ImageHelper::getImageInfo" - * @param int $dst_width destination image width (in pixels) - * @param int $dst_height destination image height (in pixels) - * @return Array - */ - function _getCropImageMinRatio($image_info, $dst_width, $dst_height) - { - $width_ratio = $dst_width ? $image_info[0] / $dst_width : 1; - $height_ratio = $dst_height ? $image_info[1] / $dst_height : 1; - - return $width_ratio < $height_ratio ? 'width' : 'height'; - } - - /** - * Returns image dimensions + checks if given file is existing image - * - * @param string $src_image full path to source image (already existing) - * @return mixed - */ - function getImageInfo($src_image) - { - if (!file_exists($src_image)) { - return false; - } - - $image_info = @getimagesize($src_image); - if (!$image_info) { - trigger_error('Image <b>'.$src_image.'</b> <span class="debug_error">missing or invalid</span>', E_USER_WARNING); - return false; - } - - return $image_info; - } - - /** - * Returns maximal image size (width & height) among fields specified - * - * @param kDBItem $object - * @param string $fields - * @param string $format any format, that returns full url (e.g. files_resized:WxH, resize:WxH, full_url, full_urls) - * @return string - */ - function MaxImageSize(&$object, $fields, $format = null) - { - static $cached_sizes = Array (); - - $cache_key = $object->getPrefixSpecial().'_'.$object->GetID(); - if (!isset($cached_sizes[$cache_key])) { - $images = Array (); - - $fields = explode(',', $fields); - foreach ($fields as $field) { - $image_data = $object->GetField($field, $format); - if (!$image_data) { - continue; - } - - $images = array_merge($images, explode('|', $image_data)); - } - - $max_width = 0; - $max_height = 0; - $base_url = rtrim($this->Application->BaseURL(), '/'); - - foreach ($images as $image_url) { - $image_path = preg_replace('/^'.preg_quote($base_url, '/').'(.*)/', FULL_PATH.'\\1', $image_url); - $image_info = $this->getImageInfo($image_path); - $max_width = max($max_width, $image_info[0]); - $max_height = max($max_height, $image_info[1]); - } - - $cached_sizes[$cache_key] = Array ($max_width, $max_height); - } - - return $cached_sizes[$cache_key]; - } - - /** - * Puts existing item images (from subitem) to virtual fields (in main item) - * - * @param kCatDBItem $object - */ - function LoadItemImages(&$object) - { - if (!$this->Application->prefixRegistred($object->Prefix.'-img')) { - return ; - } - - $max_image_count = $this->Application->ConfigValue($object->Prefix.'_MaxImageCount'); - - $sql = 'SELECT * - FROM '.TABLE_PREFIX.'Images - WHERE ResourceId = '.$object->GetDBField('ResourceId').' - ORDER BY Priority DESC - LIMIT 0, ' . (int)$max_image_count; - $item_images = $this->Conn->Query($sql); - - $image_counter = 1; - foreach ($item_images as $item_image) { - $image_path = $item_image['ThumbPath']; - if ($item_image['DefaultImg'] == 1 || $item_image['Name'] == 'main') { - // process primary image separately - if (array_key_exists('PrimaryImage', $object->Fields)) { - $object->SetDBField('PrimaryImage', $image_path); - $object->SetOriginalField('PrimaryImage', $image_path); - $object->Fields['PrimaryImage']['original_field'] = $item_image['Name']; - - $this->_loadCustomFields($object, $item_image, 0); - } - continue; - } - - if (abs($item_image['Priority'])) { - // use Priority as image counter, when specified - $image_counter = abs($item_image['Priority']); - } - - if (array_key_exists('Image'.$image_counter, $object->Fields)) { - $object->SetDBField('Image'.$image_counter, $image_path); - $object->SetOriginalField('Image'.$image_counter, $image_path); - $object->Fields['Image'.$image_counter]['original_field'] = $item_image['Name']; - - $this->_loadCustomFields($object, $item_image, $image_counter); - } - $image_counter++; - } - } - - /** - * Saves newly uploaded images to external image table - * - * @param kCatDBItem $object - */ - function SaveItemImages(&$object) - { - if (!$this->Application->prefixRegistred($object->Prefix.'-img')) { - return ; - } - - $table_name = $this->Application->getUnitOption('img', 'TableName'); - $max_image_count = $this->Application->getUnitOption($object->Prefix, 'ImageCount'); // $this->Application->ConfigValue($object->Prefix.'_MaxImageCount'); - - $i = 0; - while ($i < $max_image_count) { - $field = $i ? 'Image'.$i : 'PrimaryImage'; - $field_options = $object->GetFieldOptions($field); - - $image_src = $object->GetDBField($field); - if ($image_src) { - if (isset($field_options['original_field'])) { - $key_clause = 'Name = '.$this->Conn->qstr($field_options['original_field']).' AND ResourceId = '.$object->GetDBField('ResourceId'); - - if ($object->GetDBField('Delete'.$field)) { - // if item was cloned, then new filename is in db (not in $image_src) - $sql = 'SELECT ThumbPath - FROM '.$table_name.' - WHERE '.$key_clause; - $image_src = $this->Conn->GetOne($sql); - if (@unlink(FULL_PATH.$image_src)) { - $sql = 'DELETE FROM '.$table_name.' - WHERE '.$key_clause; - $this->Conn->Query($sql); - } - } - else { - // image record found -> update - $fields_hash = Array ( - 'ThumbPath' => $image_src, - ); - $this->_saveCustomFields($object, $fields_hash, $i); - - $this->Conn->doUpdate($fields_hash, $table_name, $key_clause); - } - } - else { - // image record not found -> create - $fields_hash = Array ( - 'ResourceId' => $object->GetDBField('ResourceId'), - 'Name' => $field, - 'AltName' => $field, - 'Enabled' => STATUS_ACTIVE, - 'DefaultImg' => $i ? 0 : 1, // first image is primary, others not primary - 'ThumbPath' => $image_src, - 'Priority' => ($i == 0)? 0 : $i * (-1), - ); - $this->_saveCustomFields($object, $fields_hash, $i); - - $this->Conn->doInsert($fields_hash, $table_name); - $field_options['original_field'] = $field; - $object->SetFieldOptions($field, $field_options); - } - } - $i++; - } - } - - /** - * Adds ability to load custom fields along with main image field - * - * @param kCatDBItem $object - * @param Array $fields_hash - * @param int $counter 0 - primary image, other number - additional image number - */ - function _loadCustomFields(&$object, $fields_hash, $counter) - { - $field_name = $counter ? 'Image' . $counter . 'Alt' : 'PrimaryImageAlt'; - - $object->SetDBField($field_name, (string)$fields_hash['AltName']); - } - - /** - * Adds ability to save custom field along with main image save - * - * @param kCatDBItem $object - * @param Array $fields_hash - * @param int $counter 0 - primary image, other number - additional image number - */ - function _saveCustomFields(&$object, &$fields_hash, $counter) - { - $field_name = $counter ? 'Image' . $counter . 'Alt' : 'PrimaryImageAlt'; - - $fields_hash['AltName'] = (string)$object->GetDBField($field_name); - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/image_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.6.2.14 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/priority_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/priority_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/priority_helper.php (nonexistent) @@ -1,175 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 kPriorityHelper extends kHelper { - - - /** - * Prepares options for priority dropdown - * - * @param kEvent $event - * @param bool $is_new for newly created items add new priority to the end - * @param string $constrain constrain for priority selection (if any) - * - */ - function preparePriorities(&$event, $is_new = false, $constrain = '') - { - $object =& $event->getObject(); - - $field_options = $object->GetFieldOptions('Priority'); - $table_name = $this->Application->getUnitOption($event->Prefix, 'TableName'); - - $sql = 'SELECT COUNT(*) - FROM '.$table_name; - if ($constrain) { - $sql .= ' WHERE '.$constrain; - } - - if (!isset($object->Fields['OldPriority'])) { - $object->VirtualFields['OldPriority'] = Array('type' => 'int', 'default' => 0); - } - - $items_count = $this->Conn->GetOne($sql); - - // instanceof is not used, because PHP4 doesn't support it - $current_priority = is_a($object, 'kDBList') ? 0 : $object->GetDBField('Priority'); - - if ($is_new || $current_priority == -($items_count+1)) { - $items_count++; - } - - if ($is_new) { - // add new item to the end of list - $object->SetDBField('Priority', -$items_count); - $object->SetDBField('OldPriority', -$items_count); - } - else { - $object->SetDBField('OldPriority', $current_priority); - } - - for ($i = 1; $i <= $items_count; $i++) { - $field_options['options'][-$i] = $i; - } - - $object->SetFieldOptions('Priority', $field_options); - // storing prioriry right after load for comparing when updating - } - - /** - * Updates priorities for changed items - * - * @param kEvent $event - * @param Array $changes = Array (ID => Array ('parent' => ..., 'new' => ..., 'old' => ...), ...) - * @param Array $new_ids = Array (temp_id => live_id) - * @param string $constrain - */ - function updatePriorities(&$event, $changes, $new_ids, $constrain = '') - { - if (!$changes) { - // no changes to process - return Array (); - } - list ($id, $pair) = each($changes); - - if (!$id && !array_key_exists('parent', $pair)) { - // adding new item without constrain -> priority stays the same - return Array ($id); - } - - $id_field = $this->Application->getUnitOption($event->Prefix, 'IDField'); - $table_name = $this->Application->getUnitOption($event->Prefix, 'TableName'); - - $ids = array(); - $not_processed = array_keys($changes); - - foreach ($changes as $id => $pair) { - array_push($ids, $id); - $constrain = isset($pair['parent']) ? 'ParentId = '.$pair['parent'].' AND ' : ''; - - if ($pair['old'] == 'new') { - // replace 0 with newly created item id (from $new_ids mapping) - $not_processed[ array_search($id, $not_processed) ] = $new_ids[$id]; - $id = $new_ids[$id]; - - $sql = 'SELECT MIN(Priority) - FROM '.$table_name.' - WHERE '.$constrain.' '.$id_field.' NOT IN ('.implode(',', $not_processed).')'; - $min_priority = (int)$this->Conn->GetOne($sql) - 1; - - if ($pair['new'] < $min_priority) { - $pair['new'] = $min_priority; - } - $pair['old'] = $min_priority; - } - - if ($pair['new'] < $pair['old']) { - $set = ' SET Priority = Priority + 1'; - $where =' WHERE '.$constrain.' - Priority >= '.$pair['new'].' - AND - Priority < '.$pair['old'].' - AND - '.$id_field.' NOT IN ('.implode(',', $not_processed).')'; - } - elseif ($pair['new'] > $pair['old']) { - $set = ' SET Priority = Priority - 1'; - $where =' WHERE '.$constrain.' - Priority > '.$pair['old'].' - AND - Priority <= '.$pair['new'].' - AND - '.$id_field.' NOT IN ('.implode(',', $not_processed).')'; - } - else { - $set = 'SET Priority = '.$pair['new']; - $where = ' WHERE '.$id_field.' = '.$id; - } - $ids = array_merge($ids, $this->Conn->GetCol('SELECT '.$id_field.' FROM '.$table_name.$where)); - $q = 'UPDATE '.$table_name.' '.$set.$where; - $this->Conn->Query($q); - - unset( $not_processed[array_search($id, $not_processed)] ); - } - return $ids; - } - - /** - * Recalculates priorities - * - * @param kEvent $event - * @param string $constrain - */ - function recalculatePriorities(&$event, $constrain = '') - { - $id_field = $this->Application->getUnitOption($event->Prefix, 'IDField'); - $table_name = $this->Application->getUnitOption($event->Prefix, 'TableName'); - - $sql = 'SELECT '.$id_field.' - FROM '.$table_name. - ($constrain ? ' WHERE '.$constrain : '').' - ORDER BY Priority DESC'; - - $items = $this->Conn->GetCol($sql); - - foreach ($items as $item_number => $item_id) { - $sql = 'UPDATE '.$table_name.' - SET Priority = '.-($item_number + 1).' - WHERE '.$id_field.' = '.$item_id; - $this->Conn->Query($sql); - } - return $items; - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/priority_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.2.2.4 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/template_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/template_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/template_helper.php (nonexistent) @@ -1,448 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 TemplateHelper extends kHelper { - - /** - * parser element location information - * - * @var Array - */ - var $_blockLocation = Array (); - - /** - * Block name, that will be used - * - * @var string - */ - var $_blockName = ''; - - /** - * Function name, that represents compiled block - * - * @var sting - */ - var $_functionName = ''; - - /** - * Errors found during template parsing - * - * @var Array - */ - var $_parseErrors = Array (); - - /** - * Source template, that is being edited - * - * @var string - */ - var $_sourceTemplate = ''; - - var $_initMade = false; - - /** - * Performs init ot helper - * - * @param kDBItem $object - */ - function InitHelper(&$object) - { - if ($this->_initMade) { - return ; - } - - define('DBG_IGNORE_FATAL_ERRORS', 1); - - // 1. get block information - $block_info = $this->Application->GetVar('block'); - list ($this->_blockName, $this->_functionName) = explode(':', $block_info); - - $this->_parseTemplate($object); - - if (array_key_exists($this->_functionName, $this->Application->Parser->ElementLocations)) { - $this->_blockLocation = $this->Application->Parser->ElementLocations[$this->_functionName]; - } - - $this->_initMade = true; - } - - function _getSourceTemplate() - { - // get source template - $t = $this->Application->GetVar('source'); - - if (!$this->Application->TemplatesCache->TemplateExists($t)) { - $cms_handler =& $this->Application->recallObject('st_EventHandler'); - /* @var $cms_handler StructureEventHandler */ - - $t = ltrim($cms_handler->GetDesignTemplate($t), '/'); - } - - $this->_sourceTemplate = $t; - } - - function _getThemeName() - { - $theme_id = (int)$this->Application->GetVar('theme_id'); - - $sql = 'SELECT Name - FROM ' . $this->Application->getUnitOption('theme', 'TableName') . ' - WHERE ' . $this->Application->getUnitOption('theme', 'IDField') . ' = ' . $theme_id; - return $this->Conn->GetOne($sql); - } - - /** - * Render source template to get parse errors OR it's element locations - * - * @param kDBItem $object - * @param string $append - * @return bool - */ - function _parseTemplate(&$object, $append = '') - { - // 1. set internal error handler to catch all parsing errors - $error_handlers = $this->Application->errorHandlers; - $this->Application->errorHandlers = Array ( - Array (&$this, '_saveError'), - ); - - // 2. parse template - $this->Application->InitParser( $this->_getThemeName() ); // we have no parser when saving block content - - $this->_getSourceTemplate(); - - // design templates have leading "/" in the beginning - $this->Application->Parser->Run($this->_sourceTemplate . $append); - - // 3. restore original error handler - $this->Application->errorHandlers = $error_handlers; - - if ($this->_parseErrors) { - if ($this->_isMainTemplate()) { - // 3.1. delete temporary file, that was parsed - $filename = $this->_getTemplateFile(false, $append . '.tpl'); - if (!unlink($filename)) { - $error_file = $this->_getTemplateFile(true, $append . '.tpl'); - $object->SetError('FileContents', 'template_delete_failed', '+Failed to delete temporary template "<strong>' . $error_file . '</strong>"'); - return false; - } - } - else { - // 3.2. restore backup - if (!rename($this->_getTemplateFile(false, '.tpl.bak'), $this->_getTemplateFile(false))) { - $error_file = $this->_getTemplateFile(true); - $object->SetError('FileContents', 'template_restore_failed', '+Failed to restore template "<strong>' . $error_file . '</strong>" from backup.'); - return false; - } - } - - return false; - } - - return true; - } - - /** - * Move elements in template and save changes, when possible - * - * @param Array $target_order - * @return bool - */ - function moveTemplateElements($target_order) - { - // 2. parse template - $this->Application->InitParser(); // we have no parser when saving block content - - $this->_getSourceTemplate(); - - $filename = $this->Application->TemplatesCache->GetRealFilename($this->_sourceTemplate) . '.tpl'; - if (!is_writable($filename)) { - // we can't save changes, don't bother calculating new template contents - return false; - } - - $data = file_get_contents($filename); - - $line_ending = strpos($data, "\r") !== false ? "\r\n" : "\n"; - - // 1. get location of movable areas - $mask = ''; - $start_pos = 0; - $elements = Array (); - $areas = $this->_getDivPairs($data, 'movable-area'); - foreach ($areas as $area_index => $area) { - // 1.1. get locations of all movable elements inside given area - $area_content = substr($area['data'], $area['open_len'], -$area['close_len']); - $elements = array_merge($elements, $this->_getDivPairs($area_content, 'movable-element', $area_index, $area['open_pos'] + $area['open_len'])); - - // 1.2. prepare mask to place movable elements into (don't include movable area div ifself) - $mask .= "\t" . substr($data, $start_pos, $area['open_pos'] + $area['open_len'] - $start_pos) . $line_ending . "\t\t" . '#AREA' . $area_index . '#' . $line_ending; - $start_pos = $area['close_pos'] - $area['close_len']; - } - $mask = trim($mask . "\t" . substr($data, $area['close_pos'] - $area['close_len'])); - - if (!$elements) { - // no elements found - return false; - } - - foreach ($areas as $area_index => $area) { - $area_content = ''; - $target_elements = $target_order[$area_index]; - foreach ($target_order[$area_index] as $old_location) { - $area_content .= $elements[$old_location]['data'] . $line_ending . "\t\t"; - } - - $mask = str_replace('#AREA' . $area_index . '#', trim($area_content), $mask); - } - - $fp = fopen($filename, 'w'); - fwrite($fp, $mask); - fclose($fp); - - return true; - } - - /** - * Extracts div pairs with given class from given text - * - * @param string $data - * @param string $class - * @param int $area - * @param int $offset - * @return Array - */ - function _getDivPairs(&$data, $class, $area = null, $offset = 0) - { - preg_match_all('/(<div[^>]*>)|(<\/div>)/s', $data, $divs, PREG_SET_ORDER + PREG_OFFSET_CAPTURE); - - $skip_count = 0; - $pairs = Array (); - - foreach ($divs as $div) { - if (strpos($div[0][0], '/') === false) { - // opening div - if (strpos($div[0][0], $class) !== false) { - $pair = Array ('open_pos' => $div[0][1], 'open_len' => strlen($div[0][0])); - $skip_count = 0; - } - else { - $skip_count++; - } - } - else { - // closing div - if ($skip_count == 0) { - $pair['close_len'] = strlen($div[0][0]); - $pair['close_pos'] = $div[0][1] + $pair['close_len']; - $pair['data'] = substr($data, $pair['open_pos'], $pair['close_pos'] - $pair['open_pos']); - - if (isset($area)) { - $pair['open_pos'] += $offset; - $pair['close_pos'] += $offset; - // index indicates area - $pairs['a' . $area . 'e' . count($pairs)] = $pair; - } - else { - $pairs[] = $pair; - } - } - else { - $skip_count--; - } - } - } - - return $pairs; - } - - /** - * Returns information about parser element locations in template - * - * @param Array $params - * @return mixed - */ - function blockInfo($info_type) - { - switch ($info_type) { - case 'block_name': - return $this->_blockName; - break; - - case 'function_name': - return $this->_functionName; - break; - - case 'start_pos': - case 'end_pos': - case 'template': - if (!array_key_exists($info_type, $this->_blockLocation)) { - // invalid block name - return 'invalid block name'; - } - - return $this->_blockLocation[$info_type]; - break; - - case 'template_file': - return $this->_getTemplateFile(true); - break; - - case 'content': - $template_body = file_get_contents( $this->_getTemplateFile() ); - $length = $this->_blockLocation['end_pos'] - $this->_blockLocation['start_pos']; - - return substr($template_body, $this->_blockLocation['start_pos'], $length); - break; - } - - return 'undefined'; - } - - /** - * Main template being edited (parse copy, instead of original) - * - * @return bool - */ - function _isMainTemplate() - { - return $this->_blockLocation['template'] == $this->_sourceTemplate; - } - - /** - * Returns filename, that contains template, where block is located - * - * @return string - */ - function _getTemplateFile($relative = false, $extension = '.tpl') - { - $filename = $this->Application->TemplatesCache->GetRealFilename( $this->_blockLocation['template'] ) . $extension; - - if ($relative) { - $filename = preg_replace('/^' . preg_quote(FULL_PATH, '/') . '/', '', $filename, 1); - } - - return $filename; - } - - /** - * Saves new version of block to template, where it's located - * - * @param kDBItem $object - */ - function saveBlock(&$object) - { - $main_template = $this->_isMainTemplate(); - $filename = $this->_getTemplateFile(false); - - // 1. get new template content - $new_template_body = $this->_getNewTemplateContent($object, $filename, $lines_before); - if (is_bool($new_template_body) && ($new_template_body === true)) { - // when nothing changed -> stop processing - return true; - } - - // 2. backup original template - if (!$main_template && !copy($filename, $filename . '.bak')) { - // backup failed - $error_file = $this->_getTemplateFile(true, '.tpl.bak'); - $object->SetError('FileContents', 'template_backup_failed', '+Failed to create backup template "<strong>' . $error_file . '</strong>" backup.'); - return false; - } - - // 3. save changed template - $save_filename = $this->_getTemplateFile(false, $main_template ? '.tmp.tpl' : '.tpl'); - $fp = fopen($save_filename, 'w'); - if (!$fp) { - // backup template create failed OR existing template save - $error_file = $this->_getTemplateFile(true, $main_template ? '.tmp.tpl' : '.tpl'); - $object->SetError('FileContents', 'template_changes_save_failed', '+Failed to save template "<strong>' . $error_file . '</strong>" changes.'); - return false; - } - fwrite($fp, $new_template_body); - fclose($fp); - - // 3. parse template to check for errors - $this->_parseTemplate($object, $main_template ? '.tmp' : ''); - - if ($this->_parseErrors) { - $error_msg = Array (); - foreach ($this->_parseErrors as $error_data) { - if (preg_match('/line ([\d]+)/', $error_data['msg'], $regs)) { - // another line number inside message -> patch it - $error_data['msg'] = str_replace('line ' . $regs[1], 'line ' . ($regs[1] - $lines_before), $error_data['msg']); - } - - $error_msg[] = $error_data['msg'] . ' at line ' . ($error_data['line'] - $lines_before); - } - - $object->SetError('FileContents', 'template_syntax_error', '+Template syntax errors:<br/>' . implode('<br/>', $error_msg)); - return false; - } - - if ($main_template) { - // 4.1. replace original file with temporary - if (!rename($this->_getTemplateFile(false, '.tmp.tpl'), $filename)) { - // failed to save new content to original template - $error_file = $this->_getTemplateFile(true); - $object->SetError('FileContents', 'template_save_failed', '+Failed to save template "<strong>' . $error_file . '</strong>".'); - return false; - } - } - else { - // 4.2. delete backup - unlink( $this->_getTemplateFile(false, '.tpl.bak') ); - } - - return true; - } - - /** - * Returns new template content of "true", when nothing is changed - * - * @param kDBItem $object - * @param string $filename - * @param int $lines_before - * @return mixed - */ - function _getNewTemplateContent(&$object, $filename, &$lines_before) - { - $new_content = $object->GetDBField('FileContents'); - - $template_body = file_get_contents($filename); - $lines_before = substr_count(substr($template_body, 0, $this->_blockLocation['start_pos']), "\n"); - - $new_template_body = substr($template_body, 0, $this->_blockLocation['start_pos']) . - $new_content . - substr($template_body, $this->_blockLocation['end_pos']); - - return crc32($template_body) == crc32($new_template_body) ? true : $new_template_body; - } - - function _saveError($errno, $errstr, $errfile, $errline, $errcontext) - { - if ($errno != E_USER_ERROR) { - // ignore all minor errors, except fatals from parser - return true; - } - - /*if (defined('E_STRICT') && ($errno == E_STRICT)) { - // always ignore strict errors here (specially when not in debug mode) - return true; - }*/ - - $this->_parseErrors[] = Array ('msg' => $errstr, 'file' => $errfile, 'line' => $errline); - return true; - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/template_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.1.2.5 \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/mod_rewrite_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/mod_rewrite_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/mod_rewrite_helper.php (nonexistent) @@ -1,921 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 kModRewriteHelper extends kHelper { - - /** - * Holds a refererence to httpquery - * - * @var kHttpQuery - */ - var $HTTPQuery = null; - - /** - * Parts found during url parsing - * - * @var Array - */ - var $_partsFound = Array (); - - /** - * Category item prefix, that was found - * - * @var string - */ - var $_modulePrefix = false; - - /** - * Constructor of kModRewriteHelper class - * - * @return kModRewriteHelper - */ - function kModRewriteHelper() - { - parent::kHelper(); - - $this->HTTPQuery =& $this->Application->recallObject('HTTPQuery'); - } - - function processRewriteURL() - { - $passed = Array (); - $url = $this->HTTPQuery->Get('_mod_rw_url_'); - if (substr($url, -5) == '.html') { - $url = substr($url, 0, strlen($url) - 5); - } - - $restored = false; - $sql = 'SELECT Data, Cached - FROM ' . TABLE_PREFIX . 'Cache - WHERE VarName = "mod_rw_' . md5($url) . '"'; - $cache = $this->Conn->GetRow($sql); - - if (false && $cache && $cache['Cached'] > 0) { - // not used for now - $cache = unserialize($cache['Data']); - $vars = $cache['vars']; - $passed = $cache['passed']; - $restored = true; - } - else { - $vars = $this->parseRewriteURL($url); - $passed = $vars['pass']; // also used in bottom of this method - unset($vars['pass']); - - $cache = Array ('vars' => $vars, 'passed' => $passed); - - $fields_hash = Array ( - 'VarName' => 'mod_rw_' . md5($url), - 'Data' => serialize($cache), - 'Cached' => adodb_mktime(), - ); - $this->Conn->doInsert($fields_hash, TABLE_PREFIX . 'Cache', 'REPLACE'); - - if (array_key_exists('t', $this->HTTPQuery->Post) && $this->HTTPQuery->Post['t']) { - // template from POST overrides template from URL. - $vars['t'] = $this->HTTPQuery->Post['t']; - if (isset($vars['is_virtual']) && $vars['is_virtual']) { - $vars['m_cat_id'] = 0; // this is virtual template category (for Proj-CMS) - } - } - - unset($vars['is_virtual']); - } - - foreach ($vars as $name => $value) { - $this->HTTPQuery->Set($name,$value); - } - -// if ($restored) { - $this->InitAll(); -// } - - $this->HTTPQuery->finalizeParsing($passed); - } - - function parseRewriteURL($url) - { - $sql = 'SELECT Data, Cached - FROM ' . TABLE_PREFIX . 'Cache - WHERE VarName = "mod_rw_' . md5($url) . '"'; - $vars = $this->Conn->GetRow($sql); - - if (false && $vars && $vars['Cached'] > 0) { - // not used for now - $vars = unserialize($menu['Data']); - return $vars; - } - - $vars = Array ('pass' => Array ('m')); - $url_parts = $url ? explode('/', trim($url, '/')) : Array (); - - if (($this->HTTPQuery->Get('rewrite') == 'on') || !$url_parts) { - $this->_setDefaultValues($vars); - } - - if (!$url_parts) { - $this->InitAll(); - $vars['t'] = $this->HTTPQuery->getDefaultTemplate(''); - - return $vars; - } - else { - $vars['t'] = ''; - } - - $this->_parseLanguage($url_parts, $vars); - $this->_parseTheme($url_parts, $vars); - $this->_setDefaultPages($vars); - - if ($this->_parsePage($url_parts, $vars)) { - $this->_partsFound[] = 'parsePage'; - } - - // http://site-url/<language>/<theme>/<category>[_<category_page>]/<template>/<module_page> - // http://site-url/<language>/<theme>/<category>[_<category_page>]/<module_page> (category-based section template) - // http://site-url/<language>/<theme>/<category>[_<category_page>]/<template>/<module_item> - // http://site-url/<language>/<theme>/<category>[_<category_page>]/<module_item> (category-based detail template) - // http://site-url/<language>/<theme>/<rl_injections>/<category>[_<category_page>]/<rl_part> (customized url) - - if ( $this->processRewriteListeners($url_parts, $vars) ) { - return $vars; - } - - if ($this->_parsePhisycalTemplate($url_parts, $vars)) { - $this->_partsFound[] = 'parsePhisycalTemplate'; - } - - if (($this->_modulePrefix === false) && in_array('parseCategory', $this->_partsFound)) { - // no item found, but category found -> module index page - foreach ($this->Application->ModuleInfo as $module_name => $info) { - // no idea what module we are talking about, so pass info form all modules - $vars['pass'][] = $info['Var']; - } - - return $vars; - } - - if (!$this->_partsFound) { - $not_found = $this->Application->ConfigValue('ErrorTemplate'); - $vars['t'] = $not_found ? $not_found : 'error_notfound'; - - $themes_helper =& $this->Application->recallObject('ThemesHelper'); - /* @var $themes_helper kThemesHelper */ - - $vars['m_cat_id'] = $themes_helper->getPageByTemplate($vars['t']); - - header('HTTP/1.0 404 Not Found'); - } - - return $vars; - } - - function InitAll() - { - $this->Application->VerifyLanguageId(); - $this->Application->Phrases->Init('phrases'); - $this->Application->VerifyThemeId(); - } - - /** - * Processes url using rewrite listeners - * - * @param Array $url_parts - * @param Array $vars - * @return bool - */ - function processRewriteListeners(&$url_parts, &$vars) - { - $this->initRewriteListeners(); - - foreach ($this->Application->RewriteListeners as $prefix => $listener) { - $listener_result = $listener[0]->$listener[1](REWRITE_MODE_PARSE, $prefix, $vars, $url_parts); - if ($listener_result === false) { - // will not proceed to other methods - return true; - } - } - - // will proceed to other methods - return false; - } - - /** - * Parses real template name from url - * - * @param Array $url_parts - * @param Array $vars - * @return bool - */ - function _parsePhisycalTemplate($url_parts, &$vars) - { - if (!$url_parts) { - return false; - } - - do { - $template_path = implode('/', $url_parts); - - $t_parts['path'] = dirname($template_path) == '.' ? '' : '/' . dirname($template_path); - $t_parts['file'] = basename($template_path); - - $sql = 'SELECT FileId - FROM ' . TABLE_PREFIX . 'ThemeFiles - WHERE (FilePath = ' . $this->Conn->qstr($t_parts['path']) . ') AND (FileName = ' . $this->Conn->qstr($t_parts['file'] . '.tpl') . ')'; - $template_found = $this->Conn->GetOne($sql); - - if (!$template_found) { - array_shift($url_parts); - } - } while (!$template_found && $url_parts); - - if ($template_found) { - $vars['t'] = $template_path; - return true; - } - - return false; - } - - /** - * Parses category part of url, build main part of url - * - * @param int $rewrite_mode Mode in what rewrite listener was called. Possbile two modes: REWRITE_MODE_BUILD, REWRITE_MODE_PARSE. - * @param string $prefix Prefix, that listener uses for system integration - * @param Array $params Params, that are used for url building or created during url parsing. - * @param Array $url_parts Url parts to parse (only for parsing). - * @param bool $keep_events Keep event names in resulting url (only for building). - * @return bool|string|Array Return true to continue to next listener; return false (when building) not to rewrite given prefix; return false (when parsing) to stop processing at this listener. - */ - function MainRewriteListener($rewrite_mode = REWRITE_MODE_BUILD, $prefix, &$params, &$url_parts, $keep_events = false) - { - if ($rewrite_mode == REWRITE_MODE_BUILD) { - return $this->_buildMainUrl($prefix, $params, $keep_events); - } - - if ( $this->_parseFriendlyUrl($url_parts, $params) ) { - // friendly urls work like exact match only! - return false; - } - - if ($this->_parseCategory($url_parts, $params)) { - $this->_partsFound[] = 'parseCategory'; - } - - return true; - } - - /** - * Build main part of every url - * - * @param string $prefix_special - * @param Array $params - * @param bool $keep_events - * @return string - */ - function _buildMainUrl($prefix_special, &$params, $keep_events) - { - $ret = ''; - list ($prefix) = explode('.', $prefix_special); - - $processed_params = $this->getProcessedParams($prefix_special, $params, $keep_events); - if ($processed_params === false) { - return ''; - } - - // add language - $default_language_id = $this->Application->GetDefaultLanguageId(); - if ($processed_params['m_lang'] && ($processed_params['m_lang'] != $default_language_id)) { - $language_name = $this->Application->getCache('language_names', $processed_params['m_lang']); - if ($language_name === false) { - $sql = 'SELECT PackName - FROM ' . TABLE_PREFIX . 'Language - WHERE LanguageId = ' . $processed_params['m_lang']; - $language_name = $this->Conn->GetOne($sql); - - $this->Application->setCache('language_names', $processed_params['m_lang'], $language_name); - } - - $ret .= $language_name . '/'; - } - - // add theme - $default_theme_id = $this->Application->GetDefaultThemeId(); - if ($processed_params['m_theme'] && ($processed_params['m_theme'] != $default_theme_id)) { - $theme_name = $this->Application->getCache('theme_names', $processed_params['m_theme']); - if ($theme_name === false) { - $sql = 'SELECT Name - FROM ' . TABLE_PREFIX . 'Theme - WHERE ThemeId = ' . $processed_params['m_theme']; - $theme_name = $this->Conn->GetOne($sql); - - $this->Application->setCache('theme_names', $processed_params['m_theme'], $theme_name); - - } - - $ret .= $theme_name . '/'; - } - - // inject custom url parts made by other rewrite listeners just after language/theme url parts - $ret .= implode('/', $params['inject_parts']) . '/'; - - // add category - if ($processed_params['m_cat_id'] > 0 && $params['pass_category']) { - $category_filename = $this->Application->getFilename('c', $processed_params['m_cat_id']); - - preg_match('/^Content\/(.*)/i', $category_filename, $regs); - - if ($regs) { - $template = array_key_exists('t', $params) ? $params['t'] : false; - - if (strtolower($regs[1]) == strtolower($template)) { - // we could have category path like "Content/<template_path>" in this case remove template - $params['pass_template'] = false; - } - - $ret .= $regs[1] . '/'; - } - - $params['category_processed'] = true; - } - - // reset category page - $force_page_adding = false; - if (array_key_exists('reset', $params) && $params['reset']) { - unset($params['reset']); - - if ($processed_params['m_cat_id']) { - $processed_params['m_cat_page'] = 1; - $force_page_adding = true; - } - } - - if ((array_key_exists('category_processed', $params) && $params['category_processed'] && ($processed_params['m_cat_page'] > 1)) || $force_page_adding) { - // category name was added before AND category page number found - $ret = rtrim($ret, '/') . '_' . $processed_params['m_cat_page'] . '/'; - } - - $template = array_key_exists('t', $params) ? $params['t'] : false; - $category_template = $processed_params['m_cat_id'] ? $this->Application->getCache('category_designs', $processed_params['m_cat_id']) : ''; - - if ((strtolower($template) == '__default__') && ($processed_params['m_cat_id'] == 0)) { - // for "Home" category set template to index when not set - $template = 'index'; - } - - // remove template from url if it is category index cached template - if (($template == $category_template) || (mb_strtolower($template) == '__default__')) { - // given template is also default template for this category or '__default__' given - $params['pass_template'] = false; - } - - if ($template && $params['pass_template']) { - $ret .= $template . '/'; - } - - return mb_strtolower( rtrim($ret, '/') ); - } - - /** - * Gets language part from url - * - * @param Array $url_parts - * @param Array $vars - * @return bool - */ - function _parseLanguage(&$url_parts, &$vars) - { - if (!$url_parts) { - return false; - } - - $url_part = array_shift($url_parts); - - $sql = 'SELECT LanguageId - FROM ' . TABLE_PREFIX . 'Language - WHERE LOWER(PackName) = ' . $this->Conn->qstr($url_part) . ' AND Enabled = 1'; - $language_id = $this->Conn->GetOne($sql); - - $this->Application->Phrases = new PhrasesCache(); - if ($language_id) { - $vars['m_lang'] = $language_id; - return true; - } - - array_unshift($url_parts, $url_part); - - return false; - } - - /** - * Gets theme part from url - * - * @param Array $url_parts - * @param Array $vars - * @return bool - */ - function _parseTheme(&$url_parts, &$vars) - { - if (!$url_parts) { - return false; - } - - $url_part = array_shift($url_parts); - - $sql = 'SELECT ThemeId - FROM ' . TABLE_PREFIX . 'Theme - WHERE LOWER(Name) = ' . $this->Conn->qstr($url_part) . ' AND Enabled = 1'; - $theme_id = $this->Conn->GetOne($sql); - if ($theme_id) { - $vars['m_theme'] = $theme_id; - return true; - } - - array_unshift($url_parts, $url_part); - - return false; - } - - /** - * Checks if whole url_parts matches a whole In-CMS page - * - * @param array $url_parts - * @return boolean - */ - function _parseFriendlyUrl($url_parts, &$vars) - { - if (!$url_parts) { - return false; - } - - $sql = 'SELECT CategoryId, NamedParentPath - FROM ' . TABLE_PREFIX . 'Category - WHERE FriendlyURL = ' . $this->Conn->qstr(implode('/', $url_parts)); - - $friendly = $this->Conn->GetRow($sql); - if ($friendly) { - $vars['m_cat_id'] = $friendly['CategoryId']; - $vars['t'] = preg_replace('/^Content\//i', '', $friendly['NamedParentPath']); - return true; - } - - return false; - } - - /** - * Set's 1st page for all modules (will be used when not passed in url) - * - * @param Array $vars - */ - function _setDefaultPages(&$vars) - { - // set 1st page for all rewrite listeners, since we don't know which of them will need it - foreach ($this->Application->RewriteListeners as $prefix => $listener) { - $vars[$prefix . '_Page'] = 1; - } - } - - /** - * Set's page (when found) to all modules - * - * @param Array $url_parts - * @param Array $vars - * @return string - */ - function _parsePage(&$url_parts, &$vars) - { - if (!$url_parts) { - return false; - } - - $page_number = end($url_parts); - if (!is_numeric($page_number)) { - return false; - } - - // set module pages for all modules, since we don't know which module will need it - foreach ($this->Application->RewriteListeners as $prefix => $listener) { - $vars[$prefix . '_id'] = 0; - $vars[$prefix . '_Page'] = $page_number; - } - - array_pop($url_parts); - - return true; - } - - /** - * Extracts category part from url - * - * @param Array $url_parts - * @param Array $vars - * @return bool - */ - function _parseCategory($url_parts, &$vars) - { - if (!$url_parts) { - return false; - } - - $res = false; - $url_part = array_shift($url_parts); - - $category_id = 0; - $last_category_info = false; - $category_path = $url_part == 'content' ? '' : 'content'; - - do { - $category_path = trim($category_path . '/' . $url_part, '/'); - // bb_<topic_id> -> forums/bb_2 - if ( !preg_match('/^bb_[\d]+$/', $url_part) && preg_match('/(.*)_([\d]+)$/', $category_path, $rets) ) { - $category_path = $rets[1]; - $vars['m_cat_page'] = $rets[2]; - } - - $sql = 'SELECT CategoryId, IsIndex, NamedParentPath - FROM ' . TABLE_PREFIX . 'Category - WHERE Status IN (1,4) AND (LOWER(NamedParentPath) = ' . $this->Conn->qstr($category_path) . ')'; - $category_info = $this->Conn->GetRow($sql); - - if ($category_info !== false) { - $last_category_info = $category_info; - $url_part = array_shift($url_parts); - $res = true; - } - } while ($category_info !== false && $url_part); - - if ($last_category_info) { - // IsIndex = 2 is a Container-only page, meaning it should go to index-page child - if ($last_category_info['IsIndex'] == 2) { - $sql = 'SELECT CategoryId, NamedParentPath - FROM ' . TABLE_PREFIX . 'Category - WHERE ParentId = ' . $last_category_info['CategoryId'] . ' AND IsIndex = 1'; - $category_info = $this->Conn->GetRow($sql); - - if ($category_info) { - // when index sub-page is found use it, otherwise use container page - $last_category_info = $category_info; - } - } - - // 1. Set virtual page as template, this will be replaced to physical template later in kApplication::Run. - // 2. Don't set CachedTemplate field as template here, because we will loose original page associated with it's cms blocks! - $vars['t'] = strtolower( preg_replace('/^Content\//i', '', $last_category_info['NamedParentPath']) ); - - $vars['m_cat_id'] = $last_category_info['CategoryId']; - $vars['is_virtual'] = true; // for template from POST, strange code there! - } - else { - $vars['m_cat_id'] = 0; - } - - return $res; - } - - /** - * Builds/parses category item part of url - * - * @param int $rewrite_mode Mode in what rewrite listener was called. Possbile two modes: REWRITE_MODE_BUILD, REWRITE_MODE_PARSE. - * @param string $prefix Prefix, that listener uses for system integration - * @param Array $params Params, that are used for url building or created during url parsing. - * @param Array $url_parts Url parts to parse (only for parsing). - * @param bool $keep_events Keep event names in resulting url (only for building). - * @return bool Return true to continue to next listener; return false (when building) not to rewrite given prefix; return false (when parsing) to stop processing at this listener. - */ - function CategoryItemRewriteListener($rewrite_mode = REWRITE_MODE_BUILD, $prefix, &$params, &$url_parts, $keep_events = false) - { - static $parsed = false; - - if ($rewrite_mode == REWRITE_MODE_BUILD) { - return $this->_buildCategoryItemUrl($prefix, $params, $keep_events); - } - - if (!$parsed) { - $this->_modulePrefix = $this->_parseCategoryItemUrl($url_parts, $params); - if ($this->_modulePrefix !== false) { - $params['pass'][] = $this->_modulePrefix; - $this->_partsFound[] = 'parseCategoryItemUrl'; - } - - $parsed = true; - } - - return true; - } - - /** - * Build category teim part of url - * - * @param string $prefix_special - * @param Array $params - * @param bool $keep_events - * @return string - */ - function _buildCategoryItemUrl($prefix_special, &$params, $keep_events) - { - $ret = ''; - list ($prefix) = explode('.', $prefix_special); - $processed_params = $this->getProcessedParams($prefix_special, $params, $keep_events); - - if ($processed_params === false) { - return ''; - } - - if ($processed_params[$prefix_special . '_id']) { - // this allows to fill 3 cache records with one query (see this method for details) - $category_id = array_key_exists('m_cat_id', $params) ? $params['m_cat_id'] : $this->Application->GetVar('m_cat_id'); - $category_filename = $this->Application->getFilename('c', $category_id); - - // if template is also item template of category, then remove template - $template = array_key_exists('t', $params) ? $params['t'] : false; - - $item_template = $this->GetItemTemplate($category_id, $prefix); - - if ($template == $item_template || strtolower($template) == '__default__') { - // given template is also default template for this category item or '__default__' given - $params['pass_template'] = false; - } - - // get item's filename - if ($prefix == 'bb') { - $ret .= 'bb_' . $processed_params[$prefix_special . '_id'] . '/'; - } - else { - $filename = $this->Application->getFilename($prefix, $processed_params[$prefix_special . '_id'], $category_id); - if ($filename !== false) { - $ret .= $filename . '/'; - } - } - } else { - if ($processed_params[$prefix_special . '_Page'] == 1) { - // when printing category items and we are on the 1st page -> there is no information about - // category item prefix and $params['pass_category'] will not be added automatically - $params['pass_category'] = true; - } - else { - $ret .= $processed_params[$prefix_special . '_Page'] . '/'; - } - } - - return mb_strtolower( rtrim($ret, '/') ); - } - - /** - * Sets template and id, corresponding to category item given in url - * - * @param Array $url_parts - * @param Array $vars - * @return bool|string - */ - function _parseCategoryItemUrl(&$url_parts, &$vars) - { - if (!$url_parts) { - return false; - } - - $item_filename = end($url_parts); - if (is_numeric($item_filename)) { - // this page, don't process here - return false; - } - - if (preg_match('/^bb_([\d]+)/', $item_filename, $regs)) { - // process topics separatly, because they don't use item filenames - array_pop($url_parts); - - return $this->_parseTopicUrl($regs[1], $vars); - } - - // locating the item in CategoryItems by filename to detect its ItemPrefix and its category ParentPath - $sql = 'SELECT ci.ItemResourceId, ci.ItemPrefix, c.ParentPath, ci.CategoryId - FROM ' . TABLE_PREFIX . 'CategoryItems AS ci - LEFT JOIN ' . TABLE_PREFIX . 'Category AS c ON c.CategoryId = ci.CategoryId - WHERE (ci.CategoryId = ' . $vars['m_cat_id'] . ') AND (ci.Filename = ' . $this->Conn->qstr($item_filename) . ')'; - $cat_item = $this->Conn->GetRow($sql); - - if ($cat_item !== false) { - // item found - $module_prefix = $cat_item['ItemPrefix']; - $item_template = $this->GetItemTemplate($cat_item, $module_prefix); - - // converting ResourceId to correpsonding Item id - $module_config = $this->Application->getUnitOptions($module_prefix); - - $sql = 'SELECT ' . $module_config['IDField'] . ' - FROM ' . $module_config['TableName'] . ' - WHERE ResourceId = ' . $cat_item['ItemResourceId']; - $item_id = $this->Conn->GetOne($sql); - - array_pop($url_parts); - - if ($item_id) { - if ($item_template) { - // when template is found in category -> set it - $vars['t'] = $item_template; - } - - // we have category item id - $vars[$module_prefix . '_id'] = $item_id; - - return $module_prefix; - } - } - - return false; - } - - /** - * Set's template and topic id corresponding to topic given in url - * - * @param int $topic_id - * @param Array $vars - * @return string - */ - function _parseTopicUrl($topic_id, &$vars) - { - $sql = 'SELECT c.ParentPath, c.CategoryId - FROM ' . TABLE_PREFIX . 'Category AS c - WHERE c.CategoryId = ' . $vars['m_cat_id']; - $cat_item = $this->Conn->GetRow($sql); - - $item_template = $this->GetItemTemplate($cat_item, 'bb'); - - if ($item_template) { - $vars['t'] = $item_template; - } - - $vars['bb_id'] = $topic_id; - - return 'bb'; - } - - /** - * Returns enviroment variable values for given prefix (uses directly given params, when available) - * - * @param string $prefix_special - * @param Array $params - * @param bool $keep_events - * @return Array - */ - function getProcessedParams($prefix_special, &$params, $keep_events) - { - list ($prefix) = explode('.', $prefix_special); - - $query_vars = $this->Application->getUnitOption($prefix, 'QueryString'); - if (!$query_vars) { - // given prefix doesn't use "env" variable to pass it's data - return false; - } - - $event_key = array_search('event', $query_vars); - if ($event_key) { - // pass through event of this prefix - unset($query_vars[$event_key]); - } - - if (array_key_exists($prefix_special . '_event', $params) && !$params[$prefix_special . '_event']) { - // if empty event, then remove it from url - unset( $params[$prefix_special . '_event'] ); - } - - // if pass events is off and event is not implicity passed - if (!$keep_events && !array_key_exists($prefix_special . '_event', $params)) { - unset($params[$prefix_special . '_event']); // remove event from url if requested - //otherwise it will use value from get_var - } - - $processed_params = Array (); - foreach ($query_vars as $index => $var_name) { - // if value passed in params use it, otherwise use current from application - $var_name = $prefix_special . '_' . $var_name; - $processed_params[$var_name] = array_key_exists($var_name, $params) ? $params[$var_name] : $this->Application->GetVar($var_name); - if (array_key_exists($var_name, $params)) { - unset($params[$var_name]); - } - } - - return $processed_params; - } - - /** - * Returns module item details template specified in given category custom field for given module prefix - * - * @param int|Array $category - * @param string $module_prefix - * @return string - */ - function GetItemTemplate($category, $module_prefix) - { - $cache_key = serialize($category) . '_' . $module_prefix; - - $cached_value = $this->Application->getCache(__CLASS__ . __FUNCTION__, $cache_key); - if ($cached_value !== false) { - return $cached_value; - } - - if (!is_array($category)) { - if ($category == 0) { - $category = $this->Application->findModule('Var', $module_prefix, 'RootCat'); - } - $sql = 'SELECT c.ParentPath, c.CategoryId - FROM ' . TABLE_PREFIX . 'Category AS c - WHERE c.CategoryId = ' . $category; - $category = $this->Conn->GetRow($sql); - } - $parent_path = implode(',',explode('|', substr($category['ParentPath'], 1, -1))); - - // item template is stored in module' system custom field - need to get that field Id - $item_template_field_id = $this->_getItemTemplateCustomField($module_prefix); - - // looking for item template through cats hierarchy sorted by parent path - $query = ' SELECT ccd.l1_cust_' . $item_template_field_id . ', - FIND_IN_SET(c.CategoryId, ' . $this->Conn->qstr($parent_path) . ') AS Ord1, - c.CategoryId, c.Name, ccd.l1_cust_' . $item_template_field_id . ' - FROM ' . TABLE_PREFIX . 'Category AS c - LEFT JOIN ' . TABLE_PREFIX . 'CategoryCustomData AS ccd - ON ccd.ResourceId = c.ResourceId - WHERE c.CategoryId IN (' . $parent_path . ') AND ccd.l1_cust_' . $item_template_field_id . ' != \'\' - ORDER BY FIND_IN_SET(c.CategoryId, ' . $this->Conn->qstr($parent_path) . ') DESC'; - $item_template = $this->Conn->GetOne($query); - - $this->Application->setCache(__CLASS__ . __FUNCTION__, $cache_key, $item_template); - - return $item_template; - } - - /** - * Loads all registered rewrite listeners, so they could be quickly accessed later - * - */ - function initRewriteListeners() - { - static $init_done = false; - - if ($init_done) { - return ; - } - - foreach ($this->Application->RewriteListeners as $prefix => $listener_data) { - list ($listener_prefix, $listener_method) = explode(':', $listener_data['listener']); - $listener =& $this->Application->recallObject($listener_prefix); - - $this->Application->RewriteListeners[$prefix] = Array (&$listener, $listener_method); - } - - $init_done = true; - } - - /** - * Returns category custom field id, where given module prefix item template name is stored - * - * @param string $module_prefix - * @return int - */ - function _getItemTemplateCustomField($module_prefix) - { - $cached_value = $this->Application->getCache(__CLASS__ . __FUNCTION__, $module_prefix); - if ($cached_value !== false) { - return $cached_value; - } - - $sql = 'SELECT CustomFieldId - FROM ' . TABLE_PREFIX . 'CustomField - WHERE FieldName = ' . $this->Conn->qstr($module_prefix . '_ItemTemplate'); - $item_template_field_id = $this->Conn->GetOne($sql); - - $this->Application->setCache(__CLASS__ . __FUNCTION__, $module_prefix, $item_template_field_id); - - return $item_template_field_id; - } - - /** - * Sets default parsed values before actual url parsing - * - * @param Array $vars - */ - function _setDefaultValues(&$vars) - { - $defaults = Array ('m_cat_id' => 0, 'm_cat_page' => 1, 'm_opener' => 's', 't' => 'index'); - - foreach ($defaults as $default_key => $default_value) { - // bug: null is never returned - if ($this->HTTPQuery->Get($default_key) == null) { - $vars[$default_key] = $default_value; - } - } - } - } -?> \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/mod_rewrite_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.11.2.9 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/language_import_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/language_import_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/language_import_helper.php (nonexistent) @@ -1,599 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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!'); - - define('LANG_OVERWRITE_EXISTING', 1); - define('LANG_SKIP_EXISTING', 2); - - class LanguageImportHelper extends kHelper { - - /** - * Current Language in import - * - * @var LanguagesItem - */ - var $lang_object = null; - - /** - * Current user's IP address - * - * @var string - */ - var $ip_address = ''; - - /** - * Event type + name mapping to id (from system) - * - * @var Array - */ - var $events_hash = Array (); - - /** - * Language pack import mode - * - * @var int - */ - var $import_mode = LANG_SKIP_EXISTING; - - /** - * Language IDs, that were imported - * - * @var Array - */ - var $_languages = Array (); - - /** - * Temporary table names to perform import on - * - * @var Array - */ - var $_tables = Array (); - - /** - * Phrase types allowed for import/export operations - * - * @var Array - */ - var $phrase_types_allowed = Array (); - - /** - * Encoding, used for language pack exporting - * - * @var string - */ - var $_exportEncoding = 'base64'; - - /** - * Debug language pack import process - * - * @var bool - */ - var $_debugMode = false; - - function LanguageImportHelper() - { - parent::kHelper(); - - // "core/install/english.lang", phrase count: 3318, xml parse time on windows: 10s, insert time: 0.058s - set_time_limit(0); - ini_set('memory_limit', -1); - - $this->lang_object =& $this->Application->recallObject('lang.import', null, Array ('skip_autoload' => true)); - - if (!(defined('IS_INSTALL') && IS_INSTALL)) { - // perform only, when not in installation mode - $this->_updateEventsCache(); - } - - $this->ip_address = getenv('HTTP_X_FORWARDED_FOR') ? getenv('HTTP_X_FORWARDED_FOR') : getenv('REMOTE_ADDR'); - -// $this->_debugMode = $this->Application->isDebugMode(); - } - - /** - * Performs import of given language pack (former Parse method) - * - * @param string $filename - * @param string $phrase_types - * @param Array $module_ids - * @param int $import_mode - * @return bool - */ - function performImport($filename, $phrase_types, $module_ids, $import_mode = LANG_SKIP_EXISTING) - { - // define the XML parsing routines/functions to call based on the handler path - if (!file_exists($filename) || !$phrase_types /*|| !$module_ids*/) { - return false; - } - - if ($this->_debugMode) { - $start_time = getmicrotime(); - $this->Application->Debugger->appendHTML(__CLASS__ . '::' . __FUNCTION__ . '("' . $filename . '")'); - } - - if (defined('IS_INSTALL') && IS_INSTALL) { - // new events could be added during module upgrade - $this->_updateEventsCache(); - } - - $this->_initImportTables(); - - $phrase_types = explode('|', substr($phrase_types, 1, -1) ); -// $module_ids = explode('|', substr($module_ids, 1, -1) ); - - $this->phrase_types_allowed = array_flip($phrase_types); - $this->import_mode = $import_mode; - - $this->_parseXML($filename); - - // copy data from temp tables to live - foreach ($this->_languages as $language_id) { - $this->_performUpgrade($language_id, 'phrases', 'Phrase'); - $this->_performUpgrade($language_id, 'emailmessages', 'EventId'); - } - - $this->_initImportTables(true); - - if ($this->_debugMode) { - $this->Application->Debugger->appendHTML(__CLASS__ . '::' . __FUNCTION__ . '("' . $filename . '"): ' . (getmicrotime() - $start_time)); - } - - return true; - } - - /** - * Creates XML file with exported language data (former Create method) - * - * @param string $filename filename to export into - * @param Array $phrase_types phrases types to export from modules passed in $module_ids - * @param Array $language_ids IDs of languages to export - * @param Array $module_ids IDs of modules to export phrases from - */ - function performExport($filename, $phrase_types, $language_ids, $module_ids) - { - $fp = fopen($filename,'w'); - if (!$fp || !$phrase_types || !$module_ids || !$language_ids) { - return false; - } - - $phrase_types = explode('|', substr($phrase_types, 1, -1) ); - $module_ids = explode('|', substr($module_ids, 1, -1) ); - - $this->events_hash = array_flip($this->events_hash); - - $lang_table = $this->Application->getUnitOption('lang','TableName'); - $phrases_table = $this->Application->getUnitOption('phrases','TableName'); - $emailevents_table = $this->Application->getUnitOption('emailmessages','TableName'); - $mainevents_table = $this->Application->getUnitOption('emailevents','TableName'); - - $phrase_tpl = "\t\t\t".'<PHRASE Label="%s" Module="%s" Type="%s">%s</PHRASE>'."\n"; - $event_tpl = "\t\t\t".'<EVENT MessageType="%s" Event="%s" Type="%s">%s</EVENT>'."\n"; - $sql = 'SELECT * FROM %s WHERE LanguageId = %s'; - $ret = '<LANGUAGES>'."\n"; - foreach ($language_ids as $language_id) { - // languages - $row = $this->Conn->GetRow( sprintf($sql, $lang_table, $language_id) ); - $ret .= "\t".'<LANGUAGE PackName="'.$row['PackName'].'" Encoding="'.$this->_exportEncoding.'"><DATEFORMAT>'.$row['DateFormat'].'</DATEFORMAT>'; - $ret .= '<TIMEFORMAT>'.$row['TimeFormat'].'</TIMEFORMAT><INPUTDATEFORMAT>'.$row['InputDateFormat'].'</INPUTDATEFORMAT>'; - $ret .= '<INPUTTIMEFORMAT>'.$row['InputTimeFormat'].'</INPUTTIMEFORMAT><DECIMAL>'.$row['DecimalPoint'].'</DECIMAL>'; - $ret .= '<THOUSANDS>'.$row['ThousandSep'].'</THOUSANDS><CHARSET>'.$row['Charset'].'</CHARSET><DOCS_URL>'.$row['UserDocsUrl'].'</DOCS_URL>'; - $ret .= '<UNITSYSTEM>'.$row['UnitSystem'].'</UNITSYSTEM>'."\n"; - - // phrases - $phrases_sql = 'SELECT * FROM '.$phrases_table.' WHERE LanguageId = %s AND PhraseType IN (%s) AND Module IN (%s) ORDER BY Phrase'; - if( in_array('In-Portal',$module_ids) ) array_push($module_ids, ''); // for old language packs - $rows = $this->Conn->Query( sprintf($phrases_sql,$language_id, implode(',',$phrase_types), '\''.implode('\',\'',$module_ids).'\'' ) ); - if($rows) - { - $ret .= "\t\t".'<PHRASES>'."\n"; - foreach($rows as $row) - { - $data = $this->_exportEncoding == 'base64' ? base64_encode($row['Translation']) : '<![CDATA['.$row['Translation'].']]>'; - $ret .= sprintf($phrase_tpl, $row['Phrase'], $row['Module'], $row['PhraseType'], $data ); - } - $ret .= "\t\t".'</PHRASES>'."\n"; - } - - // email events - if( in_array('In-Portal',$module_ids) ) unset( $module_ids[array_search('',$module_ids)] ); // for old language packs - $module_sql = preg_replace('/(.*) OR $/', '\\1', preg_replace('/(.*),/U', 'INSTR(Module,\'\\1\') OR ', implode(',', $module_ids).',' ) ); - - $sql = 'SELECT EventId FROM '.$mainevents_table.' WHERE '.$module_sql; - $event_ids = $this->Conn->GetCol($sql); - - if($event_ids) - { - $ret .= "\t\t".'<EVENTS>'."\n"; - $event_sql = ' SELECT em.* - FROM '.$emailevents_table.' em - LEFT JOIN '.$mainevents_table.' e ON e.EventId = em.EventId - WHERE em.LanguageId = %s AND em.EventId IN (%s) - ORDER BY e.Event, e.Type'; - $rows = $this->Conn->Query( sprintf($event_sql,$language_id, $event_ids ? implode(',',$event_ids) : '' ) ); - foreach($rows as $row) - { - if (!array_key_exists($row['EventId'], $this->events_hash)) { - // don't export existing translations of missing events - continue; - } - - list($event_name, $event_type) = explode('_', $this->events_hash[ $row['EventId'] ] ); - $data = $this->_exportEncoding == 'base64' ? base64_encode($row['Template']) : '<![CDATA['.$row['Template'].']]>'; - $ret .= sprintf($event_tpl, $row['MessageType'], $event_name, $event_type, $data ); - } - $ret .= "\t\t".'</EVENTS>'."\n"; - } - $ret .= "\t".'</LANGUAGE>'."\n"; - } - - $ret .= '</LANGUAGES>'; - fwrite($fp, $ret); - fclose($fp); - - return true; - } - - /** - * Sets language pack encoding (not charset) used during export - * - * @param string $encoding - */ - function setExportEncoding($encoding) - { - $this->_exportEncoding = $encoding; - } - - /** - * Performs upgrade of given language pack part - * - * @param int $language_id - * @param string $prefix - * @param string $unique_field - */ - function _performUpgrade($language_id, $prefix, $unique_field) - { - // TODO: find a way to compare (intersect,diff) phrases in non-case sensitive way, but keeping original case in result - $live_records = $this->_getTableData($language_id, $prefix, $unique_field, false); - $temp_records = $this->_getTableData($language_id, $prefix, $unique_field, true); - - if ($this->import_mode == LANG_OVERWRITE_EXISTING) { - // remove existing records before copy - $common_records = array_intersect($temp_records, $live_records); - if ($common_records) { - $live_records = array_diff($live_records, $common_records); // remove overlaping records - $common_records = array_map(Array(&$this->Conn, 'qstr'), $common_records); - - $sql = 'DELETE FROM ' . $this->Application->getUnitOption($prefix, 'TableName') . ' - WHERE (LanguageId = ' . $language_id . ') AND (' . $unique_field . ' IN (' . implode(',', $common_records) . '))'; - $this->Conn->Query($sql); - } - } - - $temp_records = array_diff($temp_records, $live_records); - - if (!$temp_records) { - // no new records found in temp table while comparing it to live table - return ; - } - - $temp_records = array_map(Array(&$this->Conn, 'qstr'), $temp_records); - - $sql = 'INSERT INTO ' . $this->Application->getUnitOption($prefix, 'TableName') . ' - SELECT * - FROM ' . $this->_tables[$prefix] . ' - WHERE (LanguageId = ' . $language_id . ')'; - - if ($live_records) { - // subsctract live records from temp table during coping - $sql .= ' AND (' . $unique_field . ' IN (' . implode(',', $temp_records) . '))'; - } - - $this->Conn->Query($sql); - } - - /** - * Returns data from given table used for language pack upgrade - * - * @param int $language_id - * @param string $prefix - * @param string $unique_field - * @param bool $temp_mode - * @return Array - */ - function _getTableData($language_id, $prefix, $unique_field, $temp_mode = false) - { - $table_name = $this->Application->getUnitOption($prefix, 'TableName'); - - if ($temp_mode) { - $table_name = $this->Application->GetTempName($table_name, 'prefix:' . $prefix); - } - - $sql = 'SELECT ' . $unique_field . ' - FROM ' . $table_name . ' - WHERE LanguageId = ' . $language_id; - return $this->Conn->GetCol($sql); - } - - function _parseXML($filename) - { - if ($this->_debugMode) { - $start_time = getmicrotime(); - $this->Application->Debugger->appendHTML(__CLASS__ . '::' . __FUNCTION__ . '("' . $filename . '")'); - } - - $fdata = file_get_contents($filename); - - $xml_parser =& $this->Application->recallObject('kXMLHelper'); - /* @var $xml_parser kXMLHelper */ - - $root_node =& $xml_parser->Parse($fdata); - if (!is_object($root_node) || !is_a($root_node, 'kXMLNode')) { - // invalid language pack contents - return false; - } - - if ($root_node->Children) { - $this->_processLanguages($root_node->firstChild); - } - - if ($this->_debugMode) { - $this->Application->Debugger->appendHTML(__CLASS__ . '::' . __FUNCTION__ . '("' . $filename . '"): ' . (getmicrotime() - $start_time)); - } - - return true; - } - - /** - * Creates temporary tables, used during language import - * - * @param bool $drop_only - */ - function _initImportTables($drop_only = false) - { - $this->_tables['phrases'] = $this->_prepareTempTable('phrases', $drop_only); - $this->_tables['emailmessages'] = $this->_prepareTempTable('emailmessages', $drop_only); - } - - /** - * Create temp table for prefix, if table already exists, then delete it and create again - * - * @param string $prefix - */ - function _prepareTempTable($prefix, $drop_only = false) - { - $idfield = $this->Application->getUnitOption($prefix, 'IDField'); - $table = $this->Application->getUnitOption($prefix,'TableName'); - $temp_table = $this->Application->GetTempName($table); - - $sql = 'DROP TABLE IF EXISTS %s'; - $this->Conn->Query( sprintf($sql, $temp_table) ); - - if (!$drop_only) { - $sql = 'CREATE TABLE %s SELECT * FROM %s WHERE 0'; - $this->Conn->Query( sprintf($sql, $temp_table, $table) ); - - $sql = 'ALTER TABLE %1$s CHANGE %2$s %2$s INT(11) NOT NULL'; - $this->Conn->Query( sprintf($sql, $temp_table, $idfield) ); - } - - return $temp_table; - } - - /** - * Prepares mapping between event name+type and their ids in database - * - */ - function _updateEventsCache() - { - $sql = 'SELECT EventId, CONCAT(Event,"_",Type) AS EventMix - FROM ' . TABLE_PREFIX . 'Events'; - $this->events_hash = $this->Conn->GetCol($sql, 'EventMix'); - } - - /** - * Processes parsed XML - * - * @param kXMLNode $language_node - */ - function _processLanguages(&$language_node) - { - $field_mapping = Array ( - 'DATEFORMAT' => 'DateFormat', - 'TIMEFORMAT' => 'TimeFormat', - 'INPUTDATEFORMAT' => 'InputDateFormat', - 'INPUTTIMEFORMAT' => 'InputTimeFormat', - 'DECIMAL' => 'DecimalPoint', - 'THOUSANDS' => 'ThousandSep', - 'CHARSET' => 'Charset', - 'UNITSYSTEM' => 'UnitSystem', - 'DOCS_URL' => 'UserDocsUrl', - ); - - do { - $language_id = false; - - $fields_hash = Array ( - 'PackName' => $language_node->Attributes['PACKNAME'], - 'LocalName' => $language_node->Attributes['PACKNAME'], - 'Encoding' => $language_node->Attributes['ENCODING'], - 'Charset' => 'iso-8859-1', - ); - - $sub_node =& $language_node->firstChild; - /* @var $sub_node kXMLNode */ - - do { - switch ($sub_node->Name) { - case 'PHRASES': - if ($sub_node->Children) { - if (!$language_id) { - $language_id = $this->_processLanguage($fields_hash); - } - - if ($this->_debugMode) { - $start_time = getmicrotime(); - } - - $this->_processPhrases($sub_node->firstChild, $language_id, $fields_hash['Encoding']); - - if ($this->_debugMode) { - $this->Application->Debugger->appendHTML(__CLASS__ . '::' . '_processPhrases: ' . (getmicrotime() - $start_time)); - } - } - break; - - case 'EVENTS': - if ($sub_node->Children) { - if (!$language_id) { - $language_id = $this->_processLanguage($fields_hash); - } - - $this->_processEvents($sub_node->firstChild, $language_id, $fields_hash['Encoding']); - } - break; - - default: - $fields_hash[ $field_mapping[$sub_node->Name] ] = $sub_node->Data; - break; - } - } while (($sub_node =& $sub_node->NextSibling())); - } while (($language_node =& $language_node->NextSibling())); - } - - /** - * Performs phases import - * - * @param kXMLNode $phrase_node - * @param int $language_id - * @param string $language_encoding - */ - function _processPhrases(&$phrase_node, $language_id, $language_encoding) - { - do { - $fields_hash = Array ( - 'LanguageId' => $language_id, - 'Phrase' => $phrase_node->Attributes['LABEL'], - 'PhraseType' => $phrase_node->Attributes['TYPE'], - 'Module' => array_key_exists('MODULE', $phrase_node->Attributes) ? $phrase_node->Attributes['MODULE'] : 'Core', - 'LastChanged' => adodb_mktime(), - 'LastChangeIP' => $this->ip_address, - 'Translation' => $phrase_node->Data, - ); - - if (array_key_exists($fields_hash['PhraseType'], $this->phrase_types_allowed)) { - if ($language_encoding != 'plain') { - $fields_hash['Translation'] = base64_decode($fields_hash['Translation']); - } - - $this->Conn->doInsert($fields_hash, $this->_tables['phrases'], 'INSERT', false); - } - } while (($phrase_node =& $phrase_node->NextSibling())); - - $this->Conn->doInsert($fields_hash, $this->_tables['phrases'], 'INSERT'); - } - - /** - * Performs email event import - * - * @param kXMLNode $event_node - * @param int $language_id - * @param string $language_encoding - */ - function _processEvents(&$event_node, $language_id, $language_encoding) - { - do { - $event_id = $this->_getEventId($event_node->Attributes['EVENT'], $event_node->Attributes['TYPE']); - if ($event_id) { - $fields_hash = Array ( - 'LanguageId' => $language_id, - 'EventId' => $event_id, - 'MessageType' => $event_node->Attributes['MESSAGETYPE'], - ); - - if ($language_encoding == 'plain') { - $fields_hash['Template'] = rtrim($event_node->Data); - } - else { - $fields_hash['Template'] = base64_decode($event_node->Data); - } - - $this->Conn->doInsert($fields_hash, $this->_tables['emailmessages'], 'INSERT', false); - } - } while (($event_node =& $event_node->NextSibling())); - - $this->Conn->doInsert($fields_hash, $this->_tables['emailmessages'], 'INSERT'); - } - - /** - * Creates/updates language based on given fields and returns it's id - * - * @param Array $fields_hash - * @return int - */ - function _processLanguage($fields_hash) - { - // 1. get language from database - $sql = 'SELECT ' . $this->lang_object->IDField . ' - FROM ' . $this->lang_object->TableName . ' - WHERE PackName = ' . $this->Conn->qstr($fields_hash['PackName']); - $language_id = $this->Conn->GetOne($sql); - - if ($language_id) { - // 2. language found -> update, when allowed - $this->lang_object->Load($language_id); - - if ($this->import_mode == LANG_OVERWRITE_EXISTING) { - // update live language record based on data from xml - $this->lang_object->SetFieldsFromHash($fields_hash); - $this->lang_object->Update(); - } - } - else { - // 3. language not found -> create - $this->lang_object->SetFieldsFromHash($fields_hash); - $this->lang_object->SetDBField('Enabled', STATUS_ACTIVE); - - if ($this->lang_object->Create()) { - $language_id = $this->lang_object->GetID(); - - if (defined('IS_INSTALL') && IS_INSTALL) { - // language created during install becomes admin interface language - $this->lang_object->setPrimary(true, true); - } - } - } - - // 4. collect ID of every processed language - if (!in_array($language_id, $this->_languages)) { - $this->_languages[] = $language_id; - } - - return $language_id; - } - - /** - * Returns event id based on it's name and type - * - * @param string $event_name - * @param string $event_type - * @return int - */ - function _getEventId($event_name, $event_type) - { - $cache_key = $event_name . '_' . $event_type; - - return array_key_exists($cache_key, $this->events_hash) ? $this->events_hash[$cache_key] : 0; - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/language_import_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.1.2.1 \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/chart_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/chart_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/chart_helper.php (nonexistent) @@ -1,47 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 kChartHelper extends kHelper { - - function kChartHelper() - { - parent::kHelper(); - $prefix = realpath(dirname(__FILE__).'/../').'/libchart/classes/'; - require_once $prefix.'model/Point.php'; - require_once $prefix.'model/DataSet.php'; - require_once $prefix.'model/XYDataSet.php'; - require_once $prefix.'model/XYSeriesDataSet.php'; - - require_once $prefix.'view/primitive/Padding.php'; - require_once $prefix.'view/primitive/Rectangle.php'; - require_once $prefix.'view/primitive/Primitive.php'; - require_once $prefix.'view/text/Text.php'; - require_once $prefix.'view/color/Color.php'; - require_once $prefix.'view/color/ColorSet.php'; - require_once $prefix.'view/color/Palette.php'; - require_once $prefix.'view/axis/Bound.php'; - require_once $prefix.'view/axis/Axis.php'; - require_once $prefix.'view/plot/Plot.php'; - require_once $prefix.'view/caption/Caption.php'; - require_once $prefix.'view/chart/Chart.php'; - require_once $prefix.'view/chart/BarChart.php'; - require_once $prefix.'view/chart/VerticalBarChart.php'; - require_once $prefix.'view/chart/HorizontalBarChart.php'; - require_once $prefix.'view/chart/LineChart.php'; - require_once $prefix.'view/chart/PieChart.php'; - } - - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/chart_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.1.4.1 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/file_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/file_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/file_helper.php (nonexistent) @@ -1,233 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 FileHelper extends kHelper { - - /** - * Puts existing item images (from subitem) to virtual fields (in main item) - * - * @param kCatDBItem $object - */ - function LoadItemFiles(&$object) - { - $max_file_count = $this->Application->ConfigValue($object->Prefix.'_MaxImageCount'); // file count equals to image count (temporary measure) - - $sql = 'SELECT * - FROM '.TABLE_PREFIX.'ItemFiles - WHERE ResourceId = '.$object->GetDBField('ResourceId').' - ORDER BY FileId ASC - LIMIT 0, '.(int)$max_file_count; - $item_files = $this->Conn->Query($sql); - - $file_counter = 1; - foreach ($item_files as $item_file) { - $file_path = $item_file['FilePath']; - $object->SetDBField('File'.$file_counter, $file_path); - $object->SetOriginalField('File'.$file_counter, $file_path); - $object->Fields['File'.$file_counter]['original_field'] = $item_file['FileName']; - $file_counter++; - } - } - - /** - * Saves newly uploaded images to external image table - * - * @param kCatDBItem $object - */ - function SaveItemFiles(&$object) - { - $table_name = $this->Application->getUnitOption('#file', 'TableName'); - $max_file_count = $this->Application->getUnitOption($object->Prefix, 'FileCount'); // $this->Application->ConfigValue($object->Prefix.'_MaxImageCount'); - - $i = 0; - while ($i < $max_file_count) { - $field = 'File'.($i + 1); - $field_options = $object->GetFieldOptions($field); - - $file_path = $object->GetDBField($field); - if ($file_path) { - if (isset($field_options['original_field'])) { - $key_clause = 'FileName = '.$this->Conn->qstr($field_options['original_field']).' AND ResourceId = '.$object->GetDBField('ResourceId'); - - if ($object->GetDBField('Delete'.$field)) { - // if item was cloned, then new filename is in db (not in $image_src) - $sql = 'SELECT FilePath - FROM '.$table_name.' - WHERE '.$key_clause; - $file_path = $this->Conn->GetOne($sql); - if (@unlink(FULL_PATH.ITEM_FILES_PATH.$file_path)) { - $sql = 'DELETE FROM '.$table_name.' - WHERE '.$key_clause; - $this->Conn->Query($sql); - } - } - else { - // image record found -> update - $fields_hash = Array ( - 'FilePath' => $file_path, - ); - - $this->Conn->doUpdate($fields_hash, $table_name, $key_clause); - } - } - else { - // record not found -> create - $fields_hash = Array ( - 'ResourceId' => $object->GetDBField('ResourceId'), - 'FileName' => $field, - 'Status' => STATUS_ACTIVE, - 'FilePath' => $file_path, - ); - - $this->Conn->doInsert($fields_hash, $table_name); - $field_options['original_field'] = $field; - $object->SetFieldOptions($field, $field_options); - } - } - $i++; - } - } - - /** - * Preserves cloned item images/files to be rewrited with original item images/files - * - * @param Array $field_values - */ - function PreserveItemFiles(&$field_values) - { - foreach ($field_values as $field_name => $field_value) { - if (!is_array($field_value)) continue; - - if (isset($field_value['upload']) && ($field_value['error'] == UPLOAD_ERR_NO_FILE)) { - // this is upload field, but nothing was uploaded this time - unset($field_values[$field_name]); - } - } - } - - /** - * Determines what image/file fields should be created (from post or just dummy fields for 1st upload) - * - * @param string $prefix - * @param bool $is_image - */ - function createItemFiles($prefix, $is_image = false) - { - $items_info = $this->Application->GetVar($prefix); - if ($items_info) { - list ($id, $fields_values) = each($items_info); - $this->createUploadFields($prefix, $fields_values, $is_image); - } - else { - $this->createUploadFields($prefix, Array(), $is_image); - } - } - - /** - * Dynamically creates virtual fields for item for each image/file field in submit - * - * @param string $prefix - * @param Array $fields_values - * @param bool $is_image - */ - function createUploadFields($prefix, $fields_values, $is_image = false) - { - $field_options = Array ( - 'type' => 'string', - 'max_len' => 240, - 'default' => '', - 'not_null' => 1, - ); - - if ($is_image) { - $field_options['formatter'] = 'kPictureFormatter'; - $field_options['include_path'] = 1; - $field_options['allowed_types'] = Array ('image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png', 'image/gif', 'image/bmp'); - $field_prefix = 'Image'; - } - else { - $field_options['formatter'] = 'kUploadFormatter'; - $field_options['upload_dir'] = ITEM_FILES_PATH; - $field_options['allowed_types'] = Array ('application/pdf', 'application/msexcel', 'application/msword', 'application/mspowerpoint'); - $field_prefix = 'File'; - } - - $fields = $this->Application->getUnitOption($prefix, 'Fields'); - $virtual_fields = $this->Application->getUnitOption($prefix, 'VirtualFields'); - - $image_count = 0; - foreach ($fields_values as $field_name => $field_value) { - if (preg_match('/^('.$field_prefix.'[\d]+|Primary'.$field_prefix.')$/', $field_name)) { - $fields[$field_name] = $field_options; - $virtual_fields[$field_name] = $field_options; - $this->_createCustomFields($prefix, $field_name, $virtual_fields, $is_image); - - $image_count++; - } - } - - if (!$image_count) { - // no images found in POST -> create default image fields - $image_names = Array ('Primary'.$field_prefix => ''); - $image_count = $this->Application->ConfigValue($prefix.'_MaxImageCount'); - - $created_count = 1; - while ($created_count < $image_count) { - $image_names[$field_prefix.$created_count] = ''; - $created_count++; - } - - $this->createUploadFields($prefix, $image_names, $is_image); - return ; - } - - $this->Application->setUnitOption($prefix, $field_prefix.'Count', $image_count); - $this->Application->setUnitOption($prefix, 'Fields', $fields); - $this->Application->setUnitOption($prefix, 'VirtualFields', $virtual_fields); - } - - /** - * Adds ability to create more virtual fields associated with main image/file - * - * @param string $prefix - * @param string $field_name - * @param Array $virtual_fields - */ - function _createCustomFields($prefix, $field_name, &$virtual_fields, $is_image) - { - $virtual_fields['Delete' . $field_name] = Array ('type' => 'int', 'not_null' => 1, 'default' => 0); - - if ($is_image) { - $virtual_fields[$field_name . 'Alt'] = Array ('type' => 'string', 'default' => ''); - } - } - - /** - * Downloads file to user - * - * @param string $filename - */ - function DownloadFile($filename) - { - $content_type = function_exists('mime_content_type') ? mime_content_type($filename) : 'application/octet-stream'; - - header('Content-type: '.$content_type); - header('Content-Disposition: attachment; filename="'.basename($filename).'"'); - header('Content-Length: '.filesize($filename)); - readfile($filename); - flush(); - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/file_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.1.2.2 \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/curl_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/curl_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/curl_helper.php (nonexistent) @@ -1,265 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 kCurlHelper extends kHelper { - - /** - * Connection to host - * - * @var resource - */ - var $connectionID = null; - - /** - * Pointer to opened log file - * - * @var resource - */ - var $logFilePointer = null; - - /** - * Responce waiting timeout - * - * @var int - */ - var $timeout = 90; - - /** - * Follow to url, if redirect received insted of document (only works when open_basedir and safe mode is off) - * - * @var bool - */ - var $followLocation = false; - - /** - * Last responce received by Curl - * - * @var string - */ - var $lastRespoce = ''; - - /** - * Last error code - * - * @var int - */ - var $lastErrorCode = 0; - - /** - * Last error message - * - * @var string - */ - var $lastErrorMsg = ''; - - /** - * Most recent HTTP responce code received - * - * @var int - */ - var $lastHTTPCode = 0; - - /** - * POST data to be sent using curl - * - * @var string - */ - var $postData = ''; - - var $requestHeaders = Array (); - - var $responceHeaders = Array (); - - var $options = Array (); - - /** - * Indicates debug mode status - * - * @var bool - */ - var $debugMode = false; - - function kCurlHelper() - { - parent::kHelper(); - - $this->debugMode = $this->Application->isDebugMode(false) && constOn('DBG_CURL'); - } - - /** - * Reset connection settings (not results) after connection was closed - * - */ - function _resetSettings() - { - $this->timeout = 90; - $this->followLocation = false; - $this->postData = ''; - $this->requestHeaders = Array (); - $this->options = Array (); - } - - function setOptions($options_hash) - { - $this->options = array_merge_recursive2($this->options, $options_hash); - } - - function prepareOptions() - { - $default_options = Array ( - // customizable options - CURLOPT_FOLLOWLOCATION => $this->followLocation ? 1 : 0, - CURLOPT_TIMEOUT => $this->timeout, - - // hardcoded options - CURLOPT_RETURNTRANSFER => 1, - CURLOPT_REFERER => PROTOCOL.SERVER_NAME, - CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'], - ); - - if ($this->requestHeaders) { - $default_options[CURLOPT_HTTPHEADER] = $this->prepareHeaders(); - } - - // if we have post data, then POST else use GET method instead - if ($this->postData) { - $default_options[CURLOPT_POST] = 1; - $default_options[CURLOPT_POSTFIELDS] = $this->postData; - } - -// $default_options[CURLOPT_HEADERFUNCTION] = Array(&$this, 'ParseHeader'); - - $user_options = $this->options; // backup options, that user set directly - $this->setOptions($default_options); - $this->setOptions($user_options); - $this->applyOptions(); - } - - function applyOptions() - { - foreach ($this->options as $option_name => $option_value) { - curl_setopt($this->connectionID, $option_name, $option_value); - } - } - - function ParseHeader(&$ch, $header) - { - $this->responceHeaders[] = $header; - return strlen($header); - } - - /** - * Sets POST data for next query - * - * @param mixed $post_data Array or string - */ - function SetPostData($post_data) - { - if (is_array($post_data)) { - $params_str = ''; - foreach ($post_data as $key => $value) { - $params_str .= $key.'='.urlencode($value).'&'; - } - $post_data = $params_str; - } - - $this->postData = $post_data; - } - - function SetHeaders($headers) - { - $this->requestHeaders = array_merge_recursive2($this->requestHeaders, $headers); - } - - function SetHeader($name, $value) - { - $this->requestHeaders[$name] = $value; - } - - /** - * Returns compiled header to be used by curl - * - * @return Array - */ - function prepareHeaders() - { - $ret = Array (); - foreach ($this->requestHeaders as $header_name => $header_value) { - $ret[] = $header_name.': '.$header_value; - } - return $ret; - } - - function Send($url, $close_connection = true) - { - $this->connectionID = curl_init($url); - - if ($this->debugMode) { - safeDefine('DBG_CURL_LOGFILE', '/curl.log'); - $this->logFilePointer = fopen(FULL_PATH.DBG_CURL_LOGFILE, 'a'); - - curl_setopt($this->connectionID, CURLOPT_FILE, $this->logFilePointer); - curl_setopt($this->connectionID, CURLOPT_VERBOSE, true); - curl_setopt($this->connectionID, CURLOPT_STDERR, $this->logFilePointer); - //curl_setopt($this->connectionID, CURLOPT_WRITEHEADER, $this->logFilePointer); - } - - $this->responceHeaders = Array (); - - $this->prepareOptions(); - $this->lastRespoce = curl_exec($this->connectionID); - - $this->Finalize($close_connection); - - return $this->lastRespoce; - } - - /** - * Returns various info about request made - * - * @param int $info_type - * @return mixed - * - * @see http://www.php.net/manual/ru/function.curl-getinfo.php - */ - function getInfo($info_type) - { - return curl_getinfo($this->connectionID, $info_type); - } - - function Finalize($close_connection = true) - { - $this->lastErrorCode = curl_errno($this->connectionID); - $this->lastErrorMsg = curl_error($this->connectionID); - $this->lastHTTPCode = curl_getinfo($this->connectionID, CURLINFO_HTTP_CODE); - - if ($this->debugMode) { - fwrite($this->logFilePointer, "\n".$this->lastRespoce); - fclose($this->logFilePointer); - } - - $this->_resetSettings(); - - if ($close_connection) { - $this->CloseConnection(); - } - } - - function CloseConnection() - { - curl_close($this->connectionID); - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/curl_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.1.4.4 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property Index: branches/5.0.x/core/units/general/helpers/category_helper.php =================================================================== --- branches/5.0.x/core/units/general/helpers/category_helper.php (revision 12307) +++ branches/5.0.x/core/units/general/helpers/category_helper.php (nonexistent) @@ -1,477 +0,0 @@ -<?php -/** -* @version $Id$ -* @package In-Portal -* @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 CategoryHelper extends kHelper { - - /** - * Structure tree for ParentId field in category or category items - * - * @var Array - */ - var $_structureTree = null; - - /** - * Prints category path using given blocks. Also supports used defined path elements at the end. - * - * @param Array $params - * @return string - */ - function NavigationBar($params) - { - $main_category_id = isset($params['cat_id']) ? $params['cat_id'] : $this->Application->GetVar('m_cat_id'); - - $home_element = $this->getHomeCategoryPath($params, $main_category_id); - if (!getArrayValue($params, 'titles') && !getArrayValue($params, 'templates')) { - // no static templates given, show only category path - return $home_element . $this->getCategoryPath($main_category_id, $params); - } - - $navigation_parts = $this->getNavigationParts($params['titles'], $params['templates']); - - $ret = ''; - $block_params = Array (); //$params; // sort of TagProcessor:prepareTagParams - $block_params['no_editing'] = 1; - $block_params['category'] = 0; - $block_params['separator'] = $params['separator']; - $current_template = $this->Application->GetVar('t'); - $show_category = getArrayValue($params, 'show_category'); - - foreach ($navigation_parts as $template => $title) { - $block_params['template'] = $template; - - if ($title == '__item__') { - if ($show_category) { - $ret .= $this->getCategoryPath($main_category_id, $params); - $show_category = false; - } - - $category_path = $this->getCategoryParentPath($main_category_id); - $module_info = $this->getCategoryModule($params, array_keys($category_path)); - if (!$module_info) { - continue; - } - - $module_prefix = $module_info['Var']; - $object =& $this->Application->recallObject($module_prefix); - /* @var $object kCatDBItem */ - - $title_field = $this->Application->getUnitOption($module_prefix, 'TitleField'); - $block_params['title'] = $object->GetField($title_field); - $block_params['prefix'] = $module_prefix; - $block_params['current'] = 0; - - $block_params['name'] = $this->SelectParam($params, 'module_item_render_as,render_as'); - } - else { - $block_params['current'] = ($template == $current_template); - $block_params['title'] = $this->Application->Phrase($title); - - $block_params['name'] = $template == $current_template ? $params['current_render_as'] : $params['render_as']; - } - - $ret .= $this->Application->ParseBlock($block_params); - } - - if ($show_category) { - $params['no_current'] = true; - return $home_element . ($show_category ? $this->getCategoryPath($main_category_id, $params) : '') . $ret; - } - - return $home_element . $ret; - } - - /** - * Get navigation parts - * - * @param Array $titles - * @param Array $templates - * @return Array - */ - function getNavigationParts($titles, $templates) - { - $titles = explode(',', $titles); - $templates = explode(',', $templates); - - $ret = Array (); - foreach ($templates as $template_pos => $template) { - $ret[$template] = $titles[$template_pos]; - } - - return $ret; - } - - /** - * Renders path to given category using given blocks. - * - * @param int $main_category_id - * @param Array $params - * @return string - */ - function getCategoryPath($main_category_id, $params) - { - $category_path = $this->getCategoryParentPath($main_category_id); - if (!$category_path) { - // in "Home" category - return ''; - } - - $module_info = $this->getCategoryModule($params, array_keys($category_path)); - - $module_category_id = $module_info['RootCat']; - $module_item_id = $this->Application->GetVar($module_info['Var'].'_id'); - - $ret = ''; - $block_params['category'] = 1; - $block_params['no_editing'] = 1; - $block_params['separator'] = $params['separator']; - $no_current = isset($params['no_current']) && $params['no_current']; - - $backup_category_id = $this->Application->GetVar('c_id'); - foreach ($category_path as $category_id => $category_name) { - $block_params['cat_id'] = $category_id; - $block_params['cat_name'] = $block_params['title'] = $category_name; - - if ($no_current) { - $block_params['current'] = 0; - } - else { - $block_params['current'] = ($main_category_id == $category_id) && !$module_item_id ? 1 : 0; - } - - $block_params['is_module_root'] = $category_id == $module_category_id ? 1 : 0; - $block_params['name'] = $this->SelectParam($params, 'render_as,block'); - - // which block to parse as current ? - if ($block_params['is_module_root']) { - $block_params['name'] = $this->SelectParam($params, 'module_root_render_as,render_as'); - $block_params['module_index'] = $module_info['TemplatePath'].'index'; - } - - if ($block_params['current']) { - $block_params['name'] = $this->SelectParam($params, 'current_render_as,render_as'); - } - - $this->Application->SetVar('c_id', $category_id); - $ret .= $this->Application->ParseBlock($block_params); - } - $this->Application->SetVar('c_id', $backup_category_id); - - return $ret; - } - - /** - * Returns module information based on given module name or current category (relative to module root categories) - * - * @param Array $params - * @param Array $category_ids category parent path (already as array) - * @return Array - */ - function getCategoryModule($params, $category_ids) - { - if (isset($params['module'])) { - // get module by name specified - $module_info = $this->Application->findModule('Name', $params['module']); - - } - elseif ($category_ids) { - // get module by category path - $module_root_categories = $this->getModuleRootCategories(); - $common_categories = array_intersect($category_ids, $module_root_categories); - $module_category_id = array_shift($common_categories); // get 1st common category - $module_info = $this->Application->findModule('RootCat', $module_category_id); - } - - return $module_info; - } - - /** - * Renders path to top catalog category - * - * @param Array $params - * @param int $current_category - * @return string - */ - function getHomeCategoryPath($params, $current_category) - { - $block_params['cat_id'] = $this->Application->findModule('Name', 'Core', 'RootCat'); // 0; - $block_params['no_editing'] = 1; - $block_params['current'] = $current_category == $block_params['cat_id'] ? 1 : 0; - $block_params['separator'] = $params['separator']; - $block_params['cat_name'] = $this->Application->ProcessParsedTag('m', 'RootCategoryName', $params); - $block_params['name'] = $this->SelectParam($params, 'root_cat_render_as,render_as'); - return $this->Application->ParseBlock($block_params); - } - - /** - * Returns root categories from all modules - * - * @return Array - */ - function getModuleRootCategories() - { - static $root_categories = null; - - if (!isset($root_categories)) { - $root_categories = Array (); - foreach ($this->Application->ModuleInfo as $module_name => $module_info) { - array_push($root_categories, $module_info['RootCat']); - } - - $root_categories = array_unique($root_categories); - } - - return $root_categories; - } - - /** - * Returns given category's parent path as array of id=>name elements - * - * @param int $main_category_id - * @return Array - */ - function getCategoryParentPath($main_category_id) - { - static $cached_path = null; - - if ($main_category_id == 0) { - // don't query path for "Home" category - return Array (); - } - - if (!isset($cached_path[$main_category_id])) { - $ml_formatter =& $this->Application->recallObject('kMultiLanguage'); - $navbar_field = $ml_formatter->LangFieldName('CachedNavBar'); - - $id_field = $this->Application->getUnitOption('c', 'IDField'); - $table_name = $this->Application->getUnitOption('c', 'TableName'); - - $sql = 'SELECT '.$navbar_field.', ParentPath - FROM '.$table_name.' - WHERE '.$id_field.' = '.$main_category_id; - $category_data = $this->Conn->GetRow($sql); - - $skip_category = $this->Application->findModule('Name', 'Core', 'RootCat'); - $cached_path[$main_category_id] = Array (); - if ($category_data) { - $category_names = explode('&|&', $category_data[$navbar_field]); - $category_ids = explode('|', substr($category_data['ParentPath'], 1, -1)); - - foreach ($category_ids as $category_index => $category_id) { - if ($category_id == $skip_category) { - continue; - } - $cached_path[$main_category_id][$category_id] = $category_names[$category_index]; - } - } - } - return $cached_path[$main_category_id]; - } - - /** - * Not tag, method for parameter - * selection from list in this TagProcessor - * - * @param Array $params - * @param string $possible_names - * @return string - * @access public - */ - function SelectParam($params, $possible_names) - { - if (!is_array($params)) return; - if (!is_array($possible_names)) - - $possible_names = explode(',', $possible_names); - foreach ($possible_names as $name) - { - if( isset($params[$name]) ) return $params[$name]; - } - return false; - } - - /** - * Converts multi-dimensional category structure in one-dimensional option array (category_id=>category_name) - * - * @param Array $data - * @param int $parent_category_id - * @param int_type $language_id - * @param int $theme_id - * @param int $level - * @return Array - */ - function _printChildren(&$data, $parent_category_id, $language_id, $theme_id, $level = 0) - { - if ($data['ThemeId'] != $theme_id && $data['ThemeId'] != 0) { - // don't show system templates from different themes - return Array (); - } - - $ret = Array($parent_category_id => str_repeat('-', $level).' '.$data['l'.$language_id.'_Name']); - - if ($data['children']) { - $level++; - foreach ($data['children'] as $category_id => $category_data) { - $ret = array_merge_recursive2($ret, $this->_printChildren($data['children'][$category_id], $category_id, $language_id, $theme_id, $level)); - } - } - - return $ret; - } - - /** - * Returns information about children under parent path (recursive) - * - * @param int $parent_category_id - * @param int $language_count - * @return Array - */ - function _getChildren($parent_category_id, $language_count) - { - $id_field = $this->Application->getUnitOption('c', 'IDField'); - - // get category children + parent category - $sql = 'SELECT * - FROM '.$this->Application->getUnitOption('c', 'TableName').' - WHERE ParentId = '.$parent_category_id.' OR '.$id_field.' = '.$parent_category_id.' - ORDER BY Priority DESC'; - $categories = $this->Conn->Query($sql, $id_field); - - $parent_data = $categories[$parent_category_id]; - unset($categories[$parent_category_id]); - - // no children for this category - $data = Array ('id' => $parent_data[$id_field], 'children' => false, 'ThemeId' => $parent_data['ThemeId']); - for ($i = 1; $i <= $language_count; $i++) { - $data['l'.$i.'_Name'] = $parent_data['l'.$i.'_Name']; - } - - if (!$categories) { - // no children - return $data; - } - - // category has children - foreach ($categories as $category_id => $category_data) { - $data['children'][$category_id] = $this->_getChildren($category_id, $language_count); - } - - return $data; - } - - /** - * Generates OR retrieves from cache structure tree - * - * @return Array - */ - function &_getStructureTree() - { - // get cached version of structure tree - $sql = 'SELECT Data - FROM ' . TABLE_PREFIX . 'Cache - WHERE VarName = "StructureTree"'; - $data = $this->Conn->GetOne($sql); - - if ($data) { - $data = unserialize($data); - - return $data; - } - - // generate structure tree from scratch - $ml_helper =& $this->Application->recallObject('kMultiLanguageHelper'); - /* @var $ml_helper kMultiLanguageHelper */ - - $language_count = $ml_helper->getLanguageCount(); - - $root_category = $this->Application->findModule('Name', 'Core', 'RootCat'); - $data = $this->_getChildren($root_category, $language_count); - - $fields_hash = Array ( - 'VarName' => 'StructureTree', - 'Data' => serialize($data), - 'Cached' => adodb_mktime(), - ); - - $this->Conn->doInsert($fields_hash, TABLE_PREFIX.'Cache', 'REPLACE'); - - return $data; - } - - /** - * Returns category structure as field option list - * - * @return Array - */ - function getStructureTreeAsOptions() - { - if (defined('IS_INSTALL') && IS_INSTALL) { - // no need to create category structure during install, because it's not used there - return Array (); - } - - if (isset($this->_structureTree)) { - return $this->_structureTree; - } - - $themes_helper =& $this->Application->recallObject('ThemesHelper'); - /* @var $themes_helper kThemesHelper */ - - $data = $this->_getStructureTree(); - - $theme_id = (int)$themes_helper->getCurrentThemeId(); - $root_category = $this->Application->findModule('Name', 'Core', 'RootCat'); - - $this->_structureTree = $this->_printChildren($data, $root_category, $this->Application->GetVar('m_lang'), $theme_id); - - return $this->_structureTree; - } - - /** - * Replace links like "@@ID@@" to actual template names in given text - * - * @param string $text - * @return string - */ - function replacePageIds($text) - { - if (!preg_match_all('/@@(\\d+)@@/', $text, $regs)) { - return $text; - } - - $page_ids = $regs[1]; - - $sql = 'SELECT NamedParentPath, CategoryId - FROM ' . TABLE_PREFIX . 'Category - WHERE CategoryId IN (' . implode(',', $page_ids) . ')'; - $templates = $this->Conn->GetCol($sql, 'CategoryId'); - - foreach ($page_ids as $page_id) { - if (!array_key_exists($page_id, $templates)) { - // internal page was deleted, but link to it was found in given content block data - continue; - } - - $url_params = Array ('m_cat_id' => $page_id, 'pass' => 'm'); - $page_url = $this->Application->HREF(strtolower($templates[$page_id]), '', $url_params); - /*if ($this->Application->IsAdmin()) { - $page_url = preg_replace('/&(admin|editing_mode)=[\d]/', '', $page_url); - }*/ - $text = preg_replace('/@@' . $page_id . '@@/', $page_url, $text); - } - - return $text; - } - } \ No newline at end of file Property changes on: branches/5.0.x/core/units/general/helpers/category_helper.php ___________________________________________________________________ Deleted: cvs2svn:cvs-rev ## -1 +0,0 ## -1.3.2.7 \ No newline at end of property Deleted: svn:executable ## -1 +0,0 ## -* \ No newline at end of property Deleted: svn:keywords ## -1 +0,0 ## -Id \ No newline at end of property