| Current Path : /var/www/html/mswp/common/components/ |
| Current File : /var/www/html/mswp/common/components/PortalDBContent.php |
<?php
namespace common\components;
use backend\models\frontendtheme\FrontendTheme;
use Exception;
class PortalDBContent{
private static $page_id;
private static $theme_id;
private static $env;
private static $page_object;
const FILE_DIRECTORY = "@frontend/runtime/frontendpage";
const FILE_EXTENSION = '.php';
const FILE_CONTENT_DIRECTORY = '@frontend/runtime/frontendpage/content';
public function __construct(array $options=null) {
if(isset($options['page_id']) && filter_var($options['page_id'], FILTER_VALIDATE_INT))
self::$page_id = $options['page_id'];
if(isset($options['theme_id']) && filter_var($options['theme_id'], FILTER_VALIDATE_INT))
self::$theme_id = $options['theme_id'];
if(isset($options['env']) && filter_var($options['env'], FILTER_VALIDATE_BOOLEAN))
self::$env = $options['env'];
if(!empty($options['page_object']))
self::$page_object = $options['page_object'];
}
public static function getRowContent(int $page_id) {
$rows_content = (new \yii\db\Query())
->select(['c.content_details', 'c.content_is_php', 'c.content_id', 'c.category_id', 'a.page_id'])
->from('frontend_content c')
->join('INNER JOIN', 'frontend_content_assign a', 'a.content_id = c.content_id')
->where(['a.status' => '1', 'a.page_id' => $page_id])
->orderBy('a.content_order')
->all();
return $rows_content;
}
public static function getRowHeader(int $theme_id) {
$rows_header = (new \yii\db\Query())
->select(['h.*', 'f.*'])
->from('frontend_theme p')
->join('INNER JOIN', 'frontend_header h', 'h.header_id = p.header_id')
->join('INNER JOIN', 'frontend_footer f', 'f.footer_id = p.footer_id')
->where(['p.theme_id' => $theme_id ])
->one();
return $rows_header;
}
/*
* Using File for rendering content
*/
public static function fileRender() {
//theme setup
$path = self::getPath(self::$page_id, self::$page_object->last_update, '.json');
if(self::fileIsExist($path)) {
echo '<script>console.log("Loading snapshot ' . self::$page_object->last_update . ' ")</script>';
echo self::renderFileContent($path);
} else {
$path = self::generatePageFile(self::$page_object->last_update);
if(!self::fileIsExist($path)) {
throw new \Exception('Cannot find file path make sure runtime/frontendpage directory is exist' . $path);
}
echo self::renderFileContent($path);
}
}
/**
* Process file and send content
* @param string $path Path to the file
* @return string
*/
public static function renderFileContent(string $path) {
$__dyna_frontend_theme = FrontendTheme::findOne(self::$theme_id);
$THEME_CSS = $__dyna_frontend_theme->theme_css ?? null;
$THEME_JS = $__dyna_frontend_theme->theme_js ?? null;
$meta = json_decode(file_get_contents($path));
foreach ($meta->file as $f) {
if ($f->php) {
include($f->path);
} else {
echo (PortalEngine::getInstance())->load(null, get_defined_vars() + [$THEME_CSS, $THEME_JS], $f->name);
}
}
}
public static function formatMicrotime() {
return preg_replace('/(0)\.(\d+) (\d+)/', '$3$1$2', microtime());
}
public static function getPath(int $page_id, $timestamp=null, $extension=null) {
if(empty($extension)) {
$extension = self::FILE_EXTENSION;
}
return \Yii::getAlias(self::FILE_DIRECTORY) . '/' . $page_id . '_' . $timestamp . $extension;
}
public static function getPathContent(int $page_id, $timestamp=null, $extension=null) {
if(empty($extension)) {
$extension = self::FILE_EXTENSION;
}
return \Yii::getAlias(self::FILE_CONTENT_DIRECTORY) . '/' . $page_id . '_' . $timestamp . $extension;
}
public static function generatePageFile($timestamp=null) {
//delete old file
self::deletePageFile(self::$page_id);
if(empty($timestamp)) {
$timestamp = self::formatMicrotime();
self::$page_object->last_update = $timestamp;
self::$page_object->save();
}
$path = self::getPath(self::$page_id, self::$page_object->last_update, '.json');
$theme_setup_path = self::getPath(self::$page_id, self::$page_object->last_update, '-theme-setup.php');
$setup_path = self::getPath(self::$page_id, self::$page_object->last_update, '-setup.php');
$header_path = self::getPath(self::$page_id, self::$page_object->last_update, '-header.php');
$footer_path = self::getPath(self::$page_id, self::$page_object->last_update, '-footer.php');
if(empty(self::$page_object)) {
throw new \Exception('Please define Page Object');
}
$__dyna_frontend_theme = FrontendTheme::findOne(self::$theme_id);
$wrap = '<?php ' . PHP_EOL . '{{content}}' . PHP_EOL . '?>' . PHP_EOL;
$html_wrap = PHP_EOL . '{{content}}' . PHP_EOL;
try {
/** check if directory exist **/
if (!file_exists(\Yii::getAlias(self::FILE_DIRECTORY) )) {
mkdir(\Yii::getAlias(self::FILE_DIRECTORY), 0777, true);
}
$meta = [];
//theme setup
$content = strtr($wrap, ['{{content}}' => '/*** THEME_SETUP ***/' . PHP_EOL . $__dyna_frontend_theme->theme_setup]);
//put in file array
$meta['file'][] = ['path' => $theme_setup_path, 'php' => true, 'type' => 'THEME_SETUP'];
file_put_contents($theme_setup_path, $content);
$content = strtr($wrap, ['{{content}}' => '/*** PAGE_SETUP ***/' . PHP_EOL . self::$page_object->page_setup]);
//put in file array
$meta['file'][] = ['path' => $setup_path, 'php' => true, 'type' => 'PAGE_SETUP'];
//put setup file
file_put_contents($setup_path, $content);
$__dyna_header = self::getRowHeader(self::$theme_id);
if($__dyna_header['header_is_php']) {
$content = strtr($wrap, ['{{content}}' => '/*** HEADER ***/' . PHP_EOL . $__dyna_header['header_content']]);
//put in file array
$meta['file'][] = ['path' => $header_path, 'php' => true, 'type' => 'header'];
} else {
$content = strtr($html_wrap, ['{{content}}' => '<!-- HEADER -->' . PHP_EOL . $__dyna_header['header_content'] . PHP_EOL . '<!-- HEADER -->']);
//put in file array
$meta['file'][] = [
'path' => $header_path,
'name' => self::$page_id . '_' . self::$page_object->last_update . '-header.php',
'php' => false,
'type' => 'header'
];
}
//opened body
$content .= PHP_EOL . '<body>' . PHP_EOL;
// put in header
file_put_contents($header_path, $content);
// contents
$__dyna_content__ = self::getRowContent(self::$page_id);
foreach ($__dyna_content__ as $__dyna_content_row__) {
$content_path = self::getPath(self::$page_id, self::$page_object->last_update, '-content-' . $__dyna_content_row__['content_id'] . '.php');
//non-php content
if ($__dyna_content_row__['content_is_php']) {
$content = strtr($wrap, ['{{content}}' => '/*** CONTENT_ID-' . $__dyna_content_row__['content_id'] . '***/' . PHP_EOL . $__dyna_content_row__['content_details']]);
//put in file array
$meta['file'][] = ['path' => $content_path, 'php' => true, 'type' => 'content-' . $__dyna_content_row__['content_id']];
} else {
$content = strtr($html_wrap, ['{{content}}' => '<!-- CONTENT_ID ' . $__dyna_content_row__['content_id'] . '-->' . PHP_EOL . $__dyna_content_row__['content_details'] . PHP_EOL . '<!-- END_CONTENT -->']);
$meta['file'][] = [
'path' => $content_path,
'name' => self::$page_id . '_' . self::$page_object->last_update . '-content-' . $__dyna_content_row__['content_id'] . '.php',
'php' => false,
'type' => 'content-' . $__dyna_content_row__['content_id']
];
}
// put in content
file_put_contents($content_path, $content);
}
//footer
if($__dyna_header['footer_is_php']) {
$content = strtr($wrap, ['{{content}}' => '/*** FOOTER ***/' . PHP_EOL . $__dyna_header['footer_content']]);
$meta['file'][] = ['path' => $footer_path, 'php' => true, 'type' => 'footer'];
} else {
echo PHP_EOL . (PortalEngine::getInstance())->load( $__dyna_header['footer_content'], get_defined_vars());
$content = strtr($html_wrap, ['{{content}}' => '<!-- FOOTER -->' . PHP_EOL . $__dyna_header['footer_content'] . PHP_EOL . '<!-- FOOTER -->']);
$meta['file'][] = [
'path' => $footer_path,
'name' => self::$page_id . '_' . self::$page_object->last_update . '-footer.php',
'php' => false,
'type' => 'footer'
];
}
// put in footer
file_put_contents($footer_path, $content);
$meta['timestamp'] = self::$page_object->last_update;
$meta['path'] = $path;
file_put_contents($path, json_encode($meta));
return $path;
} catch (\Throwable $t) {
throw new \Exception($t->getMessage());
}
}
/**
* Generate content for layout // this function is call externally
**/
public static function generateSubContent($page_object) {
$page_id = $page_object->page_id;
$timestamp = $page_object->last_update;
//delete old file
self::deleteSubContent($page_id);
if(empty($timestamp)) {
$timestamp = self::formatMicrotime();
$page_object->last_update = $timestamp;
$page_object->save();
}
$path = self::getPathContent($page_id, $page_object->last_update, '.json');
$setup_path = self::getPathContent($page_id, $page_object->last_update, '-setup.php');
if(empty(self::$page_object)) {
throw new \Exception('Please define Page Object');
}
$__dyna_frontend_theme = FrontendTheme::findOne($page_object->theme_id);
$wrap = '<?php ' . PHP_EOL . '{{content}}' . PHP_EOL . '?>' . PHP_EOL;
$html_wrap = PHP_EOL . '{{content}}' . PHP_EOL;
try {
$meta = [];
$content = strtr($wrap, ['{{content}}' => '/*** PAGE_SETUP ***/' . PHP_EOL . $page_object->page_setup]);
//put in file array
$meta['file'][] = ['path' => $setup_path, 'php' => true, 'type' => 'page_setup'];
//put setup file
file_put_contents($setup_path, $content);
// contents
$__dyna_content__ = self::getRowContent($page_id);
foreach ($__dyna_content__ as $__dyna_content_row__) {
$content_path = self::getPathContent($page_id, $page_object->last_update, '-content-' . $__dyna_content_row__['content_id'] . '.php');
//non-php content
if ($__dyna_content_row__['content_is_php']) {
$content = strtr($wrap, ['{{content}}' => '/*** CONTENT_ID-' . $__dyna_content_row__['content_id'] . '***/' . PHP_EOL . $__dyna_content_row__['content_details']]);
//put in file array
$meta['file'][] = ['path' => $content_path, 'php' => true, 'type' => 'content-' . $__dyna_content_row__['content_id']];
} else {
$content = strtr($html_wrap, ['{{content}}' => '<!-- CONTENT_ID ' . $__dyna_content_row__['content_id'] . '-->' . PHP_EOL . $__dyna_content_row__['content_details'] . PHP_EOL . '<!-- END_CONTENT -->']);
$meta['file'][] = [
'path' => $content_path,
'name' => 'content/' . $page_id . '_' . $page_object->last_update . '-content-' . $__dyna_content_row__['content_id'] . '.php',
'php' => false,
'type' => 'content-' . $__dyna_content_row__['content_id']
];
}
// put in content
file_put_contents($content_path, $content);
}
$meta['timestamp'] = $page_object->last_update;
$meta['path'] = $path;
file_put_contents($path, json_encode($meta));
return $path;
} catch (\Throwable $t) {
var_dump($t->getMessage());
}
}
public static function deletePageFile($page_id) {
$files = glob(\Yii::getAlias(self::FILE_DIRECTORY) . "/" .$page_id . "_*");
try {
if (count($files) > 0) {
foreach($files as $file) {
unlink($file);
}
echo '<script>console.log("Deleted snapshot - " + ' . json_encode($files) . ')</script>';
}
} catch (\Throwable $t) {
echo '<script>console.log("Error delete snapshot - ' . $t->getMessage() . ' ")</script>';
}
}
public static function deleteSubContent($page_id) {
$files = glob(\Yii::getAlias(self::FILE_CONTENT_DIRECTORY) . "/" .$page_id . "_*");
try {
if (count($files) > 0) {
foreach($files as $file) {
unlink($file);
}
echo '<script>console.log("Deleted snapshot - " + ' . json_encode($files) . ')</script>';
}
} catch (\Throwable $t) {
echo '<script>console.log("Error delete snapshot - ' . $t->getMessage() . ' ")</script>';
}
}
public static function fileIsExist(string $path) {
return file_exists($path);
}
/** db render method **/
public static function render() {
$error = 0;
$__dyna_frontend_theme = FrontendTheme::findOne(self::$theme_id);
$THEME_CSS = $__dyna_frontend_theme->theme_css ?? null;
$THEME_JS = $__dyna_frontend_theme->theme_js ?? null;
try {
//theme setup
$__dyna_content_error['content_id'] = 'THEME_SETUP';
eval( $__dyna_frontend_theme->theme_setup ?? null );
//page setup
$__dyna_content_error['content_id'] = 'PAGE_SETUP';
eval( self::$page_object->page_setup ?? null );
//header
$__dyna_content_error['content_id'] = 'HEADER';
$__dyna_header = self::getRowHeader(self::$theme_id);
if($__dyna_header['header_is_php']) {
eval($__dyna_header['header_content']);
} else {
echo (PortalEngine::getInstance())->load( $__dyna_header['header_content'], get_defined_vars() + [$THEME_CSS, $THEME_JS]);
}
//opened body
echo PHP_EOL . '<body>' . PHP_EOL;
// contents
$__dyna_content_error['content_id'] = 'CONTENTS';
$__dyna_content__ = self::getRowContent(self::$page_id);
foreach ($__dyna_content__ as $__dyna_content_row__) {
//non-php content
if ($__dyna_content_row__['content_is_php'] == 0) {
echo (PortalEngine::getInstance())->load($__dyna_content_row__['content_details'], get_defined_vars() + [$THEME_CSS, $THEME_JS]);
} else {
eval($__dyna_content_row__['content_details']);
}
}
//footer
if($__dyna_header['footer_is_php']) {
eval($__dyna_header['footer_content']);
} else {
echo PHP_EOL . (PortalEngine::getInstance())->load( $__dyna_header['footer_content'], get_defined_vars());
}
} catch (\Throwable $t){
switch ($__dyna_content_error['content_id']) {
case 'THEME_SETUP':
$__dyna_content_error['content_details'] = $__dyna_frontend_theme->theme_setup;
break;
case 'PAGE_SETUP':
$__dyna_content_error['content_details'] = self::$page_object->page_setup ;
break;
case 'HEADER':
$__dyna_content_error['content_details'] = $__dyna_header['header_content'];
break;
case 'CONTENTS':
$__dyna_content_error = $__dyna_content_row__;
break;
}
if (self::$env)
echo \Yii::$app->view->render('error', ['exception' => $t, 'content' => $__dyna_content_error, 'pageid' => self::$page_id, 'error' => $error]);
$error = 1;
}
}
}