* @link https://TheTempusProject.com/Core * @license https://opensource.org/licenses/MIT [MIT LICENSE] */ namespace TheTempusProject\Houdini\Classes; use TheTempusProject\Canary\Canary as Debug; class Views extends Template { public static $additionalLocations = []; /** * This function adds a standard view to the main {CONTENT} * section of the page. * * @param string $viewName - The name of the view being called. * @param wild $data - Any data to be used with the view. * * @todo add a check to viewName */ public static function view( $viewName, $data = null ) { if ( !empty( $data ) ) { $out = self::simpleView( $viewName, $data ); } else { $out = self::simpleView( $viewName ); } if ( !empty( $out ) ) { self::$content .= $out; } else { // new CustomException( 'view', $viewName ); } } public static function raw( $html ) { $out = self::parse( $html ); self::$content .= $out; } /** * Returns a completely parsed view. * * NOTE: Results will contain raw HTML. * * @param {string} [$view] - The name of the view you wish to call. * @param {var} [$data] - Any data to be used by the view. * @return {string} HTML view. */ public static function simpleView( $view, $data = null ) { Debug::log( "Calling Standard: $view" ); // all views start with lowercase letters $lowerCase = lcfirst( $view ); // convert ., \, and /, to DIRECTORY_SEPARATOR $normalized = str_replace( '.', DIRECTORY_SEPARATOR, $lowerCase ); $normalized = str_replace( '\\', DIRECTORY_SEPARATOR, $normalized ); $normalized = str_replace( '/', DIRECTORY_SEPARATOR, $normalized ); // trim any hanging DIRECTORY_SEPARATOR (shouldn't be necessary) $trimmed = rtrim( $normalized, DIRECTORY_SEPARATOR ); // add the html extension $viewName = $trimmed . '.html'; // check the main views directory $path = VIEW_DIRECTORY . $viewName; Debug::log( "Trying location: $path" ); if ( is_file( $path ) ) { if ( !empty( $data ) ) { return self::parse( file_get_contents( $path ), $data ); } else { return self::parse( file_get_contents( $path ) ); } } // if the first part of the view name matches the name of an additionalLocation Index, we check there too $exploded = explode( DIRECTORY_SEPARATOR, $viewName ); $potentialKey = array_shift( $exploded ); $imploded = implode( DIRECTORY_SEPARATOR, $exploded ); Debug::debug( "Trying potentialKey: $potentialKey" ); Debug::debug( "Trying imploded: $imploded" ); Debug::debug( 'additionalLocations: ' . var_export( self::$additionalLocations, true ) ); if ( !empty( self::$additionalLocations[$potentialKey] ) ) { $path = self::$additionalLocations[$potentialKey] . $imploded; Debug::debug( "Trying path: $path" ); } if ( is_file( $path ) ) { Debug::log( "WINNER path: $path" ); if ( !empty( $data ) ) { return self::parse( file_get_contents( $path ), $data ); } else { return self::parse( file_get_contents( $path ) ); } } // @todo - this would be awesome, if i actually caught the exception anywhere :/ // throw new CustomException('simpleView', $path); return false; } public static function addViewLocation( $name, $location ) { self::$additionalLocations[$name] = $location; } public static function removeViewLocation( $name ) { if ( ! empty( self::$additionalLocations[$name] ) ) { unset( self::$additionalLocations[$name] ); } } }