102 lines
3.4 KiB
PHP
102 lines
3.4 KiB
PHP
<?php
|
|
/**
|
|
* Ajax "save" route, for saving editor contents to disk
|
|
*/
|
|
class Loco_ajax_SaveController extends Loco_ajax_common_BundleController {
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function render(){
|
|
|
|
$post = $this->validate();
|
|
|
|
|
|
// path parameter must not be empty
|
|
$path = $post->path;
|
|
if( ! $path ){
|
|
throw new InvalidArgumentException('Path parameter required');
|
|
}
|
|
|
|
// locale must be posted to indicate whether PO or POT
|
|
$locale = $post->locale;
|
|
if( is_null($locale) ){
|
|
throw new InvalidArgumentException('Locale parameter required');
|
|
}
|
|
|
|
$pofile = new Loco_fs_LocaleFile( $path );
|
|
$pofile->normalize( loco_constant('WP_CONTENT_DIR') );
|
|
|
|
// ensure we only deal with PO/POT source files.
|
|
// posting of MO file paths is permitted when PO is missing, but we're about to fix that
|
|
$ext = strtolower( $pofile->fullExtension() );
|
|
if( 'mo' === $ext ){
|
|
$pofile = $pofile->cloneExtension('po');
|
|
}
|
|
else if( 'pot' === $ext ){
|
|
$locale = '';
|
|
}
|
|
else if( 'po' !== $ext ){
|
|
throw new Loco_error_Exception('Disallowed file extension');
|
|
}
|
|
|
|
// Prepare compiler for all save operations. PO/MO/JSON, or just POT
|
|
$compiler = new Loco_gettext_Compiler($pofile);
|
|
|
|
// data posted may be either 'multipart/form-data' (recommended for large files)
|
|
if( isset($_FILES['po']) ){
|
|
$data = Loco_gettext_Data::fromSource( Loco_data_Upload::src('po') );
|
|
}
|
|
// else 'application/x-www-form-urlencoded' by default
|
|
else {
|
|
$data = Loco_gettext_Data::fromSource( $post->data );
|
|
}
|
|
|
|
// WordPress-ize some headers that differ from that sent from JavaScript
|
|
if( $locale ){
|
|
$head = $data->getHeaders();
|
|
$head['Language'] = strtr( $locale, '-', '_' );
|
|
}
|
|
|
|
// commit PO file directly to disk
|
|
$bytes = $compiler->writePo($data);
|
|
$mtime = $pofile->modified();
|
|
|
|
// start success data with bytes written and timestamp
|
|
$this->set('locale', $locale );
|
|
$this->set('pobytes', $bytes );
|
|
$this->set('poname', $pofile->basename() );
|
|
$this->set('modified', $mtime);
|
|
$this->set('datetime', Loco_mvc_ViewParams::date_i18n($mtime) );
|
|
|
|
// add bundle to recent items on file creation
|
|
// editor permitted to save files not in a bundle, so catching failures
|
|
try {
|
|
$bundle = $this->getBundle();
|
|
Loco_data_RecentItems::get()->pushBundle($bundle)->persist();
|
|
}
|
|
catch( Exception $e ){
|
|
$bundle = null;
|
|
}
|
|
|
|
// Compile MO and JSON files if PO is localised and not POT (template)
|
|
if( $locale ){
|
|
$mobytes = $compiler->writeMo($data);
|
|
$numjson = 0;
|
|
// Project required for JSON writes
|
|
if( $bundle ){
|
|
$project = $this->getProject($bundle);
|
|
$jsons = $compiler->writeJson($project,$data);
|
|
$numjson = $jsons->count();
|
|
}
|
|
$this->set( 'mobytes', $mobytes );
|
|
$this->set( 'numjson', $numjson );
|
|
}
|
|
|
|
// Final summary depending on whether MO and JSON compiled
|
|
$compiler->getSummary();
|
|
return parent::render();
|
|
}
|
|
|
|
|
|
} |