[SI-LINDER-PARTNER-5][OSC] - Développement d'un module dans le BackOffice qui permet une gestion des images du diaporama (Slideshow) affiché en FrontOffice
$Id: si_slideshow_manager.php,v 0.1 09/10/2020 11:20:49 Saphyra-Interactive Exp $
Système de Gestionnaire du Diaporama: Interface
developped for osCommerce, Open Source E-Commerce Solutions
http://www.oscommerce.com
asked by Linder-Partner/LP-Divertissements
http(s)://www.linder-partner.com
http(s)://www.lp-divertissements.com
Copyright (c) 2003 osCommerce
Copyright (c) 2020 Saphyra-Interactive
Released under the GNU General Public License
*/
require('includes/application_top.php');
// on paramètre la variable $action par défaut à:
$action = (isset($HTTP_GET_VARS['action']) ? $HTTP_GET_VARS['action'] : '');
// si on a choisi une action
if (tep_not_null($action)) {
switch ($action) {
// si l'action est de changer le statut d'une diapositive (action = setflag)
case 'setflag':
/*
On va dans l'ordre faire cela:
1) on vérifie que le dossier est bien en accès écriture, sinon, on informe d'une erreur et on redirige!
2) on vérifie si on a vraiment un statut égal à 0 ou 1
3) si oui, on vérifie que la variable passée en paramètre GET=slideAbsolutePath n'est pas vide ou inexistante correspondant au chemin ABSOLU vers le fichier
4) si la valeur preg_match(), vérifiée ne contient pas la chaine .disabled-slide (qui est la chaîne qu'on a choisi pour indiquer qu'une diapositive (un bête fichier image) soit une diapositive désactivée)
les diapositives désactivées ne seront jamais chargées dans le diaporama
5) alors on renomme le même fichier, en y ajoutant la chaîne .disabled-slide, ce qui indiquera que cette diapositive est désactivée
6) sinon, si elle contient la chaîne .disabled-slide, on est face à une diapositive activée
7) alors, on renomme le même fichier, en y retirant la chaîne .disabled-slide, ce qui indiquera que cette diapositive est activée
8) dans un cas comme l'autre, il faut spécifier un chemin ABSOLU pour renommer avec rename() (d'où l'usage de notre variable GET=slideAbsolutePath!
9) on indique ensuite du succès du processus à l'aide d'un ajout à $messageStack !
10) que le processus soit en succès ou en échec, on redirige vers le système du Gestionnaire du Diapora à l'aid de tep_redirect()
*/
if (!is_writeable('../' . DIR_WS_DESIGN . 'Slideshow/Images/')) {
$messageStack->add_session(sprintf(ERROR_IMAGE_FILE_OR_DIR_NOT_WRITEABLE, $HTTP_GET_VARS['slideAbsolutePath']), 'error');
tep_redirect(tep_href_link(FILENAME_SI_SLIDESHOW_MANAGER));
}
if ( ($HTTP_GET_VARS['flag'] == '0') || ($HTTP_GET_VARS['flag'] == '1') ) {
if (!empty($HTTP_GET_VARS['slideAbsolutePath'])) {
if (!preg_match('/\.disabled\-slide/', $HTTP_GET_VARS['slideAbsolutePath'])) {
// le slide était actif, désormais il sera inactif
rename($HTTP_GET_VARS['slideAbsolutePath'], $HTTP_GET_VARS['slideAbsolutePath'] . '.disabled-slide');
} else {
// le slide était inactif, désormais il sera actif
rename($HTTP_GET_VARS['slideAbsolutePath'], str_replace('.disabled-slide', '', $HTTP_GET_VARS['slideAbsolutePath']));
}
}
$messageStack->add_session(SUCCESS_SLIDE_STATUS_UPDATED, 'success');
} else {
$messageStack->add_session(ERROR_UNKNOWN_STATUS_FLAG, 'error');
}
tep_redirect(tep_href_link(FILENAME_SI_SLIDESHOW_MANAGER));
break;
// si l'action est d'ajouter une nouvelle diapositive (action = insert)
case 'insert':
/*
On va dans l'ordre faire cela:
1) on sécurise la chaîne dans l'image (nom de fichier) qui va bientôt rejoindre le dossier des Diapositives (Images du Slideshow)
2) on paramètre une variable de type flag (booléenne), afin de retenir si oui ou non on a subit une erreur..
3) on stocke dans une variable une instance de la classe objet upload native à OSCommerce (elle fonctionne très bien, et donne les bonnes permissions aux fichiers uploadés, alors pourquoi s'en passer?)
4) on paramètre la destination de l'image définitive, depuis notre objet upload
5) on sécurise l'upload, on vérifie si oui ou non l'upload s'est bien passé
si non
on informe d'une erreur
6) en cas qu'une erreur durant l'upload n'a pas été provoquée,
alors
on redirige la page vers l'interface!
sinon
on spécifie un cas précis d'action: 'new' afin de laisser l'uilisateur retenter
*/
$slides_image_target = tep_db_prepare_input($HTTP_POST_VARS['slides_image']);
$slide_error = false;
$slides_image = new upload('slides_image');
$slides_image->set_destination(DIR_FS_CATALOG . DIR_WS_DESIGN . 'Slideshow/Images/' . $slides_image_target);
if ( ($slides_image->parse() == false) || ($slides_image->save() == false) ) {
$messageStack->add_session(ERROR_IMAGE_DIRECTORY_NOT_WRITEABLE, 'error');
$slide_error = true;
}
if ($slide_error == false) {
$messageStack->add_session(SUCCESS_SLIDE_INSERTED, 'success');
tep_redirect(tep_href_link(FILENAME_SI_SLIDESHOW_MANAGER));
} else {
$action = 'new';
}
break;
}
}
?>
>
en cours dans le tableau pour l'itération actuelle
sinon
on valorise le statut de l'élément actuellement itéré dans la boucle à 0 pour cette diapositive, signifiant diapositive activée
et on donne un style en apparence css internet -inline_css_style
et l'événement de survol (onmouseover) ou de non-survol (onmouseout) de la ligne
en cours dans le tableau pour l'itération actuelle
9) on construit le code HTML, ainsi que les interrupteurs de statut de la diapositive et on recupère le style en apparence css internet -inline_css_style
on remplace VISUELLEMENT (pas dans la variable) avec un str_replace() le terme '.disabled-slide' à l'affichage dans le tableau HTML pour faire beau et professionnel, si il est présent ou non..
on transforme le caractère '+' en '{CHAR_PLUS}' dans le POPUP
(pour encoder ce caractère très problématique, car sinon, dans l'action du tep_image() dans le fichier /admin/popup_image.php), il serait remplacé par PHP par un fichu espace!) !!)
(ceci s'explique car le caractère + est dans une adresse un code espace, donc, là, on remplace par {CHAR_PLUS}, et dans le fichier de popup_image, on remplacera à nouveau {CHAR_PLUS} par '+').
SANS CE FIX..
le chemin: ... /design/Slideshow/Images/Y8P+OS.png
serait cherché par le rename en:
le chemin: ... /design/Slideshow/Images/Y8P OS.png
AVEC CE FIX..
le chemin: ... /design/Slideshow/Images/Y8P%2BOS.png
serait cherché par le rename en:
le chemin: ... /design/Slideshow/Images/Y8P+OS.png
10) on continue à la prochaine itération si on échoue l'étape en (5), car cela signifie que le fichier n'a pas un format d'image valide!
11) enfin, on détruit toute les variables créées dans ces étapes à la sortie complète de la boucle
*/
$slides_query_raw = glob('../' . DIR_WS_DESIGN . "Slideshow/Images/*.*");
for ($i = 0; $i < count($slides_query_raw); $i++)
{
$slides = array(
'slide_absolute_filepath' => DIR_FS_DOCUMENT_ROOT,
'slide_filename' => '',
'status' => '0',
'inline_css_style' => '',
'js_onmouseover' => '',
'js_onmouseout' => ''
);
$slides_query = $slides_query_raw[$i];
$supported_format = array('webp', 'jpg', 'jpeg', 'png', 'disabled-slide');
$ext = strtolower(pathinfo($slides_query, PATHINFO_EXTENSION));
$slides['slide_absolute_filepath'] = str_replace(
array('../', '+'),
array('' , '%2B'),
DIR_FS_DOCUMENT_ROOT . $slides_query
);
if (in_array($ext, $supported_format))
{
$slides['slide_filename'] = $slides_query;
if (preg_match('/\.disabled\-slide/', $slides['slide_filename'])) {
$slides['status'] = '0';
$slides['inline_css_style'] = 'color: red; font-size: 1em; padding-top: 5px; padding-bottom: 5px;';
$slides['js_onmouseover'] = 'this.style.cursor=\'pointer\'; this.style.backgroundColor=\'#f7f7f7\';';
$slides['js_onmouseout'] = 'this.style.cursor=\'\'; this.style.backgroundColor=\'#ffffff\';';
} else {
$slides['status'] = '1';
$slides['inline_css_style'] = 'color: green; font-size: 1em; padding-top: 5px; padding-bottom: 5px;';
$slides['js_onmouseover'] = 'this.style.cursor=\'pointer\'; this.style.backgroundColor=\'#f7f7f7\';';
$slides['js_onmouseout'] = 'this.style.cursor=\'\'; this.style.backgroundColor=\'#ffffff\';';
}
?>