Commit 3b637876 authored by Henning Leutz's avatar Henning Leutz 🥋

Issue #275

parent ff52a0c1
......@@ -56,7 +56,12 @@
<primary>session_id</primary>
</table>
</global>
<projects>
<table name="paths" no-auto-update="1">
<field type="TEXT NOT NULL">path</field>
</table>
</projects>
</database>
<form method="POST" action="">
{if $this->getAttribute('content')}
<div class="content-template">
{if $this->getAttribute('content')}
{$this->getAttribute('content')}
{/if}
{$this->getAttribute('content')}
</div>
{/if}
{if $this->getAttribute('labels')}
<label for="qui-contact-name">
......
<?php
/**
* This file contains the \QUI\Interfaces\Projects\Site
*/
namespace QUI\Interfaces\Projects;
use QUI;
/**
* Site Objekt - eine einzelne Seite
*
* @author www.pcsg.de (Henning Leutz)
* @licence For copyright and license information, please view the /README.md
*
* @errorcodes 7XX = Site Errors -> look at Site/Edit
*/
interface Site
{
/**
* Return the project object of the site
*
* @return QUI\Projects\Project
*/
public function getProject();
/**
* Lädt die Plugins der Seite
*
* @param String|bool $plugin - Plugin welches geladen werden soll, optional, ansonsten werden alle geladen
*
* @return Site
*/
public function load($plugin = false);
/**
* Serialisierungsdaten
*
* @return String
*/
public function encode();
/**
* Setzt JSON Parameter
*
* @param String $params - JSON encoded string
*
* @throws QUI\Exception
*/
public function decode($params);
/**
* Hohlt frisch die Daten aus der DB
*/
public function refresh();
/**
* Prüft ob es eine Verknüpfung ist
*
* @return Bool|Integer
*/
public function isLinked();
/**
* Prüft ob es die Seite auch in einer anderen Sprache gibt
*
* @param String $lang
* @param Bool $check_only_active - check only active pages
*
* @return Bool
*/
public function existLang($lang, $check_only_active = true);
/**
* Gibt die IDs von Sprachverknüpfungen zurück
*
* @return Array
*/
public function getLangIds();
/**
* Return the ID of the site,
* or the ID of the sibling (linked) site of another languager
*
* @param String|bool $lang - optional, if it is set, then the language of the wanted linked sibling site
*
* @return Integer
*/
public function getId($lang = false);
/**
* Gibt alle Kinder zurück
*
* @param array $params - Parameter für die Childrenausgabe
* $params['where']
* $params['limit']
* @param Bool $load - Legt fest ob die Kinder die Plugins laden sollen
*
* @return Array;
*/
public function getChildren($params = array(), $load = false);
/**
* Liefert die nächstfolgende Seite
*
* @return QUI\Projects\Site
* @throws QUI\Exception
*/
public function nextSibling();
/**
* Die nächsten x Kinder
*
* @param Integer $no
*
* @return Array
*/
public function nextSiblings($no);
/**
* Liefert die vorhergehenden Seite
*
* @return QUI\Projects\Site
* @throws QUI\Exception
*/
public function previousSibling();
/**
* Die x vorhergehenden Geschwister
*
* @param Integer $no
*
* @return Array
*/
public function previousSiblings($no);
/**
* Gibt das erste Kind der Seite zurück
*
* @param Array $params
*
* @return QUI\Projects\Site | false
*/
public function firstChild($params = array());
/**
* Gibt die Kinder zurück achtet aber auf "Nicht in Navigation anzeigen" und Rechte
*
* @param array $params
*
* @return array
*/
public function getNavigation($params = array());
/**
* Gibt ein Kind zurück welches den Namen hat
*
* @param String $name
*
* @return Integer
* @throws QUI\Exception
*/
public function getChildIdByName($name);
/**
* Return a children by id
*
* @param Integer $id
*
* @return QUI\Projects\Site
* @throws QUI\Exception
*/
public function getChild($id);
/**
* Gibt die ID's der Kinder zurück
* Wenn nur die ID's verwendet werden sollte dies vor getChildren verwendet werden
*
* @param Array $params Parameter für die Childrenausgabe
* $params['where']
* $params['limit']
*
* @return Array
*/
public function getChildrenIds($params = array());
/**
* Return ALL children ids under the site
*
* @param array $params - db parameter
*
* @return array
*/
public function getChildrenIdsRecursive($params = array());
/**
* Gibt zurück ob Site Kinder besitzt
*
* @param Bool $navhide - if navhide == false, navhide must be 0
*
* @return Integer - Anzahl der Kinder
*/
public function hasChildren($navhide = false);
/**
* Setzt das delete Flag
*
* @todo move to Site/Edit
*/
public function delete();
/**
* Gibt die URL der Seite zurück
*
* @param $params
* @param $rewrited
*
* @return String
*/
public function getUrl($params = array(), $rewrited = false);
/**
* Gibt eine sprechenden URL zurück
* DB Abfragen werden gemacht - Hier auf Performance achten
*
* @param Array $params - Parameter welche an die URL angehängt werden
*
* @return String
*/
public function getUrlRewrited($params = array());
/**
* Return the Parent id from the site object
*
* @return Integer
*/
public function getParentId();
/**
* Gibt alle direkten Eltern Ids zurück
*
* Site
* ->Parent
* ->Parent
* ->Parent
*
* @return Array
*/
public function getParentIds();
/**
* Return the Parent ID List
*
* @return Array
*/
public function getParentIdTree();
/**
* Gibt das Parent Objekt zurück
*
* @return Site
*/
public function getParent();
/**
* Gibt alle rekursive Parents als Objekte zurück
* Site->Parent->ParentParent->ParentParentParent
*
* @return Array
*/
public function getParents();
/**
* Stellt die Seite wieder her
*
* ??? wieso hier? und nicht im trash? O.o
*/
public function restore();
/**
* Zerstört die Seite
* Die Seite wird komplett aus der DB gelöscht und auch alle Beziehungen
* Funktioniert nur wenn die Seite gelöscht ist
*/
public function destroy();
/**
* Canonical URL - Um doppelte Inhalt zu vermeiden
*
* @return String
*/
public function getCanonical();
/**
* Löscht den Seitencache
*/
public function deleteCache();
/**
* Löscht den Seitencache
*/
public function createCache();
/**
* Shortcut for QUI\Rights\Permission::hasSitePermission
*
* @param string $permission - name of the permission
* @param QUI\Users\User|Bool $User - optional
*
* @return Bool|Integer
*/
public function hasPermission($permission, $User = false);
/**
* Shortcut for QUI\Rights\Permission::checkSitePermission
*
* @param string $permission - name of the permission
* @param QUI\Users\User|Bool $User - optional
*
* @throws QUI\Exception
*/
public function checkPermission($permission, $User = false);
}
<?php
/**
* This file contains \QUI\Interfaces\System\Patch
*/
namespace QUI\Interfaces\System;
/**
* Interface Test
*
* @package quiqqer/quiqqer
*/
interface Patch
{
/**
* Execute the patch
*
* @return Bool
*/
public function execute();
/**
* Return the minimum version for the patch
*
* @return String
*/
public function minimumVersion();
}
......@@ -102,7 +102,7 @@ class Media extends QUI\QDOM
*
* @param String|Bool $type - (optional) standard=false; other options: relations
*
* @return String
* @return string
*/
public function getTable($type = false)
{
......@@ -113,6 +113,16 @@ class Media extends QUI\QDOM
return $this->_Project->getAttribute('name').'_media';
}
/**
* Return the Placeholder of the media
*
* @return string
*/
public function getPlaceholder()
{
return URL_BIN_DIR .'images/Q.png';
}
/**
* Return the ImageManager of the Media
*
......
......@@ -17,7 +17,7 @@ use QUI\Utils\String as StringUtils;
*
* @errorcodes 7XX = Site Errors -> look at Site/Edit
*/
class Site extends QUI\QDOM
class Site extends QUI\QDOM implements QUI\Interfaces\Projects\Site
{
/**
* Edit site
......@@ -1201,6 +1201,8 @@ class Site extends QUI\QDOM
*/
public function delete()
{
QUI::getRewrite()->unregisterPath($this);
if ($this->getAttribute('id') == 1) {
return false;
}
......@@ -1308,6 +1310,13 @@ class Site extends QUI\QDOM
*/
public function getUrlRewrited($params = array())
{
$seperator = QUI\Rewrite::URL_PARAM_SEPERATOR;
if (isset($param['paramAsSites']) && $param['paramAsSites']) {
$seperator = '/';
unset($param['paramAsSites']);
}
if ($this->getId() == 1) {
if (empty($params)) {
return '';
......@@ -1319,7 +1328,7 @@ class Site extends QUI\QDOM
// somit kann ein url cache aufgebaut werden
foreach ($params as $param => $value) {
if (is_integer($param)) {
$url .= QUI\Rewrite::URL_PARAM_SEPERATOR.$value;
$url .= $seperator.$value;
continue;
}
......@@ -1328,12 +1337,11 @@ class Site extends QUI\QDOM
}
if (is_int($param)) {
$url .= QUI\Rewrite::URL_PARAM_SEPERATOR.$value;
$url .= $seperator.$value;
continue;
}
$url .= QUI\Rewrite::URL_PARAM_SEPERATOR.$param
.QUI\Rewrite::URL_PARAM_SEPERATOR.$value;
$url .= $seperator.$param.$seperator.$value;
}
if (isset($params['suffix'])) {
......@@ -1388,7 +1396,7 @@ class Site extends QUI\QDOM
foreach ($params as $param => $value) {
if (is_integer($param)) {
$url .= QUI\Rewrite::URL_PARAM_SEPERATOR.$value;
$url .= $seperator.$value;
continue;
}
......@@ -1397,12 +1405,11 @@ class Site extends QUI\QDOM
}
if (is_int($param)) {
$url .= QUI\Rewrite::URL_PARAM_SEPERATOR.$value;
$url .= $seperator.$value;
continue;
}
$url .= QUI\Rewrite::URL_PARAM_SEPERATOR.$param
.QUI\Rewrite::URL_PARAM_SEPERATOR.$value;
$url .= $seperator.$param.$seperator.$value;
}
if (isset($params['suffix'])) {
......
......@@ -300,6 +300,8 @@ class Edit extends Site
return;
}
QUI::getRewrite()->unregisterPath($this);
/**
* package destroy
*/
......@@ -1206,6 +1208,7 @@ class Edit extends Site
$link_cache_dir
= VAR_DIR.'cache/links/'.$Project->getAttribute('name').'/';
$link_cache_file
= $link_cache_dir.$this->getId().'_'.$Project->getAttribute('name')
.'_'.$Project->getAttribute('lang');
......
<?php
namespace QUI\Projects\Site;
/**
* main class for site extentions
*
* @author www.pcsg.de (Henning Leutz)
* @licence For copyright and license information, please view the /README.md
*/
abstract class Extend
{
}
\ No newline at end of file
This diff is collapsed.
......@@ -240,6 +240,7 @@ class Rewrite
if ($this->_template_str) {
$this->_project_prefix
= self::URL_PROJECT_CHARACTER.$this->_project_str;
$this->_project_prefix
.= self::URL_PROJECT_CHARACTER.$this->_template_str.'/';
}
......@@ -276,13 +277,13 @@ class Rewrite
$_url = $_new_url;
// Wenns ein Hosteintrag mit der Sprache gibt, dahin leiten
// und es nicht der https host ist
// @todo https host nicht über den port prüfen, zu ungenau
if (
isset($_SERVER['HTTP_HOST'])
&& isset($vhosts[$_SERVER['HTTP_HOST']])
&& isset($vhosts[$_SERVER['HTTP_HOST']][$this->_lang])
&& // und es nicht der https host ist
(int)$_SERVER['SERVER_PORT'] !== 443
&& (int)$_SERVER['SERVER_PORT'] !== 443
&& QUI::conf('globals', 'httpshost') !=
'https://'.$_SERVER['HTTP_HOST']
) {
......@@ -423,6 +424,17 @@ class Rewrite
$this->_site = $this->getSiteByUrl($_REQUEST['_url'], true);
} catch (QUI\Exception $Exception) {
$Site = $this->existRegisterPath($_REQUEST['_url'], $this->getProject());
if ($Site) {
$Site->setAttribute('canonical', $_REQUEST['_url']);
$this->_site = $Site;
return;
}
if ($this->showErrorHeader(404)) {
return;
}
......@@ -431,14 +443,13 @@ class Rewrite
}
// Sprachen Host finden
if (
isset($_SERVER['HTTP_HOST'])
// und es nicht der https host ist
if (isset($_SERVER['HTTP_HOST'])
&& isset($vhosts[$_SERVER['HTTP_HOST']])
&& isset($vhosts[$_SERVER['HTTP_HOST']][$this->_lang])
&& $_SERVER['HTTP_HOST']
!= $vhosts[$_SERVER['HTTP_HOST']][$this->_lang]
&& // und es nicht der https host ist
(int)$_SERVER['SERVER_PORT'] !== 443
&& (int)$_SERVER['SERVER_PORT'] !== 443
&& QUI::conf('globals', 'httpshost') !=
'https://'.$_SERVER['HTTP_HOST']
) {
......@@ -455,6 +466,7 @@ class Rewrite
$site_params = $this->site_params;
if (is_array($site_params) && isset($site_params[1])) {
for ($i = 1; $i < count($site_params); $i++) {
if ($i % 2 != 0) {
$value = false;
......@@ -490,8 +502,7 @@ class Rewrite
) {
$message = "\n\n===================================\n\n";
$message
.=
'Rewrite 301 bei der wir nicht wissen wann es kommt. Rewrite.php Zeile 391 '
.= 'Rewrite 301 bei der wir nicht wissen wann es kommt. Rewrite.php Zeile 391 '
."\n";
$message .= print_r($_SERVER, true);
......@@ -512,6 +523,7 @@ class Rewrite
$request_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI']
: '';
$pos = strpos($request_url, self::URL_PARAM_SEPERATOR);
$end = strpos($request_url, '.');
......@@ -613,8 +625,11 @@ class Rewrite
if (count($_url) <= 1) {
// Erste Ebene
$site_url = explode('.', $_url[0]);
$this->site_params = explode(self::URL_PARAM_SEPERATOR,
$site_url[0]);
$this->site_params = explode(
self::URL_PARAM_SEPERATOR,
$site_url[0]
);
// für was? :
// $this->_first_child->getAttribute('name') == str_replace('-', ' ', $this->site_params[0])
......@@ -638,6 +653,7 @@ class Rewrite
$Child = false;
foreach ($_url as $key => $val) {
if ($Child == false) {
$Child = $this->_first_child;
}
......@@ -1076,6 +1092,15 @@ class Rewrite
return in_array($id, $this->_ids_in_path) ? true : false;
}
/**
* @param $Site
*/
public function addSiteToPath($Site)
{
$this->_path[] = $Site;
array_push($this->_ids_in_path, $Site->getId());
}
/**
* Setzt eine Seite in den Path
*
......@@ -1163,7 +1188,6 @@ class Rewrite
return $this->_output_content;
}
/**
* Mail Protection gegen SPAM
* Wandelt die Mail Addressen so um das ein BOT nichts mit anfangen kann
......@@ -1240,6 +1264,7 @@ class Rewrite
$att['alt'] = $Image->getAttribute('alt')
? $Image->getAttribute('alt') : '';
$att['title'] = $Image->getAttribute('title')
? $Image->getAttribute('title') : '';
......@@ -1360,6 +1385,83 @@ class Rewrite
return $url;
}
/**
* Register a rewrite path
*
* @param string|array $paths
* @param \QUI\Projects\Site $Site
*/
public function registerPath($paths, $Site)
{
$Project = $Site->getProject();
$table = QUI::getDBProjectTableName('paths', $Project);
$this->unregisterPath($Site);
if (!is_array($paths)) {
$paths = array($paths);
}
foreach ($paths as $path) {
QUI::getDataBase()->insert($table, array(
'id' => $Site->getId(),
'path' => $path
));
}
}
/**
* Unregister a rewrite path
*
* @param \QUI\Projects\Site $Site
*/
public function unregisterPath($Site)
{
$Project = $Site->getProject();
$table = QUI::getDBProjectTableName('paths', $Project);
QUI::getDataBase()->delete($table, array(
'id' => $Site->getId()
));
}
/**