Skip to content

Commit

Permalink
Merge branch 'ini_loading_order' of github.com:andrerom/ezpublish int…
Browse files Browse the repository at this point in the history
…o master

Implementes:
- #017082: Clean-up ini loading inconsistency regarding ActiveAccessExtensions SA
- #017081: Provide a simple api to load siteaccess globally & on ini instance
- #017080: Optimize eZINI input file lookup
  • Loading branch information
andrerom committed Aug 9, 2010
1 parent e194f6c commit 03b3672
Show file tree
Hide file tree
Showing 15 changed files with 889 additions and 403 deletions.
23 changes: 22 additions & 1 deletion doc/bc/4.4/changes-4.4.0.txt
Expand Up @@ -37,6 +37,10 @@ Change of behavior
possible nor needed to clear/expire sessions from admin interface or command line interface.
To get old behavoir back, enable db handler by setting site.ini/Session.Handler to eZSessionHandlerDB

- eZExtension::activateExtensions()

Default value of of first parameter has been changed from false to 'default', see deprecation note bellow.

- eZOperationHandler::operationIsAvailable()

The $name parameter for this method is no longer optional. It did return false anyway if the parameter was omitted.
Expand All @@ -61,7 +65,19 @@ Deprecated functionality
use post parameters in the future, and we recommend you to do the same for your custom code.
* breaks when you have multiple windows open, something power users frequently do.

* INI file suffix *.ini.php & *.ini.append
- eZExtension::activateExtensions( false )

Strict error will be thrown if first parameter is false as of this version.
Reason is that changes in ini system requires clearer seperation between access and default
extensions. Thus extension loading should be done in at least two phases, normally with siteaccess
loading in between like index.php does and always have done it.

- eZINI::parameterSet()

This function has been deprecated in favour of using the normal and more efficient:
eZINI::instance('<file>.ini')->hasVariable('SomeSection', 'SomeSetting')

- INI file suffix *.ini.php & *.ini.append

This ini suffix types have been deprecated, please use *.ini or *.ini.append.php

Expand Down Expand Up @@ -99,4 +115,9 @@ Removed methods
Removed globals
---------------

- eZINIOverrideDirList

eZINI now uses a private static variable to keep track of override folders, new api calls have
been added to be able modify it. ->overrideDirs() will still return an iterable list of dirs
but has a new parameter to specific if you'd want to get the internal raw structure instead.

@@ -1,6 +1,9 @@
Changes from 4.4.0alpha5 to 4.4.0alpha6

*Kernel:
- Implemented enhancement #017082: Clean-up ini loading inconsistency regarding ActiveAccessExtensions SA
- Implemented enhancement #017081: Provide a simple api to load siteaccess globally & on ini instance
- Implemented enhancement #017080: Optimize eZINI input file lookup
- Implemented enhancement #017066: Remove private & unused function eZCharTransform::varExportInternal()
- Implemented enhancement #017012: Add session handler & support for anonymous sessions
- Implemented enhancement #016801: eZINI: Deprecate *.ini.append and *.ini.php file suffix
Expand Down
201 changes: 149 additions & 52 deletions kernel/classes/ezsiteaccess.php
Expand Up @@ -92,42 +92,6 @@ static function findPathToSiteAccess( $siteAccess )
return 'settings/siteaccess/' . $siteAccess;
}

/**
* Re-initialises the current site access
*
* - clears all in-memory caches used by the INI system
* - re-builds the list of paths where INI files are searched for
* - re-searches module paths
*
* @return bool True if re-initialisation was successful
*/
static function reInitialise()
{
if ( isset( $GLOBALS['eZCurrentAccess'] ) )
{
eZINI::resetAllGlobals();

eZExtension::activateExtensions( 'default' );
$accessName = $GLOBALS['eZCurrentAccess']['name'];
if ( file_exists( "settings/siteaccess/$accessName" ) )
{
$ini = eZINI::instance();
$ini->prependOverrideDir( "siteaccess/$accessName", false, 'siteaccess' );
}
eZExtension::prependExtensionSiteAccesses( $accessName );
eZExtension::activateExtensions( 'access' );

$moduleRepositories = eZModule::activeModuleRepositories();
eZModule::setGlobalPathList( $moduleRepositories );

return true;
}
else
{
return false;
}
}

