template = Request::get('template'); } if (Request::get('page')) { $this->page = Request::get('page'); } if (Request::get('delete')) { $this->delete = Request::get('delete'); } if (Request::post('update')) { $this->update = Request::post('update'); } } protected function doRender() { if ($this->update) $this->updateJson(); if ($this->delete && $this->template) $this->deleteTag($this->template, $this->delete); switch ($this->page) { case 'messages': Render::addTemplate('administration/messages', array( 'token' => Session::get('token'), 'msgs' => $this->initMsg(false), 'msgsHC' => $this->initMsg(true) )); break; case 'templates': if ($this->templateAnalysis($this->template)) { Render::addTemplate('administration/template', array( 'token' => Session::get('token'), 'template' => $this->template, 'path' => $this->path, 'tags' => $this->tags )); break; } default: $this->initTable(); Render::addTemplate('administration/_page', array( 'token' => Session::get('token'), 'adminMessage' => $this->message, 'table' => $this->table )); } } private function initTable() { $this->listTemplates(); $de = $this->listJson('de/'); $en = $this->listJson('en/'); $pt = $this->listJson('pt/'); foreach ($this->files as $key => $value) { $this->table[] = array( 'template' => $value, 'link' => $key, 'de' => $this->checkJson($de[$key], 'de'), 'en' => $this->checkJson($en[$key], 'en'), 'pt' => $this->checkJson($pt[$key], 'pt') ); } sort($this->table); } private function listTemplates() { $this->files = array(); $dir = 'templates/'; $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); foreach ($objects as $name => $object) { if (array_pop(explode('.', $name)) === 'html') { $key = str_replace($dir, '', $name); $key = str_replace('.html', '', $key); $this->files[$key] = $name; } } } private function listJson($lang) { $json = array(); $dir = 'lang/' . $lang; $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); foreach ($objects as $name => $object) { if (array_pop(explode('.', $name)) === 'json') { $key = str_replace($dir, '', $name); $key = str_replace('.json', '', $key); $json[$key] = $key; } } return $json; } private function checkJson($path, $lang) { if (!$path) { return "JSON file is missing"; } else { $htmlTemplate = file_get_contents('templates/' . $path . '.html'); $json = Dictionary::getArrayTemplate($path, $lang); preg_match_all('/{{lang_(.*?)}}/s', $htmlTemplate, $matches); $htmlCount = count(array_unique($matches[1])); $matchCount = 0; foreach ($json as $key => $value) { if ($key != 'lang') { if (!in_array(preg_replace('/^lang_/', '', $key), $matches[1])) { $matchCount++; } else if ($value != '') { $matchCount++; } } } $diff = $htmlCount - $matchCount; if ($diff == 0) return "OK"; if ($diff > 0) return $diff . " JSON tag(s) are missing"; if ($diff < 0) return ($diff * -1) . " JSON tag(s) are not being used"; } } private function templateAnalysis($path) { if (!file_exists('templates/' . $path . '.html')) { Message::addError('invalid-template'); return false; } $htmlTemplate = file_get_contents('templates/' . $path . '.html'); preg_match_all('/{{lang_(.*?)}}/s', $htmlTemplate, $matches); $tags = $matches[1]; $tags = array_flip($tags); foreach ($tags as $key => $value) { $tags['lang_' . $key] = $value; unset($tags[$key]); } $langArray = array('en'); $json = array(); foreach ($langArray as $lang) { $jsonTags = Dictionary::getArrayTemplate($path, $lang); $json = array_merge($json, $jsonTags); } unset($json['lang']); $test = array_merge($json, $tags); foreach ($test as $tag => $value) { $this->tags[] = array( 'tag' => $tag, 'de' => $this->checkJsonTag($path, $tag, 'de/'), 'en' => $this->checkJsonTag($path, $tag, 'en/'), 'pt' => $this->checkJsonTag($path, $tag, 'pt/'), 'class' => $this->checkJsonTags($path, $tag) ); } $this->path = $path; return true; } private function checkJsonTag($path, $tag, $lang) { if ($json = Dictionary::getArrayTemplate($path, $lang)) { return $json[$tag]; } return ''; } private function checkJsonTags($path, $tag) { $htmlTemplate = file_get_contents('templates/' . $path . '.html'); $htmlCount = substr_count($htmlTemplate, $tag); if ($htmlCount < 1) return "danger"; $langArray = array('de/', 'en/', 'pt/'); foreach ($langArray as $lang) { if ($json = Dictionary::getArrayTemplate($path, $lang)) { if (!isset($json[$tag]) || $json[$tag] == '') return 'warning'; } } return ''; } private function updateJson() { $langArray = Dictionary::getLanguages(); $json = array(); foreach ($langArray as $lang) { $json[$lang] = array(); } foreach ($_REQUEST as $key => $value) { $str = explode('#', $key, 3); if (count($str) !== 3) continue; $pre = $str[0]; $lang = $str[1]; $tag = $str[2]; if ($pre === 'lang') { if (in_array($lang, $langArray)) { if ($tag !== 'newtag') $json[$lang][$tag] = $value; else { $json[$lang][$_REQUEST['newtag']] = $value; } } } } foreach ($json as $key => $array) { $path = 'lang/' . $key . '/' . $_POST['path'] . '.json'; // TODO: Wtf? Unvalidated user input -> filesystem access! $json = json_encode($array, JSON_PRETTY_PRINT); if (@file_put_contents($path, $json) === false) { Message::addError('invalid-template'); return false; } } Message::addSuccess('updated-tags'); } private function initMsg($isHardcoded) { $msgs = array(); $path = 'messages'; if ($isHardcoded) { $path = 'messages-hardcoded'; } $json = Dictionary::getArrayTemplate($path, $lang); foreach ($json as $key => $array) { if ($key != 'lang') $msgs[] = array( 'tag' => $key, 'de' => $this->checkJsonTag($path, $key, 'de/'), // TODO: Hardcoded language list, use Dictionary::getLanguages() 'en' => $this->checkJsonTag($path, $key, 'en/'), 'pt' => $this->checkJsonTag($path, $key, 'pt/') ); } return $msgs; } private function deleteTag($path, $tag) { $langArray = unserialize(SITE_LANGUAGES); foreach ($langArray as $lang) { $json = Dictionary::getArrayTemplate($path, $lang); unset($json[$tag]); unset($json['lang']); //file_put_contents('test.txt','lang/' . $lang . '/' . $path . '.json'); file_put_contents('lang/' . $lang . '/' . $path . '.json', json_encode($json)); // TODO: Check return code, show error if not writable } Message::addSuccess('deleted-tag'); } }