en Jump to content
  • 0
Valantir

Własny moduł i wylogowywanie użytkownika

Question

Witam,

Napisałem ostatnio własny moduł do Prestashop w wersji 1.6.1.7, który służy do tworzenia karuzeli na podstronie stronie. Problem w tym, że od czasu do czasu gdy kliknie się w przycisk na liście "Konfiguruj", to użytkownik jest przenoszony na podstronę z logowaniem. Ponowne zalogowanie powoduje wejście do panelu administratora ale kliknięcie na przycisk "Konfiguruj" powoduje znów przejście na stronę z logowaniem. Problem dotyczy chyba tylko mojego modułu, bo inne jakoś potrafią współpracować. Bardzo proszę o jakieś wskazówki jak się za to zabrać...

Pozdrawiam

Share this post


Link to post
Share on other sites

6 answers to this question

Recommended Posts

  • 0

Ciężko coś napisać. próbowałeś na innej przeglądarce? Albo usuwać poszczególne bloki kodu? :) Wiesz, po prostu musisz to zdebugować, zakładam, że nie działasz w środku modułu na $cookies albo nie bawisz się sprawami związanymi z tokenami by działy się takie rzeczy.

Share this post


Link to post
Share on other sites
  • 0

Nie, nie bawię się tym. Właśnie nie wiem od czego zacząć w takim debugowaniu... Jaka klasa się odpala przy klikaniu w przycisk konfiguruj? Bo klasa mojego modułu nawet nie jest odpalana :(

Share this post


Link to post
Share on other sites
  • 0

Nie jest tak że robisz moduł i poprawiasz go na żywym sklepie bez przeinstalowywania po zmianach? Może w funkcji construct miałeś początkowo need_instance a później to wywaliłeś?

Share this post


Link to post
Share on other sites
  • 0

To jest mój moduł:

 

<?php

if (!defined('_CAN_LOAD_FILES_'))
    exit;

class collection extends Module
{
    public $existingFiles = array();

    public $count = NULL;

    public $collectionDir;
    public $thumbnailCollectionDir;

    /**
     * {@inheritdoc}
     */
    function __construct()
    {
        $this->name = 'collection';
        $this->tab = 'other';
        $this->version = '1.0.0';
        $this->author = 'Autor';
        parent::__construct();
        $this->displayName = $this->l('collection');
        $this->description = $this->l('collection');
        $this->webPath = '/img/collection/';
        $this->collectionDir = getcwd() . '/../collection';
        $this->thumbnailCollectionDir = getcwd() . '/../collection/thumbnails';
    }

    /**
     * @return boolean
     */
    public function install()
    {
        parent::install();
        if (!$this->registerHook('Header')) {
            return false;
        }

        /* Create table */
        $res = $this->createTable();
        if (!$res) {
            return false;
        }

        if (!mkdir($this->collectionDir) || !mkdir($this->thumbnailCollectionDir)) {
            return false;
        }

        return true;
    }

    /**
     * @return boolean
     */
    public function uninstall()
    {
        if (!parent::uninstall() || !Configuration::deleteByName('collection')) {
            return false;
        }

        /* delete table */
        $res = $this->deleteTable();
        if (!$res) {
            return false;
        }

        if (file_exists($this->collectionDir) && is_dir($this->collectionDir)) {
            return $this->removeFile($this->collectionDir);
        }

        return true;
    }

    /**
     * @param string $path
     * 
     * @return boolean
     */
    protected function removeFile($path)
    {
        if (is_dir($path) === true)
        {
            $files = array_diff(scandir($path), array('.', '..'));

            foreach ($files as $file)
            {
                $this->removeFile(realpath($path) . '/' . $file);
            }

            return rmdir($path);
        }

        else if (is_file($path) === true)
        {
            return unlink($path);
        }

        return false;
    }

    /**
     * Create table
     */
    protected function createTable()
    {
        /* Category Photo */
        $res = (bool) Db::getInstance()->execute('
			CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'collection` (
				`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
				`photo_path` varchar(255) NOT NULL,
				`thumbnail_path` varchar(255) NOT NULL,
                                `position` int(10) unsigned NOT NULL,
				PRIMARY KEY (`id`)
			) ENGINE=' . _MYSQL_ENGINE_ . ' DEFAULT CHARSET=UTF8;
		');

        return $res;
    }

    /**
     * delete table
     */
    protected function deleteTable()
    {
        return Db::getInstance()->execute('
            DROP TABLE IF EXISTS `' . _DB_PREFIX_ . 'collection`;
        ');
    }

    /**
     * Displays panel to build grid system in backend
     * 
     * @return string
     */
    public function getContent()
    {
        
        var_dump($this->context->link->getModuleLink('collection','collection'));die;


        $this->addCss();
        $this->addJsScripts();
        $error = null;
        $file = $_FILES['collection_photo'];

        $allFiles = $this->countAllFiles();
        if ($allFiles >= 30) {
            $error = 'Limit zdjęć - przekroczyłeś/aś limit 30 zdjęć. Usuń jakieś zdjęcia aby dodać nowe';
        } else {
            if (Tools::isSubmit('submit') && !empty($file)) {
                $allowedExts = array("jpg", "jpeg");
                $allowedTypes = array('image/jpeg', 'image/jpg');
                if (!in_array($file['type'], $allowedTypes)) {
                    $error = 'Niewłaściwy typ pliku. Dozwolonymi typami plików są: ' . implode(', ', $allowedTypes);
                }

                $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
                if (!in_array($ext, $allowedExts)) {
                    $error = 'Niewłaściwe rozszerzenie pliku. Dozwolonymi rozszerzeniami plików są: ' . implode(', ', $allowedExts);
                }

                $fileName = uniqid() . '.' . $ext;
                $thumbnailFile = $this->resizeImage($file['tmp_name'], $fileName);
                if (!$thumbnailFile) {
                    $error = 'Błąd podczas generowania miniatury.';
                }

                if (!$error) {
                    $newPath = $this->collectionDir . '/' . $fileName;
                    $result = $this->fileCopy($file['tmp_name'], $newPath);
                    if ($result) {
                        $lastPosition = Db::getInstance()->executeS('SELECT position FROM `' . _DB_PREFIX_ . 'collection` ORDER BY position DESC LIMIT 1');
                        if (empty($lastPosition)) {
                            $lastPosition = 1;
                        } else {
                            $lastPosition = $lastPosition[0]['position'] + 1;
                        }

                        $upload = Db::getInstance()->executeS("INSERT INTO `" . _DB_PREFIX_ . "collection` "
                            . "(photo_path, thumbnail_path, position) "
                            . "VALUES ('" . _PS_BASE_URL_ . "/collection/" . $fileName . "', '" . _PS_BASE_URL_ . "/collection/thumbnails/" . $fileName . "', '" . $lastPosition . "')")
                        ;

                        if (!$upload && file_exists($newPath)) {
                            unlink($newPath);
                        }
                        
                        Tools::redirectAdmin(AdminController::$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules'));
                    }
                } else {
                    Tools::redirectAdmin(AdminController::$currentIndex.'&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules') . '&error=' . $error);
                }
            }
        }

        $allFiles = Db::getInstance()->executeS('SELECT id, photo_path, thumbnail_path, position FROM `' . _DB_PREFIX_ . 'collection` ORDER BY position ASC');

        $this->context->smarty->assign(array(
            'error' => ($error) ? $error : Tools::getValue('error'),
            'allFiles' => $allFiles,
        ));

        return $this->display(__FILE__, 'views/templates/admin/collection.tpl');
    }

    /**
     * Zlicza ilosc zdjec w kolekcji
     * 
     * @return string
     */
    protected function countAllFiles()
    {
        $countAllFiles = Db::getInstance()->executeS('SELECT COUNT(*) AS how_many FROM `' . _DB_PREFIX_ . 'collection`');

        return $countAllFiles[0]['how_many'];
    }

    /**
     * Dodaje wymagane pliki js
     */
    protected function addJsScripts()
    {
        $this->context->controller->addJs('https://code.jquery.com/ui/1.12.1/jquery-ui.js', 'all');
        $this->context->controller->addJs($this->_path . 'assets/js/collection-module.js', 'all');
    }

    /**
     * Dodaje wymagane pliki css
     */
    protected function addCss()
    {
        $this->context->controller->addCss($this->_path . 'assets/css/collection-module.css', 'all');
    }

    /**
     * Uploads files
     * 
     * @param string $file
     * @param string $path
     * 
     * @return boolean
     */
    protected function fileCopy($file, $path)
    {
        return move_uploaded_file($file, $path);
    }

    protected function resizeImage($file, $newName)
    {
        $width = 87;
        $height = 130;

        list($widthOrig, $heightOrig) = getimagesize($file);

        $newImage = imagecreatetruecolor($width, $height);

        if (exif_imagetype($file) == IMAGETYPE_PNG) {
            $originalImage = imagecreatefrompng($file);
        } else {
            $originalImage = imagecreatefromjpeg($file);
        }

        if (!is_resource($originalImage)) {
            return false;
        }

        if (imagecopyresampled($newImage, $originalImage, 0, 0, 0, 0, $width, $height, $widthOrig, $heightOrig)) {
            return imagejpeg($newImage, $this->thumbnailCollectionDir . '/' . $newName, 100);
        }

        return false;
    }
}

Dodatkowo zauważyłem, że podobne jazdy dzieją się czasami po wejściu na listę modułów. Ustawiłem czas sesji w panelu admina na 0 i chrome jak na razie nie ma problemów ale firefox tak... Pomaga jedynie czyszczenie ciasteczek... Hosting to home.pl

Share this post


Link to post
Share on other sites
  • 0

ja bym zaczal od tego, ze... rejestrujesz hooka "header" ale co w nim laduje? w oglle w jakim hook zaczepiasz szablon? bo tego mi brakuje w tej czesci modulu, w ogole nie widac co za zmienne sa dolaczane do szablonu... ogolnie, jakos niewiele widac. w oglole gdzie klienta ma ten przycisk "konfiguracja" i do czego on ma sie odniesc? akurat brakuje najbardziej konstruktywnych elementow w przedstawionym kodzie.

Share this post


Link to post
Share on other sites
  • 0
$this->context->smarty->assign(array(
    'error' => ($error) ? $error : Tools::getValue('error'),
    'allFiles' => $allFiles,
));

return $this->display(__FILE__, 'views/templates/admin/collection.tpl');

Ten szablon jest uruchamiany czyli collection.tpl. Przycisk konfiguruj widnieje na liście modułów przy moim module... (jak przy większości) i ma on uruchomić metodę getContent. Moduł ma nie robić nic innego jak uploadować obrazki do katalogu i dodawać wpisy do bazy.

 

Na froncie natomiast mam kontroller:

<?php

class CollectionPrintCollectionModuleFrontController extends ModuleFrontController
{
    public function initContent()
    {
        parent::initContent();
        $this->addCSS($this->module->getPathUri() . '/assets/css/bxslider.min.css', 'all');
        $this->addCSS($this->module->getPathUri() . '/assets/css/front-collection.css', 'all');
        $this->addJS($this->module->getPathUri() . '/assets/js/front-collection.js', 'all');

        $allFiles = $this->getAllFiles();

        $this->context->smarty->assign(array(
            'allFiles' => $allFiles,
            'firstImageRow' => reset($allFiles),
        ));
        $this->setTemplate('printCollection.tpl');
    }

    /**
     * Pobiera obrazki znajdujace sie w kolekcji
     * 
     * @return array
     */
    protected function getAllFiles()
    {
        $allFiles = Db::getInstance()->executeS('SELECT id, photo_path, thumbnail_path, position FROM `' . _DB_PREFIX_ . 'collection` ORDER BY position ASC');

        return $allFiles;
    }
}

 

Który pobiera uploadowane obrazki i je wyświetla w szablonie printCollection.tpl

Nie wiem czy to wina modułu czy czegoś innego ale na home.pl po zalogowaniu np. z poziomu FireFoxa zostaję przekierowany do panelu admina. Działam sobie i wszystko jest ok. Następnie zostawię wszystko na jakiś czas (podejrzewam, że aż sesja wygaśnie) i próbuję znów coś zrobić w panelu wchodząc na listę modułów (taki scenariusz ostatnio zauważyłem). No i się zaczyna... Zostaję przekierowany na ekran logowania, po poprawnym zalogowaniu znów mnie kieruje na ekran logowania i tak w kółko... W urlu widnieje informacja gdzie ma mnie przekierować (lista modułów). Gdy zmienię wszystko i wejdę na http://adres_sklepu/adminhash, to pojawi się ekran logowania, zaloguje mnie i mogę działać. Ale wchodząc na listę modułów dostaję znów przekierowanie na ekran logowania. Pomogło usunięcie ciasteczek z przeglądarki...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More