<?php
namespace App\Controller;
use App\Service\RedirectService;
use Exception;
use Knp\Component\Pager\PaginatorInterface;
use Pimcore\Controller\FrontendController;
use Pimcore\Model\DataObject\Press\Listing;
use Pimcore\Model\DataObject\Wiki;
use Pimcore\Model\Document\Page;
use Pimcore\Model\Redirect\Listing as RedirectListing;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Webmozart\Assert\Assert;
class WikiController extends FrontendController
{
/**
* @Route ("/wiki/{searchTerm}", name="wiki_search")
* @Template("wiki/index.html.twig")
* @param Request $request
* @return array
*/
public function indexAction(Request $request, PaginatorInterface $paginator, $searchTerm = null)
{
$wikiEntries = $this->getWikiArticlesByParameters($searchTerm);
return [
'index' => $wikiEntries,
'searchTerm' => $searchTerm,
];
}
/**
* @Route ("{underworld}/wissen/wiki/{searchTerm}", name="wiki_underworld_search")
* @Template("wiki/index.html.twig")
* @param Request $request
* @return array
*/
public function wikiUnderworldIndexAction(Request $request, PaginatorInterface $paginator, $searchTerm = null): array
{
$subworld = $this->document->getProperty("subworld");
$wikiEntries = $this->getWikiArticlesByParameters($searchTerm, $subworld);
return [
'index' => $wikiEntries,
'searchTerm' => $searchTerm,
];
}
private function getWikiArticlesByParameters($searchTerm = null, $subworld = null)
{
$wikiEntries = Wiki::getList([
'orderKey' => ["title"],
'order' => 'asc',
]);
if ($searchTerm == "0-9") {
$wikiEntries->setCondition('title regexp ?', ["^[0-9]+"]);
} elseif ($searchTerm && strlen($searchTerm) == 1) {
$wikiEntries->setCondition('title LIKE ?', ["$searchTerm%"]);
} elseif ($searchTerm && strlen($searchTerm) > 1) {
$wikiEntries->setCondition('title LIKE ?', ["%$searchTerm%"]);
} elseif ($searchTerm) {
$wikiEntries->setCondition('title LIKE ?', ["a%"]);
}
if ($subworld && $subworld != "main") {
$wikiEntries->filterByUnderworld($subworld);
}
if (!$subworld) {
$wikiEntries->addConditionParam("(underworld IS NULL OR underworld = '')");
}
return $wikiEntries;
}
/**
* @Route ("/wissen/wiki/{slug}", name="wiki_detail")
* @Template("wiki/detail.html.twig")
* @param Request $request
*/
public function detailAction(Request $request, RedirectService $redirectService, $slug): array|Response
{
$redirect410Response = $redirectService->check410Redirect($request);
if ($redirect410Response) {
return $redirect410Response;
}
$entry = $this->getWikiArticleBySlug($slug);
if ($entry instanceof Response) {
return $entry;
}
if (!$entry) {
throw $this->createNotFoundException('Dieser Wikiartikel existiert nicht');
}
if ($entry->hasProperty("underworld") && $entry->getUnderworld()) {
if ($this->mapUnderworldURL($entry->getUnderworld())) {
$redirectUrl = $this->mapUnderworldURL($entry->getUnderworld()) . "/wissen/" . $slug;
return new RedirectResponse($redirectUrl, 301);
}
}
return [
'wiki' => $entry
];
}
/**
* @Route ("/wissen/wiki/preview-latest/{slug}", name="wiki_detail_preview")
* @Template("wiki/detail.html.twig")
* @param Request $request
*/
public function detailPreviewAction(Request $request, $slug): array|Response
{
$entry = $this->getWikiArticleBySlug($slug);
if ($entry instanceof Response) {
return $entry;
}
if (!$entry) {
throw $this->createNotFoundException('Dieser Wikiartikel existiert nicht');
}
if ($entry->getUnderworld()) {
if ($this->mapUnderworldURL($entry->getUnderworld())) {
$redirectUrl = $this->mapUnderworldURL($entry->getUnderworld()) . "/wissen/preview-latest/" . $slug;
return new RedirectResponse($redirectUrl, 301);
}
}
$versions = $entry->getVersions();
if (empty($versions)) {
return [
'wiki' => $entry
];
}
$latestVersion = $versions[count($versions)-1];
$latestVersion = $latestVersion->getData();
return [
'wiki' => $latestVersion
];
}
/**
* @Route ("{underworld}/wissen/preview-latest/{slug}", name="wiki_underworld_detail_preview")
* @Template("wiki/detail.html.twig")
* @param Request $request
*/
public function wikiUnderworldDetailPreviewAction(Request $request, $slug): array|Response|Page
{
$entry = $this->getWikiArticleBySlug($slug);
if ($entry instanceof Response) {
return $entry;
}
if (!$entry) {
$document = \Pimcore\Model\Document::getByPath($request->getRequestUri());
if ($document && $document->getTemplate()) {
return $this->render($document->getTemplate(), $document->getObjectVars());
}
}
if (!$entry) {
throw $this->createNotFoundException('Dieser Wikiartikel existiert nicht');
}
$versions = $entry->getVersions();
if (empty($versions)) {
return [
'wiki' => $entry
];
}
$latestVersion = $versions[count($versions)-1];
$latestVersion = $latestVersion->getData();
return [
'wiki' => $latestVersion
];
}
/**
* @Route ("{underworld}/wissen/{slug}", name="wiki_underworld_detail")
* @Template("wiki/detail.html.twig")
* @param Request $request
*/
public function wikiUnderworldDetailAction(Request $request, $slug): array|Response|Page
{
$entry = $this->getWikiArticleBySlug($slug);
if ($entry instanceof Response) {
return $entry;
}
if (!$entry) {
$document = \Pimcore\Model\Document::getByPath($request->getRequestUri());
if ($document && $document->getTemplate()) {
return $this->render($document->getTemplate(), $document->getObjectVars());
}
}
if (!$entry) {
throw $this->createNotFoundException('Dieser Wikiartikel existiert nicht');
}
return [
'wiki' => $entry
];
}
private function getWikiArticleBySlug($slug)
{
$entry = Wiki::getBySlugDe($slug, 1);
if (!$entry) {
$entry = Wiki::getById($slug);
}
if (!$entry) {
$entry = Wiki::getBySlugDe($slug, ['limit' => 1, 'unpublished' => true]);
if ($entry && $entry->getRemoved()) {
return new Response("", 410);
}
}
return $entry;
}
private function mapUnderworldURL($shortname)
{
$underworldMappingArray = [
"chm" => "/change-management",
'nw' => '/new-work',
'agile' => '/agilitaet',
'fup' => '/fuehrung-und-performance',
'nac' => '/nachhaltigkeit',
'ges' => '/prozessoptimierung',
'sui' => '/strategie-und-innovation',
'prm' => '/projektmanagement',
'tur' => '/turnaround-und-restrukturierung',
'vem' => '/vertriebsmanagement'
];
return $underworldMappingArray[$shortname] ?? false;
}
/**
* Funktion zum Unveröffentlichen/Inaktiv-setzen von Wiki-Artikeln aus einer in Unpublish-CSV/file.csv abgelegten CSV.
* @Route ("admin/wiki/unpublish-articles-from-csv", name="wiki_unpublish-articles_from_csv")
* @return JsonResponse
* @throws Exception
*/
public function unpublishArticlesFromCSV()
{
$rowNum = 0;
$failedArticles = [];
$successArticles = [];
if (($fp = fopen("var/assets/Unpublish-CSV/offline.csv", "r")) !== FALSE) {
while (($row = fgetcsv($fp, 1000, ";")) !== FALSE) {
$slugFromUrl = $row[0];
$rowNum++;
$entry = Wiki::getBySlugDe($slugFromUrl, 1);
if (!$entry) {
$entry = Wiki::getById($slugFromUrl);
}
if (!$entry) {
$failedArticles[] = $slugFromUrl;
}
if ($entry) {
$entry?->setPublished(false);
$entry?->setActive(false);
$entry?->setRemoved(true);
$entry?->save();
$successArticles[] = $slugFromUrl;
}
}
fclose($fp);
}
return new JsonResponse(["erfolgreiche Artikel" => $successArticles, "fehlgeschlagene/nicht gefundene Artikel" => $failedArticles]);
}
/**
* Funktion zum Auslösen des Slug-Generator Event-Listeners.
* @Route ("admin/wiki/create-slugs", name="wiki_create_slugs")
* @return JsonResponse
* @throws Exception
*/
public function initializeWikiAndPressSlugCreation()
{
$pressArticles = new Listing();
$wikiArticles = new Wiki\Listing();
foreach ($pressArticles as $pressArticle) {
$pressArticle->save();
}
foreach ($wikiArticles as $wikiArticle) {
$wikiArticle->save();
}
return new JsonResponse(["success" => true]);
}
/**
* Funktion zum Ersetzen von h3s zu h2s
* @Route ("admin/wiki/replace-h3s", name="wiki_replace_h3s")
* @return JsonResponse
* @throws Exception
*/
public function replaceWikiH3s()
{
$wikiArticles = new Wiki\Listing();
foreach ($wikiArticles as $wikiArticle) {
$wikiArticle->setText(str_replace(array('<h3>', '</h3>'), array('<h2>', '</h2>'), $wikiArticle->getText('de')), 'de');
$wikiArticle->setText(str_replace(array('<h3>', '</h3>'), array('<h2>', '</h2>'), $wikiArticle->getText('en')), 'en');
$wikiArticle->setText(str_replace(array('<a'), array('<a class="text-blue-600 font-semibold"'), $wikiArticle->getText('de')), 'de');
$wikiArticle->setText(str_replace(array('<a'), array('<a class="text-blue-600 font-semibold"'), $wikiArticle->getText('en')), 'en');
$wikiArticle->save();
}
return new JsonResponse(["success" => true]);
}
}