/**
* Goes trough the access matching rules and returns the access match.
* The returned match is an associative array with:
Expand Down Expand Up @@ -490,47 +454,180 @@ static function matchText( &$text, $match_pre, $match_post )
return $ret;
}

/**
* Re-initialises the current site access
* If a siteaccess is set, then executes {@link eZSiteAccess::load()}
*
* @return bool True if re-initialisation was successful
*/
static function reInitialise()
{
if ( isset( $GLOBALS['eZCurrentAccess'] ) )
{
self::load( $GLOBALS['eZCurrentAccess'] );
return true;
}
else
{
return false;
}
}

/**
* Changes the site access to what's defined in $access. It will change the
* access path in eZSys and prepend an override dir to eZINI
* Note: does not load extensions, use {@link eZSiteAccess::load()} if you want that
*
* @since 4.4
* @param array $access An associative array with 'name' (string), 'type' (int) and 'uri_part' (array).
* See {@link eZSiteAccess::match()} for array structure definition
* @param eZINI|null $siteINI Optional parameter to be able to only do change on specific instance of site.ini

This comment has been minimized.

Copy link
@bdunogier

bdunogier Aug 20, 2010

Member

what ? :)

This comment has been minimized.

Copy link
@andrerom

andrerom Aug 20, 2010

Author Contributor

$siteINI ? It's used by getINI() to load siteaccess settings using same code but without affecting global stuff.

* hence skip changing eZSys access paths (but not siteaccess, see {@link eZSiteAccess::load()})
* @return array The $access parameter
*/
static function change( array $access )
static function change( array $access, eZINI $siteINI = null )
{
eZSys::clearAccessPath();
$GLOBALS['eZCurrentAccess'] =& $access;

$name = $access['name'];
if ( isset( $access['uri_part'] ) && $access['uri_part'] !== null )
eZSys::setAccessPath( $access['uri_part'], $name );
$GLOBALS['eZCurrentAccess'] =& $access;
if ( $siteINI !== null )
{
$ini = $siteINI;
}
else
$access['uri_part'] = array();

$ini = eZINI::instance();
if ( file_exists( "settings/siteaccess/$name" ) )
{
$ini->prependOverrideDir( "siteaccess/$name", false, 'siteaccess' );
eZSys::clearAccessPath();
if ( isset( $access['uri_part'] ) && $access['uri_part'] !== null )
eZSys::setAccessPath( $access['uri_part'], $name );
else
$access['uri_part'] = array();

$ini = eZINI::instance();
}

$ini->prependOverrideDir( "siteaccess/$name", false, 'siteaccess', 'siteaccess' );

/* Make sure extension siteaccesses are prepended */
eZExtension::prependExtensionSiteAccesses( $name );
eZExtension::prependExtensionSiteAccesses( $name, $ini );

$ini->loadCache();

eZUpdateDebugSettings();
if ( self::debugEnabled() )
if ( $siteINI === null )
{
eZDebug::writeDebug( "Updated settings to use siteaccess '$name'", __METHOD__ );
eZUpdateDebugSettings();
if ( self::debugEnabled() )
{
eZDebug::writeDebug( "Updated settings to use siteaccess '$name'", __METHOD__ );
}
}

return $access;
}

