Basic release
This commit is contained in:
36
modules/about/internal/index.php
Normal file
36
modules/about/internal/index.php
Normal file
@ -0,0 +1,36 @@
|
||||
<div id="wpbody-content">
|
||||
<h1>Über dieses Plugin</h1>
|
||||
|
||||
|
||||
<form method="post" action="admin.php?page=bdp-kompass%2Fmodules%2Findex.php&loadmodule=security">
|
||||
<div class="bdp_security_outer">
|
||||
<fieldset class="bdp_security_inner">
|
||||
<p>
|
||||
Das Plugin Kompass (<span style="font-weight: bold;">Komp</span>onente zur<span style="font-weight: bold;">A</span>dministration, <span style="font-weight: bold;">S</span>icherung und <span style="font-weight: bold;">S</span>ynchronisierung) wurde entwickelt, um euch bei der Administration eurer Webseite zu helfen.<br />
|
||||
Neben einer Vereinfachung der Navigation stellt das Plugin Sicherheitskomponenten bereit und installiert Plugins, die zur Absicherung eurer Webseite oder der Optimierung empfohlen werden.<br />
|
||||
Die Plugin-Empfehlung und Optimierung der Einstellungen erfolgt auf Datenbasis, die vom LB IT des LV Sachsen verwaltwet wird.<br />
|
||||
Auch bietet das Plugin Schnittstellen zur Integration und Darstellung von ausgesuchten externen Inhalten (eurem Stammes-Kalender im Wiki, der Veranstaltungsanmeldung auzf Mareike, ...) auf eurer Webseite.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Dieses Plugin wurde speziell für den Lanbdesverband Sachsen e.V. im Bund der Pfadfinderinnen und Pfadfinder e.V. ("BdP") entwickelt.<br />
|
||||
Die Nutzung außerhalb des BdP bedarf der ausrücklichen Zustimmung des Authors.<br /><br />
|
||||
Dies Plugin wurde speziell andie Anforderungen im LV Sachsen angepasst, innerhalb anderer Landesverbände kann es zu Kompatibilitätsproblemen kommen.
|
||||
Sollte dies der Fall sein, so kontaktiert bitte den Author.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Die Urheberrechte aller extern nachgeladenen Plugins und Themes liegen weiterhin bei den Authoren der jeweiligen Komponenten.
|
||||
</p>
|
||||
|
||||
<p><span style="font-weight: bold;">Informationen zum Author:</span><br />
|
||||
Thomas Günther, Aufbaugruppe Wilde Möhre im <a href="https://www.sachsen.pfadfinden.de/kontakt/gruppen-vor-ort/" target="_blank">LV Sachsen</a><br />
|
||||
<a href="mailto:thomas.guenther@pfadfinden.de">E-Mail</a><br />
|
||||
<a href="https://t.me/thomas_8611" target="_blank">Telegram</a>
|
||||
|
||||
|
||||
</p>
|
||||
</fieldset>
|
||||
</div>
|
||||
</form>
|
||||
|
13
modules/calendar/ajax-calendar.php
Normal file
13
modules/calendar/ajax-calendar.php
Normal file
@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
require_once dirname(__FILE__) . '/../../../../../wp-config.php';
|
||||
require_once dirname(__FILE__) . '/../../../../../wp-includes/option.php';
|
||||
require_once dirname(__FILE__) . '/../../../../../wp-includes/plugin.php';
|
||||
require_once dirname(__FILE__) . '/../../../../../wp-includes/load.php';
|
||||
require_once dirname(__FILE__) . '/../../../../../wp-includes/cache.php';
|
||||
|
||||
require_once dirname(__FILE__) . '/../../lib/ics-parser/Event.php';
|
||||
require_once dirname(__FILE__) . '/../../lib/ics-parser/ICal.php';
|
||||
require_once 'calendar.php';
|
||||
$calendar = new Calendar();
|
||||
echo $calendar->show();
|
22
modules/calendar/assets/ajaxscript.js
Normal file
22
modules/calendar/assets/ajaxscript.js
Normal file
@ -0,0 +1,22 @@
|
||||
// Funktion zum Laden des Kalenders über AJAX
|
||||
function loadCalendar(month, year) {
|
||||
// Erstelle ein XMLHttpRequest-Objekt
|
||||
var xhr = new XMLHttpRequest();
|
||||
|
||||
// Definiere die URL zum Laden des Kalenders (angepasst an deine Bedürfnisse)
|
||||
var url = '/wp-content/plugins/bdp-kompass/modules/calendar/ajax-calendar.php?month=' + month + '&year=' + year;
|
||||
|
||||
// Öffne eine GET-Anfrage
|
||||
xhr.open('GET', url, true);
|
||||
|
||||
// Setze die Callback-Funktion für die Antwort
|
||||
xhr.onreadystatechange = function () {
|
||||
if (xhr.readyState == 4 && xhr.status == 200) {
|
||||
// Aktualisiere den Inhalt des Container-Divs mit der Kalenderantwort
|
||||
document.getElementById('calendarContainer').innerHTML = xhr.responseText;
|
||||
}
|
||||
};
|
||||
|
||||
// Sende die Anfrage
|
||||
xhr.send();
|
||||
}
|
217
modules/calendar/assets/calendar.css
Normal file
217
modules/calendar/assets/calendar.css
Normal file
@ -0,0 +1,217 @@
|
||||
/*******************************Calendar Top Navigation*********************************/
|
||||
div#calendar{
|
||||
margin:0px auto;
|
||||
padding:0px;
|
||||
width: 100%;
|
||||
font-family:Helvetica, "Times New Roman", Times, serif;
|
||||
}
|
||||
|
||||
div#calendar div.box{
|
||||
position:relative;
|
||||
top:0px;
|
||||
left:0px;
|
||||
width:100%;
|
||||
height:40px;
|
||||
background-color: #ffcb04;
|
||||
}
|
||||
|
||||
div#calendar div.header{
|
||||
line-height:40px;
|
||||
vertical-align:middle;
|
||||
position:absolute;
|
||||
left:11px;
|
||||
top:0px;
|
||||
width:100%;
|
||||
height:40px;
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
div#calendar div.header a.prev,div#calendar div.header a.next{
|
||||
position:absolute;
|
||||
top:0px;
|
||||
padding-right: 20px;
|
||||
height: 17px;
|
||||
display:block;
|
||||
cursor:pointer;
|
||||
text-decoration:none;
|
||||
color:#3163bd;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div#calendar div.header span.title{
|
||||
color:#3163bd;
|
||||
font-weight: bold;
|
||||
font-size:18px;
|
||||
}
|
||||
|
||||
|
||||
div#calendar div.header a.prev{
|
||||
left:0px;
|
||||
}
|
||||
|
||||
div#calendar div.header a.next{
|
||||
right:0px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************Calendar Content Cells*********************************/
|
||||
div#calendar div.box-content{
|
||||
border-top:none;
|
||||
width: 100%;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
div#calendar ul.label{
|
||||
float:left;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
margin-top:5px;
|
||||
margin-left: 5px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div#calendar ul.label li{
|
||||
margin:0px;
|
||||
padding:0px;
|
||||
float:left;
|
||||
list-style-type:none;
|
||||
|
||||
height:40px;
|
||||
line-height:40px;
|
||||
vertical-align:middle;
|
||||
text-align:center;
|
||||
color:#000;
|
||||
font-size: 15px;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
|
||||
div#calendar ul.dates{
|
||||
float:left;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
margin-left: 5px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.bdp_cal_day
|
||||
{
|
||||
padding-left: 5px;
|
||||
color: #a0a0a0;
|
||||
}
|
||||
|
||||
bdp_cal_day td {
|
||||
min-height: 100px;
|
||||
}
|
||||
.bdp_event_table {
|
||||
width:95%;
|
||||
}
|
||||
.bdp_cal_day ul {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.bdp_cal_day li {
|
||||
list-style-type: none;
|
||||
width:95%;
|
||||
font-size: 8pt;
|
||||
font-weight: bold;
|
||||
padding: 2px;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.bdp_cal_event_red,
|
||||
.bdp_cal_event_yellow,
|
||||
.bdp_cal_event_blue,
|
||||
.bdp_cal_event_green,
|
||||
.bdp_cal_event_grey,
|
||||
.bdp_cal_event_fuchsia,
|
||||
.bdp_cal_event_orange
|
||||
{
|
||||
padding: 2px 4px;
|
||||
border-radius: 5px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
|
||||
}
|
||||
|
||||
.bdp_cal_event_blue {
|
||||
background-color: #1e88e5;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
|
||||
.bdp_cal_event_green {
|
||||
background-color: #00d084;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
.bdp_cal_event_red
|
||||
{
|
||||
.bdp_cal_event_entry;
|
||||
background-color: #e91e63;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.bdp_cal_event_yellow
|
||||
{
|
||||
.bdp_cal_event_entry;
|
||||
background-color: #eeee88;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
.bdp_cal_event_orange
|
||||
{
|
||||
.bdp_cal_event_entry;
|
||||
background-color: #ffa747;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
|
||||
.bdp_cal_event_grey
|
||||
{
|
||||
.bdp_cal_event_entry;
|
||||
background-color: #D5D5D5;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
.bdp_cal_event_fuchsia
|
||||
{
|
||||
.bdp_cal_event_entry;
|
||||
background-color: #FF6EFF;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/** overall width = width+padding-right**/
|
||||
div#calendar ul.dates li{
|
||||
margin:0px;
|
||||
padding:0px;
|
||||
padding-left: 2px;
|
||||
padding-top: 10px;
|
||||
vertical-align:bottom;
|
||||
float:left;
|
||||
list-style-type:none;
|
||||
width:15%;
|
||||
height:100px;
|
||||
font-size:12pt;
|
||||
background-color: #fff;
|
||||
color:#000;
|
||||
border-style: solid;
|
||||
border-width:1px;
|
||||
border-color: #add8e6;
|
||||
}
|
||||
|
||||
:focus{
|
||||
outline:none;
|
||||
}
|
||||
|
||||
div.clear{
|
||||
clear:both;
|
||||
}
|
6
modules/calendar/calendar.php
Normal file
6
modules/calendar/calendar.php
Normal file
@ -0,0 +1,6 @@
|
||||
<?php
|
||||
add_filter('the_content', ['Calendar', 'printCalendar']);
|
||||
wp_enqueue_style('bdp_calendar_css', BDP_LV_PLUGIN_URL . '/modules/calendar/assets/calendar.css');
|
||||
wp_enqueue_script( 'loadCalendar', BDP_LV_PLUGIN_URL . '/modules/calendar/assets/ajaxscript.js');
|
||||
|
||||
require_once dirname(__FILE__) . '/classes/Calendar.class.php';
|
315
modules/calendar/classes/Calendar.class.php
Normal file
315
modules/calendar/classes/Calendar.class.php
Normal file
@ -0,0 +1,315 @@
|
||||
<?php
|
||||
|
||||
class Calendar
|
||||
{
|
||||
public $ical;
|
||||
private $categories = [];
|
||||
|
||||
public static function setup()
|
||||
{
|
||||
$pageName = 'Kalender';
|
||||
$page_exists = get_page_by_path($pageName, OBJECT, 'page');
|
||||
|
||||
// Wenn die Seite nicht existiert, erstelle sie
|
||||
if (!$page_exists) {
|
||||
$page_id = wp_insert_post(array(
|
||||
'post_title' => $pageName,
|
||||
'post_content' => '{{calendar}}',
|
||||
'post_status' => 'publish',
|
||||
'post_type' => 'page',
|
||||
));
|
||||
|
||||
update_option('bdp_calendar_source_url', 'https://wiki.sachsen.pfadfinden.de/rest/calendar-services/1.0/calendar/export/subcalendar/private/ff69f5a689391ac0d7f78a70189cfde7c48cb923.ics');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static function printCalendar($content) {
|
||||
// Der zu ersetzende String
|
||||
$original_string = '{{calendar}}';
|
||||
$calendar = new Calendar();
|
||||
|
||||
// Der Ersatzstring
|
||||
$replacement_string = $calendar->show();
|
||||
|
||||
// Ersetze den Originalstring durch den Ersatzstring im Seiteninhalt
|
||||
$content = str_replace($original_string, $replacement_string, $content);
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
|
||||
$categories = get_option('bdp_calendar_categories', null);
|
||||
if (null !== $categories) {
|
||||
$categories = json_decode($categories, true);
|
||||
} else {
|
||||
$categories = [
|
||||
'yellow' => 'Meute',
|
||||
'blue' => 'Sippe',
|
||||
'red' => 'Runde',
|
||||
'green' => 'StaFü',
|
||||
'fuchsia' => '',
|
||||
'orange' => ''
|
||||
];
|
||||
}
|
||||
|
||||
foreach ($categories as $color => $keyname) {
|
||||
$this->categories[$keyname] = $color;
|
||||
}
|
||||
|
||||
|
||||
$calendarUrl = get_option('bdp_calendar_source_url', 'https://wiki.sachsen.pfadfinden.de/rest/calendar-services/1.0/calendar/export/subcalendar/private/ff69f5a689391ac0d7f78a70189cfde7c48cb923.ics');
|
||||
|
||||
$this->ical = new \ICal('', array(
|
||||
'defaultSpan' => 2, // Default value
|
||||
'defaultTimeZone' => '',
|
||||
'defaultWeekStart' => 'MO', // Default value
|
||||
'disableCharacterReplacement' => false, // Default value
|
||||
'filterDaysAfter' => null, // Default value
|
||||
'filterDaysBefore' => null, // Default value
|
||||
'httpUserAgent' => null, // Default value
|
||||
'skipRecurrence' => false, // Default value
|
||||
));
|
||||
$this->ical->initUrl($calendarUrl);
|
||||
$this->ical->events();
|
||||
$this->naviHref = htmlentities($_SERVER['PHP_SELF']);
|
||||
}
|
||||
|
||||
/********************* PROPERTY ********************/
|
||||
private $dayLabels = array("Mon", "Die", "Mit", "Don", "Fre", "Sam", "Son");
|
||||
|
||||
private $monthLabels = ['', 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];
|
||||
|
||||
private $currentYear = 0;
|
||||
|
||||
private $currentMonth = 0;
|
||||
|
||||
private $currentDay = 0;
|
||||
|
||||
private $currentDate = null;
|
||||
|
||||
private $daysInMonth = 0;
|
||||
|
||||
private $naviHref = null;
|
||||
|
||||
/********************* PUBLIC **********************/
|
||||
|
||||
/**
|
||||
* print out the calendar
|
||||
*/
|
||||
public function show()
|
||||
{
|
||||
$year = null;
|
||||
|
||||
$month = null;
|
||||
|
||||
if (null == $year && isset($_GET['year'])) {
|
||||
|
||||
$year = $_GET['year'];
|
||||
|
||||
} else if (null == $year) {
|
||||
|
||||
$year = date("Y", time());
|
||||
|
||||
}
|
||||
|
||||
if (null == $month && isset($_GET['month'])) {
|
||||
|
||||
$month = $_GET['month'];
|
||||
|
||||
} else if (null == $month) {
|
||||
|
||||
$month = date("m", time());
|
||||
|
||||
}
|
||||
|
||||
$this->currentYear = $year;
|
||||
|
||||
$this->currentMonth = $month;
|
||||
|
||||
$this->daysInMonth = $this->_daysInMonth($month, $year);
|
||||
|
||||
$content = ' <div id="calendarContainer"><div id="calendar">' .
|
||||
'<div class="box">' .
|
||||
$this->_createNavi() .
|
||||
'</div>' .
|
||||
'<div class="box-content">' .
|
||||
|
||||
'<table style=" border-collapse: collapse; border-spacing: 0; table-layout: fixed;width: 100%;">
|
||||
<tr>' . $this->_createLabels() . '</tr>';
|
||||
|
||||
|
||||
$weeksInMonth = $this->_weeksInMonth($month, $year);
|
||||
// Create weeks in a month
|
||||
for ($i = 0; $i < $weeksInMonth; $i++) {
|
||||
|
||||
//Create days in a week
|
||||
for ($j = 1; $j <= 7; $j++) {
|
||||
if ($j % 7 == 1) {
|
||||
$content .= '</tr><tr class="bdp_cal_day">';
|
||||
}
|
||||
$content .= $this->_showDay($i * 7 + $j);
|
||||
}
|
||||
}
|
||||
|
||||
$content .= '</table></div>';
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
private function getCssClass($category)
|
||||
{
|
||||
$cssClass = 'bdp_cal_event_' . ($this->categories[$category] ?? 'grey');
|
||||
return $cssClass;
|
||||
}
|
||||
|
||||
|
||||
private function getEvent($date)
|
||||
{
|
||||
$eventString = '<ul>';
|
||||
#echo '<pre>';
|
||||
foreach ($this->ical->filterByDate($date) as $curEvent) {
|
||||
$time = $curEvent->getEventTime() ?? 'Ganztags';
|
||||
|
||||
#print_r($curEvent);
|
||||
$eventString .= '<li class="' . $this->getCssClass($curEvent->category) . '">' .
|
||||
$time . ':<br />' .
|
||||
$curEvent->summary . '</li>';
|
||||
}
|
||||
return $eventString;
|
||||
}
|
||||
|
||||
/********************* PRIVATE **********************/
|
||||
/**
|
||||
* create the li element for ul
|
||||
*/
|
||||
private function _showDay($cellNumber)
|
||||
{
|
||||
|
||||
if ($this->currentDay == 0) {
|
||||
|
||||
$firstDayOfTheWeek = date('N', strtotime($this->currentYear . '-' . $this->currentMonth . '-01'));
|
||||
|
||||
if (intval($cellNumber) == intval($firstDayOfTheWeek)) {
|
||||
|
||||
$this->currentDay = 1;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (($this->currentDay != 0) && ($this->currentDay <= $this->daysInMonth)) {
|
||||
$date =
|
||||
str_pad($this->currentDay, 2, '0', STR_PAD_LEFT) . '.' .
|
||||
str_pad($this->currentMonth, 2, '0', STR_PAD_LEFT) . '.' .
|
||||
$this->currentYear;
|
||||
|
||||
$this->currentDate = date('Y-m-d', strtotime($this->currentYear . '-' . $this->currentMonth . '-' . ($this->currentDay)));
|
||||
|
||||
$cellContent = '<span class="bdp_cal_day">' . $this->currentDay . '</span>' . $this->getEvent($date);
|
||||
|
||||
$this->currentDay++;
|
||||
|
||||
} else {
|
||||
|
||||
$this->currentDate = null;
|
||||
|
||||
$cellContent = null;
|
||||
}
|
||||
|
||||
|
||||
return '<td style="padding-top: 5px; border-color: #a0a0a0; height: 120px; border-style: solid; border-width:1px; vertical-align: top;">' . $cellContent . '</td>';
|
||||
}
|
||||
|
||||
/**
|
||||
* create navigation
|
||||
*/
|
||||
private function _createNavi()
|
||||
{
|
||||
|
||||
$nextMonth = $this->currentMonth == 12 ? 1 : intval($this->currentMonth) + 1;
|
||||
|
||||
$nextYear = $this->currentMonth == 12 ? intval($this->currentYear) + 1 : $this->currentYear;
|
||||
|
||||
$preMonth = $this->currentMonth == 1 ? 12 : intval($this->currentMonth) - 1;
|
||||
|
||||
$preYear = $this->currentMonth == 1 ? intval($this->currentYear) - 1 : $this->currentYear;
|
||||
|
||||
return
|
||||
'<div class="header">' .
|
||||
'<a class="prev" href="javascript:void(0);" onclick="loadCalendar(' . $preMonth . ',' . $preYear . ');"><< Vorheriger Monat</a>' .
|
||||
'<span class="title">' . $this->monthLabels[(int)date('m', strtotime($this->currentYear . '-' . $this->currentMonth . '-1'))] . ' ' . date('Y', strtotime($this->currentYear . '-' . $this->currentMonth . '-1')) . '</span>' .
|
||||
'<a class="next" href="javascript:void(0);" onclick="loadCalendar(' . $nextMonth . ',' . $nextYear . ');">Nächster Monat >></a>' .
|
||||
'</div>';
|
||||
}
|
||||
|
||||
/**
|
||||
* create calendar week labels
|
||||
*/
|
||||
private function _createLabels()
|
||||
{
|
||||
|
||||
$content = '';
|
||||
|
||||
foreach ($this->dayLabels as $index => $label) {
|
||||
|
||||
$content .= '<td style="max-width: 14.287%;">' . $label . '</td>';
|
||||
|
||||
}
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* calculate number of weeks in a particular month
|
||||
*/
|
||||
private function _weeksInMonth($month = null, $year = null)
|
||||
{
|
||||
|
||||
if (null == ($year)) {
|
||||
$year = date("Y", time());
|
||||
}
|
||||
|
||||
if (null == ($month)) {
|
||||
$month = date("m", time());
|
||||
}
|
||||
|
||||
// find number of days in this month
|
||||
$daysInMonths = $this->_daysInMonth($month, $year);
|
||||
|
||||
$numOfweeks = ($daysInMonths % 7 == 0 ? 0 : 1) + intval($daysInMonths / 7);
|
||||
|
||||
$monthEndingDay = date('N', strtotime($year . '-' . $month . '-' . $daysInMonths));
|
||||
|
||||
$monthStartDay = date('N', strtotime($year . '-' . $month . '-01'));
|
||||
|
||||
if ($monthEndingDay < $monthStartDay) {
|
||||
|
||||
$numOfweeks++;
|
||||
|
||||
}
|
||||
|
||||
return $numOfweeks;
|
||||
}
|
||||
|
||||
/**
|
||||
* calculate number of days in a particular month
|
||||
*/
|
||||
private function _daysInMonth($month = null, $year = null)
|
||||
{
|
||||
|
||||
if (null == ($year))
|
||||
$year = date("Y", time());
|
||||
|
||||
if (null == ($month))
|
||||
$month = date("m", time());
|
||||
|
||||
return date('t', strtotime($year . '-' . $month . '-01'));
|
||||
}
|
||||
|
||||
}
|
91
modules/calendar/internal/index.php
Normal file
91
modules/calendar/internal/index.php
Normal file
@ -0,0 +1,91 @@
|
||||
<?php
|
||||
echo '<div id="wpbody-content">';
|
||||
echo '<h1>Kalender-Einstellungen</h1>';
|
||||
if (isset($_POST['submit'])) {
|
||||
echo '<div id="bdp_success">Die Einstellungen wurden gespeichert.</div>';
|
||||
update_option('bdp_calendar_categories', json_encode($_POST['category']));
|
||||
update_option('bdp_calendar_source_url', $_POST['ical_url']);
|
||||
}
|
||||
|
||||
$categories = get_option('bdp_calendar_categories', null);
|
||||
if (null !== $categories) {
|
||||
$categories = json_decode($categories, true);
|
||||
} else {
|
||||
$categories = [
|
||||
'yellow' => 'Meute',
|
||||
'blue' => 'Sippe',
|
||||
'red' => 'Runde',
|
||||
'green' => 'Stammesführung',
|
||||
'fuchsia' => '',
|
||||
'orange' => ''
|
||||
];
|
||||
}
|
||||
?>
|
||||
<form method="post" action="admin.php?page=bdp-kompass%2Fmodules%2Findex.php&loadmodule=calendar">
|
||||
<div class="bdp_cal_outer">
|
||||
<fieldset class="bdp_cal_inner">
|
||||
<legend>Datenabfrage</legend>
|
||||
|
||||
<table>
|
||||
<tr style="vertical-align: top;">
|
||||
<td>Kalender-URL:</td>
|
||||
<td><input class="long_text" type="text" name="ical_url" id="ical_url" required
|
||||
value = "<?php echo get_option('bdp_calendar_source_url', ''); ?>"
|
||||
><br />
|
||||
<label style="font-weight: normal; color: #a0a0a0; font-style: italic">
|
||||
Bitte gib hier die URL zur .ics - Datei eures Kalenbders im Wiki ein.
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="bdp_cal_inner">
|
||||
<legend>Labels</legend>
|
||||
<table>
|
||||
<tr>
|
||||
<td>Gelb:</td>
|
||||
<td><input type="text" name="category[yellow]" value="<?php echo $categories['yellow']; ?>" /></td>
|
||||
<td class="bdp_cal_event_yellow"></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Blau:</td>
|
||||
<td><input type="text" name="category[blue]" value="<?php echo $categories['blue']; ?>" /></td>
|
||||
<td class="bdp_cal_event_blue"></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Rot:</td>
|
||||
<td><input type="text" name="category[red]" value="<?php echo $categories['red']; ?>" /></td>
|
||||
<td class="bdp_cal_event_red"></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Grün:</td>
|
||||
<td><input type="text" name="category[green]" value="<?php echo $categories['green']; ?>" /></td>
|
||||
<td class="bdp_cal_event_green"></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Fuchsia:</td>
|
||||
<td><input type="text" name="category[fuchsia]" value="<?php echo $categories['fuchsia']; ?>" /></td>
|
||||
<td class="bdp_cal_event_fuchsia"></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Orange:</td>
|
||||
<td><input type="text" name="category[orange]" value="<?php echo $categories['orange']; ?>" /></td>
|
||||
<td class="bdp_cal_event_orange"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Grau:</td>
|
||||
<td>Standard</td>
|
||||
<td class="bdp_cal_event_grey"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
<input class="bdp_submit" type="submit" name="submit" value="Einstellungen speichern">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
55
modules/depency-checker/dependency-checker.php
Normal file
55
modules/depency-checker/dependency-checker.php
Normal file
@ -0,0 +1,55 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace BDP_LV_Sachsen\WordpressHelper\DependenCyChecker;
|
||||
|
||||
class DependencyChecker
|
||||
{
|
||||
const depenedencies = ['pfadfinden-theme-updater' ];
|
||||
|
||||
public static function init() : void
|
||||
{
|
||||
return;
|
||||
foreach(self::depenedencies as $class) {
|
||||
$file = ABSPATH . '/wp-content/plugins/bdp-kompass/plugins/' . $class;
|
||||
|
||||
system('cp -r ' . $file . '* ' . ABSPATH . 'wp-content/plugins/' . $class);
|
||||
|
||||
$plugin = 'pfadfinden-theme-updater/pfadfinden-theme-updater.php';
|
||||
$pluginPath = ABSPATH . '/wp-content/plugins/' . $class . '/' . $class . '.php';
|
||||
|
||||
|
||||
activate_plugin($pluginPath);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static function recursive_copy($source, $destination) {
|
||||
// Überprüfe, ob das Quellverzeichnis existiert
|
||||
if (!file_exists($source)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Erstelle das Zielpfad, wenn es nicht existiert
|
||||
if (!is_dir($destination)) {
|
||||
mkdir($destination, 0755, true);
|
||||
}
|
||||
|
||||
// Durchlaufe alle Dateien und Unterverzeichnisse im Quellverzeichnis
|
||||
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST);
|
||||
|
||||
foreach ($iterator as $item) {
|
||||
if ($item->isDir()) {
|
||||
// Wenn es ein Verzeichnis ist, erstelle es im Zielverzeichnis
|
||||
mkdir($destination . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
|
||||
} else {
|
||||
// Wenn es eine Datei ist, kopiere sie in das Zielverzeichnis
|
||||
copy($item, $destination . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
75
modules/firstusage/classes/Security.class.php
Normal file
75
modules/firstusage/classes/Security.class.php
Normal file
@ -0,0 +1,75 @@
|
||||
<?php
|
||||
namespace Bdp\Modules\Security;
|
||||
|
||||
|
||||
use ZipArchive;
|
||||
|
||||
|
||||
|
||||
class Security
|
||||
{
|
||||
public const required_security_plugins = [
|
||||
'wps_hide_login' => ['downloadUrl' => 'https://downloads.wordpress.org/plugin/wps-hide-login.1.9.10.zip'],
|
||||
'limit-login-attempts-reloaded' => ['downloadUrl' => 'https://downloads.wordpress.org/plugin/limit-login-attempts-reloaded.2.25.27.zip']];
|
||||
|
||||
|
||||
public const delete_plugins = [
|
||||
'akismet/akismet.php',
|
||||
'hello.php'
|
||||
];
|
||||
|
||||
public static function setup()
|
||||
{
|
||||
self::deletePlugins();
|
||||
foreach (self::required_security_plugins as $pluginSlug => $pluginData) {
|
||||
if (!is_dir(WP_PLUGIN_DIR . '/' . $pluginSlug)) {
|
||||
self::installSecurityPlugin($pluginSlug, $pluginData['downloadUrl']);
|
||||
}
|
||||
}
|
||||
|
||||
$loginUrl = get_option('whl_page', 'bdp_login');
|
||||
update_option('whl_page', $loginUrl);
|
||||
|
||||
}
|
||||
|
||||
public static function deletePlugins() {
|
||||
deactivate_plugins(self::delete_plugins);
|
||||
delete_plugins(self::delete_plugins);
|
||||
}
|
||||
|
||||
|
||||
public static function installSecurityPlugin(string $pluginSlug, string $downloadUrl) : bool
|
||||
{
|
||||
$ch = curl_init();
|
||||
$source = $downloadUrl;
|
||||
curl_setopt($ch, CURLOPT_URL, $source);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
$data = curl_exec ($ch);
|
||||
curl_close ($ch);
|
||||
|
||||
$destination = WP_PLUGIN_DIR . '/' . $pluginSlug . '.zip';
|
||||
$file = fopen($destination, "w+");
|
||||
fputs($file, $data);
|
||||
fclose($file);
|
||||
|
||||
$zip = new ZipArchive();
|
||||
$zip->open($destination);
|
||||
$zip->extractTo(WP_PLUGIN_DIR);
|
||||
$zip->close();
|
||||
unlink($destination);
|
||||
|
||||
$pluginInfos = get_plugins( '/'.$pluginSlug );
|
||||
$installfile = $pluginSlug . '/';
|
||||
if( ! empty( $pluginInfos ) ) {
|
||||
foreach ($pluginInfos as $file => $info) :
|
||||
$installfile .= $file;
|
||||
endforeach;
|
||||
}
|
||||
|
||||
|
||||
|
||||
$result = activate_plugin($installfile);
|
||||
|
||||
return $result === null;
|
||||
}
|
||||
}
|
22
modules/firstusage/internal/index.php
Normal file
22
modules/firstusage/internal/index.php
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
echo '<div id="wpbody-content">';
|
||||
echo '<h1>Installation erfolgreich!</h1>';
|
||||
|
||||
?>
|
||||
|
||||
<form method="post" action="admin.php?page=bdp-kompass%2Fmodules%2Findex.php&loadmodule=security">
|
||||
<div class="bdp_security_outer">
|
||||
<fieldset class="bdp_security_inner">
|
||||
<span style="font-weight: bold;">Herzlichen Glückwunsch!</span><br /><br />
|
||||
Das Plugin Kompass wurde soeben erfolgreich installiert.<br />Im Hintergrund wurden bereits erste Optimierungen an der Webseite vorgenommen, so wurde die Navcigation vereinfacht, und falls dies noch nicht der Fall war, wurde die Webseite mit einer suchmaschinenfreundlichen Struktur ausgestattet.<br />
|
||||
Es wurden bereits erste sicherheitsrelevante Plugins installiert. Du findest die Übersicht, welchePlugins aktiv sind, jederzeit <a href="plugins.php">hier</a><br /><br />
|
||||
Über die Kalender-Einstellungen kannst du den Kalender deines Stammes aus dem Wiki auf deiner Webseite einbinden, dieser erscheint dann automatisch unt er der Adresse <a href="<?php echo get_site_url() . '/kalender'; ?>"><?php echo get_site_url() . '/kalender'; ?></a><br /><br />
|
||||
Aus Sicherheitsgründen empfiehlt es sich, die Adresse zum Dashboard deiner Webseite ztu verschleiern. Ein hierfür notwendiges Plugin wurde automatisch installiert. Um dich zukünftig auf deiner Webseite einzuloggen, nutze folgende URL:<br />
|
||||
<label><?php echo get_site_url(); ?>/</label><input style="width: 250px;" class="long_text" type="text" name="login_url" id="login_url" required
|
||||
value = "<?php echo get_option('whl_page', 'bdp_login'); ?>">
|
||||
<br /><input class="bdp_submit" type="submit" name="submit" value="Verändere diese URL noch einmal"><br /><br />
|
||||
Falls du zu diesem Plugin Anmerkungen oder Fragen hast, wende dich bitte an den LB IT.
|
||||
</fieldset>
|
||||
</div>
|
||||
</form>
|
||||
|
3
modules/firstusage/security.php
Normal file
3
modules/firstusage/security.php
Normal file
@ -0,0 +1,3 @@
|
||||
<?php
|
||||
|
||||
require_once dirname(__FILE__) . '/classes/Security.class.php';
|
9
modules/index.php
Normal file
9
modules/index.php
Normal file
@ -0,0 +1,9 @@
|
||||
<?php
|
||||
if (!isset($_REQUEST['loadmodule']) ||
|
||||
!is_file(BDP_LV_PLUGIN_DIR . 'modules/' . $_REQUEST['loadmodule'] . '/internal/index.php')) {
|
||||
require_once BDP_LV_PLUGIN_DIR . 'modules/about/internal/index.php';
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
require_once BDP_LV_PLUGIN_DIR . 'modules/' . $_REQUEST['loadmodule'] . '/internal/index.php';
|
75
modules/security/classes/Security.class.php
Normal file
75
modules/security/classes/Security.class.php
Normal file
@ -0,0 +1,75 @@
|
||||
<?php
|
||||
namespace Bdp\Modules\Security;
|
||||
|
||||
|
||||
use ZipArchive;
|
||||
|
||||
|
||||
|
||||
class Security
|
||||
{
|
||||
public const required_security_plugins = [
|
||||
'wps_hide_login' => ['downloadUrl' => 'https://downloads.wordpress.org/plugin/wps-hide-login.1.9.10.zip'],
|
||||
'limit-login-attempts-reloaded' => ['downloadUrl' => 'https://downloads.wordpress.org/plugin/limit-login-attempts-reloaded.2.25.27.zip']];
|
||||
|
||||
|
||||
public const delete_plugins = [
|
||||
'akismet/akismet.php',
|
||||
'hello.php'
|
||||
];
|
||||
|
||||
public static function setup()
|
||||
{
|
||||
self::deletePlugins();
|
||||
foreach (self::required_security_plugins as $pluginSlug => $pluginData) {
|
||||
if (!is_dir(WP_PLUGIN_DIR . '/' . $pluginSlug)) {
|
||||
self::installSecurityPlugin($pluginSlug, $pluginData['downloadUrl']);
|
||||
}
|
||||
}
|
||||
|
||||
$loginUrl = get_option('whl_page', 'bdp_login');
|
||||
update_option('whl_page', $loginUrl);
|
||||
|
||||
}
|
||||
|
||||
public static function deletePlugins() {
|
||||
deactivate_plugins(self::delete_plugins);
|
||||
delete_plugins(self::delete_plugins);
|
||||
}
|
||||
|
||||
|
||||
public static function installSecurityPlugin(string $pluginSlug, string $downloadUrl) : bool
|
||||
{
|
||||
$ch = curl_init();
|
||||
$source = $downloadUrl;
|
||||
curl_setopt($ch, CURLOPT_URL, $source);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
$data = curl_exec ($ch);
|
||||
curl_close ($ch);
|
||||
|
||||
$destination = WP_PLUGIN_DIR . '/' . $pluginSlug . '.zip';
|
||||
$file = fopen($destination, "w+");
|
||||
fputs($file, $data);
|
||||
fclose($file);
|
||||
|
||||
$zip = new ZipArchive();
|
||||
$zip->open($destination);
|
||||
$zip->extractTo(WP_PLUGIN_DIR);
|
||||
$zip->close();
|
||||
unlink($destination);
|
||||
|
||||
$pluginInfos = get_plugins( '/'.$pluginSlug );
|
||||
$installfile = $pluginSlug . '/';
|
||||
if( ! empty( $pluginInfos ) ) {
|
||||
foreach ($pluginInfos as $file => $info) :
|
||||
$installfile .= $file;
|
||||
endforeach;
|
||||
}
|
||||
|
||||
|
||||
|
||||
$result = activate_plugin($installfile);
|
||||
|
||||
return $result === null;
|
||||
}
|
||||
}
|
32
modules/security/internal/index.php
Normal file
32
modules/security/internal/index.php
Normal file
@ -0,0 +1,32 @@
|
||||
<?php
|
||||
echo '<div class="health-check-body health-check-debug-tab hide-if-no-js">';
|
||||
echo '<h1>Erweiterte Sicherheitseinstellungen</h1>';
|
||||
if (isset($_POST['submit'])) {
|
||||
echo '<div id="bdp_success">Die Einstellungen wurden gespeichert.</div>';
|
||||
update_option('whl_page', $_POST['login_url']);
|
||||
}
|
||||
?>
|
||||
|
||||
<form method="post" action="admin.php?page=bdp-kompass%2Fmodules%2Findex.php&loadmodule=security">
|
||||
<div class="bdp_security_outer">
|
||||
<fieldset class="bdp_security_inner">
|
||||
<legend>Wordpress-Login</legend>
|
||||
|
||||
<table>
|
||||
<tr style="vertical-align: top;">
|
||||
<td>Login-URL:</td>
|
||||
<td> <label><?php echo get_site_url(); ?>/</label><input style="width: 100px;" class="long_text" type="text" name="login_url" id="login_url" required
|
||||
value = "<?php echo get_option('whl_page', 'bdp_login'); ?>"
|
||||
>/<br />
|
||||
<label style="font-weight: normal; color: #a0a0a0; font-style: italic">
|
||||
Du erreichst das Dashboard deiner Seite zukünftig nur noch unter dieser URL
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
<input class="bdp_submit" type="submit" name="submit" value="Einstellungen speichern">
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
25
modules/security/security.php
Normal file
25
modules/security/security.php
Normal file
@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
function wp_example_site_health_navigation_tabs( $tabs ) {
|
||||
// translators: Tab heading for Site Health navigation.
|
||||
$tabs['loginurl'] = esc_html_x( 'Login-URL', 'Site Health', 'text-domain' );
|
||||
|
||||
return $tabs;
|
||||
}
|
||||
add_filter( 'site_health_navigation_tabs', 'wp_example_site_health_navigation_tabs' );
|
||||
|
||||
|
||||
function wp_example_site_health_tab_content($tab)
|
||||
{
|
||||
// Do nothing if this is not our tab.
|
||||
if ('loginurl' === $tab) {
|
||||
require_once dirname(__FILE__) . '/internal/index.php';
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
add_action('site_health_tab_content', 'wp_example_site_health_tab_content');
|
||||
|
||||
require_once dirname(__FILE__) . '/classes/Security.class.php';
|
||||
|
||||
|
13
modules/seo/classes/Seo.class.php
Normal file
13
modules/seo/classes/Seo.class.php
Normal file
@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace Bdp\Modules\Seo;
|
||||
class Seo
|
||||
{
|
||||
public static function setup()
|
||||
{
|
||||
if (get_option('permalink_structure') === '') {
|
||||
update_option('permalink_structure', '/%postname%/');
|
||||
flush_rewrite_rules();
|
||||
}
|
||||
}
|
||||
}
|
2
modules/seo/seo.php
Normal file
2
modules/seo/seo.php
Normal file
@ -0,0 +1,2 @@
|
||||
<?php
|
||||
require_once dirname(__FILE__) . '/classes/Seo.class.php';
|
Reference in New Issue
Block a user