directory = $directory; break; } } if ($this->directory === null) { throw new RuntimeException(sprintf('Partial not found: "%s".', $name)); } if (!is_readable($file_path)) { throw new RuntimeException(sprintf('Partial not readable: "%s".', $file_path)); } $this->name = $name; $this->data = $data; } /** * Render partial and return the output. * Note: partial should only output textual content like HTML, JSON, scripts or similar. * * @throws RuntimeException if partial not found, not readable or returned false. * * @return string */ public function getOutput() { $data = $this->data; $file_path = $this->directory.'/'.$this->name.'.php'; ob_start(); if ((include $file_path) === false) { ob_end_clean(); throw new RuntimeException(sprintf('Cannot render partial: "%s".', $file_path)); } return ob_get_clean(); } /** * Get the contents of a PHP-preprocessed JavaScript file. * Notes: * - JavaScript file will be searched in the "js" subdirectory of the partial file. * - A copy of $data variable will be available for using within the file. * * @param string $file_name * @param array $data * * @throws RuntimeException if the file not found, not readable or returned false. * * @return string */ public function readJsFile(string $file_name, array $data = null): string { $data = ($data === null) ? $this->data : $data; $file_path = $this->directory.'/js/'.$file_name; ob_start(); if ((include $file_path) === false) { ob_end_clean(); throw new RuntimeException(sprintf('Cannot read file: "%s".', $file_path)); } return ob_get_clean(); } /** * Include a PHP-preprocessed JavaScript file inline. * Notes: * - JavaScript file will be searched in the "js" subdirectory of the partial file. * - A copy of $data variable will be available for using within the file. * * @param string $file_name * @param array $data * * @throws RuntimeException if the file not found, not readable or returned false. */ public function includeJsFile(string $file_name, array $data = null): void { echo $this->readJsFile($file_name, $data); } /** * Register custom directory of MVC partials. The last registered will have the first priority. * * @param string $directory */ public static function registerDirectory($directory) { if (!in_array($directory, self::$directories)) { array_unshift(self::$directories, $directory); } } /** * Get partial file name. * * @return string */ public function getName(): string { return $this->name; } }