Skip to content

Instantly share code, notes, and snippets.

@mklooss
Created September 28, 2012 13:22
Show Gist options
  • Save mklooss/3799823 to your computer and use it in GitHub Desktop.
Save mklooss/3799823 to your computer and use it in GitHub Desktop.
Multistore Magento / File Owner Cache Problem
<?php
/**
* Magento
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to [email protected] so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade Magento to newer
* versions in the future. If you wish to customize Magento for your
* needs please refer to http://www.magentocommerce.com for more information.
*
* @category Mage
* @package Mage_Core
* @copyright Copyright (c) 2011 Magento Inc. (http://www.magentocommerce.com)
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*/
/**
* Configuration options storage and logic
*
* @category Mage
* @package Mage_Core
* @author Magento Core Team <[email protected]>
*/
class Mage_Core_Model_Config_Options extends Varien_Object
{
/**
* Var directory
*
* @var string
*/
const VAR_DIRECTORY = 'var';
/**
* Flag cache for existing or already created directories
*
* @var array
*/
protected $_dirExists = array();
/**
* Initialize default values of the options
*/
protected function _construct()
{
$appRoot= Mage::getRoot();
$root = dirname($appRoot);
$this->_data['app_dir'] = $appRoot;
$this->_data['base_dir'] = $root;
$this->_data['code_dir'] = $appRoot.DS.'code';
$this->_data['design_dir'] = $appRoot.DS.'design';
$this->_data['etc_dir'] = $appRoot.DS.'etc';
$this->_data['lib_dir'] = $root.DS.'lib';
$this->_data['locale_dir'] = $appRoot.DS.'locale';
$this->_data['media_dir'] = $root.DS.'media';
$this->_data['skin_dir'] = $root.DS.'skin';
$this->_data['var_dir'] = $this->getVarDir();
$this->_data['tmp_dir'] = $this->_data['var_dir'].DS.'tmp';
// changed loe BOF
//$this->_data['cache_dir'] = $this->_data['var_dir'].DS.'cache';
$this->_data['cache_dir'] = $this->_data['var_dir'].DS.'cache'.$this->getStoreName();
// changed loe EOF
$this->_data['log_dir'] = $this->_data['var_dir'].DS.'log';
$this->_data['session_dir'] = $this->_data['var_dir'].DS.'session';
$this->_data['upload_dir'] = $this->_data['media_dir'].DS.'upload';
$this->_data['export_dir'] = $this->_data['var_dir'].DS.'export';
}
public function getDir($type)
{
$method = 'get'.ucwords($type).'Dir';
$dir = $this->$method();
if (!$dir) {
throw Mage::exception('Mage_Core', 'Invalid dir type requested: '.$type);
}
return $dir;
}
public function getAppDir()
{
//return $this->getDataSetDefault('app_dir', Mage::getRoot());
return $this->_data['app_dir'];
}
public function getBaseDir()
{
//return $this->getDataSetDefault('base_dir', dirname($this->getAppDir()));
return $this->_data['base_dir'];
}
public function getCodeDir()
{
//return $this->getDataSetDefault('code_dir', $this->getAppDir().DS.'code');
return $this->_data['code_dir'];
}
public function getDesignDir()
{
//return $this->getDataSetDefault('design_dir', $this->getAppDir().DS.'design');
return $this->_data['design_dir'];
}
public function getEtcDir()
{
//return $this->getDataSetDefault('etc_dir', $this->getAppDir().DS.'etc');
return $this->_data['etc_dir'];
}
public function getLibDir()
{
//return $this->getDataSetDefault('lib_dir', $this->getBaseDir().DS.'lib');
return $this->_data['lib_dir'];
}
public function getLocaleDir()
{
//return $this->getDataSetDefault('locale_dir', $this->getAppDir().DS.'locale');
return $this->_data['locale_dir'];
}
public function getMediaDir()
{
//return $this->getDataSetDefault('media_dir', $this->getBaseDir().DS.'media');
return $this->_data['media_dir'];
}
public function getSkinDir()
{
//return $this->getDataSetDefault('skin_dir', $this->getBaseDir().DS.'skin');
return $this->_data['skin_dir'];
}
public function getSysTmpDir()
{
return sys_get_temp_dir();
}
public function getVarDir()
{
//$dir = $this->getDataSetDefault('var_dir', $this->getBaseDir().DS.'var');
$dir = isset($this->_data['var_dir']) ? $this->_data['var_dir']
: $this->_data['base_dir'] . DS . self::VAR_DIRECTORY;
if (!$this->createDirIfNotExists($dir)) {
$dir = $this->getSysTmpDir().DS.'magento'.DS.'var';
if (!$this->createDirIfNotExists($dir)) {
throw new Mage_Core_Exception('Unable to find writable var_dir');
}
}
return $dir;
}
public function getTmpDir()
{
//$dir = $this->getDataSetDefault('tmp_dir', $this->getVarDir().DS.'tmp');
$dir = $this->_data['tmp_dir'];
if (!$this->createDirIfNotExists($dir)) {
$dir = $this->getSysTmpDir().DS.'magento'.DS.'tmp';
if (!$this->createDirIfNotExists($dir)) {
throw new Mage_Core_Exception('Unable to find writable tmp_dir');
}
}
return $dir;
}
public function getCacheDir()
{
//$dir = $this->getDataSetDefault('cache_dir', $this->getVarDir().DS.'cache');
$dir = $this->_data['cache_dir'];
$this->createDirIfNotExists($dir);
return $dir;
}
public function getLogDir()
{
//$dir = $this->getDataSetDefault('log_dir', $this->getVarDir().DS.'log');
$dir = $this->_data['log_dir'];
$this->createDirIfNotExists($dir);
return $dir;
}
public function getSessionDir()
{
//$dir = $this->getDataSetDefault('session_dir', $this->getVarDir().DS.'session');
$dir = $this->_data['session_dir'];
$this->createDirIfNotExists($dir);
return $dir;
}
public function getUploadDir()
{
//$dir = $this->getDataSetDefault('upload_dir', $this->getMediaDir().DS.'upload');
$dir = $this->_data['upload_dir'];
$this->createDirIfNotExists($dir);
return $dir;
}
public function getExportDir()
{
//$dir = $this->getDataSetDefault('export_dir', $this->getVarDir().DS.'export');
$dir = $this->_data['export_dir'];
$this->createDirIfNotExists($dir);
return $dir;
}
public function createDirIfNotExists($dir)
{
if (!empty($this->_dirExists[$dir])) {
return true;
}
if (file_exists($dir)) {
if (!is_dir($dir)) {
return false;
}
if (!is_dir_writeable($dir)) {
return false;
}
} else {
$oldUmask = umask(0);
if (!@mkdir($dir, 0777, true)) {
return false;
}
umask($oldUmask);
}
$this->_dirExists[$dir] = true;
return true;
}
protected function getStoreName()
{
if(!empty($_SERVER['MAGE_RUN_TYPE'])) {
$type = $_SERVER['MAGE_RUN_TYPE'];
} else { $type = "base"; }
if(!empty($_SERVER['MAGE_RUN_CODE'])) {
$name = $_SERVER['MAGE_RUN_CODE'];
} else { $name = "base"; }
if($name == $type) {
return '';
}
return DS.$type.DS.$name;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment