%PDF- %PDF-
Direktori : /var/www/businessmultisite/wp-content/plugins/timber-library/lib/ |
Current File : /var/www/businessmultisite/wp-content/plugins/timber-library/lib/Loader.php |
<?php namespace Timber; use Timber\Cache\Cleaner; class Loader { const CACHEGROUP = 'timberloader'; const TRANS_KEY_LEN = 50; const CACHE_NONE = 'none'; const CACHE_OBJECT = 'cache'; const CACHE_TRANSIENT = 'transient'; const CACHE_SITE_TRANSIENT = 'site-transient'; const CACHE_USE_DEFAULT = 'default'; public static $cache_modes = array( self::CACHE_NONE, self::CACHE_OBJECT, self::CACHE_TRANSIENT, self::CACHE_SITE_TRANSIENT ); protected $cache_mode = self::CACHE_TRANSIENT; protected $locations; /** * @param bool|string $caller the calling directory or false */ public function __construct( $caller = false ) { $this->locations = LocationManager::get_locations($caller); $this->cache_mode = apply_filters('timber_cache_mode', $this->cache_mode); $this->cache_mode = apply_filters('timber/cache/mode', $this->cache_mode); } /** * @param string $file * @param array $data * @param array|boolean $expires (array for options, false for none, integer for # of seconds) * @param string $cache_mode * @return bool|string */ public function render( $file, $data = null, $expires = false, $cache_mode = self::CACHE_USE_DEFAULT ) { // Different $expires if user is anonymous or logged in if ( is_array($expires) ) { /** @var array $expires */ if ( is_user_logged_in() && isset($expires[1]) ) { $expires = $expires[1]; } else { $expires = $expires[0]; } } if ( $expires === 0 ) { $expires = false; } $key = null; $output = false; if ( false !== $expires ) { ksort($data); $key = md5($file.json_encode($data)); $output = $this->get_cache($key, self::CACHEGROUP, $cache_mode); } if ( false === $output || null === $output ) { $twig = $this->get_twig(); if ( strlen($file) ) { $loader = $this->get_loader(); $result = $loader->getCacheKey($file); do_action('timber_loader_render_file', $result); } $data = apply_filters('timber_loader_render_data', $data); $data = apply_filters('timber/loader/render_data', $data, $file); $template = $twig->load($file); $output = $template->render($data); } if ( false !== $output && false !== $expires && null !== $key ) { $this->delete_cache(); $this->set_cache($key, $output, self::CACHEGROUP, $expires, $cache_mode); } $output = apply_filters('timber_output', $output); return apply_filters('timber/output', $output, $data, $file); } protected function delete_cache() { Cleaner::delete_transients(); } /** * Get first existing template. * * @param array|string $templates Name(s) of the Twig template(s) to choose from. * @return string|bool Name of chosen template, otherwise false. */ public function choose_template( $templates ) { // Change $templates into array, if needed if ( !is_array($templates) ) { $templates = (array) $templates; } // Get Twig loader $loader = $this->get_loader(); // Run through template array foreach ( $templates as $template ) { // Remove any whitespace around the template name $template = trim( $template ); // Use the Twig loader to test for existance if ( $loader->exists($template) ) { // Return name of existing template return $template; } } // No existing template was found return false; } /** * @param string $name * @return bool * @deprecated 1.3.5 No longer used internally * @todo remove in 2.x * @codeCoverageIgnore */ protected function template_exists( $name ) { return $this->get_loader()->exists($name); } /** * @return \Twig\Loader\FilesystemLoader */ public function get_loader() { $open_basedir = ini_get('open_basedir'); $paths = array_merge($this->locations, array($open_basedir ? ABSPATH : '/')); $paths = apply_filters('timber/loader/paths', $paths); $rootPath = '/'; if ( $open_basedir ) { $rootPath = null; } $fs = new \Twig\Loader\FilesystemLoader($paths, $rootPath); $fs = apply_filters('timber/loader/loader', $fs, $paths, $rootPath); return $fs; } /** * @return \Twig\Environment */ public function get_twig() { $loader = $this->get_loader(); $params = array('debug' => WP_DEBUG,'autoescape' => false); if ( isset(Timber::$autoescape) ) { $params['autoescape'] = Timber::$autoescape === true ? 'html' : Timber::$autoescape; } if ( Timber::$cache === true ) { Timber::$twig_cache = true; } if ( Timber::$twig_cache ) { $twig_cache_loc = apply_filters('timber/cache/location', TIMBER_LOC.'/cache/twig'); if ( !file_exists($twig_cache_loc) ) { mkdir($twig_cache_loc, 0777, true); } $params['cache'] = $twig_cache_loc; } $twig = new \Twig\Environment($loader, $params); if ( WP_DEBUG ) { $twig->addExtension(new \Twig\Extension\DebugExtension()); } else { $twig->addFunction(new Twig_Function('dump', function() { return null; })); } $twig->addExtension($this->_get_cache_extension()); $twig = apply_filters('twig_apply_filters', $twig); $twig = apply_filters('timber/twig/filters', $twig); $twig = apply_filters('timber/twig/functions', $twig); $twig = apply_filters('timber/twig/escapers', $twig); $twig = apply_filters('timber/loader/twig', $twig); $twig = apply_filters('timber/twig', $twig); /** * get_twig is deprecated, use timber/twig */ $twig = apply_filters('get_twig', $twig); return $twig; } public function clear_cache_timber( $cache_mode = self::CACHE_USE_DEFAULT ) { //_transient_timberloader $object_cache = false; if ( isset($GLOBALS['wp_object_cache']) && is_object($GLOBALS['wp_object_cache']) ) { $object_cache = true; } $cache_mode = $this->_get_cache_mode($cache_mode); if ( self::CACHE_TRANSIENT === $cache_mode || self::CACHE_SITE_TRANSIENT === $cache_mode ) { return self::clear_cache_timber_database(); } else if ( self::CACHE_OBJECT === $cache_mode && $object_cache ) { return self::clear_cache_timber_object(); } return false; } protected static function clear_cache_timber_database() { global $wpdb; $query = $wpdb->prepare( "DELETE FROM $wpdb->options WHERE option_name LIKE '%s'", '_transient%timberloader_%' ); return $wpdb->query($query); } protected static function clear_cache_timber_object() { global $wp_object_cache; if ( isset($wp_object_cache->cache[self::CACHEGROUP]) ) { $items = $wp_object_cache->cache[self::CACHEGROUP]; foreach ( $items as $key => $value ) { if ( is_multisite() ) { $key = preg_replace('/^(.*?):/', '', $key); } wp_cache_delete($key, self::CACHEGROUP); } return true; } } public function clear_cache_twig() { $twig = $this->get_twig(); if ( method_exists($twig, 'clearCacheFiles') ) { $twig->clearCacheFiles(); } $cache = $twig->getCache(); if ( $cache ) { self::rrmdir($twig->getCache()); return true; } return false; } /** * Remove a directory and everything inside * * @param string|false $dirPath */ public static function rrmdir( $dirPath ) { if ( !is_dir($dirPath) ) { throw new \InvalidArgumentException("$dirPath must be a directory"); } if ( substr($dirPath, strlen($dirPath) - 1, 1) != '/' ) { $dirPath .= '/'; } $files = glob($dirPath.'*', GLOB_MARK); foreach ( $files as $file ) { if ( is_dir($file) ) { self::rrmdir($file); } else { unlink($file); } } rmdir($dirPath); } /** * @return \Twig\CacheExtension\Extension */ private function _get_cache_extension() { $key_generator = new \Timber\Cache\KeyGenerator(); $cache_provider = new \Timber\Cache\WPObjectCacheAdapter($this); $cache_lifetime = apply_filters('timber/cache/extension/lifetime', 0); $cache_strategy = new \Twig\CacheExtension\CacheStrategy\GenerationalCacheStrategy($cache_provider, $key_generator, $cache_lifetime); $cache_extension = new \Twig\CacheExtension\Extension($cache_strategy); return $cache_extension; } /** * @param string $key * @param string $group * @param string $cache_mode * @return bool */ public function get_cache( $key, $group = self::CACHEGROUP, $cache_mode = self::CACHE_USE_DEFAULT ) { $object_cache = false; if ( isset($GLOBALS['wp_object_cache']) && is_object($GLOBALS['wp_object_cache']) ) { $object_cache = true; } $cache_mode = $this->_get_cache_mode($cache_mode); $value = false; $trans_key = substr($group.'_'.$key, 0, self::TRANS_KEY_LEN); if ( self::CACHE_TRANSIENT === $cache_mode ) { $value = get_transient($trans_key); } elseif ( self::CACHE_SITE_TRANSIENT === $cache_mode ) { $value = get_site_transient($trans_key); } elseif ( self::CACHE_OBJECT === $cache_mode && $object_cache ) { $value = wp_cache_get($key, $group); } return $value; } /** * @param string $key * @param string|boolean $value * @param string $group * @param integer $expires * @param string $cache_mode * @return string|boolean */ public function set_cache( $key, $value, $group = self::CACHEGROUP, $expires = 0, $cache_mode = self::CACHE_USE_DEFAULT ) { $object_cache = false; if ( isset($GLOBALS['wp_object_cache']) && is_object($GLOBALS['wp_object_cache']) ) { $object_cache = true; } if ( (int) $expires < 1 ) { $expires = 0; } $cache_mode = self::_get_cache_mode($cache_mode); $trans_key = substr($group.'_'.$key, 0, self::TRANS_KEY_LEN); if ( self::CACHE_TRANSIENT === $cache_mode ) { set_transient($trans_key, $value, $expires); } elseif ( self::CACHE_SITE_TRANSIENT === $cache_mode ) { set_site_transient($trans_key, $value, $expires); } elseif ( self::CACHE_OBJECT === $cache_mode && $object_cache ) { wp_cache_set($key, $value, $group, $expires); } return $value; } /** * @param string $cache_mode * @return string */ private function _get_cache_mode( $cache_mode ) { if ( empty($cache_mode) || self::CACHE_USE_DEFAULT === $cache_mode ) { $cache_mode = $this->cache_mode; } // Fallback if self::$cache_mode did not get a valid value if ( !in_array($cache_mode, self::$cache_modes) ) { $cache_mode = self::CACHE_OBJECT; } return $cache_mode; } }