diff --git a/CHANGES.md b/CHANGES.md index 028c8565..133b0b56 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,12 +1,39 @@ # Changelog +## version 10.5.00 +- Modifications : + - Gestion des modules dans l'interface d'administration. + +## version 10.4.05 +- Mise à jour : + - SiteMapGenerator 4.3.1 +- Modifications : + - Bouton de remontée, position plus haute et zindex augmenté. +- Corrections : + - Marges du pied de page fixe placé en dehors du site. + - TinyMCE couleurs du sélecteur de paragraphe et de headers lorsque le fond est transparent. + - Thème administration, couleur du lien dans un bloc H4. + +## version 10.4.04 +- Correction : + - Module Blog : balise non fermée dans les commentaires. +- Modifications : + -Constantes de modules. + +## version 10.4.03 +- Corrections : + - En-tête html : absence de la langue. + - Suppression de la balise sémantique
. + - Génération image Opengraph, mauvaise redirection. + - Nouvelle structure de données articles de blog dans le sitemap. + ## version 10.4.02 - Corrections : - Thème : aperçu du site amélioré. - Thème : rétablissement du contrôle de l'import d'une version ancienne d'un thème. - Éditeur de texte : couleur de fond parasite quand une image en arrière-plan est sélectionnée. -## version 10.4.01 +## version 10.4.01 Corrections : - Module form, erreur de syntaxe. - Chargement d'un thème, désactivation du contrôle des clés. @@ -65,7 +92,7 @@ Correction : Corrections : - Conflit page inactive et droit d'un membre. - Module de recherche, correction dans les pages enfants. - - Module formulaire, perte des données en cas d'édition du fomulaire ou des champs. + - Module formulaire, perte des données en cas d'édition du formulaire ou des champs. Modification : - TinyMCE nettoyage init.js d'options non supportées. @@ -73,7 +100,7 @@ Modification : Corrections : - Configuration : persistance de l'ouverture des blocs. - Réinitialisation du mot de passe : - - Remise à zéro du timer après renouvèlement du mot de passe. + - Remise à zéro du timer après renouvellement du mot de passe. - Affichage de le fenêtre "Nouveau mot de passe" allégée. - Redirection sur la page d'accueil. - Modules news et blog : transparence icône RSS. diff --git a/README.md b/README.md index cb9d1c5f..54fc703b 100755 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# ZwiiCMS 10.4.02 +# ZwiiCMS 10.4.05 Zwii est un CMS sans base de données (flat-file) qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation. diff --git a/core/class/SitemapGenerator.class.php b/core/class/SitemapGenerator.class.php deleted file mode 100755 index f15350d0..00000000 --- a/core/class/SitemapGenerator.class.php +++ /dev/null @@ -1,540 +0,0 @@ -urls = new \SplFixedArray(); - $this->baseURL = $baseURL; - $this->basePath = $basePath; - $this->document = new \DOMDocument("1.0"); - $this->document->preserveWhiteSpace = false; - $this->document->formatOutput = true; - } - - /** - * Use this to add many URL at one time. - * Each inside array can have 1 to 4 fields. - * @param $urlsArray - * @throws \InvalidArgumentException - */ - public function addUrls($urlsArray) - { - if (!is_array($urlsArray)) { - throw new \InvalidArgumentException("Array as argument should be given."); - } - foreach ($urlsArray as $url) { - $this->addUrl( - isset($url[0]) ? $url[0] : null, - isset($url[1]) ? $url[1] : null, - isset($url[2]) ? $url[2] : null, - isset($url[3]) ? $url[3] : null - ); - } - } - - /** - * Use this to add single URL to sitemap. - * @param string $url URL - * @param \DateTime $lastModified When it was modified, use ISO 8601 - * @param string $changeFrequency How often search engines should revisit this URL - * @param string $priority Priority of URL on You site - * @see http://en.wikipedia.org/wiki/ISO_8601 - * @see http://php.net/manual/en/function.date.php - * @throws \InvalidArgumentException - */ - public function addUrl($url, \DateTime $lastModified = null, $changeFrequency = null, $priority = null) - { - if ($url == null) { - throw new \InvalidArgumentException("URL is mandatory. At least one argument should be given."); - } - $urlLength = extension_loaded('mbstring') ? mb_strlen($url) : strlen($url); - if ($urlLength > 2048) { - throw new \InvalidArgumentException( - "URL length can't be bigger than 2048 characters. - Note, that precise url length check is guaranteed only using mb_string extension. - Make sure Your server allow to use mbstring extension." - ); - } - $tmp = new \SplFixedArray(1); - - $tmp[self::URL_PARAM_LOC] = $url; - - if (isset($lastModified)) { - $tmp->setSize(2); - $tmp[self::URL_PARAM_LASTMOD] = $lastModified->format(\DateTime::ATOM); - } - - if (isset($changeFrequency)) { - $tmp->setSize(3); - $tmp[self::URL_PARAM_CHANGEFREQ] = $changeFrequency; - } - - if (isset($priority)) { - $tmp->setSize(4); - $tmp[self::URL_PARAM_PRIORITY] = $priority; - } - - if ($this->urls->getSize() === 0) { - $this->urls->setSize(1); - } else { - if ($this->urls->getSize() === $this->urls->key()) { - $this->urls->setSize($this->urls->getSize() * 2); - } - } - - $this->urls[$this->urls->key()] = $tmp; - $this->urls->next(); - } - - - /** - * @throws \BadMethodCallException - * @throws \InvalidArgumentException - * @throws \LengthException - */ - public function createSitemap() - { - if (!isset($this->urls)) { - throw new \BadMethodCallException("To create sitemap, call addUrl or addUrls function first."); - } - if ($this->maxURLsPerSitemap > self::MAX_URLS_PER_SITEMAP) { - throw new \InvalidArgumentException( - "More than " . self::MAX_URLS_PER_SITEMAP . " URLs per single sitemap is not allowed." - ); - } - $generatorInfo = ''; - - - $sitemapHeader = '' . $generatorInfo . ' - - '; - - $sitemapIndexHeader = '' . $generatorInfo . ' - - '; - - - $nullUrls = 0; - foreach ($this->urls as $url) { - if (is_null($url)) { - $nullUrls++; - } - } - - $nonEmptyUrls = $this->urls->getSize() - $nullUrls; - - $chunks = ceil($nonEmptyUrls / $this->maxURLsPerSitemap); - - for ($chunkCounter = 0; $chunkCounter < $chunks; $chunkCounter++) { - $xml = new \SimpleXMLElement($sitemapHeader); - for ($urlCounter = $chunkCounter * $this->maxURLsPerSitemap; - $urlCounter < ($chunkCounter + 1) * $this->maxURLsPerSitemap && $urlCounter < $nonEmptyUrls; - $urlCounter++ - ) { - $row = $xml->addChild('url'); - - $row->addChild( - 'loc', - htmlspecialchars($this->baseURL . $this->urls[$urlCounter][self::URL_PARAM_LOC], ENT_QUOTES, 'UTF-8') - ); - - if ($this->urls[$urlCounter]->getSize() > 1) { - $row->addChild('lastmod', $this->urls[$urlCounter][self::URL_PARAM_LASTMOD]); - } - if ($this->urls[$urlCounter]->getSize() > 2) { - $row->addChild('changefreq', $this->urls[$urlCounter][self::URL_PARAM_CHANGEFREQ]); - } - if ($this->urls[$urlCounter]->getSize() > 3) { - $row->addChild('priority', $this->urls[$urlCounter][self::URL_PARAM_PRIORITY]); - } - } - if (strlen($xml->asXML()) > self::MAX_FILE_SIZE) { - throw new \LengthException( - "Sitemap size equals to " . strlen($xml->asXML()) - . " bytes is more than 10MB (" . self::MAX_FILE_SIZE . " bytes), - please decrease maxURLsPerSitemap variable." - ); - } - $this->sitemaps[] = $xml->asXML(); - } - if (count($this->sitemaps) > $this->maxSitemaps) { - throw new \LengthException( - "Sitemap index can contain {$this->maxSitemaps} sitemaps. - Perhaps You trying to submit too many maps." - ); - } - if (count($this->sitemaps) > 1) { - for ($i = 0; $i < count($this->sitemaps); $i++) { - $this->sitemaps[$i] = array( - str_replace(".xml", ($i + 1) . ".xml", $this->sitemapFileName), - $this->sitemaps[$i] - ); - } - $xml = new \SimpleXMLElement($sitemapIndexHeader); - foreach ($this->sitemaps as $sitemap) { - $row = $xml->addChild('sitemap'); - $row->addChild('loc', $this->baseURL . "/" . $this->getSitemapFileName(htmlentities($sitemap[0]))); - $row->addChild('lastmod', date('c')); - } - $this->sitemapFullURL = $this->baseURL . "/" . $this->sitemapIndexFileName; - $this->sitemapIndex = array( - $this->sitemapIndexFileName, - $xml->asXML() - ); - } else { - $this->sitemapFullURL = $this->baseURL . "/" . $this->getSitemapFileName(); - - $this->sitemaps[0] = array( - $this->sitemapFileName, - $this->sitemaps[0] - ); - } - } - - - /** - * Returns created sitemaps as array of strings. - * Use it You want to work with sitemap without saving it as files. - * @return array of strings - * @access public - */ - public function toArray() - { - if (isset($this->sitemapIndex)) { - return array_merge(array($this->sitemapIndex), $this->sitemaps); - } else { - return $this->sitemaps; - } - } - - /** - * Will write sitemaps as files. - * @access public - * @throws \BadMethodCallException - */ - public function writeSitemap() - { - if (!isset($this->sitemaps)) { - throw new \BadMethodCallException("To write sitemap, call createSitemap function first."); - } - if (isset($this->sitemapIndex)) { - $this->document->loadXML($this->sitemapIndex[1]); - $this->writeFile($this->document->saveXML(), $this->basePath, $this->sitemapIndex[0], true); - foreach ($this->sitemaps as $sitemap) { - $this->writeFile($sitemap[1], $this->basePath, $sitemap[0]); - } - } else { - $this->document->loadXML($this->sitemaps[0][1]); - $this->writeFile($this->document->saveXML(), $this->basePath, $this->sitemaps[0][0], true); - $this->writeFile($this->sitemaps[0][1], $this->basePath, $this->sitemaps[0][0]); - } - } - - - private function getSitemapFileName($name = null) - { - if (!$name) { - $name = $this->sitemapFileName; - } - if ($this->createGZipFile) { - $name .= ".gz"; - } - return $name; - } - - /** - * Save file. - * @param string $content - * @param string $filePath - * @param string $fileName - * @param bool $noGzip - * @return bool - * @access private - */ - private function writeFile($content, $filePath, $fileName, $noGzip = false) - { - if (!$noGzip && $this->createGZipFile) { - return $this->writeGZipFile($content, $filePath, $fileName); - } - $file = fopen($filePath . $fileName, 'w'); - fwrite($file, $content); - return fclose($file); - } - - /** - * Save GZipped file. - * @param string $content - * @param string $filePath - * @param string $fileName - * @return bool - * @access private - */ - private function writeGZipFile($content, $filePath, $fileName) - { - $fileName .= '.gz'; - $file = gzopen($filePath . $fileName, 'w'); - gzwrite($file, $content); - return gzclose($file); - } - - /** - * If robots.txt file exist, will update information about newly created sitemaps. - * If there is no robots.txt will, create one and put into it information about sitemaps. - * @access public - * @throws \BadMethodCallException - */ - public function updateRobots() - { - if (!isset($this->sitemaps)) { - throw new \BadMethodCallException("To update robots.txt, call createSitemap function first."); - } - $sampleRobotsFile = "User-agent: *\nAllow: /"; - if (file_exists($this->basePath . $this->robotsFileName)) { - $robotsFile = explode("\n", file_get_contents($this->basePath . $this->robotsFileName)); - $robotsFileContent = ""; - foreach ($robotsFile as $key => $value) { - if (substr($value, 0, 8) == 'Sitemap:') { - unset($robotsFile[$key]); - } else { - $robotsFileContent .= $value . "\n"; - } - } - $robotsFileContent .= "Sitemap: $this->sitemapFullURL"; - if (!isset($this->sitemapIndex)) { - $robotsFileContent .= "\nSitemap: " . $this->getSitemapFileName($this->sitemapFullURL); - } - file_put_contents($this->basePath . $this->robotsFileName, $robotsFileContent); - } else { - $sampleRobotsFile = $sampleRobotsFile . "\n\nSitemap: " . $this->sitemapFullURL; - if (!isset($this->sitemapIndex)) { - $sampleRobotsFile .= "\nSitemap: " . $this->getSitemapFileName($this->sitemapFullURL); - } - file_put_contents($this->basePath . $this->robotsFileName, $sampleRobotsFile); - } - } - - /** - * Will inform search engines about newly created sitemaps. - * Google, Ask, Bing and Yahoo will be noticed. - * If You don't pass yahooAppId, Yahoo still will be informed, - * but this method can be used once per day. If You will do this often, - * message that limit was exceeded will be returned from Yahoo. - * @param string $yahooAppId Your site Yahoo appid. - * @return array of messages and http codes from each search engine - * @access public - * @throws \BadMethodCallException - */ - public function submitSitemap($yahooAppId = null) - { - if (!isset($this->sitemaps)) { - throw new \BadMethodCallException("To submit sitemap, call createSitemap function first."); - } - if (!extension_loaded('curl')) { - throw new \BadMethodCallException("cURL library is needed to do submission."); - } - $searchEngines = $this->searchEngines; - $searchEngines[0] = isset($yahooAppId) ? - str_replace("USERID", $yahooAppId, $searchEngines[0][0]) : - $searchEngines[0][1]; - $result = array(); - for ($i = 0; $i < count($searchEngines); $i++) { - $submitSite = curl_init($searchEngines[$i] . htmlspecialchars($this->sitemapFullURL, ENT_QUOTES, 'UTF-8')); - curl_setopt($submitSite, CURLOPT_RETURNTRANSFER, true); - $responseContent = curl_exec($submitSite); - $response = curl_getinfo($submitSite); - $submitSiteShort = array_reverse(explode(".", parse_url($searchEngines[$i], PHP_URL_HOST))); - $result[] = array( - "site" => $submitSiteShort[1] . "." . $submitSiteShort[0], - "fullsite" => $searchEngines[$i] . htmlspecialchars($this->sitemapFullURL, ENT_QUOTES, 'UTF-8'), - "http_code" => $response['http_code'], - "message" => str_replace("\n", " ", strip_tags($responseContent)) - ); - } - return $result; - } - - - /** - * Returns array of URLs - * - * Converts internal SplFixedArray to array - * @return array - */ - public function getUrls() - { - $urls = $this->urls->toArray(); - - /** - * @var int $key - * @var \SplFixedArray $urlSplArr - */ - foreach ($urls as $key => $urlSplArr) { - if (!is_null($urlSplArr)) { - $urlArr = $urlSplArr->toArray(); - $url = []; - foreach ($urlArr as $paramIndex => $paramValue) { - switch ($paramIndex) { - case static::URL_PARAM_LOC: - $url['loc'] = $paramValue; - break; - case static::URL_PARAM_CHANGEFREQ: - $url['changefreq'] = $paramValue; - break; - case static::URL_PARAM_LASTMOD: - $url['lastmod'] = $paramValue; - break; - case static::URL_PARAM_PRIORITY: - $url['priority'] = $paramValue; - break; - default: - break; - } - } - $urls[$key] = $url; - } - } - - return $urls; - } - - public function countUrls() - { - return $this->urls->getSize(); - } -} diff --git a/core/class/autoload.php b/core/class/autoload.php index a9d16ed4..ac507c05 100755 --- a/core/class/autoload.php +++ b/core/class/autoload.php @@ -4,7 +4,9 @@ class autoload { public static function autoloader () { require_once 'core/class/helper.class.php'; require_once 'core/class/template.class.php'; - require_once 'core/class/SitemapGenerator.class.php'; + require_once 'core/class/sitemap/Runtime.class.php'; + require_once 'core/class/sitemap/FileSystem.class.php'; + require_once 'core/class/sitemap/SitemapGenerator.class.php'; require_once 'core/class/phpmailer/PHPMailer.class.php'; require_once 'core/class/phpmailer/Exception.class.php'; require_once 'core/class/phpmailer/SMTP.class.php'; diff --git a/core/class/helper.class.php b/core/class/helper.class.php index 396208ec..503ea941 100755 --- a/core/class/helper.class.php +++ b/core/class/helper.class.php @@ -1,4 +1,5 @@ $value) { + // Dossier non vide + if (file_exists('module/' . $value . '/' . $value . '.php')) { + // Lire les constantes en gérant les erreurs de nom de classe + try { + $class_reflex = new \ReflectionClass($value); + $class_constants = $class_reflex->getConstants(); + // Constante REALNAME + if (array_key_exists('REALNAME', $class_constants)) { + $realName = $value::REALNAME; + } else { + $realName = ucfirst($value); + } + // Constante VERSION + if (array_key_exists('VERSION', $class_constants)) { + $version = $value::VERSION; + } else { + $version = '0.0'; + } + // Constante UPDATE + if (array_key_exists('UPDATE', $class_constants)) { + $update = $value::UPDATE; + } else { + $update = '0.0'; + } + // Constante DELETE + if (array_key_exists('DELETE', $class_constants)) { + $delete = $value::DELETE; + } else { + $delete = true; + } + // Constante DATADIRECTORY + if ( array_key_exists('DATADIRECTORY', $class_constants) + && $class_constants['DATADIRECTORY'] !== [] + && is_array($class_constants['DATADIRECTORY']) + ) { + $dataDirectory = $value::DATADIRECTORY; + } else { + $dataDirectory = []; + } + // Affection + $modules [$value] = [ + 'realName' => $realName, + 'version' => $version, + 'update' => $update, + 'delete' => $delete, + 'dataDirectory' => $dataDirectory + ]; + + } catch (Exception $e){ + // on ne fait rien + } + } + } + return($modules); + } + + + /** * Retourne true si le protocole est en TLS * @return bool @@ -504,4 +574,4 @@ class helper { return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv); } -} \ No newline at end of file +} diff --git a/core/class/sitemap/FileSystem.class.php b/core/class/sitemap/FileSystem.class.php new file mode 100755 index 00000000..261102c6 --- /dev/null +++ b/core/class/sitemap/FileSystem.class.php @@ -0,0 +1,36 @@ +\n") + private $sitemapUrlCount = 0; + private $generatedFiles = []; + + /** + * @param string $baseURL You site URL + * @param string $basePath Relative path where sitemap and robots should be stored. + * @param FileSystem|null $fs + * @param Runtime|null $runtime + */ + public function __construct(string $baseURL, string $basePath = "", FileSystem $fs = null, Runtime $runtime = null) + { + $this->urls = []; + $this->baseURL = rtrim($baseURL, '/'); + + if ($fs === null) { + $this->fs = new FileSystem(); + } else { + $this->fs = $fs; + } + + if ($runtime === null) { + $this->runtime = new Runtime(); + } else { + $this->runtime = $runtime; + } + + if ($this->runtime->is_writable($basePath) === false) { + throw new InvalidArgumentException( + sprintf('the provided basePath (%s) should be a writable directory,', $basePath) . + ' please check its existence and permissions' + ); + } + if (strlen($basePath) > 0 && substr($basePath, -1) != DIRECTORY_SEPARATOR) { + $basePath = $basePath . DIRECTORY_SEPARATOR; + } + $this->basePath = $basePath; + + $this->xmlWriter = $this->createXmlWriter(); + $this->flushedSitemapFilenameFormat = sprintf("sm-%%d-%d.xml", time()); + } + + private function createXmlWriter(): XMLWriter + { + $w = new XMLWriter(); + $w->openMemory(); + $w->setIndent(true); + return $w; + } + + /** + * @param string $filename + * @return SitemapGenerator + */ + public function setSitemapFilename(string $filename = ''): SitemapGenerator + { + if (strlen($filename) === 0) { + throw new InvalidArgumentException('sitemap filename should not be empty'); + } + if (pathinfo($filename, PATHINFO_EXTENSION) !== 'xml') { + throw new InvalidArgumentException('sitemap filename should have *.xml extension'); + } + $this->sitemapFileName = $filename; + return $this; + } + + /** + * @param string $filename + * @return $this + */ + public function setSitemapIndexFilename(string $filename = ''): SitemapGenerator + { + if (strlen($filename) === 0) { + throw new InvalidArgumentException('filename should not be empty'); + } + $this->sitemapIndexFileName = $filename; + return $this; + } + + /** + * @param string $filename + * @return $this + */ + public function setRobotsFileName(string $filename): SitemapGenerator + { + if (strlen($filename) === 0) { + throw new InvalidArgumentException('filename should not be empty'); + } + $this->robotsFileName = $filename; + return $this; + } + + /** + * @param int $value + * @return $this + */ + public function setMaxUrlsPerSitemap(int $value): SitemapGenerator + { + if ($value < 1 || self::MAX_URLS_PER_SITEMAP < $value) { + throw new OutOfRangeException( + sprintf('value %d is out of range 1-%d', $value, self::MAX_URLS_PER_SITEMAP) + ); + } + $this->maxUrlsPerSitemap = $value; + return $this; + } + + public function enableCompression(): SitemapGenerator + { + $this->isCompressionEnabled = true; + return $this; + } + + public function disableCompression(): SitemapGenerator + { + $this->isCompressionEnabled = false; + return $this; + } + + public function isCompressionEnabled(): bool + { + return $this->isCompressionEnabled; + } + + public function validate( + string $path, + DateTime $lastModified = null, + string $changeFrequency = null, + float $priority = null, + array $alternates = null, + array $extensions = []) + { + if (!(1 <= mb_strlen($path) && mb_strlen($path) <= self::MAX_URL_LEN)) { + throw new InvalidArgumentException( + sprintf("The urlPath argument length must be between 1 and %d.", self::MAX_URL_LEN) + ); + } + if ($changeFrequency !== null && !in_array($changeFrequency, $this->validChangefreqValues)) { + throw new InvalidArgumentException( + 'The change frequency argument should be one of: %s' . implode(',', $this->validChangefreqValues) + ); + } + if ($priority !== null && !in_array($priority, $this->validPriorities)) { + throw new InvalidArgumentException("Priority argument should be a float number in the range [0.0..1.0]"); + } + if ($extensions !== null && isset($extensions['google_video'])) { + GoogleVideoExtension::validate($this->baseURL . $path, $extensions['google_video']); + } + } + + /** + * Add url components. + * Instead of storing all urls in the memory, the generator will flush sets of added urls + * to the temporary files created on your disk. + * The file format is 'sm-{index}-{timestamp}.xml' + * @param string $path + * @param DateTime|null $lastModified + * @param string|null $changeFrequency + * @param float|null $priority + * @param array|null $alternates + * @param array $extensions + * @return $this + */ + public function addURL( + string $path, + DateTime $lastModified = null, + string $changeFrequency = null, + float $priority = null, + array $alternates = null, + array $extensions = [] + ): SitemapGenerator + { + $this->validate($path, $lastModified, $changeFrequency, $priority, $alternates, $extensions); + + if ($this->totalUrlCount >= self::TOTAL_MAX_URLS) { + throw new OutOfRangeException( + sprintf("Max url limit reached (%d)", self::TOTAL_MAX_URLS) + ); + } + if ($this->isSitemapStarted === false) { + $this->writeSitemapStart(); + } + + $this->writeSitemapUrl($this->baseURL . $path, $lastModified, $changeFrequency, $priority, $alternates, $extensions); + + if ($this->totalUrlCount % 1000 === 0 || $this->sitemapUrlCount >= $this->maxUrlsPerSitemap) { + $this->flushWriter(); + } + + if ($this->sitemapUrlCount === $this->maxUrlsPerSitemap) { + $this->writeSitemapEnd(); + } + + return $this; + } + + private function writeSitemapStart() + { + $this->xmlWriter->startDocument("1.0", "UTF-8"); + $this->xmlWriter->writeComment(sprintf('generator-class="%s"', get_class($this))); + $this->xmlWriter->writeComment(sprintf('generator-version="%s"', $this->classVersion)); + $this->xmlWriter->writeComment(sprintf('generated-on="%s"', date('c'))); + $this->xmlWriter->startElement('urlset'); + $this->xmlWriter->writeAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9'); + $this->xmlWriter->writeAttribute('xmlns:xhtml', 'http://www.w3.org/1999/xhtml'); + $this->xmlWriter->writeAttribute('xmlns:video', 'http://www.google.com/schemas/sitemap-video/1.1'); + $this->xmlWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); + $this->xmlWriter->writeAttribute('xsi:schemaLocation', 'http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'); + $this->isSitemapStarted = true; + } + + private function writeSitemapUrl($loc, $lastModified, $changeFrequency, $priority, $alternates, $extensions) + { + $this->xmlWriter->startElement('url'); + $this->xmlWriter->writeElement('loc', htmlspecialchars($loc, ENT_QUOTES)); + + if ($lastModified !== null) { + $this->xmlWriter->writeElement('lastmod', $lastModified->format(DateTime::ATOM)); + } + + if ($changeFrequency !== null) { + $this->xmlWriter->writeElement('changefreq', $changeFrequency); + } + + if ($priority !== null) { + $this->xmlWriter->writeElement('priority', number_format($priority, 1, ".", "")); + } + + if (is_array($alternates) && count($alternates) > 0) { + foreach ($alternates as $alternate) { + if (is_array($alternate) && isset($alternate['hreflang']) && isset($alternate['href'])) { + $this->xmlWriter->startElement('xhtml:link'); + $this->xmlWriter->writeAttribute('rel', 'alternate'); + $this->xmlWriter->writeAttribute('hreflang', $alternate['hreflang']); + $this->xmlWriter->writeAttribute('href', $alternate['href']); + $this->xmlWriter->endElement(); + } + } + } + + foreach ($extensions as $extName => $extFields) { + if ($extName === 'google_video') { + GoogleVideoExtension::writeVideoTag($this->xmlWriter, $loc, $extFields); + } + } + + $this->xmlWriter->endElement(); // url + $this->sitemapUrlCount++; + $this->totalUrlCount++; + } + + private function flushWriter() + { + $targetSitemapFilepath = $this->basePath . sprintf($this->flushedSitemapFilenameFormat, $this->flushedSitemapCounter); + $flushedString = $this->xmlWriter->outputMemory(true); + $flushedStringLen = mb_strlen($flushedString); + + if ($flushedStringLen === 0) { + return; + } + + $this->flushedSitemapSize += $flushedStringLen; + + if ($this->flushedSitemapSize > self::MAX_FILE_SIZE - $this->urlsetClosingTagLen) { + $this->writeSitemapEnd(); + $this->writeSitemapStart(); + } + $this->fs->file_put_contents($targetSitemapFilepath, $flushedString, FILE_APPEND); + } + + private function writeSitemapEnd() + { + $targetSitemapFilepath = $this->basePath . sprintf($this->flushedSitemapFilenameFormat, $this->flushedSitemapCounter); + $this->xmlWriter->endElement(); // urlset + $this->xmlWriter->endDocument(); + $this->fs->file_put_contents($targetSitemapFilepath, $this->xmlWriter->flush(true), FILE_APPEND); + $this->isSitemapStarted = false; + $this->flushedSitemaps[] = $targetSitemapFilepath; + $this->flushedSitemapCounter++; + $this->sitemapUrlCount = 0; + } + + /** + * Flush all stored urls from memory to the disk and close all necessary tags. + */ + public function flush() + { + $this->flushWriter(); + if ($this->isSitemapStarted) { + $this->writeSitemapEnd(); + } + } + + /** + * Move flushed files to their final location. Compress if necessary. + */ + public function finalize() + { + $this->generatedFiles = []; + + if (count($this->flushedSitemaps) === 1) { + $targetSitemapFilename = $this->sitemapFileName; + if ($this->isCompressionEnabled) { + $targetSitemapFilename .= '.gz'; + } + + $targetSitemapFilepath = $this->basePath . $targetSitemapFilename; + + if ($this->isCompressionEnabled) { + $this->fs->copy($this->flushedSitemaps[0], 'compress.zlib://' . $targetSitemapFilepath); + $this->fs->unlink($this->flushedSitemaps[0]); + } else { + $this->fs->rename($this->flushedSitemaps[0], $targetSitemapFilepath); + } + $this->generatedFiles['sitemaps_location'] = [$targetSitemapFilepath]; + $this->generatedFiles['sitemaps_index_url'] = $this->baseURL . '/' . $targetSitemapFilename; + } else if (count($this->flushedSitemaps) > 1) { + $ext = '.' . pathinfo($this->sitemapFileName, PATHINFO_EXTENSION); + $targetExt = $ext; + if ($this->isCompressionEnabled) { + $targetExt .= '.gz'; + } + + $sitemapsUrls = []; + $targetSitemapFilepaths = []; + foreach ($this->flushedSitemaps as $i => $flushedSitemap) { + $targetSitemapFilename = str_replace($ext, ($i + 1) . $targetExt, $this->sitemapFileName); + $targetSitemapFilepath = $this->basePath . $targetSitemapFilename; + + if ($this->isCompressionEnabled) { + $this->fs->copy($flushedSitemap, 'compress.zlib://' . $targetSitemapFilepath); + $this->fs->unlink($flushedSitemap); + } else { + $this->fs->rename($flushedSitemap, $targetSitemapFilepath); + } + $sitemapsUrls[] = htmlspecialchars($this->baseURL . '/' . $targetSitemapFilename, ENT_QUOTES); + $targetSitemapFilepaths[] = $targetSitemapFilepath; + } + + $targetSitemapIndexFilepath = $this->basePath . $this->sitemapIndexFileName; + $this->createSitemapIndex($sitemapsUrls, $targetSitemapIndexFilepath); + $this->generatedFiles['sitemaps_location'] = $targetSitemapFilepaths; + $this->generatedFiles['sitemaps_index_location'] = $targetSitemapIndexFilepath; + $this->generatedFiles['sitemaps_index_url'] = $this->baseURL . '/' . $this->sitemapIndexFileName; + } else { + throw new RuntimeException('failed to finalize, please add urls and flush first'); + } + } + + private function createSitemapIndex($sitemapsUrls, $sitemapIndexFileName) + { + $this->xmlWriter->flush(true); + $this->writeSitemapIndexStart(); + foreach ($sitemapsUrls as $sitemapsUrl) { + $this->writeSitemapIndexUrl($sitemapsUrl); + } + $this->writeSitemapIndexEnd(); + $this->fs->file_put_contents( + $sitemapIndexFileName, + $this->xmlWriter->flush(true), + FILE_APPEND + ); + } + + private function writeSitemapIndexStart() + { + $this->xmlWriter->startDocument("1.0", "UTF-8"); + $this->xmlWriter->writeComment(sprintf('generator-class="%s"', get_class($this))); + $this->xmlWriter->writeComment(sprintf('generator-version="%s"', $this->classVersion)); + $this->xmlWriter->writeComment(sprintf('generated-on="%s"', date('c'))); + $this->xmlWriter->startElement('sitemapindex'); + $this->xmlWriter->writeAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9'); + $this->xmlWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); + $this->xmlWriter->writeAttribute('xsi:schemaLocation', 'http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'); + } + + private function writeSitemapIndexUrl($url) + { + $this->xmlWriter->startElement('sitemap'); + $this->xmlWriter->writeElement('loc', htmlspecialchars($url, ENT_QUOTES)); + $this->xmlWriter->writeElement('lastmod', date('c')); + $this->xmlWriter->endElement(); // sitemap + } + + private function writeSitemapIndexEnd() + { + $this->xmlWriter->endElement(); // sitemapindex + $this->xmlWriter->endDocument(); + } + + /** + * @return array Array of previously generated files + */ + public function getGeneratedFiles(): array + { + return $this->generatedFiles; + } + + /** + * Will inform search engines about newly created sitemaps. + * Google, Ask, Bing and Yahoo will be noticed. + * If You don't pass yahooAppId, Yahoo still will be informed, + * but this method can be used once per day. If You will do this often, + * message that limit was exceeded will be returned from Yahoo. + * @param string $yahooAppId Your site Yahoo appid. + * @return array of messages and http codes from each search engine + * @access public + * @throws BadMethodCallException + */ + public function submitSitemap($yahooAppId = null): array + { + if (count($this->generatedFiles) === 0) { + throw new BadMethodCallException("To update robots.txt, call finalize() first."); + } + if (!$this->runtime->extension_loaded('curl')) { + throw new BadMethodCallException("cURL extension is needed to do submission."); + } + $searchEngines = $this->searchEngines; + $searchEngines[0] = isset($yahooAppId) ? + str_replace("USERID", $yahooAppId, $searchEngines[0][0]) : + $searchEngines[0][1]; + $result = []; + for ($i = 0; $i < count($searchEngines); $i++) { + $submitUrl = $searchEngines[$i] . htmlspecialchars($this->generatedFiles['sitemaps_index_url'], ENT_QUOTES); + $submitSite = $this->runtime->curl_init($submitUrl); + $this->runtime->curl_setopt($submitSite, CURLOPT_RETURNTRANSFER, true); + $responseContent = $this->runtime->curl_exec($submitSite); + $response = $this->runtime->curl_getinfo($submitSite); + $submitSiteShort = array_reverse(explode(".", parse_url($searchEngines[$i], PHP_URL_HOST))); + $result[] = [ + "site" => $submitSiteShort[1] . "." . $submitSiteShort[0], + "fullsite" => $submitUrl, + "http_code" => $response['http_code'], + "message" => str_replace("\n", " ", strip_tags($responseContent)), + ]; + } + return $result; + } + + /** + * Adds sitemap url to robots.txt file located in basePath. + * If robots.txt file exists, + * the function will append sitemap url to file. + * If robots.txt does not exist, + * the function will create new robots.txt file with sample content and sitemap url. + * @access public + * @throws BadMethodCallException + * @throws RuntimeException + */ + public function updateRobots(): SitemapGenerator + { + if (count($this->generatedFiles) === 0) { + throw new BadMethodCallException("To update robots.txt, call finalize() first."); + } + + $robotsFilePath = $this->basePath . $this->robotsFileName; + + $robotsFileContent = $this->createNewRobotsContentFromFile($robotsFilePath); + + $this->fs->file_put_contents($robotsFilePath, $robotsFileContent); + + return $this; + } + + /** + * @param $filepath + * @return string + */ + private function createNewRobotsContentFromFile($filepath): string + { + if ($this->fs->file_exists($filepath)) { + $robotsFileContent = ""; + $robotsFile = explode(PHP_EOL, $this->fs->file_get_contents($filepath)); + foreach ($robotsFile as $key => $value) { + if (substr($value, 0, 8) == 'Sitemap:') { + unset($robotsFile[$key]); + } else { + $robotsFileContent .= $value . PHP_EOL; + } + } + } else { + $robotsFileContent = $this->getSampleRobotsContent(); + } + + $robotsFileContent .= "Sitemap: {$this->generatedFiles['sitemaps_index_url']}"; + + return $robotsFileContent; + } + + /** + * @return string + * @access private + */ + private function getSampleRobotsContent(): string + { + return implode(PHP_EOL, $this->sampleRobotsLines) . PHP_EOL; + } +} diff --git a/core/core.js.php b/core/core.js.php index 09bfb0dd..456cd067 100755 --- a/core/core.js.php +++ b/core/core.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/core.php b/core/core.php index e0602d7c..bb4a00b4 100755 --- a/core/core.php +++ b/core/core.php @@ -1,15 +1,15 @@ * @copyright Copyright (C) 2008-2018, Rémi Jean - * @license GNU General Public License, version 3 * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez + * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ @@ -44,7 +44,7 @@ class common { const ACCESS_TIMER = 1800; // Numéro de version - const ZWII_VERSION = '10.4.02'; + const ZWII_VERSION = '10.5.00'; const ZWII_UPDATE_CHANNEL = "v10"; public static $actions = []; @@ -56,7 +56,8 @@ class common { 'sitemap', 'theme', 'user', - 'translate' + 'translate', + 'addon' ]; public static $accessList = [ 'user', @@ -603,7 +604,7 @@ class common { $this->setData(['theme',$tempData['theme']]); // Import des users sauvegardés si option active - if ($keepUsers === false + if ($keepUsers === false AND $tempData['user'] !== NULL) { $this->setData(['user',$tempData['user']]); } @@ -740,22 +741,26 @@ class common { $timezone = $this->getData(['config','timezone']); - $sitemap = new \Icamys\SitemapGenerator\SitemapGenerator(helper::baseurl()); + $outputDir = getcwd(); + + $sitemap = new \Icamys\SitemapGenerator\SitemapGenerator(helper::baseurl(false),$outputDir); // will create also compressed (gzipped) sitemap - $sitemap->createGZipFile = true; + $sitemap->enableCompression(); // determine how many urls should be put into one file // according to standard protocol 50000 is maximum value (see http://www.sitemaps.org/protocol.html) - $sitemap->maxURLsPerSitemap = 50000; + $sitemap->setMaxUrlsPerSitemap(50000); // sitemap file name - $sitemap->sitemapFileName = "sitemap.xml"; + $sitemap->setSitemapFileName("sitemap.xml"); + + // Set the sitemap index file name + $sitemap->setSitemapIndexFileName("sitemap-index.xml"); $datetime = new DateTime(date('c')); $datetime->format(DateTime::ATOM); // Updated ISO8601 - // sitemap index file name - $sitemap->sitemapIndexFileName = "sitemap-index.xml"; + foreach($this->getHierarchy(null, null, null) as $parentPageId => $childrenPageIds) { // Exclure les barres et les pages non publiques et les pages masquées if ($this->getData(['page',$parentPageId,'group']) !== 0 || @@ -766,6 +771,16 @@ class common { if ($this->getData(['page', $parentPageId, 'disable']) !== true ) { $sitemap->addUrl ($parentPageId,$datetime); } + // Articles du blog + if ($this->getData(['page', $parentPageId, 'moduleId']) === 'blog' && + !empty($this->getData(['module',$parentPageId])) ) { + foreach($this->getData(['module',$parentPageId,'posts']) as $articleId => $article) { + if($this->getData(['module',$parentPageId,'posts',$articleId,'state']) === true) { + $date = $this->getData(['module',$parentPageId,'posts',$articleId,'publishedOn']); + $sitemap->addUrl( $parentPageId . '/' . $articleId , new DateTime("@{$date}",new DateTimeZone($timezone))); + } + } + } // Sous-pages foreach($childrenPageIds as $childKey) { if ($this->getData(['page',$childKey,'group']) !== 0 || $this->getData(['page', $childKey, 'disable']) === true) { @@ -776,31 +791,28 @@ class common { // La sous-page est un blog if ($this->getData(['page', $childKey, 'moduleId']) === 'blog' && !empty($this->getData(['module',$childKey])) ) { - foreach($this->getData(['module',$childKey]) as $articleId => $article) { - if($this->getData(['module',$childKey,$articleId,'state']) === true) { - $date = $this->getData(['module',$childKey,$articleId,'publishedOn']); + foreach($this->getData(['module',$childKey,'posts']) as $articleId => $article) { + if($this->getData(['module',$childKey,'posts',$articleId,'state']) === true) { + $date = $this->getData(['module',$childKey,'posts',$articleId,'publishedOn']); $sitemap->addUrl( $childKey . '/' . $articleId , new DateTime("@{$date}",new DateTimeZone($timezone))); } } } } - // Articles du blog - if ($this->getData(['page', $parentPageId, 'moduleId']) === 'blog' && - !empty($this->getData(['module',$parentPageId])) ) { - foreach($this->getData(['module',$parentPageId]) as $articleId => $article) { - if($this->getData(['module',$parentPageId,$articleId,'state']) === true) { - $date = $this->getData(['module',$parentPageId,$articleId,'publishedOn']); - $sitemap->addUrl( $parentPageId . '/' . $articleId , new DateTime("@{$date}",new DateTimeZone($timezone))); - } - } - } + } - // generating internally a sitemap - $sitemap->createSitemap(); + // Flush all stored urls from memory to the disk and close all necessary tags. + $sitemap->flush(); - // writing early generated sitemap to file - $sitemap->writeSitemap(); + // Move flushed files to their final location. Compress if the option is enabled. + $sitemap->finalize(); + + // Update robots.txt file in output directory or create a new one + $sitemap->updateRobots(); + + // Submit your sitemaps to Google, Yahoo, Bing and Ask.com + $sitemap->submitSitemap(); return(file_exists('sitemap.xml')); @@ -1008,11 +1020,43 @@ class common { * @param string URL du dossier à supprimer */ public function removeDir ( $path ) { - foreach ( new DirectoryIterator($path) as $item ): - if ( $item->isFile() ) unlink($item->getRealPath()); + foreach ( new DirectoryIterator($path) as $item ) { + if ( $item->isFile() ) @unlink($item->getRealPath()); if ( !$item->isDot() && $item->isDir() ) $this->removeDir($item->getRealPath()); - endforeach; - rmdir($path); + } + return ( rmdir($path) ); + } + + + /** + * Génère une archive d'un dossier et des sous-dossiers + * @param string fileName path et nom de l'archive + * @param string folder path à zipper + * @param array filter dossiers à exclure + */ + public function makeZip ($fileName, $folder, $filter ) { + $zip = new ZipArchive(); + $zip->open($fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE); + //$directory = 'site/'; + $files = new RecursiveIteratorIterator( + new RecursiveCallbackFilterIterator( + new RecursiveDirectoryIterator( + $folder, + RecursiveDirectoryIterator::SKIP_DOTS + ), + function ($fileInfo, $key, $iterator) use ($filter) { + return $fileInfo->isFile() || !in_array($fileInfo->getBaseName(), $filter); + } + ) + ); + foreach ($files as $name => $file) { + if (!$file->isDir()) { + $filePath = $file->getRealPath(); + $relativePath = substr($filePath, strlen(realpath($folder)) + 1); + $zip->addFile($filePath, $relativePath); + } + } + $zip->close(); } /** @@ -1562,10 +1606,15 @@ class common { $this->setData(['core', 'dataVersion', 10400]); - /** - * mettre à jour defaultdata - */ + } + // Version 10.4.05 + if ($this->getData(['core', 'dataVersion']) < 10405) { + // Mise à jour forcée des thèmes + unlink (self::DATA_DIR . 'admin.css'); + unlink (self::DATA_DIR . 'theme.css'); + + $this->setData(['core', 'dataVersion', 10405]); } } } @@ -1652,14 +1701,14 @@ class core extends common { $css .= 'body{font-family:"' . str_replace('+', ' ', $this->getData(['theme', 'text', 'font'])) . '",sans-serif}'; if($themeBodyImage = $this->getData(['theme', 'body', 'image'])) { // Image dans html pour éviter les déformations. - $css .= 'html{background-image:url("../file/source/' . $themeBodyImage . '");background-position:' . $this->getData(['theme', 'body', 'imagePosition']) . ';background-attachment:' . $this->getData(['theme', 'body', 'imageAttachment']) . ';background-size:' . $this->getData(['theme', 'body', 'imageSize']) . ';background-repeat:' . $this->getData(['theme', 'body', 'imageRepeat']) . '}'; + $css .= 'html, .mce-menu.mce-in.mce-animate {background-image:url("../file/source/' . $themeBodyImage . '");background-position:' . $this->getData(['theme', 'body', 'imagePosition']) . ';background-attachment:' . $this->getData(['theme', 'body', 'imageAttachment']) . ';background-size:' . $this->getData(['theme', 'body', 'imageSize']) . ';background-repeat:' . $this->getData(['theme', 'body', 'imageRepeat']) . '}'; // Couleur du body transparente - $css .= 'body{background-color: rgba(0,0,0,0)}'; + $css .= 'body, .mce-menu.mce-in.mce-animate{background-color: rgba(0,0,0,0)}'; } else { // Pas d'image couleur du body - $css .= 'html{background-color:' . $colors['normal'] . ';}'; + $css .= 'html, .mce-menu.mce-in.mce-animate{background-color:' . $colors['normal'] . ';}'; // Même couleur dans le fond de l'éditeur - $css .= 'div.mce-edit-area{background-color:' . $colors['normal'] . ' !important}'; + $css .= 'div.mce-edit-area {background-color:' . $colors['normal'] . ' !important}'; } // Icône BacktoTop $css .= '#backToTop {background-color:' .$this->getData(['theme', 'body', 'toTopbackgroundColor']). ';color:'.$this->getData(['theme', 'body', 'toTopColor']).';}'; @@ -1667,7 +1716,7 @@ class core extends common { $colors = helper::colorVariants($this->getData(['theme', 'text', 'linkColor'])); $css .= 'a{color:' . $colors['normal'] . '}'; // Couleurs de site dans TinyMCe - $css .= 'div.mce-edit-area{font-family:"' . str_replace('+', ' ', $this->getData(['theme', 'text', 'font'])) . '",sans-serif}'; + $css .= 'div.mce-edit-area {font-family:"' . str_replace('+', ' ', $this->getData(['theme', 'text', 'font'])) . '",sans-serif}'; // Site dans TinyMCE $css .= '.editorWysiwyg {background-color:' . $this->getData(['theme', 'site', 'backgroundColor']) . ';}'; //$css .= 'a:hover:not(.inputFile, button){color:' . $colors['darken'] . '}'; @@ -1680,8 +1729,23 @@ class core extends common { //$css .= '.button.buttonGrey,.button.buttonGrey:hover{color:' . $this->getData(['theme', 'text', 'textColor']) . '}'; $css .= '.container{max-width:' . $this->getData(['theme', 'site', 'width']) . '}'; $margin = $this->getData(['theme', 'site', 'margin']) ? '0' : '20px'; - $css .= $this->getData(['theme', 'site', 'width']) === '100%' ? '#site.light{margin:5% auto !important;}#site{margin:0 auto !important;} body{margin:0 auto !important;} #bar{margin:0 auto !important;} body > header{margin:0 auto !important;} body > nav {margin: 0 auto !important;} body > footer {margin:0 auto !important;}': "#site.light{margin: 5% auto !important;}#site{margin: " . $margin . " auto !important;} body{margin:0px 10px;} #bar{margin: 0 -10px;} body > header{margin: 0 -10px;} body > nav {margin: 0 -10px;} body > footer {margin: 0 -10px;} "; - $css .= $this->getData(['theme', 'site', 'width']) === '750px' ? '.button, button{font-size:0.8em;}' : ''; + // Marge supplémentaire lorsque le pied de page est fixe + if ( $this->getData(['theme', 'footer', 'fixed']) === true && + $this->getData(['theme', 'footer', 'position']) === 'body') { + //$css .= '@media (min-width: 769px) { #site {margin-bottom: ' . ((str_replace ('px', '', $this->getData(['theme', 'footer', 'height']) ) * 2 ) + 31 ) . 'px}}'; + //$css .= '@media (max-width: 768px) { #site {margin-bottom: ' . ((str_replace ('px', '', $this->getData(['theme', 'footer', 'height']) ) * 2 ) + 93 ) . 'px}}'; + $marginBottomLarge = ((str_replace ('px', '', $this->getData(['theme', 'footer', 'height']) ) * 2 ) + 31 ) . 'px'; + $marginBottomSmall = ((str_replace ('px', '', $this->getData(['theme', 'footer', 'height']) ) * 2 ) + 93 ) . 'px'; + } else { + $marginBottomSmall = $margin; + $marginBottomLarge = $margin; + } + $css .= $this->getData(['theme', 'site', 'width']) === '100%' + ? '@media (min-width: 769px) {#site{margin:0 auto 0 ' . $marginBottomLarge . ' !important;}}@media (max-width: 768px) {#site{margin:0 auto 0 ' . $marginBottomSmall . ' !important;}}#site.light{margin:5% auto !important;} body{margin:0 auto !important;} #bar{margin:0 auto !important;} body > header{margin:0 auto !important;} body > nav {margin: 0 auto !important;} body > footer {margin:0 auto !important;}' + : '@media (min-width: 769px) {#site{margin: ' . $margin . ' auto ' . $marginBottomLarge . ' auto !important;}}@media (max-width: 768px) {#site{margin: ' . $margin . ' auto ' . $marginBottomSmall . ' auto !important;}}#site.light{margin: 5% auto !important;} body{margin:0px 10px;} #bar{margin: 0 -10px;} body > header{margin: 0 -10px;} body > nav {margin: 0 -10px;} body > footer {margin: 0 -10px;} '; + $css .= $this->getData(['theme', 'site', 'width']) === '750px' + ? '.button, button{font-size:0.8em;}' + : ''; $css .= '#site{background-color:' . $this->getData(['theme', 'site', 'backgroundColor']) . ';border-radius:' . $this->getData(['theme', 'site', 'radius']) . ';box-shadow:' . $this->getData(['theme', 'site', 'shadow']) . ' #212223;}'; $colors = helper::colorVariants($this->getData(['theme', 'button', 'backgroundColor'])); $css .= '.speechBubble,.button,.button:hover,button[type=\'submit\'],.pagination a,.pagination a:hover,input[type=\'checkbox\']:checked + label:before,input[type=\'radio\']:checked + label:before,.helpContent{background-color:' . $colors['normal'] . ';color:' . $colors['text'] . '}'; @@ -1769,22 +1833,16 @@ class core extends common { } $css .= 'footer span, #footerText > p {color:' . $this->getData(['theme', 'footer', 'textColor']) . ';font-family:"' . str_replace('+', ' ', $this->getData(['theme', 'footer', 'font'])) . '",sans-serif;font-weight:' . $this->getData(['theme', 'footer', 'fontWeight']) . ';font-size:' . $this->getData(['theme', 'footer', 'fontSize']) . ';text-transform:' . $this->getData(['theme', 'footer', 'textTransform']) . '}'; - $css .= 'footer{background-color:' . $colors['normal'] . ';color:' . $this->getData(['theme', 'footer', 'textColor']) . '}'; + $css .= 'footer {background-color:' . $colors['normal'] . ';color:' . $this->getData(['theme', 'footer', 'textColor']) . '}'; $css .= 'footer a{color:' . $this->getData(['theme', 'footer', 'textColor']) . '}'; $css .= 'footer #footersite > div {margin:' . $this->getData(['theme', 'footer', 'height']) . ' 0}'; - $css .= 'footer #footerbody > div {margin:' . $this->getData(['theme', 'footer', 'height']) . ' 0}'; + $css .= 'footer #footerbody > div {margin:' . $this->getData(['theme', 'footer', 'height']) . ' 0}'; + $css .= '@media (max-width: 768px) {footer #footerbody > div { padding: 2px }}'; $css .= '#footerSocials{text-align:' . $this->getData(['theme', 'footer', 'socialsAlign']) . '}'; $css .= '#footerText > p {text-align:' . $this->getData(['theme', 'footer', 'textAlign']) . '}'; $css .= '#footerCopyright{text-align:' . $this->getData(['theme', 'footer', 'copyrightAlign']) . '}'; - // Marge supplémentaire lorsque le pied de page est fixe - if ( $this->getData(['theme', 'footer', 'fixed']) === true && - $this->getData(['theme', 'footer', 'position']) === 'body') { - $css .= "@media (min-width: 769px) { #site {margin-bottom: 100px;} }"; - $css .= "@media (max-width: 768px) { #site {margin-bottom: 150px;} }"; - } - // Enregistre la personnalisation file_put_contents(self::DATA_DIR.'theme.css', $css); // Effacer le cache pour tenir compte de la couleur de fond TinyMCE @@ -1802,7 +1860,7 @@ class core extends common { $colors = helper::colorVariants($this->getData(['admin','backgroundColor'])); $css .= '#site{background-color:' . $colors['normal']. ';}'; $css .= '.row > div {font:' . $this->getData(['admin','fontSize']) . ' "' . $this->getData(['admin','fontText']) . '", sans-serif;}'; - $css .= 'body h1, h2, h3, h4, h5, h6 {font-family:' . $this->getData(['admin','fontTitle' ]) . ', sans-serif;color:' . $this->getData(['admin','colorTitle' ]) . ';}'; + $css .= 'body h1, h2, h3, h4 a, h5, h6 {font-family:' . $this->getData(['admin','fontTitle' ]) . ', sans-serif;color:' . $this->getData(['admin','colorTitle' ]) . ';}'; $css .= 'body:not(.editorWysiwyg),span .zwiico-help {color:' . $this->getData(['admin','colorText']) . ';}'; $colors = helper::colorVariants($this->getData(['admin','backgroundColorButton'])); $css .= 'input[type="checkbox"]:checked + label::before,.speechBubble{background-color:' . $colors['normal'] . ';color:' . $colors['text'] . ';}'; @@ -2901,6 +2959,7 @@ class layout extends common { $rightItems .= '
  • ' . template::ico('users') . '
  • '; $rightItems .= '
  • ' . template::ico('brush') . '
  • '; //$rightItems .= '
  • ' . template::ico('flag') . '
  • '; + $rightItems .= '
  • ' . template::ico('puzzle') . '
  • '; $rightItems .= '
  • ' . template::ico('cog-alt') . '
  • '; // Mise à jour automatique $today = mktime(0, 0, 0); diff --git a/core/layout/blank.css b/core/layout/blank.css index b0bb2187..d38faba7 100755 --- a/core/layout/blank.css +++ b/core/layout/blank.css @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/layout/common.css b/core/layout/common.css index 3a7f49da..eba5d1b4 100755 --- a/core/layout/common.css +++ b/core/layout/common.css @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ @@ -44,11 +45,11 @@ body { body { margin: 0px; } - +/* #site { margin: 0px auto; } - +*/ body>header { margin: 0px 0px; } @@ -476,12 +477,13 @@ td>.col12 { #site { overflow: hidden; } - +/* Dans theme.css @media (min-width:768px) { #site { margin: 20px auto; } } +*/ /* Bannière */ @@ -960,9 +962,9 @@ footer #footerSocials .zwiico-github:hover { /* Remonter en haut */ #backToTop { position: fixed; - z-index: 30; + z-index: 50; right: 30px; - bottom: 50px; + bottom: 100px; padding: 13px 16px 16px; /* Paramétré dans le thème (9.2.21) diff --git a/core/layout/light.css b/core/layout/light.css index 5ea840d3..2ec90bb5 100755 --- a/core/layout/light.css +++ b/core/layout/light.css @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/layout/main.php b/core/layout/main.php index fb3eacfb..1f19cbc4 100755 --- a/core/layout/main.php +++ b/core/layout/main.php @@ -1,7 +1,6 @@ - + - + diff --git a/core/module/addon/addon.php b/core/module/addon/addon.php new file mode 100644 index 00000000..a1521575 --- /dev/null +++ b/core/module/addon/addon.php @@ -0,0 +1,443 @@ + + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez + * @author Sylvain Lelièvre + * @copyright Copyright (C) 2020-2021, Sylvain Lelièvre + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + */ + +class addon extends common { + + public static $actions = [ + 'index' => self::GROUP_ADMIN, + 'moduleDelete' => self::GROUP_ADMIN, + 'export' => self::GROUP_ADMIN, + 'import' => self::GROUP_ADMIN + ]; + + // Gestion des modules + public static $modInstal = []; + + // pour tests + public static $valeur = []; + + /* + * Effacement d'un module installé et non utilisé + */ + public function moduleDelete() { + + // Jeton incorrect + if ($this->getUrl(3) !== $_SESSION['csrf']) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'addon', + 'state' => false, + 'notification' => 'Action non autorisée' + ]); + } + else{ + // Suppression des dossiers + $infoModules = helper::getModules(); + $module = $this->getUrl(2); + //Liste des dossiers associés au module non effacés + $list = ''; + foreach( $infoModules[$module]['dataDirectory'] as $moduleId){ + if (strpos($moduleId,'module.json') === false && strpos($moduleId,'page.json') === false) { + $list === '' ? $list = self::DATA_DIR.$moduleId : $list .= ', '.self::DATA_DIR. $moduleId; + } + } + if( $this->removeDir('./module/'.$module ) === true){ + $success = true; + if( $list === ''){ + $notification = 'Module '.$module .' désinstallé'; + } + else{ + $notification = 'Module '.$module .' désinstallé, il reste des données dans '.$list; + } + } + else{ + $success = false; + $notification = 'La suppression a échouée'; + } + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'addon', + 'notification' => $notification, + 'state' => $success + ]); + } + } + + + /** + * Gestion des modules + */ + public function index() { + + // Lister les modules + // $infoModules[nom_module]['realName'], ['version'], ['update'], ['delete'], ['dataDirectory'] + $infoModules = helper::getModules(); + + // Clés moduleIds dans les pages + $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); + foreach( $inPages as $key=>$value){ + $inPagesTitle[ $this->getData(['page', $key, 'title' ]) ] = $value; + } + + // Parcourir les données des modules + foreach ($infoModules as $key=>$value) { + // Construire le tableau de sortie + self::$modInstal[] = [ + $key, + $infoModules[$key]['realName'], + $infoModules[$key]['version'], + implode(', ', array_keys($inPagesTitle,$key)), + //array_key_exists('delete',$infoModules[$key]) && $infoModules[$key]['delete'] === true && implode(', ',array_keys($inPages,$key)) === '' + $infoModules[$key]['delete'] === true && implode(', ',array_keys($inPages,$key)) === '' + ? template::button('moduleDelete' . $key, [ + 'class' => 'moduleDelete buttonRed', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/moduleDelete/' . $key . '/' . $_SESSION['csrf'], + 'value' => template::ico('cancel') + ]) + : '', + is_array($infoModules[$key]['dataDirectory']) && implode(', ',array_keys($inPages,$key)) !== '' + ? template::button('moduleExport' . $key, [ + 'class' => 'buttonBlue', + 'href' => helper::baseUrl(). $this->getUrl(0) . '/export/' . $key,// appel de fonction vaut exécution, utiliser un paramètre + 'value' => template::ico('download') + ]) + : '', + is_array($infoModules[$key]['dataDirectory']) && implode(', ',array_keys($inPages,$key)) === '' + ? template::button('moduleExport' . $key, [ + 'class' => 'buttonBlue', + 'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $key.'/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + 'value' => template::ico('upload') + ]) + : '' + ]; + } + + // Retour du formulaire ? + if($this->isPost()) { + // Installation d'un module + $success = true; + $checkValidMaj = $this->getInput('configModulesCheck', helper::FILTER_BOOLEAN); + $zipFilename = $this->getInput('configModulesInstallation', helper::FILTER_STRING_SHORT); + if( $zipFilename !== ''){ + $tempFolder = 'datamodules';//uniqid(); + $zip = new ZipArchive(); + if ($zip->open(self::FILE_DIR.'source/'.$zipFilename) === TRUE) { + $notification = 'Archive ouverte'; + mkdir (self::TEMP_DIR . $tempFolder); + $zip->extractTo(self::TEMP_DIR . $tempFolder ); + // Archive de module ? + $success = false; + $notification = 'Ce n\'est pas l\'archive d\'un module !'; + $moduleDir = self::TEMP_DIR . $tempFolder . '/module'; + $moduleName = ''; + if ( is_dir( $moduleDir )) { + // Lire le nom du module + if ($dh = opendir( $moduleDir )) { + while (($file = readdir($dh)) !== false) { + $moduleName = $file; + } + closedir($dh); + } + // Module normalisé ? + if( is_file( $moduleDir.'/'.$moduleName.'/'.$moduleName.'.php' ) AND is_file( $moduleDir.'/'.$moduleName.'/view/index/index.php' ) ){ + + // Lecture de la version et de la validation d'update du module pour validation de la mise à jour + // Pour une version <= version installée l'utilisateur doit cocher 'Mise à jour forcée' + $version = '0.0'; + $update = '0.0'; + $valUpdate = false; + $file = file_get_contents( $moduleDir.'/'.$moduleName.'/'.$moduleName.'.php'); + $file = str_replace(' ','',$file); + $file = str_replace("\t",'',$file); + $pos1 = strpos($file, 'constVERSION'); + if( $pos1 !== false){ + $posdeb = strpos($file, "'", $pos1); + $posend = strpos($file, "'", $posdeb + 1); + $version = substr($file, $posdeb + 1, $posend - $posdeb - 1); + } + $pos1 = strpos($file, 'constUPDATE'); + if( $pos1 !== false){ + $posdeb = strpos($file, "'", $pos1); + $posend = strpos($file, "'", $posdeb + 1); + $update = substr($file, $posdeb + 1, $posend - $posdeb - 1); + } + // Si version actuelle >= version indiquée dans UPDATE la mise à jour est validée + if( $infoModules[$moduleName]['update'] >= $update ) $valUpdate = true; + + // Module déjà installé ? + $moduleInstal = false; + foreach( self::$modInstal as $key=>$value){ + if($moduleName === $value[0]){ + $moduleInstal = true; + } + } + + // Validation de la maj si autorisation du concepteur du module ET + // ( Version plus récente OU Check de forçage ) + $valNewVersion = floatval($version); + $valInstalVersion = floatval( $infoModules[$moduleName]['version'] ); + $newVersion = false; + if( $valNewVersion > $valInstalVersion ) $newVersion = true; + $validMaj = $valUpdate && ( $newVersion || $checkValidMaj); + + // Nouvelle installation ou mise à jour du module + if( ! $moduleInstal || $validMaj ){ + // Copie récursive des dossiers + $this -> custom_copy( self::TEMP_DIR . $tempFolder, './' ); + $success = true; + if( ! $moduleInstal ){ + $notification = 'Module '.$moduleName.' installé'; + } + else{ + $notification = 'Module '.$moduleName.' mis à jour'; + } + } + else{ + $success = false; + if( $valNewVersion == $valInstalVersion){ + $notification = ' Version détectée '.$version.' = à celle installée '.$infoModules[$moduleName]['version']; + } + else{ + $notification = ' Version détectée '.$version.' < à celle installée '.$infoModules[$moduleName]['version']; + } + if( $valUpdate === false){ + if( $infoModules[$moduleName]['update'] === $update ){ + $notification = ' Mise à jour par ce procédé interdite par le concepteur du module'; + } + else{ + $notification = ' Mise à jour par ce procédé interdite, votre version est trop ancienne'; + } + } + } + } + } + // Supprimer le dossier temporaire même si le module est invalide + $this->removeDir(self::TEMP_DIR . $tempFolder); + $zip->close(); + } else { + // erreur à l'ouverture + $success = false; + $notification = 'Impossible d\'ouvrir l\'archive'; + } + } + + $this->addOutput([ + 'redirect' => helper::baseUrl() . $this->getUrl(), + 'notification' => $notification, + 'state' => $success + ]); + } + + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Gestion des modules', + 'view' => 'index' + ]); + } + + /* + * Copie récursive de dossiers + * + */ + private function custom_copy($src, $dst) { + // open the source directory + $dir = opendir($src); + // Make the destination directory if not exist + if (!is_dir($dst)) { + mkdir($dst); + } + // Loop through the files in source directory + while( $file = readdir($dir) ) { + if (( $file != '.' ) && ( $file != '..' )) { + if ( is_dir($src . '/' . $file) ){ + // Recursively calling custom copy function + // for sub directory + $this -> custom_copy($src . '/' . $file, $dst . '/' . $file); + } + else { + copy($src . '/' . $file, $dst . '/' . $file); + } + } + } + closedir($dir); + } + + + /* + * Export des données d'un module externes ou interne à module.json + */ + public function export(){ + // Lire les données du module + $infoModules = helper::getModules(); + // Créer un dossier par défaut + $tmpFolder = self::TEMP_DIR . uniqid(); + //$tmpFolder = self::TEMP_DIR . 'test'; + if (!is_dir($tmpFolder)) { + mkdir($tmpFolder); + } + // Clés moduleIds dans les pages + $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); + // Parcourir les pages utilisant le module + foreach (array_keys($inPages,$this->getUrl(2)) as $pageId) { + // Export des pages hébergeant le module + $pageContent[$pageId] = $this->getData(['page',$pageId]); + // Export de fr/module.json + $moduleId = 'fr/module.json'; + // Création de l'arborescence des langues + // Pas de nom dossier de langue - dossier par défaut + $t = explode ('/',$moduleId); + if ( is_array($t)) { + $lang = 'fr'; + } else { + $lang = $t[0]; + } + // Créer le dossier si inexistant + if (!is_dir($tmpFolder . '/' . $lang)) { + mkdir ($tmpFolder . '/' . $lang); + } + // Sauvegarde si données non vides + $tmpData [$pageId] = $this->getData(['module',$pageId ]); + if ($tmpData [$pageId] !== null) { + file_put_contents($tmpFolder . '/' . $moduleId, json_encode($tmpData)); + } + // Export des données localisées dans des dossiers + foreach ($infoModules[$this->getUrl(2)]['dataDirectory'] as $dirId) { + if ( file_exists(self::DATA_DIR . '/' . $dirId) + && !file_exists($tmpFolder . '/' . $dirId ) ) { + $this->custom_copy ( self::DATA_DIR . '/' . $dirId, $tmpFolder . '/' . $dirId ); + } + } + } + // Enregistrement des pages dans le dossier de langue identique à module + + if (!file_exists($tmpFolder . '/' . $lang . '/page.json')) { + file_put_contents($tmpFolder . '/' . $lang . '/page.json', json_encode($pageContent)); + } + + // création du zip + $fileName = $this->getUrl(2) . '.zip'; + $this->makeZip ($fileName, $tmpFolder, []); + if (file_exists($fileName)) { + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename="' . $fileName . '"'); + header('Content-Length: ' . filesize($fileName)); + readfile( $fileName); + // Valeurs en sortie + $this->addOutput([ + 'display' => self::DISPLAY_RAW + ]); + unlink($fileName); + $this->removeDir($tmpFolder); + exit(); + } else { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'addon', + 'notification' => 'Quelque chose s\'est mal passé', + 'state' => false + ]); + } + } + + /* + * Importer des données d'un module externes ou interne à module.json + */ + public function import(){ + // Jeton incorrect + if ($this->getUrl(3) !== $_SESSION['csrf']) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'addon', + 'state' => false, + 'notification' => 'Action non autorisée' + ]); + } + else{ + // Soumission du formulaire + if($this->isPost()) { + // Récupérer le fichier et le décompacter + $zipFilename = $this->getInput('addonImportFile', helper::FILTER_STRING_SHORT, true); + $tempFolder = uniqid(); + mkdir (self::TEMP_DIR . $tempFolder); + $zip = new ZipArchive(); + if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) { + $zip->extractTo(self::TEMP_DIR . $tempFolder ); + } + // Import des données localisées page.json et module.json + // Pour chaque dossier localisé + $dataTarget = array(); + $dataSource = array(); + // Liste des pages de même nom dans l'archive et le site + $list = ''; + foreach (self::$i18nList as $key=>$value) { + // Les Pages et les modules + foreach (['page','module'] as $fileTarget){ + if (file_exists(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json')) { + // Le dossier de langue existe + // faire la fusion + $dataSource = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'), true); + // Des pages de même nom que celles de l'archive existent + if( $fileTarget === 'page' ){ + foreach( $dataSource as $keydataSource=>$valuedataSource ){ + foreach( $this->getData(['page']) as $keypage=>$valuepage ){ + if( $keydataSource === $keypage){ + $list === '' ? $list .= ' '.$this->getData(['page', $keypage, 'title']) : $list .= ', '.$this->getData(['page', $keypage, 'title']); + } + } + } + } + $dataTarget = json_decode(file_get_contents(self::DATA_DIR . $key . '/' . $fileTarget . '.json'), true); + $data [$fileTarget] = array_merge($dataTarget[$fileTarget], $dataSource); + if( $list === ''){ + file_put_contents(self::DATA_DIR . '/' .$key . '/' . $fileTarget . '.json', json_encode( $data ,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|LOCK_EX) ); + } + // Supprimer les fichiers importés + unlink (self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'); + } + } + } + + // Import des fichiers placés ailleurs que dans les dossiers localisés. + $this->custom_copy (self::TEMP_DIR . $tempFolder,self::DATA_DIR ); + + // Supprimer le dossier temporaire + $this->removeDir(self::TEMP_DIR . $tempFolder); + $zip->close(); + if( $list !== '' ){ + $success = false; + strpos( $list, ',') === false ? $notification = 'Import impossible la page suivante doit être renommée :'.$list : $notification = 'Import impossible les pages suivantes doivent être renommées :'.$list; + } + else{ + $success = true; + $notification = 'Import réussi'; + } + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'addon', + 'state' => $success, + 'notification' => $notification + ]); + } + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Importer des données de module', + 'view' => 'import' + ]); + } + } +} diff --git a/core/module/addon/view/import/import.css b/core/module/addon/view/import/import.css new file mode 100644 index 00000000..5a91e7a7 --- /dev/null +++ b/core/module/addon/view/import/import.css @@ -0,0 +1,18 @@ +/** + * This file is part of Zwii. + * + * For full copyright and license information, please see the LICENSE + * file that was distributed with this source code. + * + * @author Rémi Jean + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + */ + + +/** NE PAS EFFACER +* admin.css +*/ \ No newline at end of file diff --git a/core/module/addon/view/import/import.php b/core/module/addon/view/import/import.php new file mode 100644 index 00000000..7cc41dac --- /dev/null +++ b/core/module/addon/view/import/import.php @@ -0,0 +1,31 @@ + +
    +
    + 'buttonGrey', + 'href' => helper::baseUrl() . 'addon', + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
    +
    + 'Appliquer' + ]); ?> +
    +
    +
    +
    +
    +

    Installer des données de module

    +
    +
    + 'Archive ZIP :', + 'type' => 2 + ]); ?> +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/core/module/addon/view/index/index.css b/core/module/addon/view/index/index.css new file mode 100644 index 00000000..5a91e7a7 --- /dev/null +++ b/core/module/addon/view/index/index.css @@ -0,0 +1,18 @@ +/** + * This file is part of Zwii. + * + * For full copyright and license information, please see the LICENSE + * file that was distributed with this source code. + * + * @author Rémi Jean + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + */ + + +/** NE PAS EFFACER +* admin.css +*/ \ No newline at end of file diff --git a/core/module/addon/view/index/index.js.php b/core/module/addon/view/index/index.js.php new file mode 100644 index 00000000..8e670ba8 --- /dev/null +++ b/core/module/addon/view/index/index.js.php @@ -0,0 +1,22 @@ +/** + * This file is part of Zwii. + * For full copyright and license information, please see the LICENSE + * file that was distributed with this source code. + * + * @author Rémi Jean + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + */ + +/** + * Confirmation de suppression + */ +$(".moduleDelete").on("click", function() { + var _this = $(this); + return core.confirm("Êtes-vous sûr de vouloir supprimer, effacer ce module ?", function() { + $(location).attr("href", _this.attr("href")); + }); +}); \ No newline at end of file diff --git a/core/module/addon/view/index/index.php b/core/module/addon/view/index/index.php new file mode 100644 index 00000000..5248fdc9 --- /dev/null +++ b/core/module/addon/view/index/index.php @@ -0,0 +1,46 @@ + +
    +
    + 'buttonGrey', + 'href' => helper::baseUrl(), + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
    +
    + 'Valider', + 'ico' => 'check' + ]); ?> +
    +
    +
    +
    +
    +

    Installer ou mettre à jour un module

    +
    +
    + 'Archive ZIP :', + 'type' => 2 + ]); ?> +
    +
    +
    +
    + false, + 'help' => 'Permet de forcer une mise à jour même si la version du module est inférieure ou égale à celle du module installé.', + ]); ?> +
    +
    +
    +
    +
    + + + + + + diff --git a/core/module/config/config.php b/core/module/config/config.php index 85f34738..7665cfd7 100755 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -9,7 +9,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ @@ -30,7 +30,6 @@ class config extends common { 'logDownload'=> self::GROUP_ADMIN, 'blacklistReset' => self::GROUP_ADMIN, 'blacklistDownload' => self::GROUP_ADMIN - ]; public static $timezones = [ @@ -286,16 +285,20 @@ class config extends common { $data = str_replace('_','/',$googlePagespeedData['lighthouseResult']['audits']['final-screenshot']['details']['data']); $data = str_replace('-','+',$data); $img = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $data)); - $success = file_put_contents( self::FILE_DIR.'source/screenshot.jpg',$img) ; - // Effacer la miniature png - if (file_exists(self::FILE_DIR.'source/screenshot.png')) { - unlink (self::FILE_DIR.'source/screenshot.png'); + // Effacer l'image et la miniature png + if (file_exists(self::FILE_DIR.'thumb/screenshot.jpg')) { + unlink (self::FILE_DIR.'thumb/screenshot.jpg'); } + if (file_exists(self::FILE_DIR.'source/screenshot.jpg')) { + unlink (self::FILE_DIR.'source/screenshot.jpg'); + } + $success = file_put_contents( self::FILE_DIR.'source/screenshot.jpg',$img) ; + } // Valeurs en sortie $this->addOutput([ 'notification' => $success === false ? 'Service inaccessible ou erreur d\'écriture de l\'image' : 'Image générée avec succès', - 'redirect' => helper::baseUrl() . 'advanced', + 'redirect' => helper::baseUrl() . 'config/advanced', 'state' => $success === false ? false : true ]); } @@ -376,13 +379,6 @@ class config extends common { $this->getInput('configManageImportUser', helper::FILTER_BOOLEAN) === true) { $this->setData(['user',$users]); } - /* - if ($version === '9' ) { - $this->importData($this->getInput('configManageImportUser', helper::FILTER_BOOLEAN)); - $this->setData(['core','dataVersion',0]); - }*/ - - // Met à jours les URL dans les contenus de page // Message de notification $notification = $success === true ? 'Restauration réalisée avec succès' : 'Erreur inconnue'; @@ -453,12 +449,7 @@ class config extends common { 'state' => $success ]); } - // Initialisation du screen - APPEL AUTO DESACTIVE POUR EVITER UN RALENTISSEMENT - /* - if (!file_exists(self::FILE_DIR.'source/screenshot.jpg')) { - $this->configMetaImage(); - } - */ + // Valeurs en sortie $this->addOutput([ 'title' => 'Configuration', @@ -579,9 +570,10 @@ class config extends common { // Générer robots.txt et sitemap $this->generateFiles(); // Valeurs en sortie + $notification = $notification . 'Modifications enregistrées'; $this->addOutput([ 'redirect' => helper::baseUrl() . $this->getUrl(), - 'notification' => 'Modifications enregistrées', + 'notification' => $notification, 'state' => $success ]); } @@ -812,5 +804,4 @@ class config extends common { } return $newArray; } - } diff --git a/core/module/config/view/advanced/advanced.css b/core/module/config/view/advanced/advanced.css index fc8f1ca2..fdc5d676 100644 --- a/core/module/config/view/advanced/advanced.css +++ b/core/module/config/view/advanced/advanced.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/config/view/advanced/advanced.js.php b/core/module/config/view/advanced/advanced.js.php index 14354f54..cc6664e6 100644 --- a/core/module/config/view/advanced/advanced.js.php +++ b/core/module/config/view/advanced/advanced.js.php @@ -5,7 +5,7 @@ * file that was distributed with this source code. * * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/config/view/advanced/advanced.php b/core/module/config/view/advanced/advanced.php index 06718e43..0d11fe06 100644 --- a/core/module/config/view/advanced/advanced.php +++ b/core/module/config/view/advanced/advanced.php @@ -504,4 +504,5 @@ + diff --git a/core/module/config/view/backup/backup.css b/core/module/config/view/backup/backup.css index 01a06f8d..8796d11b 100755 --- a/core/module/config/view/backup/backup.css +++ b/core/module/config/view/backup/backup.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/config/view/backup/backup.js.php b/core/module/config/view/backup/backup.js.php index 90b38808..7e564b07 100755 --- a/core/module/config/view/backup/backup.js.php +++ b/core/module/config/view/backup/backup.js.php @@ -5,7 +5,7 @@ * file that was distributed with this source code. * * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/config/view/index/index.css b/core/module/config/view/index/index.css index 805e9150..5a91e7a7 100755 --- a/core/module/config/view/index/index.css +++ b/core/module/config/view/index/index.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/config/view/index/index.php b/core/module/config/view/index/index.php index 42b8b8ae..f7c50a18 100755 --- a/core/module/config/view/index/index.php +++ b/core/module/config/view/index/index.php @@ -90,7 +90,7 @@ 'Aucune'] , helper::arrayCollumn($pages, 'title', 'SORT_ASC') ) , [ 'label' => 'Recherche dans le site', 'selected' => $this->getData(['locale', 'searchPageId']), - 'help' => 'Sélectionner la page "Recherche" ou une page contenant le module "Recherche" permet d\'activer un lien dans le pied de page. ' + 'help' => 'Sélectionner la page "Recherche" ou une page contenant le module "Recherche". Une option du pied de page ajoute un lien discret vers cette page.' ]); ?> diff --git a/core/module/config/view/manage/manage.css b/core/module/config/view/manage/manage.css index 805e9150..5a91e7a7 100755 --- a/core/module/config/view/manage/manage.css +++ b/core/module/config/view/manage/manage.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/config/view/script/script.css b/core/module/config/view/script/script.css index 805e9150..5a91e7a7 100755 --- a/core/module/config/view/script/script.css +++ b/core/module/config/view/script/script.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/install/install.php b/core/module/install/install.php index e9fef5a2..1c2c1254 100755 --- a/core/module/install/install.php +++ b/core/module/install/install.php @@ -2,12 +2,13 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/install/view/index/index.js.php b/core/module/install/view/index/index.js.php index eef087dd..fdc1c892 100755 --- a/core/module/install/view/index/index.js.php +++ b/core/module/install/view/index/index.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/install/view/update/update.css b/core/module/install/view/update/update.css index 805e9150..5a91e7a7 100755 --- a/core/module/install/view/update/update.css +++ b/core/module/install/view/update/update.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/maintenance/maintenance.php b/core/module/maintenance/maintenance.php index 8840123b..9987e803 100755 --- a/core/module/maintenance/maintenance.php +++ b/core/module/maintenance/maintenance.php @@ -2,12 +2,13 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/page/page.php b/core/module/page/page.php index 88e6b37f..f842e3da 100755 --- a/core/module/page/page.php +++ b/core/module/page/page.php @@ -9,7 +9,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ @@ -29,15 +29,7 @@ class page extends common { '' => 'Aucune' ]; public static $moduleIds = []; - // Nom des modules - public static $moduleNames = [ - 'news' => 'Nouvelles', - 'blog' => 'Blog', - 'form' => 'Formulaire', - 'gallery' => 'Galerie', - 'redirection' => 'Redirection', - 'search' => 'Recherche' - ]; + public static $typeMenu = [ 'text' => 'Texte', 'icon' => 'Icône', @@ -449,22 +441,7 @@ class page extends common { ]); } } - // Liste des modules - $moduleIds = []; - $iterator = new DirectoryIterator('module/'); - foreach($iterator as $fileInfos) { - if(is_file($fileInfos->getPathname() . '/' . $fileInfos->getFilename() . '.php')) { - if (array_key_exists($fileInfos->getBasename(),self::$moduleNames)) { - $moduleIds[$fileInfos->getBasename()] = self::$moduleNames[$fileInfos->getBasename()]; - } else { - $moduleIds[$fileInfos->getBasename()] = ucfirst($fileInfos->getBasename()); - } - } - } - self::$moduleIds = $moduleIds; - asort(self::$moduleIds); - self::$moduleIds = array_merge( ['' => 'Aucun'] , self::$moduleIds); - // Pages sans parent + self::$moduleIds = array_merge( ['' => 'Aucun'] , helper::arrayCollumn(helper::getModules(),'realName','SORT_ASC')); // Pages sans parent foreach($this->getHierarchy() as $parentPageId => $childrenPageIds) { if($parentPageId !== $this->getUrl(2)) { self::$pagesNoParentId[$parentPageId] = $this->getData(['page', $parentPageId, 'title']); diff --git a/core/module/page/view/edit/edit.css b/core/module/page/view/edit/edit.css index f456dd05..3eed60ff 100755 --- a/core/module/page/view/edit/edit.css +++ b/core/module/page/view/edit/edit.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/page/view/edit/edit.js.php b/core/module/page/view/edit/edit.js.php index 941b24a0..c73b5f66 100755 --- a/core/module/page/view/edit/edit.js.php +++ b/core/module/page/view/edit/edit.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @authorFrédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/page/view/edit/edit.php b/core/module/page/view/edit/edit.php index cac97d04..be3941f2 100755 --- a/core/module/page/view/edit/edit.php +++ b/core/module/page/view/edit/edit.php @@ -54,7 +54,7 @@ echo template::formOpen('pageEditForm'); ]); ?> $this->getData(['page', $this->getUrl(2), 'moduleId'])]); ?> array_key_exists($this->getData(['page', $this->getUrl(2), 'moduleId']),$module::$moduleNames)? $module::$moduleNames[$this->getData(['page', $this->getUrl(2), 'moduleId'])] : ucfirst($this->getData(['page', $this->getUrl(2), 'moduleId'])) + 'value' => array_key_exists($this->getData(['page', $this->getUrl(2), 'moduleId']),$module::$moduleIds)? $module::$moduleIds[$this->getData(['page', $this->getUrl(2), 'moduleId'])] : ucfirst($this->getData(['page', $this->getUrl(2), 'moduleId'])) ]); ?>
    diff --git a/core/module/sitemap/sitemap.php b/core/module/sitemap/sitemap.php index 0d14ded4..61f885a7 100755 --- a/core/module/sitemap/sitemap.php +++ b/core/module/sitemap/sitemap.php @@ -2,12 +2,13 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/theme.php b/core/module/theme/theme.php index a3c1b137..8cb8b382 100755 --- a/core/module/theme/theme.php +++ b/core/module/theme/theme.php @@ -11,7 +11,7 @@ * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ * @copyright : Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez */ class theme extends common { @@ -692,7 +692,7 @@ class theme extends common { */ public function export() { // Make zip - $zipFilename = $this->makezip($this->getUrl(2)); + $zipFilename = $this->zipTheme($this->getUrl(2)); // Téléchargement du ZIP header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); @@ -710,7 +710,7 @@ class theme extends common { */ public function save() { // Make zip - $zipFilename = $this->makezip($this->getUrl(2)); + $zipFilename = $this->zipTheme($this->getUrl(2)); // Téléchargement du ZIP if (!is_dir(self::FILE_DIR.'source/theme')) { mkdir(self::FILE_DIR.'source/theme'); @@ -772,7 +772,7 @@ class theme extends common { * construction du zip * @param string $modele theme ou admin */ - private function makezip($modele) { + private function zipTheme($modele) { // Creation du dossier $zipFilename = $modele . ' ' .date('d m Y').' '.date('H i s ').'.zip'; $zip = new ZipArchive(); diff --git a/core/module/theme/view/admin/admin.css b/core/module/theme/view/admin/admin.css index 08286440..4b233fe4 100755 --- a/core/module/theme/view/admin/admin.css +++ b/core/module/theme/view/admin/admin.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/advanced/advanced.css b/core/module/theme/view/advanced/advanced.css index 805e9150..5a91e7a7 100755 --- a/core/module/theme/view/advanced/advanced.css +++ b/core/module/theme/view/advanced/advanced.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/advanced/advanced.js.php b/core/module/theme/view/advanced/advanced.js.php index 464d93bb..9c189916 100755 --- a/core/module/theme/view/advanced/advanced.js.php +++ b/core/module/theme/view/advanced/advanced.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/body/body.css b/core/module/theme/view/body/body.css index 1a3509ef..e1a1d50b 100755 --- a/core/module/theme/view/body/body.css +++ b/core/module/theme/view/body/body.css @@ -1,5 +1,5 @@ /** - * This file is part of Zwii. * + * This file is part of Zwii. * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * @@ -7,7 +7,7 @@ * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/body/body.js.php b/core/module/theme/view/body/body.js.php index 19a42926..d7292da3 100755 --- a/core/module/theme/view/body/body.js.php +++ b/core/module/theme/view/body/body.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/footer/footer.css b/core/module/theme/view/footer/footer.css index 805e9150..5a91e7a7 100755 --- a/core/module/theme/view/footer/footer.css +++ b/core/module/theme/view/footer/footer.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/footer/footer.js.php b/core/module/theme/view/footer/footer.js.php index 9b5e9c5c..da12b143 100755 --- a/core/module/theme/view/footer/footer.js.php +++ b/core/module/theme/view/footer/footer.js.php @@ -8,7 +8,7 @@ * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/header/header.css b/core/module/theme/view/header/header.css index 9346d7ac..d2dafebe 100755 --- a/core/module/theme/view/header/header.css +++ b/core/module/theme/view/header/header.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/header/header.js.php b/core/module/theme/view/header/header.js.php index 87a89cf2..3669bcb8 100755 --- a/core/module/theme/view/header/header.js.php +++ b/core/module/theme/view/header/header.js.php @@ -8,7 +8,7 @@ * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/index/index.css b/core/module/theme/view/index/index.css index 809178d3..c24d1e12 100755 --- a/core/module/theme/view/index/index.css +++ b/core/module/theme/view/index/index.css @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/index/index.js.php b/core/module/theme/view/index/index.js.php index 345e765e..e9b96163 100755 --- a/core/module/theme/view/index/index.js.php +++ b/core/module/theme/view/index/index.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/manage/manage.css b/core/module/theme/view/manage/manage.css index 805e9150..5a91e7a7 100755 --- a/core/module/theme/view/manage/manage.css +++ b/core/module/theme/view/manage/manage.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/manage/manage.js.php b/core/module/theme/view/manage/manage.js.php index 765a9662..65954fd6 100755 --- a/core/module/theme/view/manage/manage.js.php +++ b/core/module/theme/view/manage/manage.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/menu/menu.css b/core/module/theme/view/menu/menu.css index 805e9150..5a91e7a7 100755 --- a/core/module/theme/view/menu/menu.css +++ b/core/module/theme/view/menu/menu.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/menu/menu.js.php b/core/module/theme/view/menu/menu.js.php index 891c6d58..bb1632c5 100755 --- a/core/module/theme/view/menu/menu.js.php +++ b/core/module/theme/view/menu/menu.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/site/site.css b/core/module/theme/view/site/site.css index 805e9150..5a91e7a7 100755 --- a/core/module/theme/view/site/site.css +++ b/core/module/theme/view/site/site.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/site/site.js.php b/core/module/theme/view/site/site.js.php index 279dd85e..fb5e4b77 100755 --- a/core/module/theme/view/site/site.js.php +++ b/core/module/theme/view/site/site.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/translate/translate.php b/core/module/translate/translate.php index 890e4d0a..65aa7dd8 100755 --- a/core/module/translate/translate.php +++ b/core/module/translate/translate.php @@ -2,12 +2,13 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/translate/view/index/index.css b/core/module/translate/view/index/index.css index 51a18ec5..88fe3629 100755 --- a/core/module/translate/view/index/index.css +++ b/core/module/translate/view/index/index.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/user/user.php b/core/module/user/user.php index 69c3580e..6e33f000 100755 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -2,12 +2,13 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/user/view/add/add.css b/core/module/user/view/add/add.css index 55e779b3..1ab3eefb 100755 --- a/core/module/user/view/add/add.css +++ b/core/module/user/view/add/add.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/user/view/add/add.js.php b/core/module/user/view/add/add.js.php index 6d797f0c..692460a0 100755 --- a/core/module/user/view/add/add.js.php +++ b/core/module/user/view/add/add.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/user/view/edit/edit.css b/core/module/user/view/edit/edit.css index 805e9150..5a91e7a7 100755 --- a/core/module/user/view/edit/edit.css +++ b/core/module/user/view/edit/edit.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/user/view/edit/edit.js.php b/core/module/user/view/edit/edit.js.php index ad7e1087..57166da5 100755 --- a/core/module/user/view/edit/edit.js.php +++ b/core/module/user/view/edit/edit.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/user/view/import/import.css b/core/module/user/view/import/import.css index 2aa6edae..20dbdfe1 100755 --- a/core/module/user/view/import/import.css +++ b/core/module/user/view/import/import.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/user/view/index/index.css b/core/module/user/view/index/index.css index 805e9150..5a91e7a7 100755 --- a/core/module/user/view/index/index.css +++ b/core/module/user/view/index/index.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/user/view/index/index.js.php b/core/module/user/view/index/index.js.php index 53d5d62d..3afc259a 100755 --- a/core/module/user/view/index/index.js.php +++ b/core/module/user/view/index/index.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/module/user/view/reset/reset.css b/core/module/user/view/reset/reset.css index 75723119..f422a347 100755 --- a/core/module/user/view/reset/reset.css +++ b/core/module/user/view/reset/reset.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/core/vendor/zwiico/css/zwiico-codes.css b/core/vendor/zwiico/css/zwiico-codes.css index aab2b686..9c7b0e02 100755 --- a/core/vendor/zwiico/css/zwiico-codes.css +++ b/core/vendor/zwiico/css/zwiico-codes.css @@ -1,8 +1,5 @@ .zwiico-plus-circled:before { content: '\2191'; } /* '↑' */ -.zwiico-flag:before { content: '\2691'; } /* '⚑' */ -.zwiico-mail:before { content: '\2709'; } /* '✉' */ -.zwiico-divide:before { content: '\e05b'; } /* '' */ .zwiico-logout:before { content: '\e800'; } /* '' */ .zwiico-plus:before { content: '\e801'; } /* '' */ .zwiico-cancel:before { content: '\e802'; } /* '' */ @@ -16,6 +13,7 @@ .zwiico-folder:before { content: '\e80a'; } /* '' */ .zwiico-users:before { content: '\e80b'; } /* '' */ .zwiico-left:before { content: '\e80c'; } /* '' */ +.zwiico-mail:before { content: '\e80d'; } /* '' */ .zwiico-user:before { content: '\e80e'; } /* '' */ .zwiico-update:before { content: '\e80f'; } /* '' */ .zwiico-home:before { content: '\e810'; } /* '' */ @@ -38,6 +36,8 @@ .zwiico-login:before { content: '\e821'; } /* '' */ .zwiico-lock:before { content: '\e822'; } /* '' */ .zwiico-mimi:before { content: '\e823'; } /* '' */ +.zwiico-divide:before { content: '\e824'; } /* '' */ +.zwiico-flag:before { content: '\e825'; } /* '' */ .zwiico-spin:before { content: '\e831'; } /* '' */ .zwiico-twitter:before { content: '\f099'; } /* '' */ .zwiico-facebook:before { content: '\f09a'; } /* '' */ @@ -48,6 +48,7 @@ .zwiico-download-cloud:before { content: '\f0ed'; } /* '' */ .zwiico-upload-cloud:before { content: '\f0ee'; } /* '' */ .zwiico-code:before { content: '\f121'; } /* '' */ +.zwiico-puzzle:before { content: '\f12e'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */ diff --git a/core/vendor/zwiico/css/zwiico-embedded.css b/core/vendor/zwiico/css/zwiico-embedded.css index 6bec0fe3..36707b09 100755 --- a/core/vendor/zwiico/css/zwiico-embedded.css +++ b/core/vendor/zwiico/css/zwiico-embedded.css @@ -1,15 +1,15 @@ @font-face { font-family: 'zwiico'; - src: url('../font/zwiico.eot?63980596'); - src: url('../font/zwiico.eot?63980596#iefix') format('embedded-opentype'), - url('../font/zwiico.svg?63980596#zwiico') format('svg'); + src: url('../font/zwiico.eot?55150548'); + src: url('../font/zwiico.eot?55150548#iefix') format('embedded-opentype'), + url('../font/zwiico.svg?55150548#zwiico') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'zwiico'; - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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OC2wPSywABawFyNCILAKI0IgICBGI0ewASsjYTgtsD4ssAAWsBcjQrADJbACJUcjRyNhsABUWC4gPCMhG7ACJbACJUcjRyNhILAFJbAEJUcjRyNhsAYlsAUlSbACJWG5CAAIAGNjIyBYYhshWWO4BABiILAAUFiwQGBZZrABY2AjLiMgIDyKOCMhWS2wPyywABawFyNCILAKQyAuRyNHI2EgYLAgYGawAmIgsABQWLBAYFlmsAFjIyAgPIo4LbBALCMgLkawAiVGsBdDWFAbUllYIDxZLrEwARQrLbBBLCMgLkawAiVGsBdDWFIbUFlYIDxZLrEwARQrLbBCLCMgLkawAiVGsBdDWFAbUllYIDxZIyAuRrACJUawF0NYUhtQWVggPFkusTABFCstsEMssDorIyAuRrACJUawF0NYUBtSWVggPFkusTABFCstsEQssDsriiAgPLAGI0KKOCMgLkawAiVGsBdDWFAbUllYIDxZLrEwARQrsAZDLrAwKy2wRSywABawBCWwBCYgICBGI0dhsAwjQi5HI0cjYbALQysjIDwgLiM4sTABFCstsEYssQoEJUKwABawBCWwBCUgLkcjRyNhILAGI0KxDABCsAtDKyCwYFBYILBAUVizBCAFIBuzBCYFGllCQiMgR7AGQ7ACYiCwAFBYsEBgWWawAWNgILABKyCKimEgsARDYGQjsAVDYWRQWLAEQ2EbsAVDYFmwAyWwAmIgsABQWLBAYFlmsAFjYbACJUZhOCMgPCM4GyEgIEYjR7ABKyNhOCFZsTABFCstsEcssQA6Ky6xMAEUKy2wSCyxADsrISMgIDywBiNCIzixMAEUK7AGQy6wMCstsEkssAAVIEewACNCsgABARUUEy6wNiotsEossAAVIEewACNCsgABARUUEy6wNiotsEsssQABFBOwNyotsEwssDkqLbBNLLAAFkUjIC4gRoojYTixMAEUKy2wTiywCiNCsE0rLbBPLLIAAEYrLbBQLLIAAUYrLbBRLLIBAEYrLbBSLLIBAUYrLbBTLLIAAEcrLbBULLIAAUcrLbBVLLIBAEcrLbBWLLIBAUcrLbBXLLMAAABDKy2wWCyzAAEAQystsFksswEAAEMrLbBaLLMBAQBDKy2wWyyzAAABQystsFwsswABAUMrLbBdLLMBAAFDKy2wXiyzAQEBQystsF8ssgAARSstsGAssgABRSstsGEssgEARSstsGIssgEBRSstsGMssgAASCstsGQssgABSCstsGUssgEASCstsGYssgEBSCstsGcsswAAAEQrLbBoLLMAAQBEKy2waSyzAQAARCstsGosswEBAEQrLbBrLLMAAAFEKy2wbCyzAAEBRCstsG0sswEAAUQrLbBuLLMBAQFEKy2wbyyxADwrLrEwARQrLbBwLLEAPCuwQCstsHEssQA8K7BBKy2wciywABaxADwrsEIrLbBzLLEBPCuwQCstsHQssQE8K7BBKy2wdSywABaxATwrsEIrLbB2LLEAPSsusTABFCstsHcssQA9K7BAKy2weCyxAD0rsEErLbB5LLEAPSuwQistsHossQE9K7BAKy2weyyxAT0rsEErLbB8LLEBPSuwQistsH0ssQA+Ky6xMAEUKy2wfiyxAD4rsEArLbB/LLEAPiuwQSstsIAssQA+K7BCKy2wgSyxAT4rsEArLbCCLLEBPiuwQSstsIMssQE+K7BCKy2whCyxAD8rLrEwARQrLbCFLLEAPyuwQCstsIYssQA/K7BBKy2whyyxAD8rsEIrLbCILLEBPyuwQCstsIkssQE/K7BBKy2wiiyxAT8rsEIrLbCLLLILAANFUFiwBhuyBAIDRVgjIRshWVlCK7AIZbADJFB4sQUBFUVYMFktAEu4AMhSWLEBAY5ZsAG5CAAIAGNwsQAHQrEAACqxAAdCsQAKKrEAB0KxAAoqsQAHQrkAAAALKrEAB0K5AAAACyq5AAMAAESxJAGIUViwQIhYuQADAGREsSgBiFFYuAgAiFi5AAMAAERZG7EnAYhRWLoIgAABBECIY1RYuQADAABEWVlZWVmxAA4quAH/hbAEjbECAESzBWQGAERE') format('truetype'); + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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AiVGsBdDWFIbUFlYIDxZLrEwARQrLbBCLCMgLkawAiVGsBdDWFAbUllYIDxZIyAuRrACJUawF0NYUhtQWVggPFkusTABFCstsEMssDorIyAuRrACJUawF0NYUBtSWVggPFkusTABFCstsEQssDsriiAgPLAGI0KKOCMgLkawAiVGsBdDWFAbUllYIDxZLrEwARQrsAZDLrAwKy2wRSywABawBCWwBCYgICBGI0dhsAwjQi5HI0cjYbALQysjIDwgLiM4sTABFCstsEYssQoEJUKwABawBCWwBCUgLkcjRyNhILAGI0KxDABCsAtDKyCwYFBYILBAUVizBCAFIBuzBCYFGllCQiMgR7AGQ7ACYiCwAFBYsEBgWWawAWNgILABKyCKimEgsARDYGQjsAVDYWRQWLAEQ2EbsAVDYFmwAyWwAmIgsABQWLBAYFlmsAFjYbACJUZhOCMgPCM4GyEgIEYjR7ABKyNhOCFZsTABFCstsEcssQA6Ky6xMAEUKy2wSCyxADsrISMgIDywBiNCIzixMAEUK7AGQy6wMCstsEkssAAVIEewACNCsgABARUUEy6wNiotsEossAAVIEewACNCsgABARUUEy6wNiotsEsssQABFBOwNyotsEwssDkqLbBNLLAAFkUjIC4gRoojYTixMAEUKy2wTiywCiNCsE0rLbBPLLIAAEYrLbBQLLIAAUYrLbBRLLIBAEYrLbBSLLIBAUYrLbBTLLIAAEcrLbBULLIAAUcrLbBVLLIBAEcrLbBWLLIBAUcrLbBXLLMAAABDKy2wWCyzAAEAQystsFksswEAAEMrLbBaLLMBAQBDKy2wWyyzAAABQystsFwsswABAUMrLbBdLLMBAAFDKy2wXiyzAQEBQystsF8ssgAARSstsGAssgABRSstsGEssgEARSstsGIssgEBRSstsGMssgAASCstsGQssgABSCstsGUssgEASCstsGYssgEBSCstsGcsswAAAEQrLbBoLLMAAQBEKy2waSyzAQAARCstsGosswEBAEQrLbBrLLMAAAFEKy2wbCyzAAEBRCstsG0sswEAAUQrLbBuLLMBAQFEKy2wbyyxADwrLrEwARQrLbBwLLEAPCuwQCstsHEssQA8K7BBKy2wciywABaxADwrsEIrLbBzLLEBPCuwQCstsHQssQE8K7BBKy2wdSywABaxATwrsEIrLbB2LLEAPSsusTABFCstsHcssQA9K7BAKy2weCyxAD0rsEErLbB5LLEAPSuwQistsHossQE9K7BAKy2weyyxAT0rsEErLbB8LLEBPSuwQistsH0ssQA+Ky6xMAEUKy2wfiyxAD4rsEArLbB/LLEAPiuwQSstsIAssQA+K7BCKy2wgSyxAT4rsEArLbCCLLEBPiuwQSstsIMssQE+K7BCKy2whCyxAD8rLrEwARQrLbCFLLEAPyuwQCstsIYssQA/K7BBKy2whyyxAD8rsEIrLbCILLEBPyuwQCstsIkssQE/K7BBKy2wiiyxAT8rsEIrLbCLLLILAANFUFiwBhuyBAIDRVgjIRshWVlCK7AIZbADJFB4sQUBFUVYMFktAEu4AMhSWLEBAY5ZsAG5CAAIAGNwsQAHQrEAACqxAAdCsQAKKrEAB0KxAAoqsQAHQrkAAAALKrEAB0K5AAAACyq5AAMAAESxJAGIUViwQIhYuQADAGREsSgBiFFYuAgAiFi5AAMAAERZG7EnAYhRWLoIgAABBECIY1RYuQADAABEWVlZWVmxAA4quAH/hbAEjbECAESzBWQGAERE') format('truetype'); } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ @@ -17,7 +17,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'zwiico'; - src: url('../font/zwiico.svg?63980596#zwiico') format('svg'); + src: url('../font/zwiico.svg?55150548#zwiico') format('svg'); } } */ @@ -57,9 +57,6 @@ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } .zwiico-plus-circled:before { content: '\2191'; } /* '↑' */ -.zwiico-flag:before { content: '\2691'; } /* '⚑' */ -.zwiico-mail:before { content: '\2709'; } /* '✉' */ -.zwiico-divide:before { content: '\e05b'; } /* '' */ .zwiico-logout:before { content: '\e800'; } /* '' */ .zwiico-plus:before { content: '\e801'; } /* '' */ .zwiico-cancel:before { content: '\e802'; } /* '' */ @@ -73,6 +70,7 @@ .zwiico-folder:before { content: '\e80a'; } /* '' */ .zwiico-users:before { content: '\e80b'; } /* '' */ .zwiico-left:before { content: '\e80c'; } /* '' */ +.zwiico-mail:before { content: '\e80d'; } /* '' */ .zwiico-user:before { content: '\e80e'; } /* '' */ .zwiico-update:before { content: '\e80f'; } /* '' */ .zwiico-home:before { content: '\e810'; } /* '' */ @@ -95,6 +93,8 @@ .zwiico-login:before { content: '\e821'; } /* '' */ .zwiico-lock:before { content: '\e822'; } /* '' */ .zwiico-mimi:before { content: '\e823'; } /* '' */ +.zwiico-divide:before { content: '\e824'; } /* '' */ +.zwiico-flag:before { content: '\e825'; } /* '' */ .zwiico-spin:before { content: '\e831'; } /* '' */ .zwiico-twitter:before { content: '\f099'; } /* '' */ .zwiico-facebook:before { content: '\f09a'; } /* '' */ @@ -105,6 +105,7 @@ .zwiico-download-cloud:before { content: '\f0ed'; } /* '' */ .zwiico-upload-cloud:before { content: '\f0ee'; } /* '' */ .zwiico-code:before { content: '\f121'; } /* '' */ +.zwiico-puzzle:before { content: '\f12e'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */ diff --git a/core/vendor/zwiico/css/zwiico-ie7-codes.css b/core/vendor/zwiico/css/zwiico-ie7-codes.css index 82ebb1ca..6e732fc0 100755 --- a/core/vendor/zwiico/css/zwiico-ie7-codes.css +++ b/core/vendor/zwiico/css/zwiico-ie7-codes.css @@ -1,8 +1,5 @@ .zwiico-plus-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '↑ '); } -.zwiico-flag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '⚑ '); } -.zwiico-mail { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '✉ '); } -.zwiico-divide { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } @@ -16,6 +13,7 @@ .zwiico-folder { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-users { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-left { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-mail { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-user { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-update { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } @@ -38,6 +36,8 @@ .zwiico-login { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-mimi { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-divide { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-flag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-spin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-twitter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-facebook { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } @@ -48,6 +48,7 @@ .zwiico-download-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-upload-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-code { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-puzzle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-youtube { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-instagram { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-brush { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } diff --git a/core/vendor/zwiico/css/zwiico-ie7.css b/core/vendor/zwiico/css/zwiico-ie7.css index 7b6be3da..f7920c99 100755 --- a/core/vendor/zwiico/css/zwiico-ie7.css +++ b/core/vendor/zwiico/css/zwiico-ie7.css @@ -11,9 +11,6 @@ } .zwiico-plus-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '↑ '); } -.zwiico-flag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '⚑ '); } -.zwiico-mail { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '✉ '); } -.zwiico-divide { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } @@ -27,6 +24,7 @@ .zwiico-folder { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-users { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-left { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-mail { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-user { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-update { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } @@ -49,6 +47,8 @@ .zwiico-login { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-mimi { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-divide { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-flag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-spin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-twitter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-facebook { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } @@ -59,6 +59,7 @@ .zwiico-download-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-upload-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-code { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-puzzle { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-youtube { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-instagram { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-brush { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } diff --git a/core/vendor/zwiico/css/zwiico.css b/core/vendor/zwiico/css/zwiico.css index 0f92db3e..c2b405f7 100755 --- a/core/vendor/zwiico/css/zwiico.css +++ b/core/vendor/zwiico/css/zwiico.css @@ -1,11 +1,11 @@ @font-face { font-family: 'zwiico'; - src: url('../font/zwiico.eot?96515118'); - src: url('../font/zwiico.eot?96515118#iefix') format('embedded-opentype'), - url('../font/zwiico.woff2?96515118') format('woff2'), - url('../font/zwiico.woff?96515118') format('woff'), - url('../font/zwiico.ttf?96515118') format('truetype'), - url('../font/zwiico.svg?96515118#zwiico') format('svg'); + src: url('../font/zwiico.eot?44489499'); + src: url('../font/zwiico.eot?44489499#iefix') format('embedded-opentype'), + url('../font/zwiico.woff2?44489499') format('woff2'), + url('../font/zwiico.woff?44489499') format('woff'), + url('../font/zwiico.ttf?44489499') format('truetype'), + url('../font/zwiico.svg?44489499#zwiico') format('svg'); font-weight: normal; font-style: normal; } @@ -15,7 +15,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'zwiico'; - src: url('../font/zwiico.svg?96515118#zwiico') format('svg'); + src: url('../font/zwiico.svg?44489499#zwiico') format('svg'); } } */ @@ -56,9 +56,6 @@ } .zwiico-plus-circled:before { content: '\2191'; } /* '↑' */ -.zwiico-flag:before { content: '\2691'; } /* '⚑' */ -.zwiico-mail:before { content: '\2709'; } /* '✉' */ -.zwiico-divide:before { content: '\e05b'; } /* '' */ .zwiico-logout:before { content: '\e800'; } /* '' */ .zwiico-plus:before { content: '\e801'; } /* '' */ .zwiico-cancel:before { content: '\e802'; } /* '' */ @@ -72,6 +69,7 @@ .zwiico-folder:before { content: '\e80a'; } /* '' */ .zwiico-users:before { content: '\e80b'; } /* '' */ .zwiico-left:before { content: '\e80c'; } /* '' */ +.zwiico-mail:before { content: '\e80d'; } /* '' */ .zwiico-user:before { content: '\e80e'; } /* '' */ .zwiico-update:before { content: '\e80f'; } /* '' */ .zwiico-home:before { content: '\e810'; } /* '' */ @@ -94,6 +92,8 @@ .zwiico-login:before { content: '\e821'; } /* '' */ .zwiico-lock:before { content: '\e822'; } /* '' */ .zwiico-mimi:before { content: '\e823'; } /* '' */ +.zwiico-divide:before { content: '\e824'; } /* '' */ +.zwiico-flag:before { content: '\e825'; } /* '' */ .zwiico-spin:before { content: '\e831'; } /* '' */ .zwiico-twitter:before { content: '\f099'; } /* '' */ .zwiico-facebook:before { content: '\f09a'; } /* '' */ @@ -104,6 +104,7 @@ .zwiico-download-cloud:before { content: '\f0ed'; } /* '' */ .zwiico-upload-cloud:before { content: '\f0ee'; } /* '' */ .zwiico-code:before { content: '\f121'; } /* '' */ +.zwiico-puzzle:before { content: '\f12e'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */ diff --git a/core/vendor/zwiico/font/zwiico.eot b/core/vendor/zwiico/font/zwiico.eot index 7772760a..66efe7e2 100755 Binary files a/core/vendor/zwiico/font/zwiico.eot and b/core/vendor/zwiico/font/zwiico.eot differ diff --git a/core/vendor/zwiico/font/zwiico.svg b/core/vendor/zwiico/font/zwiico.svg index c3c30fef..947f4d93 100755 --- a/core/vendor/zwiico/font/zwiico.svg +++ b/core/vendor/zwiico/font/zwiico.svg @@ -1,19 +1,13 @@ -Copyright (C) 2020 by original authors @ fontello.com +Copyright (C) 2021 by original authors @ fontello.com - - - - - - @@ -40,6 +34,8 @@ + + @@ -84,6 +80,10 @@ + + + + @@ -104,6 +104,8 @@ + + diff --git a/core/vendor/zwiico/font/zwiico.ttf b/core/vendor/zwiico/font/zwiico.ttf index 56e48ab1..1cd9d571 100755 Binary files a/core/vendor/zwiico/font/zwiico.ttf and b/core/vendor/zwiico/font/zwiico.ttf differ diff --git a/core/vendor/zwiico/font/zwiico.woff b/core/vendor/zwiico/font/zwiico.woff index 551f14a0..272be499 100755 Binary files a/core/vendor/zwiico/font/zwiico.woff and b/core/vendor/zwiico/font/zwiico.woff differ diff --git a/core/vendor/zwiico/font/zwiico.woff2 b/core/vendor/zwiico/font/zwiico.woff2 index 526c0aaf..881293b0 100755 Binary files a/core/vendor/zwiico/font/zwiico.woff2 and b/core/vendor/zwiico/font/zwiico.woff2 differ diff --git a/index.php b/index.php index 30ea149e..3e6b954b 100755 --- a/index.php +++ b/index.php @@ -9,7 +9,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/blog/blog.php b/module/blog/blog.php index 110d92f0..560086b3 100755 --- a/module/blog/blog.php +++ b/module/blog/blog.php @@ -2,18 +2,25 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ class blog extends common { + const VERSION = '4.4'; + const REALNAME = 'Blog'; + const DELETE = true; + const UPDATE = '0.0'; + const DATADIRECTORY = []; // Contenu localisé inclus par défaut (page.json et module.json) + const EDIT_OWNER = 'owner'; const EDIT_GROUP = 'group'; const EDIT_ALL = 'all'; @@ -87,8 +94,6 @@ class blog extends common { public static $users = []; - const BLOG_VERSION = '4.2'; - /** * Flux RSS */ @@ -758,4 +763,3 @@ class blog extends common { } } } - diff --git a/module/blog/view/add/add.css b/module/blog/view/add/add.css index 805e9150..5a91e7a7 100755 --- a/module/blog/view/add/add.css +++ b/module/blog/view/add/add.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/blog/view/add/add.js.php b/module/blog/view/add/add.js.php index 6067ca10..4c12608f 100755 --- a/module/blog/view/add/add.js.php +++ b/module/blog/view/add/add.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/blog/view/article/article.js.php b/module/blog/view/article/article.js.php index 0d0fb3e9..dcb3e2af 100755 --- a/module/blog/view/article/article.js.php +++ b/module/blog/view/article/article.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/blog/view/article/article.php b/module/blog/view/article/article.php index 7016c91c..aa19fe55 100755 --- a/module/blog/view/article/article.php +++ b/module/blog/view/article/article.php @@ -1,154 +1,153 @@ -
    -
    -
    -
    - - getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn'])), 'UTF-8', true) - ? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn'])) - : utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']))); - $heure = mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn'])), 'UTF-8', true) - ? strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn'])) - : utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']))); - echo $date . ' à ' . $heure; - ?> -
    -
    -
    - getUser('password') === $this->getInput('ZWII_USER_PASSWORD') - AND - ( // Propriétaire - ( - $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1),'editConsent']) === $module::EDIT_OWNER - AND ( $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1),'userId']) === $this->getUser('id') - OR $this->getUser('group') === self::GROUP_ADMIN ) - ) - OR ( - // Groupe - ( $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1),'editConsent']) === self::GROUP_ADMIN - OR $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1),'editConsent']) === self::GROUP_MODERATOR) - AND $this->getUser('group') >= $this->getData(['module',$this->getUrl(0), 'posts', $this->getUrl(1),'editConsent']) - ) - OR ( - // Tout le monde - $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1),'editConsent']) === $module::EDIT_ALL - AND $this->getUser('group') >= $module::$actions['config'] - ) - ) - ): ?> - helper::baseUrl() . $this->getUrl(0) . '/edit/' . $this->getUrl(1) . '/' . $_SESSION['csrf'], - 'value' => 'Editer' - ]); ?> - +
    +
    +
    + + getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn'])), 'UTF-8', true) + ? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn'])) + : utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']))); + $heure = mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn'])), 'UTF-8', true) + ? strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn'])) + : utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']))); + echo $date . ' à ' . $heure; + ?>
    - getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'pictureSize']) === null ? '100' : $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'pictureSize']); ?> - getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'hidePicture']) == false) { - echo '' . $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'picture']) . ''; - } ?> - getData(['module', $this->getUrl(0),'posts', $this->getUrl(1), 'content']); ?> -

    - - getData(['module',$this->getUrl(0), 'config', 'feeds'])): ?> - - - getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'commentClose'])): ?> -

    Cet article ne reçoit pas de commentaire.

    - -

    - - - - 0 ? $commentsNb . ' ' . 'commentaire' . $s : 'Pas encore de commentaire'; ?> -

    - - 'Rédiger un commentaire...', - 'readonly' => true - ]); ?> -
    - getUser('password') === $this->getInput('ZWII_USER_PASSWORD')): ?> - 'Nom', - 'readonly' => true, - 'value' => $module::$editCommentSignature - ]); ?> - $this->getUser('id') - ]); ?> - -
    -
    - 'Nom' - ]); ?> -
    -
    -
    Ou
    -
    -
    - helper::baseUrl() . 'user/login/' . str_replace('/', '_', $this->getUrl()) . '__comment', - 'value' => 'Connexion' - ]); ?> -
    -
    - - 'Commentaire avec maximum '.$this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'commentMaxlength']).' caractères', - 'class' => 'editorWysiwygComment', - 'noDirty' => true, - 'maxlength' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'commentMaxlength']) +
    + getUser('password') === $this->getInput('ZWII_USER_PASSWORD') + AND + ( // Propriétaire + ( + $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1),'editConsent']) === $module::EDIT_OWNER + AND ( $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1),'userId']) === $this->getUser('id') + OR $this->getUser('group') === self::GROUP_ADMIN ) + ) + OR ( + // Groupe + ( $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1),'editConsent']) === self::GROUP_ADMIN + OR $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1),'editConsent']) === self::GROUP_MODERATOR) + AND $this->getUser('group') >= $this->getData(['module',$this->getUrl(0), 'posts', $this->getUrl(1),'editConsent']) + ) + OR ( + // Tout le monde + $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1),'editConsent']) === $module::EDIT_ALL + AND $this->getUser('group') >= $module::$actions['config'] + ) + ) + ): ?> + helper::baseUrl() . $this->getUrl(0) . '/edit/' . $this->getUrl(1) . '/' . $_SESSION['csrf'], + 'value' => 'Editer' ]); ?> -
    - getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')): ?> -
    -
    - $this->getData(['config','captchaStrong']) - ]); ?> -
    -
    - + +
    +
    + getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'pictureSize']) === null ? '100' : $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'pictureSize']); ?> + getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'hidePicture']) == false) { + echo '' . $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'picture']) . ''; + } ?> +getData(['module', $this->getUrl(0),'posts', $this->getUrl(1), 'content']); ?> +

    + +getData(['module',$this->getUrl(0), 'config', 'feeds'])): ?> + + +getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'commentClose'])): ?> +

    Cet article ne reçoit pas de commentaire.

    + +

    + + + + 0 ? $commentsNb . ' ' . 'commentaire' . $s : 'Pas encore de commentaire'; ?> +

    + + 'Rédiger un commentaire...', + 'readonly' => true + ]); ?> +
    + getUser('password') === $this->getInput('ZWII_USER_PASSWORD')): ?> + 'Nom', + 'readonly' => true, + 'value' => $module::$editCommentSignature + ]); ?> + $this->getUser('id') + ]); ?> +
    -
    - 'buttonGrey', - 'value' => 'Annuler' +
    + 'Nom' ]); ?>
    -
    - 'Envoyer', - 'ico' => '' +
    +
    Ou
    +
    +
    + helper::baseUrl() . 'user/login/' . str_replace('/', '_', $this->getUrl()) . '__comment', + 'value' => 'Connexion' ]); ?>
    + + 'Commentaire avec maximum '.$this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'commentMaxlength']).' caractères', + 'class' => 'editorWysiwygComment', + 'noDirty' => true, + 'maxlength' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'commentMaxlength']) + ]); ?> +
    + getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')): ?> +
    +
    + $this->getData(['config','captchaStrong']) + ]); ?> +
    +
    + +
    +
    + 'buttonGrey', + 'value' => 'Annuler' + ]); ?> +
    +
    + 'Envoyer', + 'ico' => '' + ]); ?> +
    - -
    -
    - $comment): ?> -
    -

    - le - -

    -
    + +
    +
    + $comment): ?> +
    +

    + le +

    + +
    +
    - -
    \ No newline at end of file + + \ No newline at end of file diff --git a/module/blog/view/comment/comment.css b/module/blog/view/comment/comment.css index 805e9150..5a91e7a7 100755 --- a/module/blog/view/comment/comment.css +++ b/module/blog/view/comment/comment.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/blog/view/comment/comment.js.php b/module/blog/view/comment/comment.js.php index fc6f7aaa..fa9fe18d 100755 --- a/module/blog/view/comment/comment.js.php +++ b/module/blog/view/comment/comment.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/blog/view/config/config.css b/module/blog/view/config/config.css index 805e9150..5a91e7a7 100755 --- a/module/blog/view/config/config.css +++ b/module/blog/view/config/config.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/blog/view/config/config.js.php b/module/blog/view/config/config.js.php index df6138c0..e7fe11ce 100755 --- a/module/blog/view/config/config.js.php +++ b/module/blog/view/config/config.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php index 7830d8fd..fee5671a 100755 --- a/module/blog/view/config/config.php +++ b/module/blog/view/config/config.php @@ -47,6 +47,6 @@
    Version n° - +
    diff --git a/module/blog/view/edit/edit.css b/module/blog/view/edit/edit.css index 805e9150..5a91e7a7 100755 --- a/module/blog/view/edit/edit.css +++ b/module/blog/view/edit/edit.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/blog/view/edit/edit.js.php b/module/blog/view/edit/edit.js.php index 96e2872a..d60d5512 100755 --- a/module/blog/view/edit/edit.js.php +++ b/module/blog/view/edit/edit.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/blog/view/index/index.php b/module/blog/view/index/index.php index 1434d5b7..ca0f24d7 100755 --- a/module/blog/view/index/index.php +++ b/module/blog/view/index/index.php @@ -21,7 +21,6 @@ diff --git a/module/form/form.php b/module/form/form.php index a47a0ec7..77d416d8 100755 --- a/module/form/form.php +++ b/module/form/form.php @@ -9,13 +9,19 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ class form extends common { + const VERSION = '2.8'; + const REALNAME = 'Formulaire'; + const DELETE = true; + const UPDATE = '0.0'; + const DATADIRECTORY = []; // Contenu localisé inclus par défaut (page.json et module.json) + public static $actions = [ 'config' => self::GROUP_MODERATOR, 'data' => self::GROUP_MODERATOR, @@ -32,7 +38,6 @@ class form extends common { public static $pagination; - const FORM_VERSION = '2.7'; // Objets const TYPE_MAIL = 'mail'; @@ -166,7 +171,7 @@ class form extends common { /** * Export CSV * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez */ public function export2csv() { // Jeton incorrect @@ -285,7 +290,7 @@ class form extends common { if( $this->getData(['module', $this->getUrl(0), 'config', 'captcha']) // AND $this->getInput('formcaptcha', helper::FILTER_INT) !== $this->getInput('formcaptchaFirstNumber', helper::FILTER_INT) + $this->getInput('formcaptchaSecondNumber', helper::FILTER_INT)) - AND password_verify($this->getInput('formCaptcha', helper::FILTER_INT), $this->getInput('formCaptchaResult') ) === false ) + AND password_verify($this->getInput('formCaptcha', helper::FILTER_INT), $this->getInput('formCaptchaResult') ) === false ) { self::$inputNotices['formCaptcha'] = 'Incorrect'; diff --git a/module/form/view/config/config.css b/module/form/view/config/config.css index 5ad89b08..c9c08e84 100755 --- a/module/form/view/config/config.css +++ b/module/form/view/config/config.css @@ -8,7 +8,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/form/view/config/config.js.php b/module/form/view/config/config.js.php index 37afae73..4d0788d2 100755 --- a/module/form/view/config/config.js.php +++ b/module/form/view/config/config.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/form/view/config/config.php b/module/form/view/config/config.php index 5d2e8946..fea6d9ff 100755 --- a/module/form/view/config/config.php +++ b/module/form/view/config/config.php @@ -164,5 +164,5 @@
    Version n° - +
    diff --git a/module/form/view/data/data.css b/module/form/view/data/data.css index 805e9150..5a91e7a7 100755 --- a/module/form/view/data/data.css +++ b/module/form/view/data/data.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/form/view/data/data.js.php b/module/form/view/data/data.js.php index 9fb2aafd..8b13fb63 100755 --- a/module/form/view/data/data.js.php +++ b/module/form/view/data/data.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/form/view/data/data.php b/module/form/view/data/data.php index c60511b4..947e20db 100755 --- a/module/form/view/data/data.php +++ b/module/form/view/data/data.php @@ -26,5 +26,5 @@
    Version n° - +
    \ No newline at end of file diff --git a/module/gallery/gallery.php b/module/gallery/gallery.php index 77d0f2c3..9434387f 100755 --- a/module/gallery/gallery.php +++ b/module/gallery/gallery.php @@ -9,17 +9,24 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ class gallery extends common { + + const VERSION = '2.6'; + const REALNAME = 'Galerie'; + const DELETE = true; + const UPDATE = '0.0'; + const DATADIRECTORY = []; // Contenu localisé inclus par défaut (page.json et module.json) + const SORT_ASC = 'SORT_ASC'; const SORT_DSC = 'SORT_DSC'; const SORT_HAND = 'SORT_HAND'; - const GALLERY_VERSION = '2.5'; + public static $directories = []; @@ -691,4 +698,4 @@ class galleriesHelper extends helper { } return $dirContent; } -} \ No newline at end of file +} diff --git a/module/gallery/view/config/config.css b/module/gallery/view/config/config.css index 8079fedb..b15a3331 100755 --- a/module/gallery/view/config/config.css +++ b/module/gallery/view/config/config.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/gallery/view/config/config.js.php b/module/gallery/view/config/config.js.php index f56117b3..ca2edf11 100755 --- a/module/gallery/view/config/config.js.php +++ b/module/gallery/view/config/config.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/gallery/view/config/config.php b/module/gallery/view/config/config.php index 0c41378b..91400a98 100755 --- a/module/gallery/view/config/config.php +++ b/module/gallery/view/config/config.php @@ -58,6 +58,6 @@
    Version n° - +
    diff --git a/module/gallery/view/edit/edit.css b/module/gallery/view/edit/edit.css index 805e9150..5a91e7a7 100755 --- a/module/gallery/view/edit/edit.css +++ b/module/gallery/view/edit/edit.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/gallery/view/edit/edit.js.php b/module/gallery/view/edit/edit.js.php index c36e08d7..23338729 100755 --- a/module/gallery/view/edit/edit.js.php +++ b/module/gallery/view/edit/edit.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/gallery/view/edit/edit.php b/module/gallery/view/edit/edit.php index 9b243d32..c745d1e5 100755 --- a/module/gallery/view/edit/edit.php +++ b/module/gallery/view/edit/edit.php @@ -64,6 +64,6 @@
    Version n° - +
    diff --git a/module/gallery/view/gallery/gallery.js.php b/module/gallery/view/gallery/gallery.js.php index d99980d2..0b7c46b9 100755 --- a/module/gallery/view/gallery/gallery.js.php +++ b/module/gallery/view/gallery/gallery.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/gallery/view/theme/theme.css b/module/gallery/view/theme/theme.css index 805e9150..5a91e7a7 100755 --- a/module/gallery/view/theme/theme.css +++ b/module/gallery/view/theme/theme.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/gallery/view/theme/theme.php b/module/gallery/view/theme/theme.php index 8ada32ed..694ecaf9 100755 --- a/module/gallery/view/theme/theme.php +++ b/module/gallery/view/theme/theme.php @@ -139,7 +139,7 @@
    Version n° - +
    \ No newline at end of file diff --git a/module/news/news.php b/module/news/news.php index 13fcb2fa..6675ec37 100755 --- a/module/news/news.php +++ b/module/news/news.php @@ -2,18 +2,25 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ class news extends common { + const VERSION = '2.1'; + const REALNAME = 'Actualités'; + const DELETE = true; + const UPDATE = '0.0'; + const DATADIRECTORY = []; // Contenu localisé inclus par défaut (page.json et module.json) + public static $actions = [ 'add' => self::GROUP_MODERATOR, 'config' => self::GROUP_MODERATOR, @@ -33,7 +40,6 @@ class news extends common { false => 'Brouillon', true => 'Publié' ]; - const NEWS_VERSION = '2.0'; public static $users = []; @@ -328,4 +334,4 @@ class news extends common { return $this->getData(['user', $userId, 'firstname']); } } -} \ No newline at end of file +} diff --git a/module/news/view/add/add.css b/module/news/view/add/add.css index 805e9150..5a91e7a7 100755 --- a/module/news/view/add/add.css +++ b/module/news/view/add/add.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/news/view/add/add.js.php b/module/news/view/add/add.js.php index 77bb1442..a2ad5361 100755 --- a/module/news/view/add/add.js.php +++ b/module/news/view/add/add.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/news/view/config/config.css b/module/news/view/config/config.css index 805e9150..5a91e7a7 100755 --- a/module/news/view/config/config.css +++ b/module/news/view/config/config.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/news/view/config/config.js.php b/module/news/view/config/config.js.php index 608f5324..b24dd37d 100755 --- a/module/news/view/config/config.js.php +++ b/module/news/view/config/config.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/news/view/config/config.php b/module/news/view/config/config.php index f25fe3d0..73929b9d 100755 --- a/module/news/view/config/config.php +++ b/module/news/view/config/config.php @@ -48,5 +48,5 @@
    Version n° - +
    \ No newline at end of file diff --git a/module/news/view/edit/edit.js.php b/module/news/view/edit/edit.js.php index ef1444ff..461b7602 100755 --- a/module/news/view/edit/edit.js.php +++ b/module/news/view/edit/edit.js.php @@ -1,11 +1,12 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/news/view/index/index.css b/module/news/view/index/index.css index d500e8fe..ba6dd269 100755 --- a/module/news/view/index/index.css +++ b/module/news/view/index/index.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/redirection/redirection.php b/module/redirection/redirection.php index 5c92521c..0d1a704d 100755 --- a/module/redirection/redirection.php +++ b/module/redirection/redirection.php @@ -2,24 +2,30 @@ /** * This file is part of Zwii. - * * For full copyright and license information, please see the LICENSE * file that was distributed with this source code. * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ class redirection extends common { + const VERSION = '1.5'; + const REALNAME = 'Redirection'; + const DELETE = true; + const UPDATE = '0.0'; + const DATADIRECTORY = []; // Contenu localisé inclus par défaut (page.json et module.json) + public static $actions = [ 'config' => self::GROUP_MODERATOR, 'index' => self::GROUP_VISITOR ]; - const REDIRECTION_VERSION = '1.4'; /** * Configuration @@ -70,4 +76,4 @@ class redirection extends common { ]); } } -} \ No newline at end of file +} diff --git a/module/redirection/view/config/config.css b/module/redirection/view/config/config.css index 805e9150..5a91e7a7 100755 --- a/module/redirection/view/config/config.css +++ b/module/redirection/view/config/config.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/redirection/view/config/config.php b/module/redirection/view/config/config.php index 72071f4c..ff421b39 100755 --- a/module/redirection/view/config/config.php +++ b/module/redirection/view/config/config.php @@ -37,5 +37,5 @@
    Version n° - +
    \ No newline at end of file diff --git a/module/redirection/view/index/index.css b/module/redirection/view/index/index.css index 805e9150..5a91e7a7 100755 --- a/module/redirection/view/index/index.css +++ b/module/redirection/view/index/index.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/search/search.php b/module/search/search.php index f84dfdeb..ed9a5815 100755 --- a/module/search/search.php +++ b/module/search/search.php @@ -9,7 +9,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @copyright Sylvain Lelièvre * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ @@ -18,6 +18,12 @@ class search extends common { + const VERSION = '1.3'; + const REALNAME = 'Recherche'; + const DELETE = true; + const UPDATE = '0.0'; + const DATADIRECTORY = []; // Contenu localisé inclus par défaut (page.json et module.json) + public static $actions = [ 'index' => self::GROUP_VISITOR, 'config' => self::GROUP_MODERATOR @@ -38,7 +44,6 @@ class search extends common { 400 => '400 caractères', ]; - const SEARCH_VERSION = '1.2'; // Configuration vide public function config() { diff --git a/module/search/view/config/config.css b/module/search/view/config/config.css index 9346d7ac..d2dafebe 100755 --- a/module/search/view/config/config.css +++ b/module/search/view/config/config.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Copyright (C) 2018-2021, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ diff --git a/module/search/view/config/config.php b/module/search/view/config/config.php index 37a60653..f54674d7 100755 --- a/module/search/view/config/config.php +++ b/module/search/view/config/config.php @@ -68,5 +68,5 @@
    Version n° - +
    \ No newline at end of file