/**
* Reloads extensions and changes siteaccess globally
* If you only want changes on a instance of ini, use {@link eZSiteAccess::getIni()}
*
* - clears all in-memory caches used by the INI system
* - re-builds the list of paths where INI files are searched for
* - runs {@link eZSiteAccess::change()}
* - re-searches module paths {@link eZModule::setGlobalPathList()}
*
* @since 4.4
* @param array $access An associative array with 'name' (string), 'type' (int) and 'uri_part' (array).
* See {@link eZSiteAccess::match()} for array structure definition
* @param eZINI|null $siteINI Optional parameter to be able to only do change on specific instance of site.ini
* If set, then global siteacceess will not be changed as well.
* @return array The $access parameter
*/
static function load( array $access, eZINI $siteINI = null )
{
$currentSiteAccess = $GLOBALS['eZCurrentAccess'];
unset( $GLOBALS['eZCurrentAccess'] );

// Clear all ini override dirs
if ( $siteINI instanceof eZINI )
{
$siteINI->resetOverrideDirs();
}
else
{
eZINI::resetAllGlobals();
eZExtension::clearActiveExtensionsMemoryCache();
eZTemplateDesignResource::clearInMemoryOverrideArray();
}

// Reload extensions, siteaccess and access extensions
eZExtension::activateExtensions( 'default', $siteINI );
$access = self::change( $access, $siteINI );
eZExtension::activateExtensions( 'access', $siteINI );

// Restore current (old) siteacces if changes where only to be applied to locale instance of site.ini
if ( $siteINI instanceof eZINI )
{
$GLOBALS['eZCurrentAccess'] = $currentSiteAccess;
}
else
{
$moduleRepositories = eZModule::activeModuleRepositories();
eZModule::setGlobalPathList( $moduleRepositories );
}

return $access;
}

/**
* Get current siteaccess data
* Loads ini envermont for a specific siteaccess

This comment has been minimized.

Copy link
@bdunogier

bdunogier Aug 20, 2010

Member

envermont ?

This comment has been minimized.

Copy link
@andrerom

andrerom Aug 20, 2010

Author Contributor

Fixed

*
* eg: eZSiteAccess::getIni( 'eng', 'site.ini' )
*
* @since 4.4
* @param string $siteAccess
* @param string $settingFile
* @return eZINI
*/
static function getIni( $siteAccess, $settingFile = 'site.ini' )
{
// return global if siteaccess is same as requested
if ( isset( $GLOBALS['eZCurrentAccess'] )
&& $GLOBALS['eZCurrentAccess']['name'] === $siteAccess )
{
return eZINI::instance( $settingFile );
}

// create a site ini instance using $useLocalOverrides = true
$siteIni = new eZINI( 'site.ini', 'settings', null, null, true );

// create a access definition reusing current if set but change name
$access = isset( $GLOBALS['eZCurrentAccess'] ) ?
$GLOBALS['eZCurrentAccess'] :
array( 'type' => eZSiteAccess::TYPE_STATIC, 'uri_part' => array() );
$access['name'] = $siteAccess;
if ( $access['type'] === eZSiteAccess::TYPE_URI )
{
$access['uri_part'] = array( $siteAccess );
}

// Load siteaccess but on our locale instance of site.ini only
$access = self::load( $access, $siteIni );

// if site.ini, return with no further work needed
if ( $settingFile === 'site.ini' )
{
return $siteIni;
}

// load settings file with $useLocalOverrides = true
$ini = new eZINI( $settingFile,'settings', null, null, true );

// overwrite overrideDirs from siteIni instance
$ini->setOverrideDirs( $siteIni->overrideDirs( false ) );
$ini->load();

return $ini;
}

