Ip\Internal\PathHelper::ipRelativeDir PHP Method

ipRelativeDir() public static method

public static ipRelativeDir ( integer $callLevel ) : string
$callLevel integer
return string
    public static function ipRelativeDir($callLevel = 0)
    {
        $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, $callLevel + 1);
        if (!isset($backtrace[$callLevel]['file'])) {
            throw new \Ip\Exception("Can't find caller");
        }
        $absoluteFile = $backtrace[$callLevel]['file'];
        if (DIRECTORY_SEPARATOR == '\\') {
            // Replace windows paths
            $absoluteFile = str_replace('\\', '/', $absoluteFile);
        }
        $overrides = ipConfig()->get('fileOverrides');
        if ($overrides) {
            foreach ($overrides as $relativePath => $fullPath) {
                if (DIRECTORY_SEPARATOR == '\\') {
                    // Replace windows paths
                    $fullPath = str_replace('\\', '/', $fullPath);
                }
                if (strpos($absoluteFile, $fullPath) === 0) {
                    $relativeFile = substr_replace($absoluteFile, $relativePath, 0, strlen($fullPath));
                    return substr($relativeFile, 0, strrpos($relativeFile, '/') + 1);
                }
            }
        }
        $baseDir = ipConfig()->get('baseDir');
        $baseDir = str_replace('\\', '/', $baseDir);
        if (strpos($absoluteFile, $baseDir) !== 0) {
            throw new \Ip\Exception('Cannot find relative path for file ' . esc($absoluteFile));
        }
        $relativeFile = substr($absoluteFile, strlen($baseDir) + 1);
        return substr($relativeFile, 0, strrpos($relativeFile, '/') + 1);
    }

Usage Example

Beispiel #1
0
/**
 * Get MVC view object
 *
 * Get a view object using specified view file and data array.
 * @param string $file MVC view file pathname.
 * @param array $data View's data.
 * @param int $_callerDepth
 * @return \Ip\View
 * @throws \Ip\Exception\View
 */
function ipView($file, $data = array(), $_callerDepth = 0)
{
    if ($file[0] == '/' || $file[1] == ':') {
        // Absolute filename
        return new \Ip\View($file, $data);
    }
    if (preg_match('%^(Plugin|Theme|file|Ip)/%', $file)) {
        $relativePath = $file;
    } else {
        $relativePath = \Ip\Internal\PathHelper::ipRelativeDir($_callerDepth + 1) . $file;
    }
    $fileInThemeDir = ipThemeFile(\Ip\View::OVERRIDE_DIR . '/' . $relativePath);
    if (is_file($fileInThemeDir)) {
        return new \Ip\View($fileInThemeDir, $data);
    }
    $absolutePath = ipFile($relativePath);
    if (file_exists($absolutePath)) {
        // The most common case
        return new \Ip\View($absolutePath, $data);
    }
    // File was not found, check whether it is in theme override dir.
    if (strpos($relativePath, 'Theme/' . ipConfig()->theme() . '/override/') !== 0) {
        $file = esc($file);
        throw new \Ip\Exception\View("View {$file} not found.");
    }
    $pathFromWebsiteRoot = str_replace(ipFile('Theme/' . ipConfig()->theme() . '/override/'), '', $absolutePath);
    return ipView($pathFromWebsiteRoot);
}
PathHelper