<?php /* **** COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE **** * * Xentral (c) Xentral ERP Sorftware GmbH, Fuggerstrasse 11, D-86150 Augsburg, * Germany 2019 * * This file is licensed under the Embedded Projects General Public License *Version 3.1. * * You should have received a copy of this license from your vendor and/or *along with this file; If not, please visit www.wawision.de/Lizenzhinweis * to obtain the text of the corresponding license version. * **** END OF COPYRIGHT & LICENSE NOTICE *** DO NOT REMOVE **** */ ?> <?php use \Xentral\Modules\SystemNotification\Service\NotificationService; class Wiki { /** @var ApplicationCore $app */ var $app; const MODULE_NAME = 'Wiki'; /** * @param ApplicationCore $app * @param bool $intern */ public function __construct($app, $intern = false) { $this->app=$app; if($intern){ return; } $this->app->ActionHandlerInit($this); $this->app->DB->DisableHTMLClearing(true); $this->app->ActionHandler("create","WikiCreate"); $this->app->ActionHandler("edit","WikiEdit"); $this->app->ActionHandler("delete","WikiDelete"); $this->app->ActionHandler("rename","WikiRename"); $this->app->ActionHandler("new","WikiNew"); $this->app->ActionHandler("alle","WikiAlle"); $this->app->ActionHandler("dateien","WikiDateien"); $this->app->ActionHandler("list","WikiList"); $this->app->ActionHandler("settings","WikiSettings"); $this->app->ActionHandler("getfile","WikiGetFile"); $this->app->ActionHandler("faq","WikiFaq"); $this->app->ActionHandler("changelog","WikiChangelog"); $this->app->ActionHandler("minidetailsites","WikiMinidetailSites"); $this->app->ActionHandler("minidetailfaq","WikiMinidetailFaq"); $this->app->ActionHandler("minidetailchangelog","WikiMinidetailChangelog"); $this->app->DefaultActionHandler("list"); $this->app->ActionHandlerListen($app); } /** * @return bool */ public function runInstallFromJson() { ignore_user_abort(true); $this->app->erp->SetKonfigurationValue('wiki_install', 0); $workspaces = $this->getAllWorkspaces(); $foundWorkspace = false; if(!empty($workspaces)) { foreach($workspaces as $workspace) { if($workspace['name'] === 'XentralHandbuch' || $workspace['foldername'] === 'XentralHandbuch') { $foundWorkspace = true; if($workspace['savein'] !== 'userdata') { $this->app->DB->Update( sprintf( "UPDATE wiki_workspace SET savein = 'userdata' WHERE id =%d", $workspace['id'] ) ); } break; } } } if(!$foundWorkspace) { $this->app->DB->Insert( "INSERT INTO wiki_workspace (name, description, active, foldername, savein) VALUE ('XentralHandbuch','',1,'XentralHandbuch','userdata')" ); } $ret = $this->fromUserData(); $workspace = $this->getWorkspaceByName('XentralHandbuch'); if(!empty($workspace['id'])){ $this->app->DB->Update( sprintf( "UPDATE `datei_stichwoerter` AS `ds` INNER JOIN `wiki` AS `w` ON `ds`.objekt LIKE 'Wiki' AND ds.parameter = w.id SET ds.parameter2 = %d WHERE w.wiki_workspace_id = %d", $workspace['id'],$workspace['id'] ) ); } return $ret; } public function Install() { $this->app->erp->RegisterHook('inline_tooltip','wiki','WikiInlineTooltip'); $this->app->erp->RegisterHook('appstoreModulelistToShow','wiki','WikiAppstoreModulelistToShow'); $this->app->erp->RegisterHook('appstoreModuleDetailToShow','wiki','WikiAppstoreModuleDetailToShow'); $this->app->erp->RegisterHook('welcome_news','wiki','WikiWelcomeNews'); $this->app->erp->RegisterHook('dateibrowser_tablesearch_list_swhere2','wiki','WikiDateiBrowserTableSearch'); $this->getAllWorkspaces(); $this->runInstallFromJson(); $this->app->erp->SetKonfigurationValue('wiki_install', 1); } /** * @param string $swhere2 */ public function WikiDateiBrowserTableSearch(&$swhere2) { $workspace = $this->getWorkspaceByName('XentralHandbuch'); if(empty($workspace)) { return; } $swhere2 .= sprintf(" AND (ds.objekt NOT LIKE 'Wiki' OR ds.parameter2 <> '%d') ", $workspace['id']); } public function WikiWelcomeNews() { if(!$this->app->erp->RechteVorhanden('wiki', 'list')) { return; } $workspace = $this->getWorkspaceByName('XentralHandbuch'); if(empty($workspace)) { return; } $version_revision = ''; include dirname(dirname(__DIR__)).'/version.php'; $wiki = $this->getArticleByName('changelog'.$version_revision, $workspace['id']); if(empty($wiki)) { return; } $this->app->Tpl->Add( 'UPDATEBUTTONS_HOOK1', '<a target="_blank" href="index.php?module=wiki&action=list&workspace=' .$workspace['id'] .'&cmd=changelog'.$version_revision.'" class="button button-secondary">{|Änderungen zur Version ' .$version_revision.'|}</a>' ); } /** * @param array $module */ public function WikiAppstoreModuleDetailToShow(&$module) { $workspace = $this->getWorkspaceByName('XentralHandbuch'); if(empty($workspace)) { return; } $wikis = $this->app->DB->SelectArr( sprintf( "SELECT w.* FROM `wiki` AS `w` WHERE w.`wiki_workspace_id` = %d AND w.`name` = '%s' ORDER BY w.`name`, w.`language` = '' DESC, w.language = 'default ' DESC", $workspace['id'], $this->app->DB->real_escape_string($module['key']) ) ); if(empty($wikis)) { return; } $name = ''; foreach($wikis as $wiki) { if($wiki['name'] === $name) { continue; } $name = $wiki['name']; $module['helpdesk'] = 'index.php?module=wiki&action=list&workspace='.$workspace['id'].'&cmd='.$name; } } /** * @param array $modules */ public function WikiAppstoreModulelistToShow(&$modules) { $workspace = $this->getWorkspaceByName('XentralHandbuch'); if(empty($workspace)) { return; } $modulList = []; $nameToModule = []; if(!empty($modules['kauf'])) { foreach($modules['kauf'] as $key => $module) { if(!empty($module['key']) && $module['key'] !== 'appstore_extern') { $modulList[] = $this->app->DB->real_escape_string($module['key']); $nameToModule[$module['key']] = ['kauf', $key]; } } } if(!empty($modules['installiert'])) { foreach($modules['installiert'] as $key => $module) { if(!empty($module['key']) && $module['key'] !== 'appstore_extern') { $modulList[] = $this->app->DB->real_escape_string($module['key']); $nameToModule[$module['key']] = ['installiert', $key]; } } } $wikis = $this->app->DB->SelectArr( sprintf( "SELECT w.* FROM `wiki` AS `w` WHERE w.`wiki_workspace_id` = %d AND w.`name` IN ('%s') ORDER BY w.`name`, w.`language` = '' DESC, w.language = 'default ' DESC", $workspace['id'], implode("','", $modulList) ) ); if(empty($wikis)) { return; } $name = ''; foreach($wikis as $wiki) { if($wiki['name'] === $name) { continue; } $name = $wiki['name']; if(empty($nameToModule[$name])) { continue; } $modules[$nameToModule[$name][0]][$nameToModule[$name][1]]['helpdesk'] = 'index.php?module=wiki&action=list&workspace='.$workspace['id'].'&cmd='.$name; } } /** * @param string $folder */ public function changeUserdataRights($folder = '') { if(empty($folder)) { $folder = $this->getUserDataFolder(); $workspace = $this->getWorkspaceByName('XentralHandbuch'); $folder .= $workspace['foldername']; } if(!is_dir($folder) && !@mkdir($folder,0777,true) && !is_dir($folder)) { return; } @chmod($folder, 0777); $handle = @opendir($folder); if(!$handle) { return; } $folders = []; while($entry = @readdir($handle)) { if(strpos($entry,'.') === 0) { continue; } if(is_file($folder.'/'.$entry)) { @chmod($folder.'/'.$entry, 0666); } if(!is_dir($folder.'/'.$entry)) { continue; } $folders[] = $folder.'/'.$entry; } closedir($handle); if(empty($folders)) { return; } foreach($folders as $subfolder) { $this->changeUserdataRights($subfolder); } } /** * @param array $arr * @param string $prefix * * @return string */ public function drawMenuFromArray($arr, $prefix = '') { $html = ''; if(empty($arr)) { return $html; } $actlvl = 0; foreach($arr as $key => $row) { $newLvl = $row['lvl']; if($newLvl > $actlvl) { for($i = $actlvl; $i < $newLvl; $i++) { if($i === 0) { $html .= '<ul class="firstlvl">'; } else { $html .= '<ul>'; } $html .= '<li>'; } } elseif($newLvl == $actlvl && $key > 0) { $html .= '</li><li>'; } elseif($actlvl > $newLvl) { for($i = $newLvl; $i < $actlvl; $i++) { $html .= '</li></ul>'; } $html .= '<li>'; } $actlvl = $newLvl; $html .= '<a href="#'.($prefix===''?'':$prefix.$key).'" data-lvl="'.$newLvl.'">'.$row['text'].'</a>'; } for($i = $actlvl; $i > 0; $i--) { $html .= '</li></ul>'; } return $html.'<hr />'; } /** * @param string $html * @param int $maxLvl * @param string $prefix * * @return array */ public function parseMenuFromHtml($html, $maxLvl = 3, $prefix = '') { $headers = []; $html = str_replace( [ '<h1> </h1>', '<h2> </h2>', '<h3> </h3>', '<h1><br />', '<h2><br />', '<h3><br />', '<h1><br/>', '<h2><br/>', '<h3><br/>', '<h1><br>', '<h2><br>', '<h3><br>', '<h1></h1>', '<h2></h2>', '<h3></h3>', ], [ ' ', ' ', ' ', '<h1>', '<h2>', '<h3>', '<h1>', '<h2>', '<h3>', ' ', ' ', ' ', ], $html ); if(preg_match_all( sprintf( '/<h([1-%d]{1})([^>]*)>([^<]+)<\/h([1-%d]{1})>/i', $maxLvl, $maxLvl ),$html,$matches,PREG_OFFSET_CAPTURE)) { foreach($matches[0] as $i => $match) { $headers[] = ['lvl' => $matches[1][$i][0], 'text' => $matches[3][$i][0], 'pos' => $matches[0][$i][1]]; if($prefix === '') { continue; } if(!empty($matches[2][$i][0]) && preg_match_all('/(.*)(id="([^"]+)")(.*)/', $matches[2][$i][0],$matches2,PREG_OFFSET_CAPTURE)) { if(!empty($matches2[2][0][0])) { $matches[2][$i][0] = str_replace($matches2[2][0][0], ' ', $matches[2][$i][0]); } } $html = str_replace( $match[0], '<h'.$matches[1][$i][0].$matches[2][$i][0].' id="'.$prefix.$i.'">'.$matches[3][$i][0].'</h'.$matches[4][$i][0].'>', $html ); } } return [$headers, $html]; } public function WikiInlineTooltip(&$inline, &$tooltip, &$module, &$action, $id, $module2) { $actModule = !empty($module2)?$module2:$module; if(empty($actModule)) { return; } $moduleOld = $module; $module = $actModule; $extraLinks = []; $content = ''; list($poId, $link, $oldLink) = [null,null,null]; $oldAction = $action; if(empty($inline[$actModule])) { $action = 'default'; if(!empty($link)) { $inline[$actModule]['default']['link'] = $link; } $inline[$actModule][$oldAction]['link'] = $link; } elseif(!empty($inline[$actModule][$action])) { if(empty($inline[$actModule][$action]['link']) && !empty($link)) { $inline[$actModule][$action]['link'] = $link; } } elseif(!empty($inline[$actModule]['default'])) { $action = 'default'; $inline[$actModule][$action] = $inline[$actModule]['default']; if(!empty($link)) { $inline[$actModule]['default']['link'] = $link; } } else { $action = 'default'; if(!empty($link)) { $inline[$actModule]['default']['link'] = $link; $inline[$actModule][$oldAction]['link'] = $link; } } if(!empty($oldLink)) { $extraLinks[$oldLink] = $oldLinkDescription; } if(!empty($extraLinks)) { $inline[$actModule][$action]['extralinks3'] = $extraLinks; $inline[$actModule][$oldAction]['extralinks3'] = $extraLinks; } $linkContent = ''; if(!empty($content)) { $inline[$actModule][$action]['extradescription'] = $content;// '<h2>Vorschau</h2>'.$content.'<hr />'; $inline[$actModule][$oldAction]['extradescription'] = $content;//'<h2>Vorschau</h2>'.$content.'<hr />'; $linkContent = $content; } /** @var Wiki $wiki */ //$wiki = $this->app->erp->LoadModul('wiki'); $workspace = $this->getWorkspaceByName('XentralHandbuch'); if(!empty($workspace)){ //$this->checkWiki($actModule, $content, $wiki); $inline[$actModule][$action]['handbook'] = ''; $wiki = $this->getArticleByName($actModule,$workspace['id']); $content = $wiki['content']; $menu = null; if(!empty($content)){ list($menu, $content) = $this->parseMenuFromHtml($content); } if(empty($linkContent)) { $listLink = ''; if(!empty($wiki)) { $listLink = ' <a target="_blank" href="index.php?module=wiki&action=list&workspace='.$workspace['id'].'&cmd='.$wiki['name'].'">' .'(Handbuch im neuen Tab öffnen)' .'</a><br />'; $linkToWiki = "index.php?module=wiki&action=list&workspace=".$workspace['id'].'&cmd='.$wiki['name'].""; $this->app->Tpl->Add("LINKTOWIKI", $linkToWiki); } $inline[$actModule][$action]['handbook'] = ''; $inline[$actModule][$oldAction]['handbook'] = ''; if(!empty($menu)) { ##$inline[$actModule][$action]['handbook'] .= '<h2 class="inlinetabh2">Inhaltsverzeichnis</h2>'.$listLink.$this->drawMenuFromArray($menu); if($action !== $oldAction){ ##$inline[$actModule][$oldAction]['handbook'] .= '<h2 class="inlinetabh2">Inhaltsverzeichnis</h2>' . $listLink . $this->drawMenuFromArray($menu); } } else { $inline[$actModule][$action]['handbook'] .= $listLink; if($action !== $oldAction){ $inline[$actModule][$oldAction]['handbook'] .= $listLink; } } $inline[$actModule][$action]['handbook'] .= $content . '<hr />'; $inline[$actModule][$oldAction]['handbook'] .= $content . '<hr />'; } else{ if(!empty($menu)) { ##$inline[$actModule][$action]['handbook'] .= '<h2>Inhaltsverzeichnis</h2>'.$this->drawMenuFromArray($menu); } $inline[$actModule][$action]['handbook'] .= $content . '<hr />'; } if(!empty($wiki)) { /*$inline[$actModule][$action]['extraheading'] = '<div class="rTabs"> <ul><li class="aktiv"><a class="inlinecontentlink" href="#rinhalt">Inhalt</a></li><li><a class="inlinefaqlink" href="#rfaq">FAQ</a></li></ul></div>';*/ $inline[$actModule][$action]['extralinks3'] = [ 'index.php?module=wiki&action=edit&workspace='.$workspace['id'].'&cmd='.$wiki['name'] => 'Wiki' ]; unset($inline[$actModule][$action]['extralinks']); $faqs = $this->app->DB->SelectArr(sprintf("SELECT question,answer FROM wiki_faq WHERE wiki_id = %d", $wiki['id'])); if(!empty($faqs)) { $inline[$actModule][$action]['faqs'] = $faqs; if($action !== $oldAction && empty($inline[$actModule][$oldAction]['faqs'])) { $inline[$actModule][$oldAction]['faqs'] = $faqs; } } $inline[$actModule][$action]['extmenu'] = '<li> <a target="_blank" href="index.php?module=wiki&action=edit&workspace='.$workspace['id'].'&cmd='.$wiki['name'].'">Bearbeiten</a> </li>'; if($oldAction !== $action){ $inline[$actModule][$oldAction]['extmenu'] = $inline[$actModule][$action]['extmenu']; } } else { } if($oldAction !== $action){ $inline[$actModule][$oldAction]['handbook'] = $inline[$actModule][$action]['handbook']; } } if(empty($inline[$actModule][$action]['handbook'])){ $inline[$actModule][$action]['handbook'] = ' '; //$inline[$actModule][$action]['extralinks3']; $inline[$actModule][$oldAction]['handbook'] = ' '; //$inline[$actModule][$oldAction]['extralinks3']; } $action = $oldAction; if($module !== $moduleOld) { $inline[$moduleOld] = $inline[$module]; } $module = $moduleOld; } /** * @param ApplicationCore $app * @param string $name * @param array $erlaubtevars * * @return array */ public function TableSearch($app, $name, $erlaubtevars) { switch($name) { case 'wiki_changelog': $id = $this->app->Secure->GetGET('id'); $wiki = $this->app->DB->SelectRow(sprintf('SELECT name, id, wiki_workspace_id FROM wiki WHERE id = %d', $id)); if(!empty($wiki)) { $ids = $this->app->DB->SelectFirstCols( sprintf( "SELECT id FROM wiki WHERE wiki_workspace_id = %d AND name = '%s'", $wiki['wiki_workspace_id'], $this->app->DB->real_escape_string($wiki['name']) ) ); } else{ $ids = $this->app->DB->SelectFirstCols( sprintf( 'SELECT id FROM wiki WHERE parent_id = %d OR id = %d', $id, $id ) ); $ids = $this->app->DB->SelectFirstCols( sprintf( 'SELECT id FROM wiki WHERE parent_id IN (%s) OR id IN (%s)', implode(',', $ids), implode(',', $ids) ) ); } $result = []; $result['allowed']['wiki'] = ['faq']; $result['heading'] = ['','Datum','Bearbeiter','Kommentar','']; $result['width'] = ['1%','20%','40','50%', '1%']; $result['findcols'] = ['open','wc.created_at','wc.created_by','wc.comment', 'wc.id']; $result['searchsql'] = ['wc.comment']; $result['menucol'] = 4; $result['sql'] = "SELECT wc.id, '<img src=./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/details_open.png class=details>' as open, DATE_FORMAT(wc.created_at,'%d.%m.%Y %H:%i:%s'),wc.created_by, wc.comment, wc.id FROM wiki_changelog AS wc INNER JOIN wiki AS w ON wc.wiki_id = w.id"; $result['menu'] = '<table class="nopadding"><tr><td nowrap>' .'<a href="#">' .'<img class="hidden" data-id="%value%" src="./themes/new/images/edit.svg" alt="zur Seite" />' .'</a>' .'</td></tr></table>'; $result['where'] = sprintf(' w.id in (%s)', implode(',', $ids))." AND w.comment <> '' "; $result['moreinfo'] = true; $result['moreinfoaction'] = 'changelog'; break; case 'wiki_faq': $id = $this->app->Secure->GetGET('id'); $wiki = $this->app->DB->SelectRow(sprintf('SELECT name, id, wiki_workspace_id FROM wiki WHERE id = %d', $id)); if(!empty($wiki)) { $ids = $this->app->DB->SelectFirstCols( sprintf( "SELECT id FROM wiki WHERE wiki_workspace_id = %d AND name = '%s'", $wiki['wiki_workspace_id'], $this->app->DB->real_escape_string($wiki['name']) ) ); } else{ $ids = $this->app->DB->SelectFirstCols( sprintf( 'SELECT id FROM wiki WHERE parent_id = %d OR id = %d', $id, $id ) ); $ids = $this->app->DB->SelectFirstCols( sprintf( 'SELECT id FROM wiki WHERE parent_id IN (%s) OR id IN (%s)', implode(',', $ids), implode(',', $ids) ) ); } $result = []; $result['allowed']['wiki'] = ['faq']; $result['heading'] = ['','Seite','Sprache','Frage','Menü']; $result['width'] = ['1%','40','20%','50%', '1%']; $result['findcols'] = ['open','w.name','w.language','wf.question', 'wf.id']; $result['searchsql'] = ['w.name','wf.question']; $result['menucol'] = 4; $result['sql'] = "SELECT wf.id, '<img src=./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/details_open.png class=details>' as open, w.name, w.language, wf.question, wf.id FROM wiki_faq AS wf INNER JOIN wiki AS w ON wf.wiki_id = w.id"; $result['menu'] = '<table class="nopadding"><tr><td nowrap>' .'<a href="#">' .'<img class="wikifaqedit" data-id="%value%" src="./themes/new/images/edit.svg" alt="ändern" />' .' ' .'<img class="wikifaqdelete" data-id="%value%" src="./themes/new/images/delete.png" alt="löschen" />' .'</a>' .'</td></tr></table>'; $result['where'] = sprintf(' w.id in (%s)', implode(',', $ids)); $result['moreinfo'] = true; $result['moreinfoaction'] = 'faq'; break; case 'wiki_sites': $workspace = $this->getUserWorkspace(); $result = []; $result['allowed']['wiki'] = ['settings']; $result['heading'] = ['','Seite','Sprache','Menü']; $result['width'] = ['1%','40','20%', '1%']; $result['findcols'] = ['open','w.name','w.language', 'w.id']; $result['searchsql'] = ['w.name']; $result['menucol'] = 3; $result['sql'] = "SELECT w.id, '<img src=./themes/{$this->app->Conf->WFconf['defaulttheme']}/images/details_open.png class=details>' as open, w.name, w.language, w.id FROM wiki AS w"; $result['menu'] = '<table class="nopadding"><tr><td nowrap>' .'<a href="index.php?module=wiki&action=list&id=%value%">' .'<img src="./themes/new/images/forward.svg" alt="zur Seite" />' .'</a>' .'</td></tr></table>'; $result['where'] = sprintf(' w.wiki_workspace_id = %d', $workspace); $result['moreinfo'] = true; $result['moreinfoaction'] = 'sites'; break; case 'wiki_workspaces': $result = []; $result['allowed']['wiki'] = array('settings'); $result['heading'] = ['Bezeichnung','Speicherort','Aktiv', 'Menü']; $result['width'] = ['54%','40','5%', '1%']; $result['findcols'] = array('ww.name','ww.active','ww.savein', 'ww.id'); $result['searchsql'] = array('ww.name'); $result['sql'] = "SELECT ww.id, ww.name,IF(ww.savein = 'userdata','Userdata','Datenbank'), IF(ww.active,'ja','-'), ww.id FROM wiki_workspace AS ww"; $result['count'] = 'SELECT COUNT(ww.id) FROM wiki_workspace AS ww'; $result['menucol'] = 4; $result['menu'] = '<table class="nopadding"><tr><td nowrap>' . '<img src="./themes/'.$this->app->Conf->WFconf['defaulttheme'].'/images/edit.svg" data-id="%value%" class="workspaceedit" alt="Editieren" />' . ' ' . '<img src="./themes/'.$this->app->Conf->WFconf['defaulttheme'].'/images/overview.png" data-id="%value%" class="workspacesites" alt="Übersicht" />' . ' ' . '<img src="./themes/'.$this->app->Conf->WFconf['defaulttheme'].'/images/delete.svg" data-id="%value%" class="workspacedelete" alt="Löschen" />' . '</td></tr></table>'; $result['where'] = 'ww.id > 0'; break; case 'wiki_files': $id = (int)$app->Secure->GetGET('id'); $workspace = $this->getUserWorkspace(); $wikiname = (string)$app->Secure->GetGET('cmd'); if ($wikiname === 'wiki_files') { $wikiname = (string)$app->Secure->GetGET('smodule', 'nohtml'); } // ID der Wiki-Page ermitteln if($id === 0 && !empty($wikiname)){ $id = (int)$app->DB->Select(sprintf('SELECT w.id FROM `wiki` AS w WHERE w.name = \'%s\' LIMIT 1',$wikiname)); } $heading = array('', 'Vorschau', 'Titel', 'Stichwort', 'Version', 'Größe', 'Ersteller', 'Bemerkung', 'Datum', 'Sortierung', 'Menü'); $width = array('1%', '10%', '40%', '15%', '5%', '10%', '15%', '10%', '10%', '15%', '10%', '5%', '1%'); $findcols = array('open', 'd.id', 'CONCAT(d.titel, \' \', v1.dateiname)', 's.subjekt', 'v1.version', "if(v1.size!='',if(v1.size > 1024*1024,CONCAT(ROUND(v1.size/1024/1024,2),' MB'),CONCAT(ROUND(v1.size/1024,2),' KB')),'')", 'v1.ersteller', 'v1.bemerkung', 'v1.datum', 's.sort', 's.id'); $searchsql = array('d.titel', 's.subjekt', 'v1.version', "if(v1.size!='',if(v1.size > 1024*1024,CONCAT(ROUND(v1.size/1024/1024,2),' MB'),CONCAT(ROUND(v1.size/1024,2),' KB')),'')", 'v1.ersteller', 'v1.bemerkung', 'v1.dateiname', "DATE_FORMAT(v1.datum, '%d.%m.%Y')"); $menu = '<table border="0" cellpadding="0" cellspacing="0"><tr><td nowrap>'; $menu .= '<a href="#" data-file-id="%value%" class="wiki-select-file-button">'; $menu .= '<img src="./themes/' . $app->Conf->WFconf['defaulttheme'] . '/images/forward.svg' . '" alt="Bild auswählen" border="0" />'; $menu .= '</a>'; $menu .= ' '; $menu .= '<a href="#" data-file-id="%value%" class="wiki-delete-file-button">'; $menu .= '<img src="./themes/' . $app->Conf->WFconf['defaulttheme'] . '/images/delete.svg' . '" alt="Bild löschen" border="0" />'; $menu .= '</a>'; $menu .= '</td></tr></table>'; $menucol = 10; $alignright = [5, 6, 10]; if(!function_exists('imagejpeg')){ $img = "'<img src=./themes/{$app->Conf->WFconf['defaulttheme']}/images/icon_img_error.png title=\"Keine GD-Erweiterung installiert\" />'"; }else{ $img = "concat('<span style=\"width:100px;text-align:center;display:block;\"><a href=\"index.php?module=dateien&action=send&id=',d.id,'\"><img src=\"index.php?module=ajax&action=thumbnail&cmd=wiki&id=',d.id,'\" style=\"border:0;max-width:100px;max-height:100px;\" /></a></span>')"; } // SQL statement $sql = "SELECT SQL_CALC_FOUND_ROWS d.id, '<img src=\"./themes/{$app->Conf->WFconf['defaulttheme']}/images/details_open.png\" class=\"details\">' AS open, {$img}, IF(d.titel != '', CONCAT(d.titel, '<br><i style=color:#999>', v1.dateiname, '</i>'), v1.dateiname), s.subjekt, v1.version, IF(v1.size != '', IF(v1.size > 1024 * 1024, CONCAT(ROUND(v1.size / 1024 / 1024, 2), ' MB'), CONCAT(ROUND(v1.size / 1024, 2),' KB')), '') AS groesse, v1.ersteller, v1.bemerkung, DATE_FORMAT(v1.datum, '%d.%m.%Y'), s.sort, d.id FROM datei AS d LEFT JOIN datei_stichwoerter AS s ON d.id = s.datei LEFT JOIN ( SELECT dv.datei, MAX(dv.version) AS version FROM datei_version AS dv GROUP BY dv.datei ) AS v2 ON v2.datei = d.id LEFT JOIN datei_version AS v1 ON v1.datei = v2.datei AND v1.version = v2.version "; $parameter = $id; $where = " s.objekt LIKE 'Wiki' AND s.parameter = '{$parameter}' AND d.geloescht = 0 "; $count = " SELECT COUNT(d.id) AS anzahl FROM datei AS d LEFT JOIN datei_stichwoerter AS s ON d.id = s.datei LEFT JOIN ( SELECT dv.datei FROM datei_version AS dv GROUP BY dv.datei ) v ON v.datei = d.id WHERE $where"; $result = [ 'alignright' => $alignright, 'heading' => $heading, 'width' => $width, 'findcols' => $findcols, 'searchsql' => $searchsql, 'menu' => $menu, 'menucol' => $menucol, 'moreinfo' => true, 'moreinfomodule' => 'dateien', 'sql' => $sql, 'where' => $where, 'count' => $count, ]; break; } // Nicht erlaubt Keys aus Result entfernen foreach ($result as $key => $value) { if (!in_array($key, $erlaubtevars, true)) { unset($result[$key]); } } return !empty($result) ? $result : []; } public function WikiMinidetailChangelog() { $id = $this->app->Secure->GetGET('id'); $iframe = $this->app->Secure->GetGET('iframe'); if(empty($iframe)) { echo '<iframe style="border:none;width:100%;" border="0" src="index.php?module=wiki&action=minidetailchangelog&id='.$id.'&iframe=true"></iframe>'; $this->app->ExitXentral(); } $content = $this->app->DB->Select(sprintf('SELECT content FROM wiki_changelog WHERE id = %d', $id)); echo $content; $this->app->ExitXentral(); } public function WikiMinidetailFaq() { $id = $this->app->Secure->GetGET('id'); $iframe = $this->app->Secure->GetGET('iframe'); if(empty($iframe)) { echo '<iframe style="border:none;width:100%;" border="0" src="index.php?module=wiki&action=minidetailfaq&id='.$id.'&iframe=true"></iframe>'; $this->app->ExitXentral(); } $content = $this->app->DB->Select(sprintf('SELECT answer FROM wiki_faq WHERE id = %d', $id)); echo $content; $this->app->ExitXentral(); } public function WikiMinidetailSites() { $id = $this->app->Secure->GetGET('id'); $iframe = $this->app->Secure->GetGET('iframe'); if(empty($iframe)) { echo '<iframe style="border:none;width:100%;" border="0" src="index.php?module=wiki&action=minidetailsites&id='.$id.'&iframe=true"></iframe>'; $this->app->ExitXentral(); } $content = $this->app->DB->Select(sprintf('SELECT content FROM wiki WHERE id = %d', $id)); echo $content; $this->app->ExitXentral(); } public function WikiFaq() { $command = $this->app->Secure->GetGET('command'); if($command === 'deletefaq') { $wikiFaqId = $this->app->Secure->GetPOST('wikifaqid'); $success = 0; if($wikiFaqId > 0) { $this->deleteFaqInUserdata($wikiFaqId); $this->app->DB->Delete( sprintf( 'DELETE FROM wiki_faq WHERE id = %d', $wikiFaqId ) ); if($this->app->DB->affected_rows() > 0) { $success = 1; } } header('Content-Type: application/json'); echo json_encode(['success' => $success]); $this->app->ExitXentral(); } if($command === 'savefaq') { $id = $this->app->Secure->GetPOST('id'); $wikiFaqId = $this->app->Secure->GetPOST('wikifaqid'); $answer = $this->app->Secure->GetPOST('answer'); $question = $this->app->Secure->GetPOST('question'); $oldWiki = empty($wikiFaqId)?null:$this->app->DB->SelectRow( sprintf( 'SELECT * FROM wiki_faq WHERE id = %d', $wikiFaqId ) ); if(empty($wikiFaqId) && !empty($id)) { $this->app->DB->Insert(sprintf("INSERT INTO wiki_faq (wiki_id) VALUES (%d)", $id)); $wikiFaqId = $this->app->DB->GetInsertID(); } if(!empty($wikiFaqId)) { if(!empty($oldWiki['question']) && $this->app->DB->real_escape_string($oldWiki['question']) != $question) { $this->deleteFaqInUserdata($wikiFaqId); } $this->app->DB->Update( sprintf( "UPDATE wiki_faq SET answer = '%s', question = '%s', created_by = '%s', updated_at = NOW() WHERE id = %d", $answer, $question, $this->app->DB->real_escape_string($this->app->User->GetName()), $wikiFaqId ) ); $this->saveFaqInUserdata($wikiFaqId); } $wikiFaq = $wikiFaqId <= 0?null:$this->app->DB->SelectRow( sprintf('SELECT * FROM wiki_faq WHERE id = %d', $wikiFaqId) ); if(empty($wikiFaq)) { $wikiFaq = ['id' => 0, 'answer' => '', 'question' => '']; } header('Content-Type: application/json'); echo json_encode($wikiFaq); $this->app->ExitXentral(); } if($command === 'getfaq') { $wikiFaqId = $this->app->Secure->GetPOST('wikifaqid'); $wikiFaq = $wikiFaqId <= 0?null:$this->app->DB->SelectRow( sprintf( 'SELECT * FROM wiki_faq WHERE id = %d', $wikiFaqId ) ); if(empty($wikiFaq)) { $wikiFaq = ['id' => 0, 'answer' => '', 'question' => '']; } header('Content-Type: application/json'); echo json_encode($wikiFaq); $this->app->ExitXentral(); } $this->WikiMenu(); $workspace =$this->getUserWorkspace(); $language = $this->getUserLanguage(); $cmd = $this->app->Secure->GetGET('cmd'); $id = $this->app->Secure->GetGET('id'); if(!empty($id)) { $this->app->Tpl->Set('ID', $id); } else { $wiki = $this->getArticleByName($cmd, $workspace, $language); if(empty($wiki) && !empty($language)){ $wiki = $this->getArticleByName($cmd, $workspace); } if(!empty($wiki)){ $this->app->Tpl->Set('ID', $wiki['id']); } } $this->app->YUI->TableSearch('TAB1', 'wiki_faq','show','','',basename(__FILE__),__CLASS__); //$this->app->YUI->CkEditor('popupanswer','wiki',['ckeditor5'=>true,'min-height'=>'250']); $this->app->YUI->CkEditor('popupanswer','wiki'); $this->app->Tpl->Parse('PAGE', 'wiki_faq.tpl'); } public function WikiChangelog() { $this->WikiMenu(); $this->app->YUI->TableSearch('TAB1','wiki_changelog','show','','',basename(__FILE__),__CLASS__); $this->app->Tpl->Parse('PAGE', 'wiki_changelog.tpl'); } public function WikiGetFileCache() { $this->WikiGetFile(true); } public function WikiGetFile($exit = false) { $workspacefolder = $this->app->Secure->GetGET('workspacefolder', 'nothtml','', true); $article = $this->app->Secure->GetGET('article', 'nothtml','', true); $fileid = $this->app->Secure->GetGET('fileid', 'nothtml','', true); $path = $this->getUserDataFolder().$workspacefolder.'/files/'.$article.'/'.$fileid; $name = $article; if(is_file($path)) { if ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], "MSIE" ) > 0 ) { $header_name = 'Content-Disposition: attachment; filename="' . rawurlencode ( $name ) . '"' ; } else { $header_name = 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode ( $name ) ; } $contenttype= $this->app->erp->content_type($name); if(empty($contenttype)) { $contenttype = mime_content_type($path); } //required, or it might try to send the serving //document instead of the file header('Cache-Control: public, max-age=14400, s-maxage=14400'); header('Pragma: '); header('Expires: '.date('D, d M Y H:i:s e'), time()+14400); header("Content-Type: $contenttype"); header('Content-Length: ' .(string)(empty($path)?0:@filesize($path)) ); //header('Content-Disposition: inline; filename="'.$name.'"'); //$name = $this->Dateinamen($name); //header('Content-Disposition: attachment; filename="'.$name.'"'); header($header_name); if(!empty($path) && $file = fopen($path, 'rb')){ while( (!feof($file)) && (connection_status()==0) ){ print(fread($file, 1024*8)); flush(); } fclose($file); } } if($exit) { exit; } $this->app->ExitXentral(); } public function WikiSettings() { $command = $this->app->Secure->GetGET('command'); if($command === 'openworkspace') { $id = $this->app->Secure->GetPOST('id'); $workspace = $this->app->DB->SelectRow( sprintf( 'SELECT * FROM wiki_workspace WHERE id = %d', $id ) ); if(empty($workspace)) { $workspace = [ 'name' =>'', 'id' => 0, 'active' => 1, 'savein' => '' ]; } header('Content-Type: application/json'); echo json_encode($workspace); $this->app->ExitXentral(); } if($command === 'saveworkspace') { $id = $this->app->Secure->GetPOST('id'); $active= $this->app->Secure->GetPOST('active'); $name = $this->app->Secure->GetPOST('name'); $savein = $this->app->Secure->GetPOST('savein'); $status = 0; if(empty($id)) { $this->app->DB->Insert( sprintf( "INSERT INTO wiki_workspace (id, name, description, active, savein) VALUES (NULL, '%s', '', %d,'%s')", $name, $active, $savein ) ); $status = $this->app->DB->GetInsertID()>0?1:0; } else { $this->app->DB->Update( sprintf( "UPDATE wiki_workspace SET name = '%s', active = %d, savein = '%s' WHERE id = %d", $name, $active, $savein, $id ) ); if($this->app->DB->error()) { $status = 0; } elseif($this->app->DB->Select( sprintf( 'SELECT id FROM wiki_workspace WHERE id = %d', $id ) )) { $status = 1; } } header('Content-Type: application/json'); echo json_encode(['status' => $status]); $this->app->ExitXentral(); } if($command === 'deleteworkspace') { $id = $this->app->Secure->GetPOST('id'); $status = 0; if($this->app->DB->Select(sprintf('SELECT id FROM wiki_workspace WHERE id = %d', $id))) { if($this->app->DB->Select(sprintf('SELECT id FROM wiki WHERE wiki_workspace_id = %d', $id))) { $this->app->DB->Update(sprintf('UPDATE wiki_workspace SET active = 0 WHERE id = %d', $id)); } else { $this->app->DB->Delete(sprintf('DELETE FROM wiki_workspace WHERE id = %d', $id)); } } header('Content-Type: application/json'); echo json_encode(['status' => $status]); $this->app->ExitXentral(); } $this->WikiMenu(); $this->app->erp->MenuEintrag('#','Neu'); $this->app->YUI->TableSearch('TAB1','wiki_workspaces','show','','',basename(__FILE__),__CLASS__); $this->app->YUI->TableSearch('TABSITES','wiki_sites','show','','',basename(__FILE__),__CLASS__); $this->app->Tpl->Parse('PAGE', 'wiki_settings.tpl'); } /** * @return string */ public function getUserDataFolder() { $folder = rtrim($this->app->Conf->WFuserdata).'/wiki/'; if(!is_dir($folder) && !@mkdir($folder,0777, true) && !is_dir($folder)) { return $folder; } return $folder; } /** * @return bool */ public function fromUserData() { $folder = $this->getUserDataFolder(); $workspaces = $this->getFilesAndFolders($folder); if(empty($workspaces) || empty($workspaces['folders'])) { return false; } $workspaces = $workspaces['folders']; $workspaces = array_flip($workspaces); foreach($workspaces as $workspaceKey => $workspace) { $workspaces[$workspaceKey] = 0; } $workSpacesInDb = $this->getAllWorkspaces(); foreach($workspaces as $workspace => $workspaceId) { $found = false; if(!empty($workSpacesInDb)) { foreach($workSpacesInDb as $workSpaceInDb) { if($workSpaceInDb['foldername'] === $workspace) { $workspaces[$workspace] = $workSpaceInDb['id']; $found = true; break; } } } if(!$found) { $this->app->DB->Insert( sprintf( "INSERT INTO wiki_workspace (name, foldername, savein, active) VALUES ('%s', '%s', 'userdata', 1)", $this->app->DB->real_escape_string(ucfirst($workspace)), $this->app->DB->real_escape_string($workspace) ) ); $workspaces[$workspace] = (int)$this->app->DB->GetInsertID(); } } $allLanguages = $this->app->erp->GetSelectSprachenListe(); unset($allLanguages[0]); $allLanguages = array_unique(array_merge(['default'], array_keys($allLanguages))); foreach($workspaces as $workspace => $workspaceId) { if(empty($workspaceId)) { continue; } $workspaceFolders = $this->getFilesAndFolders($folder.$workspace); if(empty($workspaceFolders) || empty($workspaceFolders['folders'])) { continue; } $workspaceFolders = $workspaceFolders['folders']; $languages = array_intersect($allLanguages, $workspaceFolders); if(empty($languages)) { continue; } foreach($languages as $language) { $articles = $this->getFilesAndFolders($folder . $workspace . '/' . $language); if(empty($articles) || empty($articles['files'])) { continue; } $articles = $articles['files']; foreach($articles as $article) { @chmod($folder . $workspace . '/' . $language.'/'.$article, 0666); $articleContent = file_get_contents($folder . $workspace . '/' . $language.'/'.$article); $articleContent = strip_tags( $articleContent, '<table><tr><td><th><tbody><tfoot><thead><button><br><br /><div><a><img><h1><h2><h3><h4><h5><h6><p><span><ul><li><ol><strong><u><i><iframe><article>' ); $articleContent = str_replace(['<h1> </h1>','<h2> </h2>','<h3> </h3>'],' ', $articleContent); foreach(['img','h1','h2','h3','a'] as $tag) { while ( preg_match_all( '/(.*)<'.$tag.'([^>]+)((class|alt)="([^"]+)")(.*)>/', $articleContent, $matches, PREG_OFFSET_CAPTURE ) ) { if(strlen($matches[3][0][0]) === 0){ break; } $articleContent = substr($articleContent, 0, $matches[3][0][1]) . substr($articleContent, $matches[3][0][1] + strlen($matches[3][0][0])); } } /*$articleContent = str_replace( ["<br />","<br>","</p>",'</div>','</ul>','</h1>','</h2>','</h3>','</h4>','</h5>','</h6>'], ["<br />\n","<br>\n","</p>\n","</div>\n","</ul>","</h1>\n","</h2>\n","</h3>\n","</h4>\n","</h5>\n","</h6>\n"], $articleContent );*/ if(empty($articleContent)) { continue; } $this->saveArticle($article, $articleContent, $workspaceId, $language==='default'?'':$language, true); } } if(is_dir($folder . $workspace . '/faq')) { $fileFolders = $this->getFilesAndFolders($folder . $workspace . '/faq'); if(empty($fileFolders['folders'])) { continue; } $fileFolders = $fileFolders['folders']; foreach($fileFolders as $fileFolder) { @chmod($folder . $workspace . '/faq/' . $fileFolder, 0777); $article = $this->getArticleByName($fileFolder, $workspaceId); if(empty($article)) { continue; } $files = $this->getFilesAndFolders($folder . $workspace . '/faq/'.$fileFolder); if(empty($files['files'])) { continue; } $files = $files['files']; $this->syncFaqs($folder . $workspace . '/faq/'.$fileFolder, $files, $article); } } } return true; } /** * @param string $folder * @param array $files * @param array $wiki */ public function syncFaqs($folder, $files, $wiki) { foreach($files as $file) { $fileabsoulte = $folder.'/'.$file; if(strpos($file,'question_') !== 0) { continue; } if(!is_file($fileabsoulte)) { continue; } $question = file_get_contents($fileabsoulte); if(empty($question)) { continue; } $answerfile = $folder.'/answer_'.substr($file, 9); @chmod($answerfile, 0666); $answer= is_file($answerfile)?file_get_contents($answerfile):''; if(empty($answer)) { $this->deleteFaq($wiki, $question); continue; } $this->updateFaq($wiki, $question, $answer); } } /** * @param array $wiki * @param string $question */ public function deleteFaq($wiki, $question) { $this->app->DB->Delete( sprintf( "DELETE FROM wiki_faq WHERE wiki_id = %d AND question = '%s'", $wiki['id'], $this->app->DB->real_escape_string($question) ) ); } /** * @param $wiki * @param $question * @param $answer */ public function updateFaq($wiki, $question, $answer) { if(empty($question) || empty($wiki['id'])) { return; } $id = $this->app->DB->Select( sprintf( "SELECT id FROM wiki_faq WHERE wiki_id = %d AND question = '%s' LIMIT 1", $wiki['id'], $this->app->DB->real_escape_string($question) ) ); if($id <= 0) { $this->app->DB->Insert( sprintf( "INSERT INTO wiki_faq (wiki_id, question) VALUES (%d, '%s')", $wiki['id'], $this->app->DB->real_escape_string($question) ) ); $id = $this->app->DB->GetInsertID(); } if($id <= 0) { return; } $this->app->DB->Update( sprintf( "UPDATE wiki_faq SET answer = '%s' WHERE id = %d", $this->app->DB->real_escape_string($answer), $id ) ); } /** * @param string $rootFolder * * @return array */ public function getFilesAndFolders($rootFolder) { $ret =[]; if(!is_dir($rootFolder)) { return $ret; } $rootFolder = rtrim($rootFolder,'/').'/'; $handle = @opendir($rootFolder); if(empty($handle)) { return $ret; } while($entry = @readdir($handle)) { if($entry === '.' || $entry === '..') { continue; } if(is_dir($rootFolder.$entry)) { $ret['folders'][] = $entry; continue; } if(is_file($rootFolder.$entry)) { @chmod($rootFolder.$entry, 0666); $ret['files'][] = $entry; } } closedir($handle); return $ret; } /** * @return array */ public function getWorkspacesWithUserdata($fullRow = false) { if($fullRow) { $ret = $this->app->DB->SelectArr("SELECT * FROM wiki_workspace WHERE savein = 'userdata'"); if(empty($ret)) { return []; } return $ret; } return $this->app->DB->SelectPairs("SELECT id, name FROM wiki_workspace WHERE savein = 'userdata'"); } /** * @param string $name * * @return array|null */ public function getWorkspaceByName($name) { return $this->app->DB->SelectRow( sprintf( "SELECT * FROM wiki_workspace WHERE name = '%s' LIMIT 1", $this->app->DB->real_escape_string($name) ) ); } /** * @return array */ public function getAllWorkspaces() { $workspaces = $this->app->DB->SelectArr( 'SELECT * FROM wiki_workspace' ); if(empty($workspaces)) { return []; } foreach($workspaces AS $key => $workspace) { if(empty($workspace['foldername'])) { $foldername = $this->app->erp->Dateinamen($workspace['name']); if($workspace['savein'] === 'userdata'){ $this->app->DB->Update( sprintf( "UPDATE wiki_workspace SET foldername = '%s' WHERE id = %d", $this->app->DB->real_escape_string($foldername), $workspace['id'] ) ); } $workspaces[$key]['foldername'] = $foldername; } } return $workspaces; } public function saveAllInUserdata() { $workspaces = $this->getWorkspacesWithUserdata(true); if(empty($workspaces)) { return; } foreach($workspaces as $workspace) { $workspaceId = $workspace['id']; $articles = $this->getArticlesByWorkspaceId($workspaceId); if(empty($articles)) { continue; } foreach($articles as $article) { $this->saveArticleInUserdata($article, $workspace); } } } /** * @param null|int|array $faq * @param bool $isChangeLog * * @return array|null */ public function getFaqDataForUserdata($faq, $isChangeLog = false) { if(is_numeric($faq)) { if($isChangeLog) { $faq = $this->app->DB->SelectRow(sprintf('SELECT * FROM wiki_changelog WHERE id = %d', $faq)); } else{ $faq = $this->app->DB->SelectRow(sprintf('SELECT * FROM wiki_faq WHERE id = %d', $faq)); } } if(empty($faq) || empty($faq['wiki_id'])) { return null; } if(!$isChangeLog && empty($faq['question'])) { return null; } if($isChangeLog && empty($faq['comment'])) { return null; } $wiki = $this->app->DB->SelectRow(sprintf('SELECT wiki_workspace_id, name FROM wiki WHERE id = %d', $faq['wiki_id'])); if(empty($wiki) || empty($wiki['wiki_workspace_id']) || empty($wiki['name']) || !$this->app->DB->Select( sprintf( "SELECT id FROM wiki_workspace WHERE savein = 'userdata' AND id =%d ", $wiki['wiki_workspace_id'] ) ) ) { return null; } $faq['wikifilename'] = $this->app->erp->Dateinamen($wiki['name']); $faq['workspace_id'] = $wiki['wiki_workspace_id']; $faq['workspace_folder'] = $this->app->DB->Select( sprintf( 'SELECT foldername FROM wiki_workspace WHERE id = %d', $faq['workspace_id'] ) ); if(empty($faq['workspace_folder'])) { return null; } $faq['folder'] = $this->getUserDataFolder() .$faq['workspace_folder'].'/'.($isChangeLog?'changelog':'faq').'/'.$faq['wikifilename']; return $faq; } /** * @param int|array|null $faq */ public function saveFaqInUserdata($faq) { $faq = $this->getFaqDataForUserdata($faq); if(empty($faq)) { return; } if(!is_dir($faq['folder']) && !@mkdir($faq['folder'],0777, true) && !is_dir($faq['folder'])) { return; } list($questionFile, $answerfile) = $this->getFaqFiles($faq['folder'], $faq['question']); if(empty($questionFile) || empty($answerfile)) { return; } @file_put_contents($questionFile, $faq['question']); @chmod($questionFile,0666); @file_put_contents($answerfile, $faq['answer']); @chmod($answerfile,0666); } /** * @param int|array|null $changelog */ public function saveChangeLogInUserdata($changelog) { $changelog = $this->getFaqDataForUserdata($changelog, true); if(empty($changelog)) { return; } if(!is_dir($changelog['folder']) && !@mkdir($changelog['folder'],0777, true) && !is_dir($changelog['folder'])) { return; } list($commentFile, $messageFile, $createdAtFile, $createdByFile) = $this->getChangelogFiles($changelog['folder'], $changelog['created_at']); if(empty($commentFile) || empty($messageFile) || empty($createdAtFile) || empty($createdByFile)) { return; } @file_put_contents($commentFile, $changelog['commment']); @file_put_contents($messageFile, $changelog['content']); @file_put_contents($createdAtFile, $changelog['created_at']); @file_put_contents($createdByFile, $changelog['created_by']); @chmod($commentFile,0666); @chmod($messageFile,0666); @chmod($createdAtFile,0666); @chmod($createdByFile,0666); } /** * @param string $folder * @param string $question * * @return array */ public function getFaqFiles($folder, $question) { $ids = []; $files = $this->getFilesAndFolders($folder); if(!empty($files['files'])) { $files = $files['files']; foreach($files as $file) { if(strpos($file, 'question_') !== 0) { continue; } if($question === file_get_contents($folder.'/'.$file)) { @chmod($folder.'/'.$file, 0666); return [$folder.'/'.$file, $folder.'/answer_'.substr($file,9)]; } $ids[] = (int)substr($file,9); } } $id = 1; while(in_array($id, $ids)) { $id++; } return [ $folder.'/question_'.$id, $folder.'/answer_'.$id]; } /** * @param string $folder * @param string $changelog * * @return array */ public function getChangelogFiles($folder, $changelog) { $ids = []; $files = $this->getFilesAndFolders($folder); if(!empty($files['files'])) { $files = $files['files']; foreach($files as $file) { if(strpos($file, 'createdat_') !== 0) { continue; } if($changelog === file_get_contents($folder.'/'.$file)) { return [ $folder.'/comment_'.substr($file,10), $folder.'/content_'.substr($file,10), $folder.'/'.$file, $folder.'/createdby_'.substr($file,10) ]; } $ids[] = (int)substr($file,9); } } $id = 1; while(in_array($id, $ids)) { $id++; } return [ $folder.'/comment_'.$id, $folder.'/content_'.$id, $folder.'/createdat_'.$id,$folder.'/createdby_'.$id]; } /** * @param int|array|null $faq */ public function deleteFaqInUserdata($faq) { $faq = $this->getFaqDataForUserdata($faq); if(empty($faq)) { return; } $faq['answer'] = ''; $this->saveFaqInUserdata($faq); } /** * @param int $changeLogId */ public function saveCommentInUserdata($changeLogId) { $changeLog = $this->app->DB->SelectRow( sprintf( 'SELECT comment,content,wiki_id FROM wiki_changelog WHERE id = %d', $changeLogId ) ); if(empty($changeLog) || empty($changeLog['comment']) || empty($changeLog['wiki_id'])) { return; } $article = $this->app->DB->SelectRow(sprintf('SELECT * FROM wiki WHERE id = %d', $changeLog['wiki_id'])); if(empty($article)) { return; } $workspace = $this->app->DB->SelectRow( sprintf( 'SELECT * FROM wiki_workspace WHERE id = %d', $article['wiki_workspace_id'] ) ); if(empty($workspace) || $workspace['savein'] !== 'userdata') { return; } if(empty($workspace['foldername'])) { $workspace['foldername'] = $this->app->erp->Dateinamen($workspace['name']); } $language = empty($article['language'])?'default':$article['language']; $folder = $this->getUserDataFolder().$workspace['foldername'].'/changelog/'.$language; if(!is_dir($folder) && !@mkdir($folder, 0777, true) && !is_dir($folder)) { return; } list($new, $content) = $this->getUserdataPicturesFromFiles($changeLog['content'], $article, $workspace); if(@file_put_contents($folder.'/'.$article['name'], $content)) { if($new && !empty($content)) { $this->app->DB->Update( sprintf( "UPDATE wiki set content = '%s' WHERE id = %d", $this->app->DB->real_escape_string($content), $article['id'] ) ); } @chmod($folder.'/'.$article['name'], 0666); } } /** * @param int|array|null $article * @param null|int|array $workspace */ public function saveArticleInUserdata($article, $workspace = null) { if(empty($article)) { return; } if(is_numeric($article)) { $article = $this->app->DB->SelectRow(sprintf('SELECT * FROM wiki WHERE id = %d', $article)); if(empty($article)) { return; } } elseif(empty($article['content'])) { $article = $this->app->DB->SelectRow(sprintf('SELECT * FROM wiki WHERE id = %d', $article['id'])); } if(empty($workspace)) { $workspace = $this->app->DB->SelectRow( sprintf( 'SELECT * FROM wiki_workspace WHERE id = %d', $article['wiki_workspace_id'] ) ); if(empty($workspace) || $workspace['savein'] !== 'userdata') { return; } } elseif(is_numeric($workspace)) { $workspace = $this->app->DB->SelectRow( sprintf( 'SELECT * FROM wiki_workspace WHERE id = %d', $workspace ) ); if(empty($workspace) || $workspace['savein'] !== 'userdata') { return; } } if(empty($workspace['foldername'])) { $workspace['foldername'] = $this->app->erp->Dateinamen($workspace['name']); } $language = empty($article['language'])?'default':$article['language']; $folder = $this->getUserDataFolder().$workspace['foldername'].'/'.$language; if(!is_dir($folder) && !@mkdir($folder, 0777, true) && !is_dir($folder)) { return; } if(empty($article['name']) || empty($article['content'])) { return; } $content = $article['content']; list($new, $content) = $this->getUserdataPicturesFromFiles($content, $article, $workspace); /*$new = false; while( preg_match_all( '/(.*)src="\.\/index\.php\?(module=dateien&action=send&id=([0-9]+))"(.*)/', $content, $matches, PREG_OFFSET_CAPTURE ) ) { if(empty($matches[3]) || empty($matches[3][0]) || empty($matches[3][0][0])) { break; } $articleFolder = $this->app->erp->Dateinamen($article['name']); $newFile = $this->saveFileToUserData( $matches[3][0][0], $articleFolder, $workspace['foldername'] ); if(empty($newFile)) { break; } $newContent = str_replace( 'src="./index.php?module=dateien&action=send&id='.$matches[3][0][0].'"', 'src="./index.php?module=wiki&action=getfile&workspacefolder=' .urlencode($workspace['foldername']) .'&article='.urlencode($articleFolder) .'&fileid='.$matches[3][0][0].'"', $content ); if($newContent === $content || empty($newContent)) { break; } $content = $newContent; $new = true; }*/ if(@file_put_contents($folder.'/'.$article['name'], $content)) { @chmod($folder.'/'.$article['name'],0666); @chmod($folder, 0777); if($new && !empty($content)) { $this->app->DB->Update( sprintf( "UPDATE wiki set content = '%s' WHERE id = %d", $this->app->DB->real_escape_string($content), $article['id'] ) ); } } } /** * @param string $content * @param array $article * @param array $workspace * * @return array */ public function getUserdataPicturesFromFiles($content, $article, $workspace) { $new = false; while( preg_match_all( '/(.*)src="\.\/index\.php\?(module=dateien&action=send&id=([0-9]+))"(.*)/', $content, $matches, PREG_OFFSET_CAPTURE ) ) { if(empty($matches[3]) || empty($matches[3][0]) || empty($matches[3][0][0])) { return [$new, $content]; } $articleFolder = $this->app->erp->Dateinamen($article['name']); $newFile = $this->saveFileToUserData( $matches[3][0][0], $articleFolder, $workspace['foldername'] ); if(empty($newFile)) { return [$new, $content]; } $newContent = str_replace( 'src="./index.php?module=dateien&action=send&id='.$matches[3][0][0].'"', 'src="./index.php?module=wiki&action=getfile&workspacefolder=' .urlencode($workspace['foldername']) .'&article='.urlencode($articleFolder) .'&fileid='.$matches[3][0][0].'"', $content ); if($newContent === $content || empty($newContent)) { return [$new, $content]; } $content = $newContent; $new = true; } return [$new, $content]; } /** * @param int $fileId * @param string $aricleFolder * @param string $workspaceFolder * * @return string */ public function saveFileToUserData($fileId, $aricleFolder, $workspaceFolder) { if(empty($fileId) || empty($aricleFolder) || empty($workspaceFolder)) { return ''; } $folder = $this->getUserDataFolder().$workspaceFolder.'/files/'.$aricleFolder; if(!is_dir($folder) && !@mkdir($folder,0777,true) && !is_dir($folder)) { return ''; } $folder .= '/'; $dmsFolder = $this->app->Conf->WFuserdata.'/dms/'.$this->app->Conf->WFdbname; $dmsFile = $this->app->erp->GetDateiPfad($fileId); if(!is_file($dmsFile)) { return ''; } $file = $folder.$fileId; if(is_file($file)) { @chmod($file, 0666); $md5dms = md5_file($dmsFile); $md5 = md5_file($file); if($md5dms === $md5) { return (String)$fileId; } $fileId++; while(is_file($folder.$fileId)) { $md5 = md5_file($folder.$fileId); if($md5dms === $md5) { return (String)$fileId; } $fileId++; } } if(@copy($dmsFile, $file)) { @chmod($file, 0666); @chmod(dirname($file), 0777); return (String)$fileId; } return ''; } /** * @param int $workspaceId * * @return array */ public function getArticlesByWorkspaceId($workspaceId) { if(empty($workspaceId)) { return []; } $ret = $this->app->DB->SelectArr('SELECT id, language, name FROM wiki WHERE wiki_workspace_id = %d', $workspaceId); if(empty($ret)) { return $ret; } return $ret; } public function WikiDateien() { $subcmd = $this->app->Secure->GetGET('subcmd'); if($subcmd === 'delete') { $status = 0; $fileId = (int)$this->app->Secure->GetPOST('fileid'); if($fileId > 0) { if($this->app->erp->DeleteDatei($fileId)) { $status = 1; } } header('Content-Type: application/json'); echo json_encode(['status' => $status]); $this->app->ExitXentral(); } if($subcmd === 'browse'){ $this->app->BuildNavigation = false; $this->app->YUI->TableSearch('DATATABLE', 'wiki_files', 'show', '', '', basename(__FILE__), __CLASS__); //$cmd = $this->app->Secure->GetGET('cmd'); //$id = (int)$this->app->DB->Select(sprintf('SELECT w.id FROM `wiki` AS w WHERE w.name = \'%s\' LIMIT 1', $cmd)); $this->app->Tpl->Parse('PAGE', 'wiki_files_popup.tpl'); return; } $id = $this->app->Secure->GetGET('id'); $this->WikiMenu(); $this->app->Tpl->Add('UEBERSCHRIFT',' (Dateien)'); $this->app->YUI->DateiUpload('PAGE','Wiki',$id); } public function WikiAlle() { $command = $this->app->Secure->GetGET('command'); if($command === 'gethtml') { $html = ''; $workspace = $this->app->Secure->GetPOST('workspace'); $this->app->User->SetParameter('wiki_workspace', $workspace); $html = $this->getAllHtml($this->app->DB->SelectArr( sprintf( "SELECT name,id FROM wiki WHERE wiki_workspace_id = %d ORDER by name", $workspace ) )); $html = $this->app->Tpl->ParseTranslation($html); header('Content-Type: application/json'); echo json_encode( [ 'html' => $html ] ); $this->app->ExitXentral(); } $this->app->Tpl->Add('KURZUEBERSCHRIFT2','Hauptseite'); $this->app->erp->MenuEintrag('index.php?module=wiki&action=list&cmd=Hauptseite','Hauptseite'); $anzahldateien = $this->app->erp->AnzahlDateien('Wiki','Hauptseite'); if($anzahldateien > 0) { $anzahldateien = ' ('.$anzahldateien.')'; } else { $anzahldateien=''; } $this->app->erp->MenuEintrag('index.php?module=wiki&action=dateien&cmd=Hauptseite','Dateien'.$anzahldateien); $this->app->erp->MenuEintrag('index.php?module=wiki&action=new','Neue Seite anlegen'); $this->app->erp->MenuEintrag('index.php?module=wiki&action=alle','Alle Seiten anzeigen'); $this->app->erp->MenuEintrag('index.php?module=wiki&action=list&cmd=Hauptseite','Zurück zur Übersicht'); $workspace = $this->getUserWorkspace(); $alle = $this->app->DB->SelectArr( sprintf( "SELECT name,id FROM wiki WHERE wiki_workspace_id = %d ORDER by name", $workspace ) ); $this->app->Tpl->Set('TAB1', $this->getAllHtml($alle)); $this->showWorkspaces(); $this->app->Tpl->Parse('PAGE','wiki_alle.tpl'); } /** * @param array|null $alle * * @return string */ public function getAllHtml($alle) { $html = '<h1>{|Alle Seiten nach Alphabet sortiert|}:</h1><ul>'; if(!empty($alle)){ foreach ($alle as $row) { $html .= '<li><a href="index.php?module=wiki&action=list&id=' . $row['id'] . '&cmd=' . $row['name'] . '">' . $row['name'] . '</a></li>'; } } $html .= '</ul>'; return $html; } function WikiCreateDialog() { $cmd = $this->app->Secure->GetGET('cmd'); $this->app->Tpl->Set( 'TAB1', "<div class=\"info\">{|Seite|}: <b>{|$cmd|}</b> {|fehlt|}! {|Soll diese jetzt angelegt werden?|} <a href=\"index.php?module=wiki&action=create&cmd=$cmd\">{|Seite jetzt anlegen!|}</a></div>" ); } public function WikiDelete() { session_start(); $cmd = $this->app->Secure->GetGET('cmd'); $id = $this->app->Secure->GetGET('id'); $key = $this->app->Secure->GetGET('key'); if($key==$_SESSION['deletekey'] && $id > 0 && $key!='') { //loeschen $_SESSION['deletekey'] = ''; $this->app->DB->Delete("DELETE FROM wiki WHERE id='$id' LIMIT 1"); $this->app->DB->Delete("DELETE FROM datei_stichwoerter WHERE parameter='$id' AND objekt='Wiki'"); $this->app->Location->execute('index.php?module=wiki&action=list'); } if($id > 0) { $l=20; $c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxwz0123456789"; $s = ''; for(;$l > 0;$l--) { $s .= $c[rand(0, strlen($c))]; } $key = str_shuffle($s); $_SESSION['deletekey'] = $key; $name = $this->app->DB->Select("SELECT name FROM wiki WHERE id='$id'"); $this->app->Tpl->Set( 'TAB1', "<div class=\"error\">Seite: <b>$name</b> wirklich löschen? <a href=\"index.php?module=wiki&action=delete&id=$id&key=$key\">Seite jetzt löschen!</a></div>" ); $this->app->Tpl->Set('KURZUEBERSCHRIFT2',"$name"); $this->app->Tpl->Parse('PAGE','tabview.tpl'); } } public function WikiNew() { $workspace = $this->app->Secure->GetGET('workspace'); $cmd = $this->app->Secure->GetGET('cmd'); $command = $this->app->Secure->GetGET('command'); if($command === 'createnew' && !empty($cmd)) { $language = $this->app->Secure->GetPOST('language'); $this->app->User->SetParameter('wiki_language', $language); $this->app->User->SetParameter('wiki_workspace', $workspace); $wiki = $this->getArticleByName($cmd,$workspace,$language); if(empty($wiki)) { $content = ''; $this->saveArticle($cmd, $content, $workspace, $language); } $this->app->Location->execute('index.php?module=wiki&action=edit&cmd='.$cmd); } if($command === 'changelanguage') { $language = $this->app->Secure->GetPOST('language'); $this->app->User->SetParameter('wiki_language', $language); header('Content-Type: application/json'); echo json_encode(['success' => 1]); $this->app->ExitXentral(); } if($command === 'changeworkspace') { $workspace = $this->app->Secure->GetPOST('workspace'); $this->app->User->SetParameter('wiki_workspace', $workspace); header('Content-Type: application/json'); echo json_encode(['success' => 1]); $this->app->ExitXentral(); } if(!empty($workspace)) { $this->app->User->SetParameter('wiki_workspace', $workspace); $this->app->User->SetParameter('wiki_language',''); $this->app->Location->execute('index.php?module=wiki&action=new&cmd='.$cmd); } $submit = $this->app->Secure->GetPOST('submit'); $newname = $this->app->Secure->GetPOST('newname'); $this->WikiMenu(); if($submit!='') { // pruefen ob name passt $workspace = $this->getUserWorkspace(); $language = $this->getUserLanguage(); $checkname = $this->app->DB->Select( sprintf( "SELECT name FROM wiki WHERE name='%s' AND wiki_workspace_id = %d AND language = '%s' LIMIT 1", $newname, $workspace, $language ) ); if($checkname == $newname) { $this->app->Tpl->Set( 'MESSAGE', "<div class=\"error\">Diesen Namen gibt es bereits. Bitte wählen Sie einen anderen Namen.</div>" ); } else if($newname=='') { $this->app->Tpl->Set( 'MESSAGE', "<div class=\"error\">Bitte geben Sie eine Namen an!</div>" ); } else { // alle $newname = str_replace(' ','_',$newname); $this->app->DB->Insert( sprintf( "INSERT INTO wiki (name,content, wiki_workspace_id, language) VALUES ('%s','', %d,'%s')", $newname, $workspace, $language ) ); $newId = $this->app->DB->GetInsertID(); $this->saveArticleInUserdata($newId); $this->app->Location->execute('index.php?module=wiki&action=edit&cmd='.$newname); } } $this->app->Tpl->Set( 'TAB1', "<form action=\"\" method=\"post\">Neuer Name: <input type=\"text\" name=\"newname\" value=\"\" size=\"50\"> <input type=\"submit\" value=\"anlegen\" name=\"submit\"></form>" ); $this->app->Tpl->Set('TABTEXT','Wiki'); $this->showWorkspaces(); $this->showLanguages(); $this->app->Tpl->Parse('PAGE','wiki_new.tpl'); } function WikiRename() { $submit = $this->app->Secure->GetPOST('submit'); $cmd = $this->app->Secure->GetGET('cmd'); $newname = $this->app->Secure->GetPOST('newname'); $this->WikiMenu(); if($submit!='') { // pruefen ob name passt $workspace = $this->getUserWorkspace(); $language = $this->getUserLanguage(); $checkname = $this->app->DB->Select( sprintf( "SELECT name FROM wiki WHERE name='%s' AND wiki_workspace_id = %d AND `language` = '%s' LIMIT 1", $newname, $workspace, $language ) ); if($checkname == $cmd) { $this->app->Tpl->Set( 'MESSAGE', "<div class=\"error\">Diesen Namen gibt es bereits. Bitte wählen Sie einen anderen Namen.</div>" ); $cmd = $newname; } else if($newname=='') { $this->app->Tpl->Set( 'MESSAGE', "<div class=\"error\">Bitte geben Sie eine Namen an!</div>" ); $cmd = $newname; } else { // alle $newname = str_replace(' ','_',$newname); $this->app->DB->UPDATE( sprintf( "UPDATE wiki SET name='%s' WHERE name='%s' AND wiki_workspace_id = %d AND `language` = '%s' LIMIT 1", $newname, $cmd, $workspace, $language ) ); if(empty($workspace)){ $this->app->DB->UPDATE( "UPDATE datei_stichwoerter SET parameter='$newname' WHERE parameter='$cmd' AND (parameter2 = '' OR parameter2 = '0') AND objekt='Wiki'" ); } else { $this->app->DB->UPDATE( sprintf( "UPDATE datei_stichwoerter SET parameter='%s' WHERE parameter='%s' AND parameter2 = '%d' AND objekt='Wiki'", $newname, $cmd, $workspace ) ); } $this->app->Location->execute('index.php?module=wiki&action=list&cmd='.$newname); } } $this->app->Tpl->Set( 'TAB1', "<form action=\"\" method=\"post\">Neuer Name: <input type=\"text\" name=\"newname\" value=\"$cmd\" size=\"50\"> <input type=\"submit\" value=\"umbenennen\" name=\"submit\"></form>" ); $this->app->Tpl->Parse('PAGE','tabview.tpl'); } /** * @return string */ public function getUserLanguage() { $language = $this->app->User->GetParameter('wiki_language'); if(empty($language)) { return ''; } $languages = $this->app->erp->GetSelectSprachenListe(); unset($languages[0]); if(isset($languages[$language])) { return $language; } return ''; } /** * @return int */ public function getUserWorkspace() { $workspace = $this->app->User->GetParameter('wiki_workspace'); if(empty($workspace)) { return 0; } $workspace = (int)$this->app->DB->Select( sprintf( 'SELECT id FROM wiki_workspace WHERE id = %d', $workspace ) ); if(empty($workspace)) { $this->app->User->SetParameter('wiki_workspace', ''); return 0; } return $workspace; } public function WikiCreate() { $cmd = $this->app->Secure->GetGET('cmd'); if($cmd !='') { $workspace = $this->getUserWorkspace(); $wikiname = $this->app->DB->Select( sprintf( "SELECT name FROM wiki WHERE name='%s' AND wiki_workspace_id = %d LIMIT 1", $cmd, $workspace ) ); if($wikiname != $cmd) { $this->app->DB->Insert( sprintf( "INSERT INTO wiki (name,content, wiki_workspace_id) VALUES ('%s','', %d)", $cmd, $workspace ) ); $this->app->Location->execute('index.php?module=wiki&action=edit&cmd='.$cmd); } $this->app->Location->execute('index.php?module=wiki&action=edit&cmd='.$cmd); } } /** * @param string $site * @param string $content * @param string|int $workspace * @param string $language * @param $bool $dontSaveInUserSpace * * @return int */ public function saveArticle($site, $content, $workspace = '', $language = '', $dontSaveInUserSpace = false) { if(empty($site)) { return 0; } $workspaceId = $this->getWorkspaceFromName($workspace); $article = $this->getArticleByName($site, $workspaceId, $language); $parent = null; if(empty($article)) { $parent = $this->getArticleByName($site, $workspaceId); if(!empty($parent)) { $article = $this->getArticleByParentId($parent['id'], $workspaceId, $language); } } if(empty($article)) { $this->app->DB->Insert( sprintf( "INSERT INTO wiki (name, parent_id, wiki_workspace_id, language, content) VALUES ('%s', %d, %d, '%s', '%s')", $this->app->DB->real_escape_string($site), empty($parent)?0:$parent['id'], $workspaceId, $this->app->DB->real_escape_string($language), $this->app->DB->real_escape_string($content) ) ); $id = (int)$this->app->DB->GetInsertID(); if($dontSaveInUserSpace) { return $id; } if($workspaceId > 0) { $this->saveArticleInUserdata($id); } return $id; } $this->app->DB->Update( sprintf( 'UPDATE wiki SET lastcontent = content WHERE id = %d', $article['id'] ) ); $this->app->DB->Update( sprintf( "UPDATE wiki SET content = '%s' WHERE id = %d", $this->app->DB->real_escape_string($content), $article['id'] ) ); if($dontSaveInUserSpace) { return (int)$article['id']; } if($workspaceId > 0) { $this->saveArticleInUserdata((int)$article['id']); } return (int)$article['id']; } /** * @param string $site * @param int $workspaceId * @param string $language * * @return array|null */ public function getArticleByName($site, $workspaceId = 0, $language = '') { if($language === 'any') { return $this->app->DB->SelectRow( sprintf( "SELECT * FROM wiki WHERE name = '%s' AND wiki_workspace_id = %d ORDER BY language = '' DESC LIMIT 1", $this->app->DB->real_escape_string($site), $workspaceId ) ); } return $this->app->DB->SelectRow( sprintf( "SELECT * FROM wiki WHERE name = '%s' AND wiki_workspace_id = %d AND language = '%s' LIMIT 1", $this->app->DB->real_escape_string($site), $workspaceId, $this->app->DB->real_escape_string($language) ) ); } /** * @param int $parentId * @param int $workspaceId * @param string $language * * @return array|null */ public function getArticleByParentId($parentId, $workspaceId, $language) { return $this->app->DB->SelectRow( sprintf( "SELECT * FROM wiki WHERE parent_id = %d AND wiki_workspace_id = %d AND language = '%s' LIMIT 1", $parentId, $workspaceId, $this->app->DB->real_escape_string($language) ) ); } /** * @param string|int $name * * @return int */ public function getWorkspaceFromName($name) { if(empty($name)) { return 0; } if(is_numeric($name) && $this->app->DB->Select( sprintf( 'SELECT id FROM wiki_workspace WHERE id = %d', $name ) ) ) { return (int)$name; } return (int)$this->app->DB->Select( sprintf( "SELECT id FROM wiki_workspace WHERE name = '%s' LIMIT 1", $this->app->DB->real_escape_string($name) ) ); } /** * @param int $articleId * @param string $comment * @param int $notify * * @return int */ public function saveComment($articleId, $comment, $notify = 0) { if($articleId <= 0) { return 0; } $article = $this->app->DB->SelectRow( sprintf( 'SELECT * FROM wiki WHERE id = %d', $articleId ) ); if(empty($article)) { return 0; } $this->app->DB->Insert( sprintf( "INSERT INTO wiki_changelog (wiki_id, `comment`, content, created_by, notify) VALUES (%d, '%s', '%s','%s', %d)", $articleId, $comment, $this->app->DB->real_escape_string($article['content']), $this->app->DB->real_escape_string($this->app->User->GetName()), $notify ) ); return (int)$this->app->DB->GetInsertID(); } /** * @param int $articleId * * @return array */ public function getArticlesById($articleId) { return array_unique( array_merge( [$articleId], $this->app->DB->SelectFirstCols( sprintf('SELECT id FROM wiki WHERE parent_id = %d', $articleId) ), $this->app->DB->SelectFirstCols( sprintf('SELECT parent_id FROM wiki WHERE id = %d AND parent_id > 0', $articleId) ) ) ); } /** * @param int $articleId */ public function notify($articleId) { $article = $this->app->DB->SelectRow(sprintf('SELECT id, name FROM wiki WHERE id = %d', $articleId)); $articleIds = $this->getArticlesById($articleId); $users = $this->app->DB->SelectFirstCols( sprintf( 'SELECT `user_id` FROM wiki_subscription WHERE wiki_id IN (%s) AND active = 1', implode(',', $articleIds) ) ); if(empty($users)) { return; } /** @var NotificationService $notificationService */ $notificationService = $this->app->Container->get('NotificationService'); foreach($users as $user) { try { $notificationService->create( $user, NotificationService::TYPE_NOTICE, 'Wikibenachrichtung', 'Änderung im Artikel ' . $article['name'] ); } catch(Exception $e) { } } } /** * @return array */ public function getActiveWorkspaces() { return $this->app->DB->SelectPairs(sprintf('SELECT id, name FROM wiki_workspace WHERE active = 1 ORDER BY name')); } /** * @param int $aricleId * @param bool $active */ public function subscibe($articleId, $active = true) { $articleIds = $this->getArticlesById($articleId); if($active) { $this->app->DB->Insert( sprintf( 'INSERT INTO wiki_subscription (`user_id`, `wiki_id`, `active`) SELECT %d as `user_id`, w.`id`, 1 as `active` FROM wiki as w LEFT JOIN wiki_subscription AS ws ON w.id = ws.wiki_id AND ws.user_id = %d WHERE ISNULL(ws.id) AND w.id IN (%s) ', $this->app->User->GetID(), $this->app->User->GetID(), implode(',', $articleIds) ) ); $this->app->DB->Update( sprintf( 'UPDATE wiki_subscription SET active = 1 WHERE user_id = %d AND wiki_id IN (%s)', $this->app->User->GetID(), implode(',', $articleIds) ) ); return; } $this->app->DB->Update( sprintf( 'UPDATE wiki_subscription SET active = 0 WHERE user_id = %d AND wiki_id IN (%s)', $this->app->User->GetID(), implode(',', $articleIds) ) ); } public function WikiList() { $command = $this->app->Secure->GetGET('command'); if($command === 'install') { $this->runInstallFromJson(); header('Content-Type: application/json'); echo json_encode(['success' => 1]); $this->app->ExitXentral(); } $cmd = $this->app->Secure->GET['cmd']; $workspace= $this->app->Secure->GET['workspace']; if(!empty($workspace)) { $this->app->User->SetParameter('wiki_workspace', $workspace); $this->app->User->SetParameter('wiki_language',''); $this->app->Location->execute('index.php?module=wiki&action=list&cmd='.$cmd); } $id = $this->app->Secure->GetGET('id'); if(empty($command) && empty($cmd) && !empty($id)) { $wiki = $this->app->DB->SelectRow( sprintf( 'SELECT id, name, wiki_workspace_id, language, parent_id FROM wiki WHERE id = %d', $id ) ); if(!empty($wiki)) { $this->app->User->SetParameter('wiki_workspace', $wiki['wiki_workspace_id']); $this->app->User->SetParameter('wiki_language',$wiki['language']); $this->app->Location->execute('index.php?module=wiki&action=list&cmd='.$wiki['name']); } } if($command === 'subscribe') { $site = $this->app->Secure->GetPOST('site'); $article = $this->getArticleByName($site); $this->subscibe($article['id']); header('Content-Type: application/json'); echo json_encode(['success' => !empty($article['id'])?1:0]); $this->app->ExitXentral(); } if($cmd === 'unsubscribe') { $site = $this->app->Secure->GetPOST('site'); $article = $this->getArticleByName($site); $this->subscibe($article['id'], false); header('Content-Type: application/json'); echo json_encode(['success' => !empty($article['id'])?1:0]); $this->app->ExitXentral(); } if($command === 'savearticle') { $site = $this->app->Secure->GetPOST('site'); $workspace = $this->app->Secure->GetPOST('workspace'); $language = $this->app->Secure->GetPOST('language'); $content = $this->app->Secure->POST['content']; $comment = $this->app->Secure->GetPOST('comment'); $notify = $this->app->Secure->GetPOST('notify'); $articleId = $this->saveArticle($site, $content, $workspace, $language); if(!empty($comment)) { $this->saveComment($articleId, $comment, $notify); $this->saveChangeLogInUserdata($this->app->DB->GetInsertID()); } if($notify) { $this->notify($articleId); } $this->saveArticleInUserdata($articleId); $url = 'index.php?module=wiki&action=list&cmd='.$site; header('Content-Type: application/json'); echo json_encode(['success' => !empty($articleId)?1:0,'url'=>$url]); $this->app->ExitXentral(); } if($command === 'loadarticle') { $html = ''; $site = $this->app->Secure->GetPOST('site'); $workspace = $this->app->Secure->GetPOST('workspace'); $this->app->User->SetParameter('wiki_workspace', $workspace); $language = $this->app->Secure->GetPOST('language'); $this->app->User->SetParameter('wiki_language', $language); $article = $this->getArticleByName($site, (int)$workspace, $language); if(!empty($article)) { $content = $article['content']; $wikiparser = new WikiParser(); $content = $wikiparser->parse($content); $html = html_entity_decode($content); } header('Content-Type: application/json'); echo json_encode( [ 'site' => $site, 'workspace' => $workspace, 'language' => $language, 'artice_id' => $articleId, 'html' => $html ] ); $this->app->ExitXentral(); } if($cmd !='') { $workspace = $this->getUserWorkspace(); $language = $this->getUserLanguage(); $wikiname = $this->app->DB->Select( sprintf( "SELECT name FROM wiki WHERE name='%s' AND wiki_workspace_id = %d LIMIT 1", $cmd, $workspace ) ); if($wikiname == $cmd) { $content = $this->app->DB->Select( sprintf( "SELECT content FROM wiki WHERE name='%s' AND wiki_workspace_id = %d ORDER BY language = '%s' DESC LIMIT 1", $cmd, $workspace, $language ) ); $str = $this->app->erp->ReadyForPDF($content); $wikiparser = new WikiParser(); if (preg_match('/(<[^>].*?>)/e', $str)) { $str=preg_replace('#(href)="([^:"]*)(?:")#','$1="index.php?module=wiki&action=list&cmd=$2"',$str); $content = $str; } else { $content = $wikiparser->parse($content); //$index = $wikiparser->BuildIndex(); } $content = html_entity_decode($content); //if($index!==false) { //$this->app->Tpl->Set('INDEX', $index); //$this->app->Tpl->Parse('WIKIINDEX', 'wiki_index.tpl'); //} //Pruefe ob es die Seite Navigation gibt $navigation = $this->app->DB->Select( sprintf( "SELECT content FROM wiki WHERE name='Navigation' AND wiki_workspace_id = %d LIMIT 1", $workspace ) ); if($navigation!='' && $cmd!=='Navigation') { $navigation = $this->app->erp->ReadyForPDF($navigation); $navigation = str_replace(['https://','http://'],'',$navigation); $navigation=preg_replace( '#(href)="([^:"]*)(?:")#','$1="index.php?module=wiki&action=list&cmd=$2"', $navigation ); $content = "<table width=100%><tr valign=top><td width=200><div id=\"wikinav\"><ul><li style=\"color:white;font-weight:bold;padding-bottom:5px;\">Navigation<br></li></ul>$navigation</div></td><td style=\"padding:0px 15px;\">$content</td></tr></table>"; } $this->app->Tpl->Set('TAB1',$content); // TODO Wiki Parser!!!! } else { $this->WikiCreateDialog(); } $this->app->Tpl->Set('WIKISITE',$cmd); } else { // hauptseite $this->app->Location->execute('index.php?module=wiki&action=list&cmd=Hauptseite'); } $this->app->Tpl->Add( 'WIKISUBMENUBEFOREWORKSPACE', '<table class="wikilabel" id="tabwikilist"><tr class="labeltr"> <td><label for="labels">{|Labels|}:</label></td> <td></td> <td><a href="#" class="label-manager" data-label-column-number="2" data-label-reference-id="[ID]" data-label-reference-table="wiki"><img src="./themes/new/images/label.svg"></a></td> </tr></table> <label for="language">{|Sprache|}:</label> <td colspan="2"> <select id="language" name="language"> <option value="">{|Default|}</option> '.$this->showLanguages(true).' </select> </td>' ); if($this->app->erp->RechteVorhanden('wiki','edit')){ $this->app->Tpl->Add( 'WIKISUBMENUAFTEREDIT', '<a href="index.php?module=wiki&action=edit&cmd='.$cmd.'"><img class="submenusettingsicon" src="./themes/new/images/edit.svg" alt="Einstellungen" /></a>' ); $this->app->Tpl->Add( 'WIKIICONS', "<a href=\"index.php?module=wiki&action=edit&cmd=$cmd\"><img src=\"./themes/new/images/edit.svg\"></a> " ); } if($this->app->erp->RechteVorhanden('wiki','rename')){ $this->app->Tpl->Add( 'WIKIICONS', "<a href=\"index.php?module=wiki&action=rename&cmd=$cmd\"><img src=\"./themes/new/images/forward.svg\"></a> " ); } if($this->app->erp->RechteVorhanden('wiki','delete')){ $this->app->Tpl->Add( 'WIKIICONS', "<a href=\"index.php?module=wiki&action=delete&id=$id\"><img src=\"./themes/new/images/delete.svg\"></a> " ); } $addtionalcspheader = ' '. str_replace([';','"'],'',$this->app->erp->Firmendaten('additionalcspheader')).' '; $this->app->Tpl->Add('ADDITIONALCSPHEADER', $addtionalcspheader); $this->WikiMenu(); $this->showWorkspaces(); if($this->app->erp->GetKonfiguration('wiki_install')) { $this->app->Tpl->Add('TAB1','<input type="hidden" id="wikiinstall" />'); } $this->app->Tpl->Parse('PAGE','wiki_list.tpl'); } /** * @param bool $return * * @return string */ public function showLanguages($return = false) { $languages = $this->app->erp->GetSelectSprachenListe(); $selLanguage = $this->app->User->GetParameter('wiki_language'); unset($languages[0]); $html = ''; foreach($languages as $iso => $language) { $html .= '<option value="'.$iso.'"'.($selLanguage === $iso?' selected="selected" ':'').'>'. $language .'</option>'; } if(!$return) { $this->app->Tpl->Add('SELLANGUAGE', $html); } return $html; } public function showWorkspaces() { $this->app->Tpl->Add('SELWORKSPACE', $this->getWorkspaceOptions()); } /** * @return string */ public function getWorkspaceOptions() { $return = ''; $workspaces = $this->getActiveWorkspaces(); $selWorkspace = (int)$this->app->User->GetParameter('wiki_workspace'); foreach($workspaces as $workspaceId => $workspace) { $return .= '<option value="'.$workspaceId.'"'.($selWorkspace == $workspaceId?' selected="selected" ':'').'>'. $workspace .'</option>'; } return $return; } public function WikiMenu() { $cmd = $this->app->Secure->GET['cmd']; $action = $this->app->Secure->GetGET('action'); $id = $this->app->Secure->GetGET('id'); if(in_array($action,['faq','changelog','edit'])){ $this->app->Tpl->Set('WORSPACEDISABLED', 'disabled="disables" '); } if($action !== 'dateien'){ $this->app->Tpl->Add('SELWORKSPACEOPTIONS', $this->getWorkspaceOptions()); $this->app->Tpl->Parse('WIKISUBMENU', 'wiki_submenu.tpl'); } if($action === 'settings'){ $this->app->erp->MenuEintrag( 'index.php?module=wiki&action=settings', '{|Workspaces|}' ); $this->app->erp->MenuEintrag( 'index.php?module=wiki&action=list&cmd=Hauptseite', '{|Zurück zur Übersicht|}' ); return; } $workspace = $this->getUserWorkspace(); $language = $this->getUserLanguage(); if($cmd!='' && $id<=0) { $id = $this->app->DB->Select( sprintf( "SELECT id FROM wiki WHERE name='%s' ORDER BY wiki_workspace_id = %d DESC, language = '%s' DESC, language = '' DESC LIMIT 1", $cmd, $workspace, $language ) ); } if(is_numeric($id)) { $wikiname = $this->app->DB->Select("SELECT name FROM wiki WHERE id='$id'"); } else { $wikiname = $this->app->Secure->GET['cmd']; } $tabName = $wikiname; if(in_array($tabName, ['Hauptseite','hauptseite'])) { $tabName = 'Startsteite'; } if($tabName !== 'Startseite') { $tabName = 'Inhalt'; } if($action==='edit'){ $this->app->erp->MenuEintrag("index.php?module=wiki&action=edit&cmd=$wikiname", $tabName); } else{ $this->app->erp->MenuEintrag("index.php?module=wiki&action=list&cmd=$wikiname", $tabName); } $this->app->Tpl->Set('KURZUEBERSCHRIFT2',$wikiname); $anzahldateien = $this->app->erp->AnzahlDateien('Wiki',$id); if($anzahldateien > 0) { $anzahldateien = ' ('.$anzahldateien.')'; } else { $anzahldateien=''; } $wiki = $this->getArticleByName($cmd, $workspace, $language); if(empty($wiki)) { $wiki = $this->getArticleByName($cmd, $workspace,'any'); } $ids = [0]; if(!empty($wiki['id'])) { $ids = $this->app->DB->SelectFirstCols( sprintf( 'SELECT id FROM wiki WHERE parent_id = %d OR id = %d', $wiki['id'], $wiki['id'] ) ); $ids = $this->app->DB->SelectFirstCols( sprintf( 'SELECT id FROM wiki WHERE parent_id IN (%s) OR id IN (%s)', implode(',', $ids), implode(',', $ids) ) ); } $cmddateiid = $this->app->DB->Select("SELECT id FROM wiki WHERE name='$cmd' AND name!='' LIMIT 1"); $faqanz = $this->app->DB->Select( sprintf( 'SELECT COUNT(id) FROM wiki_faq WHERE wiki_id IN (%s) AND wiki_id > 0', implode(', ', $ids) ) ); if($faqanz > 0) { $faqanz = ' ('.$faqanz.')'; }else{ $faqanz = ''; } $changeanz = $this->app->DB->Select( sprintf( 'SELECT COUNT(id) FROM wiki_changelog WHERE wiki_id IN (%s) AND wiki_id > 0', implode(', ', $ids) ) ); if($changeanz > 0) { $changeanz = ' ('.$changeanz.')'; }else{ $changeanz = ''; } $this->app->erp->MenuEintrag( 'index.php?module=wiki&action=faq&cmd='.$wikiname.(empty($wiki)?'':'&id='.$wiki['id']), 'FAQs'.$faqanz ); $this->app->erp->MenuEintrag( 'index.php?module=wiki&action=changelog&cmd='.$wikiname.(empty($wiki)?'':'&id='.$wiki['id']), 'Historie'.$changeanz ); $this->app->erp->MenuEintrag('index.php?module=wiki&action=dateien&id='.$cmddateiid,'Dateien'.$anzahldateien); // $this->app->erp->MenuEintrag("index.php?module=wiki&action=edit&name=$cmd","bearbeiten"); // $this->app->erp->MenuEintrag("index.php?module=wiki&action=rename&name=$cmd","umbenennen"); $this->app->erp->MenuEintrag("index.php?module=wiki&action=new","{|Neue Seite anlegen|}"); // $this->app->erp->MenuEintrag("index.php?module=wiki&action=delete&name=$cmd","löschen"); if($tabName === 'Startseite'){ $this->app->erp->MenuEintrag("index.php?module=wiki&action=alle", "{|Alle Seiten anzeigen|}"); } $this->app->erp->MenuEintrag("index.php?module=wiki&action=list&cmd=Hauptseite","{|Zurück zur Übersicht|}"); if($action === 'list' && !empty($wiki['id'])) { $this->app->Tpl->Set('ID', $wiki['id']); } } public function WikiEdit() { $this->WikiMenu(); $cmd = $this->app->Secure->GET['cmd']; $workspace= $this->app->Secure->GET['workspace']; if(!empty($workspace)) { $this->app->User->SetParameter('wiki_workspace', $workspace); $this->app->User->SetParameter('wiki_language',''); $this->app->Location->execute('index.php?module=wiki&action=edit&cmd='.$cmd); } //$content = $this->app->Secure->GetPOST("content"); $content = $this->app->DB->real_escape_string($this->app->Secure->POST['content']); $content = str_replace(array('<','>'),array('<','>'),$content); $startseite_link = ''; $workspace = $this->getUserWorkspace(); $language = $this->getUserLanguage(); if($cmd !='') { // check if is valid page $wikiname = $this->app->DB->Select( sprintf( "SELECT name FROM wiki WHERE name='%s' AND wiki_workspace_id = %d AND language = '%s' LIMIT 1", $cmd, $workspace, $language ) ); if(empty($wikiname) && !empty($language)) { $wikiname = $this->app->DB->Select( sprintf( "SELECT name FROM wiki WHERE name='%s' AND wiki_workspace_id = %d AND language = '%s' LIMIT 1", $cmd, $workspace, '' ) ); if(!empty($wikiname)) { $this->app->DB->Insert( sprintf( "INSERT INTO wiki (name,wiki_workspace_id,language,content) VALUES ('%s',%d,'%s','')", $cmd, $workspace, $language ) ); if($this->app->DB->GetInsertID() > 0) { $wikiname = $cmd; } } } if(!empty($wikiname)) { $id = $this->app->DB->Select( sprintf( "SELECT id FROM wiki WHERE name='%s' AND wiki_workspace_id = %d AND language = '%s' LIMIT 1", $cmd, $workspace, '' ) ); $this->app->Tpl->Set('ID', $id); } $home_wikis = $this->app->DB->SelectArr("SELECT target FROM accordion"); $found = false; if(!empty($home_wikis)){ foreach($home_wikis as $home_row) { if($home_row['target'] == $wikiname){ $found = true; break; } } } if($found) { $startseite_link = "<input type=\"submit\" name=\"submitAndGoBack\" value=\"Speichern und zurück zur Startseite\" name=\"submit\">"; } if($wikiname != $cmd) { // seite gibt es nicht!!! } else { // wenn es seite gibt speichern if($this->app->Secure->GetPOST('submit')!='' || $this->app->Secure->GetPOST('submitAndGoBack')!='') { $articleId = $this->app->DB->Select( sprintf( "SELECT id FROM wiki WHERE name = '%s' AND wiki_workspace_id = %d AND `language` = '%s' LIMIT 1", $cmd, $workspace, $language ) ); $this->app->DB->Update( sprintf( "UPDATE wiki SET lastcontent=content WHERE id = %d LIMIT 1", $articleId ) ); $this->app->DB->Update( sprintf( "UPDATE wiki SET content='%s' WHERE id = %d LIMIT 1", $content, $articleId ) ); $this->saveArticleInUserdata($articleId); if($this->app->Secure->GetPOST('submitAndGoBack')!=''){ $this->app->Location->execute('index.php?module=welcome&action=start'); } else{ $this->app->Location->execute('index.php?module=wiki&action=list&cmd='.$cmd); } } $articleId = $this->app->DB->Select( sprintf( "SELECT id FROM wiki WHERE name = '%s' AND wiki_workspace_id = %d AND `language` = '%s' LIMIT 1", $cmd, $workspace, $language ) ); $content = $this->app->DB->Select( sprintf( "SELECT content FROM wiki WHERE id = %d LIMIT 1", $articleId ) ); if (!preg_match('/(<[^>].*?>)/e', $str)) { $wikiparser = new WikiParser(); $content = $wikiparser->parse($content); //$index = $wikiparser->BuildIndex(); } } } else { // Seite fehlt!!! soll diese angelegt werden? $this->WikiCreateDialog(); } //$this->app->YUI->CkEditor('content','wiki',array('wikiname' => $cmd, 'height'=>'50vh','ckeditor5'=>true)); $this->app->YUI->CkEditor('content','wiki',array('wikiname' => $cmd, 'height'=>'50vh')); $this->app->Tpl->Set( 'TAB1', "<textarea rows=\"25\" cols=\"120\" name=\"content\" id=\"content\">$content</textarea><br> $startseite_link" ); $this->app->Tpl->Set('CMD', $cmd); $this->app->Tpl->Set('WIKISITE', $cmd); $this->app->Tpl->Set('KURZUEBERSCHRIFT2',"$cmd - Seite bearbeiten"); $languages = $this->app->erp->GetSelectSprachenListe(); $selLanguage = $this->getUserLanguage(); $this->app->Tpl->Set('LANUAGEISO', $selLanguage); if(empty($selLanguage) || $selLanguage == '0' || !isset($languages[$selLanguage])) { $this->app->Tpl->Set('LANGUAGE', 'Default'); } else{ $this->app->Tpl->Set('LANGUAGE', $languages[$selLanguage]); } $workspace = $this->getUserWorkspace(); $this->app->Tpl->Set('WORKSPACEID', $workspace); if(empty($workspace)) { $this->app->Tpl->Set('WORKSPACE', 'Default'); } else{ $this->app->Tpl->Set( 'WORKSPACE', $this->app->DB->Select( sprintf('SELECT name FROM wiki_workspace WHERE id = %d', $workspace) ) ); } $addtionalcspheader = ' '.str_replace([';','"'],'',$this->app->erp->Firmendaten('additionalcspheader')).' '; $this->app->Tpl->Add('ADDITIONALCSPHEADER', $addtionalcspheader); $this->app->Tpl->Parse('PAGE','wiki_edit.tpl'); } }