/**
* Get current siteaccess data if set, see {@link eZSiteAccess::match()} for array structure
*
* @since 4.4
* return array|null
Expand Down
2 changes: 1 addition & 1 deletion kernel/classes/ezstaticcache.php
Expand Up @@ -503,7 +503,7 @@ private function buildCacheDirPart( $dir, $siteAccess )
{
return array( 'dir' => $dir,
'access_name' => $siteAccess,
'site_url' => eZINI::getSiteAccessIni( $siteAccess, 'site.ini' )->variable( 'SiteSettings', 'SiteURL' ) );
'site_url' => eZSiteAccess::getIni( $siteAccess, 'site.ini' )->variable( 'SiteSettings', 'SiteURL' ) );
}

/**
Expand Down
30 changes: 9 additions & 21 deletions kernel/common/eztemplatedesignresource.php
Expand Up @@ -596,15 +596,13 @@ function overrideKeys( $siteAccess = false )
if ( $siteAccess )
{
// Get the design resources
$ini = eZINI::instance( 'site.ini', 'settings', null, null, true );
$ini->prependOverrideDir( "siteaccess/$siteAccess", false, 'siteaccess' );
eZExtension::prependExtensionSiteAccesses( $siteAccess, $ini, false, 'siteaccess' );
$ini->loadCache();
$ini = eZSiteAccess::getIni( $siteAccess, 'site.ini' );

$overrideINI = eZINI::instance( 'override.ini', 'settings', null, null, true );
$overrideINI->prependOverrideDir( "siteaccess/$siteAccess", false, 'siteaccess' );
eZExtension::prependExtensionSiteAccesses( $siteAccess, $overrideINI, false, 'siteaccess', false );
$overrideINI->loadCache();

// overwrite overrideDirs from siteIni instance
$overrideINI->setOverrideDirs( $ini->overrideDirs( false ) );
$overrideINI->load();

$standardBase = $ini->variable( "DesignSettings", "StandardDesign" );
$keys[] = "siteaccess/$siteAccess";
Expand All @@ -617,17 +615,13 @@ function overrideKeys( $siteAccess = false )
$ini = eZINI::instance();
if ( $this->OverrideSiteAccess != false )
{
$overrideINI = eZINI::instance( 'override.ini', 'settings', null, null, true );
eZExtension::prependExtensionSiteAccesses( $siteAccess, $overrideINI, false, 'siteaccess' );
$overrideINI->prependOverrideDir( "siteaccess/$this->OverrideSiteAccess", false, 'siteaccess', false );
$overrideINI->loadCache();
$overrideINI = eZSiteAccess::getIni( $siteAccess, 'override.ini' );
$keys[] = "siteaccess/$this->OverrideSiteAccess";
}
else
{
$overrideINI = eZINI::instance( 'override.ini' );
$currentAccess = $GLOBALS['eZCurrentAccess'];
$siteAccess = $currentAccess['name'];
$siteAccess = $GLOBALS['eZCurrentAccess']['name'];
$keys[] = "siteaccess/$siteAccess";
}

Expand Down Expand Up @@ -766,10 +760,7 @@ private static function findDesignBase( eZINI $ini, $siteAccess = false )
{
if( $siteAccess )
{
$ini = eZINI::instance( 'site.ini', 'settings', null, null, true );
$ini->prependOverrideDir( "siteaccess/$siteAccess", false, 'siteaccess' );
eZExtension::prependExtensionSiteAccesses( $siteAccess, $ini, false, 'siteaccess' );
$ini->loadCache();
$ini = eZSiteAccess::getIni( $siteAccess, 'site.ini' );

$standardDesign = $ini->variable( 'DesignSettings', 'StandardDesign' );
$siteDesign = $ini->variable( 'DesignSettings', 'SiteDesign' );
Expand Down Expand Up @@ -878,10 +869,7 @@ static function overrideArray( $siteAccess = false )
// fetch the override array from a specific siteacces
if ( $siteAccess )
{
$overrideINI = eZINI::instance( 'override.ini', 'settings', null, null, true );
$overrideINI->prependOverrideDir( "siteaccess/$siteAccess", false, 'siteaccess' );
eZExtension::prependExtensionSiteAccesses( $siteAccess, $overrideINI, false, 'siteaccess', false );
$overrideINI->loadCache();
$overrideINI = eZSiteAccess::getIni( $siteAccess, 'override.ini' );
}
else
{
Expand Down

0 comments on commit 03b3672

Please sign in to comment.