Skip to content

Instantly share code, notes, and snippets.

@stepanselyuk
Created September 1, 2014 13:21
Show Gist options
  • Save stepanselyuk/79a5532b1c946dd7c0f5 to your computer and use it in GitHub Desktop.
Save stepanselyuk/79a5532b1c946dd7c0f5 to your computer and use it in GitHub Desktop.
Component for generating JS-files for include in page
<?php
/**
* Created by PhpStorm.
* Author: Stepan Seliuk <stepan@selyuk.com>
* Date: 30/08/14
* Time: 22:33
*/
namespace app\components\i18n;
use app\components\helpers\DirHelper;
use app\models\AppSettingsRecord;
use yii\base\Object;
use yii\helpers\Json;
use yii\web\View;
/**
* Class JavaScriptMessages
* @package app\components\i18n
*/
class JavaScriptMessages extends Object
{
public $language;
public $expire = 3600;
protected $dir = '@runtime/assets/generated';
function __construct( $config = [ ] )
{
parent::__construct( $config );
if (is_null( $this->language )) {
$this->language = \Yii::$app->language;
}
}
function __toString()
{
try {
return $this->getFilepath();
} catch ( \Exception $e ) {
\Yii::error( $e->getMessage() );
return false;
}
}
protected function getFilepath()
{
$filePath = \Yii::getAlias( $this->dir . '/' . $this->language . '.messages.js' );
/*
* 1. Проверяем наличие файла и валидность файла
* 2. Если файл валиден, возвращаем его путь,
* иначе запускаем процедуру генерации файла и потом возвращаем путь.
*/
// Если файл существует
if (file_exists( $filePath )) {
$messagesFile = $this->getMessagesFilePath();
if ($this->expire === 0) {
if (is_file( $messagesFile ) && filemtime( $messagesFile ) > filemtime( $filePath )) {
// Если файл с сообщениями имеет более свежую дату чем генерируемый файл
// Генерируем файл и возвращаем путь к нему
return $this->generateFile( $filePath );
} else {
// Если включен бесконечный кеш
// Возвращаем путь к файлу
return $filePath;
}
} elseif ($this->expire === false) {
// Если кеш отключен
// Генерируем файл и возвращаем путь к нему
return $this->generateFile( $filePath );
} else {
if ($this->expire > 0 && ( filemtime( $filePath ) + $this->expire > time() )) {
if (is_file( $messagesFile ) && filemtime( $messagesFile ) > filemtime( $filePath )) {
// Если файл с сообщениями имеет более свежую дату чем генерируемый файл
// Генерируем файл и возвращаем путь к нему
return $this->generateFile( $filePath );
} else {
// Если файл валиден, кеш не истек
// Возвращаем путь к файлу
return $filePath;
}
} else {
// Если кеш устарел
// Генерируем файл и возвращаем путь к нему
return $this->generateFile( $filePath );
}
}
} else {
// Если файл не существует
// Генерируем файл и возвращаем путь к нему
return $this->generateFile( $filePath );
}
}
protected function getMessagesFilePath()
{
return \Yii::getAlias( $this->dir . '/' . $this->language . '.messages.json' );
}
protected function generateFile( $filePath )
{
DirHelper::create( $this->dir );
$messagesPath = $this->getMessagesFilePath();
if (is_file( $messagesPath )) {
$json = file_get_contents( $messagesPath );
$data = Json::decode( $json );
} else {
$data = [
'params' => [
'lang' => $this->language,
'source_lang' => \Yii::$app->sourceLanguage,
'currency' => AppSettingsRecord::getValue( 'system.currency' )
],
'messages' => [ ]
];
}
$view = new View();
$render = $view->renderFile( __DIR__ . '/javascriptMessagesTpl.php', [ 'data' => $data ] );
file_put_contents( $filePath, $render );
return $filePath;
}
}
<?php
/**
* Created by PhpStorm.
* Author: Stepan Seliuk <stepan@selyuk.com>
* Date: 30/08/14
* Time: 22:49
*
* @var array $data
*/
?>
if ( typeof window.MyApp === 'undefined' ) window.MyApp = {};
MyApp.ttData = <?=json_encode($data)?>;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment