disabled = $this->lang['noauth'];
} else if (!$auth->canDo('getUsers')) {
$this->disabled = $this->lang['nosupport'];
} else {
// we're good to go
$this->_auth = & $auth;
}
if ( ! $this->_setup() ) return false;
if ( !$this->functions->checkDatabase() ) {
$this->functions = null;
return false;
}
}
/**
* return some info
*/
function getInfo(){
return array_merge(confToHash(dirname(__FILE__).'/info.txt'), array(
'name' => 'Translator (Admin Component)',
));
}
/**
* return sort order for position in admin menu
*/
function getMenuSort() {
return 100;
}
function forAdminOnly(){
return false;
}
/**
* handle user request
*/
function handle() {
if (is_null($this->_auth)) return false;
// extract the command and any specific parameters
// submit button name is of the form - fn[cmd][param(s)]
$fn = $_REQUEST['fn'];
if (is_array($fn)) {
$cmd = key($fn);
$param = is_array($fn[$cmd]) ? key($fn[$cmd]) : null;
} else {
$cmd = $fn;
$param = null;
}
switch($cmd){
case "set_user" : $this->_setUser($_REQUEST['user']); break;
case "createcategories" : $this->_createCategory($_REQUEST['CategoryName'], $_REQUEST['FileName']); break;
case "updatecategories" : $this->_deleteCategory($_REQUEST['deletecategory']); break;
case "uploadmaster" : $this->_handleUploadedFiles($_REQUEST['Category'], $_REQUEST['Version'], $_FILES['File']); break;
case "deletemaster" : $this->_handleDeleteMaster($_REQUEST['deletemaster']); break;
case "deleteuser" : $this->_handleDeleteUser($_REQUEST['deleteuser'], $_REQUEST['manageUser']); break;
}
$this->functions->_handleRequest($fn);
}
/**
* output appropriate html
*/
function html() {
global $ID, $conf;
if(is_null($this->_auth)) {
print $this->lang['badauth'];
return false;
}
print $this->locale_xhtml('intro');
print '
';
if ( $_REQUEST['manageUser'] ) {
// Display Categories of User
$this->_userCategoryManager($_REQUEST['manageUser']);
} else {
// Set User Languages
$this->_userRightsForm();
// Manager Categories
$this->_categoryManager();
// Import Master and Languages
$this->_importManager();
// Export MAnager
$this->functions->_exportManager($this);
// Delete Master Languages
$this->_deleteMasterLanguageManager();
}
print '
';
}
function _importManager() {
$categories = array_keys($this->functions->_getCategories());
if ( count($categories) == 0 ) return;
$form = $this->_startFieldSet($this->getLang('ImportMasterLanguage'), 'translator_master_import', 'multipart/form-data');
$form->addElement(form_makeListboxField('Category', $categories, $_REQUEST['Category'], 'Select the Category:'));
$form->addElement(form_makeTag('br'));
$form->addElement(form_makeTextField('Version', $_REQUEST['Version'], 'Product Version:'));
$form->addElement(form_makeTag('br'));
$form->addElement(form_makeFileField('File[]', 'Upload File:', null, null, array('multiple' => 'true')));
$form->addElement(form_makeTag('br'));
$form->addElement(form_makeField('submit', 'fn[uploadmaster]', 'Upload', ''));
$this->_finishFieldset($form);
$this->functions->_revertManager($this, $this->revertableUpload);
}
function _deleteMasterLanguageManager() {
$categories = $this->functions->_getCategories();
if ( count($categories) == 0 ) return;
$nothingToDo = true;
$form = $this->_startFieldSet($this->getLang('RemoveMasterLanguage'), 'translator_master_remove');
foreach ( $categories as $name => $category ) {
$formCategories[] = $name;
foreach ( $this->functions->_getAvailableVersions($category['CategoryID']) as $Version ) {
$nothingToDo = false;
$form->addElement(form_makeCheckboxField("deletemaster[$name][$Version]", 1, $name . " ($Version)", null));
$form->addElement(form_makeTag('br'));
}
}
$form->addElement(form_makeField('submit', 'fn[deletemaster]', 'Delete', ''));
if ( ! $nothingToDo )
$this->_finishFieldset($form);
}
/*
* Print the Manager for Categories
*/
function _categoryManager() {
$categories = $this->functions->_getCategories();
if ( count($categories) > 0 ) {
$form = $this->_startFieldSet($this->getLang('CategoryManager'), 'translator_categories');
foreach( $categories as $name => $data ) {
$form->addElement(form_makeCheckboxField("deletecategory[{$data['CategoryID']}]", 1, $name . " ({$data['FileName']})", null));
$form->addElement(form_makeTag('br'));
}
$form->addElement(form_makeField('submit', 'fn[updatecategories]', $this->getLang('Delete'), ''));
$this->_finishFieldset($form);
}
$form = $this->_startFieldSet($this->getLang('AddCategory'), 'translator_new_categories');
$form->addElement(form_makeTextField('CategoryName', $_REQUEST['CategoryName'], $this->getLang('Category') . ':', 'CategoryName', null));
$form->addElement(form_makeTag('br'));
$form->addElement(form_makeTextField('FileName', $_REQUEST['FileName'], $this->getLang('CategoryFileName') . ':', 'FileName', null));
$form->addElement(form_makeTag('br'));
$form->addElement(form_makeField('submit', 'fn[createcategories]', $this->getLang('Create'), ''));
$this->_finishFieldset($form);
}
/*
* Print the User Rights formula with update button for Languages
*/
function _userRightsForm() {
// System User List
$user_list = $this->_getUserLanguages();
$form = $this->_startFieldSet($this->getLang('UserManager'), 'translator_users');
foreach ( $user_list as $user => $values ) {
$lang = $values['Lang'];
$form->addElement(form_makeTextField("user[$user]", $lang, tpl_link(wl($ID, array('do' => 'admin', 'page' => 'translator', 'manageUser' => $user ), true), $user, null, true) . ':', $user, null));
$form->addElement(form_makeTag('br'));
}
$form->addElement(form_makeField('submit', 'fn[set_user]', $this->getLang('Update'), ''));
$this->_finishFieldset($form);
}
/*
* Fieldsets for the admin page
*/
function _startFieldSet($name, $hid='translator', $formType=null) {
global $ID;
$form = new Doku_Form($hid, wl($ID), 'post', $formType);
$form->addHidden('do', 'admin');
$form->addHidden('page', 'translator');
$form->startFieldset( $name );
return $form;
}
function _getUserLanguages() {
$user_list = $this->_auth->retrieveUsers();
$this->functions->database->prepare("SELECT User, Lang FROM tblUserRights;");
$this->functions->database->execute();
if ( $this->functions->database->num_rows() != 0 ) {
$data = array(); $this->functions->database->bind_assoc($data);
while ( $this->functions->database->fetch() ) {
$user_list[$data['User']]['Lang'] = $data['Lang'];
}
}
return $user_list;
}
function _finishFieldset($form=null) {
if ( empty($form) ) return;
$form->endFieldset();
$form->printForm();
}
function _setUser($users=array()) {
if ( empty($users) || !is_array($users)) { return false; }
foreach ( $users as $user => $lang ) {
$user = trim($user);
if ( empty($user) ) continue;
$lang = trim($lang);
if ( empty($lang) ) {
$this->functions->database->prepare("DELETE FROM tblUserRights WHERE User=?;");
$this->functions->database->execute($user);
continue;
}
$lang = preg_replace("/[,;\s]/", "|", $lang);
$lang = preg_replace("/\|+/", "|", $lang);
$this->functions->database->prepare("SELECT * FROM tblUserRights WHERE User=?;");
$this->functions->database->execute($user);
if ( $this->functions->database->num_rows() > 0 )
$this->functions->database->prepare("UPDATE tblUserRights SET Lang=? WHERE User=?;");
else
$this->functions->database->prepare("INSERT INTO tblUserRights (Lang, User) VALUES(?, ?);");
$this->functions->database->execute($lang, $user);
}
}
function _createCategory($categoryName, $fileName) {
if ( empty($categoryName) ) {
msg($this->getLang('CategoryNameMissing'), -1);
return false;
}
if ( empty($fileName) ) {
msg($this->getLang('FileNameMissing'), -1);
return false;
}
$this->functions->database->prepare("SELECT * FROM tblCategory WHERE Name=?;");
$this->functions->database->execute($categoryName);
if ( $this->functions->database->num_rows() > 0 ) {
msg($this->getLang('CategoryExists'), -1);
return false;
}
$this->functions->database->prepare("INSERT INTO tblCategory (Name, FileName) VALUES (?,?);");
$this->functions->database->execute($categoryName, $fileName);
}
/*
* Remove Categories
*/
function _deleteCategory($category=array()) {
if ( empty($category) || !is_array($category)) { return false; }
foreach ( $category as $name => $value ) {
$name = trim($name);
if ( empty($name) ) continue;
$value = trim($value);
if ( empty($value) ) {
continue;
}
$this->functions->database->prepare("DELETE FROM tblCategory WHERE CategoryID=?;");
$this->functions->database->execute($name);
$this->_handleDeleteFiles($name, "%", true);
}
}
/*
* Reorders the uplaoded Files to insert the master language first
* It also checks and rejects wrong file formats.
*/
function _handleUploadedFiles($category, $version, $FILES) {
list($CategoryID, $CategoryRegex) = $this->functions->_getCategoryFromName($category);
$orderedFiles = array();
for ( $i=0; $i $FILES['name'][$i],
'tmp_name' => $FILES['tmp_name'][$i],
'current_date_time' => date('Y-m-d H:i:s')
);
// check uploaded FileName to match on the selected Category
$matches = array();
if ( !preg_match("/$CategoryRegex/", $FILE['name'], $matches) ) {
msg($this->functions->_messageReplacer('MasterFileNotInFormat', array($FILE['name'], $CategoryRegex)), -1);
return;
}
// Cleanup the Language and set default Language if needed.
$FILE['lang'] = preg_replace("/^_?(.*?)_?$/", "$1", $matches[1]);
// Set Default Language and put in front of all others in ordered list
if ( empty($FILE['lang']) ) {
// Need a version here!
if ( empty($version) ) {
msg($this->getLang('VersionNeeded'), -1);
return;
}
$FILE['lang'] = $this->getConf('default_language');
array_unshift($orderedFiles, $FILE);
continue;
}
$orderedFiles[] = $FILE;
}
foreach ( $orderedFiles as $file ) {
$status = $this->_importLanguage($file, $CategoryID, $version);
// Should be reverted
if ( $status === false ) {
$this->revertableUpload[] = $file;
}
}
}
/*
* Delete Master Languages
*/
function _handleDeleteMaster($deleteMaster) {
foreach( $deleteMaster as $key => $versions) {
foreach ( array_keys($versions) as $version ) {
$this->_handleDeleteFiles($key, $version);
}
}
}
/*
* Cycle through Users to be deleted
*/
function _handleDeleteUser($deleteUserLanguage, $User) {
$removed = 0;
$removeUserKeys = array();
foreach( $deleteUserLanguage as $Category => $versions) {
if ( !empty($Category) ) {
list($CategoryID, $FileName) = $this->functions->_getCategoryFromName($Category);
}
foreach ( $versions as $version => $date ) {
if ( !is_array($date) ) {
$this->_getTranslastionsForUser($removeUserKeys, $User, $CategoryID, $version);
continue;
}
foreach( $date as $dateEntry => $Lang ) {
if ( !is_array($Lang) ) {
continue;
}
foreach ( array_keys($Lang) as $Language ) {
$this->_getTranslastionsForUser($removeUserKeys, $User, $CategoryID, $version, $dateEntry, $Language);
}
}
}
}
$this->functions->database->prepare("DELETE FROM tblTranslation WHERE KeyID=? AND User=? AND Lang=?;");
foreach( $removeUserKeys as $Entry) {
list($KeyID, $Lang) = $Entry;
$this->functions->database->execute($KeyID, $User, $Lang);
$removed += $this->functions->database->num_rows();
}
msg($this->functions->_messageReplacer('RemovedUserEntries', array($removed, $User)));
}
function _getTranslastionsForUser(&$removeUserKeys, $User, $CategoryID=null, $Version=null, $Date=null, $Lang=null) {
$ADDITIONAL = "";
$EXECUTE = array($User);
// If Date is set, check for that one too
if ( !empty($Date) ) {
$ADDITIONAL .= " AND Date=?";
$EXECUTE[] = $Date;
}
// If Date is set, check for that one too
if ( !empty($CategoryID) ) {
$ADDITIONAL .= " AND CategoryID=?";
$EXECUTE[] = $CategoryID;
}
// If Date is set, check for that one too
if ( !empty($Version) ) {
$ADDITIONAL .= " AND Version=?";
$EXECUTE[] = $Version;
}
// If Date is set, check for that one too
if ( !empty($Lang) ) {
$ADDITIONAL .= " AND Lang=?";
$EXECUTE[] = $Lang;
}
$this->functions->database->prepare("SELECT tblTranslation.KeyID FROM tblTranslation INNER JOIN tblMaster ON tblTranslation.KeyID = tblMaster.KeyID WHERE User=? $ADDITIONAL;");
$this->functions->database->execute($EXECUTE);
$data = array(); $this->functions->database->bind_assoc($data);
while ( $this->functions->database->fetch() ) {
$removeUserKeys[] = array($data['KeyID'],$Lang);
}
}
function _handleDeleteFiles($Category, $Version, $isID=false, $User=null) {
if ( $isID) {
$CategoryID = $Category;
$Category = array_shift(array_keys($this->functions->_getCategories($CategoryID, true)));
} else {
list($CategoryID, $FileName) = $this->functions->_getCategoryFromName($Category);
}
$ADDITIONAL = "";
$EXECUTE = array($CategoryID, $Version);
if ( !empty($User) ) {
$ADDITIONAL .= " AND User=?";
$EXECUTE[] = $User;
}
$this->functions->database->prepare("DELETE FROM tblMaster WHERE CategoryID=? AND Version LIKE ? $ADDITIONAL");
$this->functions->database->execute($EXECUTE);
if ( $this->functions->database->num_rows() > 0 ) {
if ( $Version == '%' ) { $Version = 'any version'; }
msg($this->functions->_messageReplacer('RemovedEntries', array($this->functions->database->num_rows(), $Category, $Version)));
}
}
function _importLanguage($file, $CategoryID, $version) {
$FileName = $file['name'];
$Lang = $file['lang'];
$currentDateTime = $file['current_date_time'];
$isMasterLang = $Lang == $this->getConf('default_language');
$finalStatus = array(
'KeysNotInMaster' => array(),
'KeysMatchingExisting' => array(),
'CountOfKeys' => 0,
'CountOfToBeReverted' => 0,
);
// Get Content of uploaded temp file
$FileContent = file($file['tmp_name']);
@unlink($file['tmp_name']);
if ( $isMasterLang ) {
// Clean Up Current Category and Version Entries
$this->functions->database->prepare("DELETE FROM tblMaster WHERE CategoryID=? AND Version=?;");
$this->functions->database->execute($CategoryID, $version);
}
$FileContent = preg_grep("/^\s*?(#|\/\/)/", $FileContent, PREG_GREP_INVERT);
$translation = array();
// Cycle through the Lines and add them into the MasterDB
foreach ( $FileContent as $line ) {
// No Comments.
// if ( preg_match("/^\s*?(#|\/\/)/", $line) ) {
// continue;
// }
list($key, $value) = explode("=", $line, 2);
$key = trim($key);
$value = trim($value);
if ( empty($key) || empty($value) ) {
continue;
}
$translation[$key] = $value;
}
unset($FileContent);
if ( $isMasterLang ) {
// Create Master Entry and finish this entry
$this->functions->_createMasterTableEntry($translation, $CategoryID, $version, $finalStatus);
} else {
// Bottleneck 1
$this->functions->_checkForMasterKeyIDs($translation, $finalStatus, $CategoryID);
$this->functions->_insertTranslationArray($translation, $finalStatus, $Lang, $currentDateTime);
}
return $this->functions->_statusResult($finalStatus, $Lang, $FileName);
}
function _printBackToAdmin() {
return '
' . tpl_link(wl($ID, array('do' => 'admin', 'page' => 'translator', ), true), $this->getLang('backToFirstPage'), null, true);
}
function _userCategoryManager($user) {
global $conf;
$this->functions->database->prepare("SELECT tblCategory.CategoryID, tblCategory.Name FROM (tblTranslation INNER JOIN tblMaster ON tblMaster.KeyID=tblTranslation.KeyID) INNER JOIN tblCategory ON tblCategory.CategoryID=tblMaster.CategoryID WHERE tblTranslation.User=? GROUP BY tblMaster.CategoryID");
$this->functions->database->execute($user);
if ( $this->functions->database->num_rows() == 0 ) {
print $this->getLang('UserHasNoTranslations');
print $this->_printBackToAdmin();
return;
}
$categories=array(); $data=array(); $this->functions->database->bind_assoc($data);
while ( $this->functions->database->fetch()) {
$categories[$data['Name']] = $data['CategoryID'];
}
$form = $this->_startFieldSet($this->functions->_messageReplacer('RemoveUserLanguage', $user), 'translator_user_language_remove');
$form->addHidden("manageUser", $user);
$form->addElement(form_makeOpenTag("table", array('class' => 'translation_table')));
$form->addElement(form_makeOpenTag("tr"));
$form->addElement(form_makeOpenTag("th")); $form->addElement($this->getLang('Category')); $form->addElement(form_makeCloseTag("th"));
$form->addElement(form_makeOpenTag("th")); $form->addElement($this->getLang('Version')); $form->addElement(form_makeCloseTag("th"));
$form->addElement(form_makeOpenTag("th")); $form->addElement($this->getLang('AmountOfValues')); $form->addElement(form_makeCloseTag("th"));
$form->addElement(form_makeCloseTag("tr"));
$formByDate = $this->_startFieldSet($this->functions->_messageReplacer('RemoveUserLanguageByDate', $user), 'translator_user_language_date_remove');
$formByDate->addHidden("manageUser", $user);
$formByDate->addElement(form_makeOpenTag("table", array('class' => 'translation_table')));
$formByDate->addElement(form_makeOpenTag("tr"));
$formByDate->addElement(form_makeOpenTag("th")); $formByDate->addElement($this->getLang('Date')); $formByDate->addElement(form_makeCloseTag("th"));
$formByDate->addElement(form_makeOpenTag("th")); $formByDate->addElement($this->getLang('Language')); $formByDate->addElement(form_makeCloseTag("th"));
$formByDate->addElement(form_makeOpenTag("th")); $formByDate->addElement($this->getLang('AmountOfValues')); $formByDate->addElement(form_makeCloseTag("th"));
$formByDate->addElement(form_makeCloseTag("tr"));
$onclick = array( 'onclick' => 'var elem=getElementsByClass("edit", this.parentNode); elem[0].firstChild.checked=(elem[0].firstChild.checked ? false : true);',);
foreach ( $categories as $Name => $CategoryID ) {
$this->functions->database->prepare("SELECT Version, COUNT(tblTranslation.KeyID) as Amount FROM tblTranslation INNER JOIN tblMaster ON tblMaster.KeyID=tblTranslation.KeyID WHERE tblTranslation.User=? AND CategoryID=? GROUP BY Version;");
$this->functions->database->execute($user, $CategoryID);
$data=array(); $this->functions->database->bind_assoc($data);
while ( $this->functions->database->fetch()) {
$form->addElement(form_makeOpenTag("tr"));
$form->addElement(form_makeOpenTag("td", $onclick)); $form->addElement($Name); $form->addElement(form_makeCloseTag("td"));
$form->addElement(form_makeOpenTag("td", $onclick)); $form->addElement($data['Version']); $form->addElement(form_makeCloseTag("td"));
$form->addElement(form_makeOpenTag("td", $onclick)); $form->addElement($data['Amount']); $form->addElement(form_makeCloseTag("td"));
$form->addElement(form_makeOpenTag("td"));
$form->addElement(form_makeCheckboxField("deleteuser[$Name][{$data['Version']}]", 1, '', '', 'edit'));
$form->addElement(form_makeCloseTag("td"));
$form->addElement(form_makeCloseTag("tr"));
}
}
$this->functions->database->prepare("SELECT Date, Lang, COUNT(tblTranslation.KeyID) as Amount FROM tblTranslation WHERE tblTranslation.User=? GROUP BY Date ORDER By Date DESC;");
$this->functions->database->execute($user);
$data=array(); $this->functions->database->bind_assoc($data);
while ( $this->functions->database->fetch()) {
$formByDate->addElement(form_makeOpenTag("tr"));
$formByDate->addElement(form_makeOpenTag("td", $onclick)); $formByDate->addElement(strftime($conf['dformat'], strtotime($data['Date']))); $formByDate->addElement(form_makeCloseTag("td"));
$formByDate->addElement(form_makeOpenTag("td", $onclick)); $formByDate->addElement($data['Lang']); $formByDate->addElement(form_makeCloseTag("td"));
$formByDate->addElement(form_makeOpenTag("td", $onclick)); $formByDate->addElement($data['Amount']); $formByDate->addElement(form_makeCloseTag("td"));
$formByDate->addElement(form_makeOpenTag("td"));
$formByDate->addElement(form_makeCheckboxField("deleteuser[][][{$data['Date']}][{$data['Lang']}]", 1, '', '', 'edit'));
$formByDate->addElement(form_makeCloseTag("td"));
$formByDate->addElement(form_makeCloseTag("tr"));
}
$form->addElement(form_makeCloseTag("table"));
$form->addElement(form_makeField('submit', 'fn[deleteuser]', 'Delete', ''));
$form->addElement(form_makeTag('br'));
$formByDate->addElement(form_makeCloseTag("table"));
$formByDate->addElement(form_makeField('submit', 'fn[deleteuser]', 'Delete', ''));
$formByDate->addElement(form_makeTag('br'));
$this->_finishFieldset($form);
$this->_finishFieldset($formByDate);
print $this->_printBackToAdmin();
}
function _setup() {
if ( !$this->functions =& plugin_load('helper', 'translator') ) {
msg($this->lang['helpermissing'], -1);
return false;
}
// check Database
return $this->functions->init_database(true);
}
}
//Setup VIM: ex: et ts=4 enc=utf-8 :