Prestashop - 自定义模块和显示图像

时间:2014-05-04 17:08:11

标签: php prestashop prestashop-1.6

这是我第一次使用prestashop并按照文档我可以创建一个存储一些文本的简单模块。
我想修改它并添加上传图像的可能性...在这种情况下,文档非常差,所以我尝试了自己,我是ablo上传它,但如果我尝试将图像传递给fronend我得到的是NULL

这是我的配置文件:

<?php if ( ! defined('_PS_VERSION_') ) exit;


class Stilogopopup extends Module
{
    public function __construct()
    {
        $this->name                   = 'stilogopopup';
        $this->tab                    = 'front_office_features';        //Indica dove posizionare il modulo (http://doc.prestashop.com/display/PS15/Creating+a+PrestaShop+module)
        $this->version                = '1.0.0';
        $this->author                 = 'Christian Giupponi STILOGO';
        $this->need_instance          = 0;                              //Indica se il modulo deve essere caricato quando si entra nel backoffice 0=no 1=si
        $this->ps_versions_compliancy = array('min' => '1.5');

        parent::__construct();

        $this->displayName        = $this->l('STILOGO PopUp');
        $this->description        = $this->l('Permette di mostrare un PopUp contenente un testo o una immagine');
        $this->confirmUninstall   = $this->l('Sicuro di voler disinstallare questo modulo?');

        if( ! Configuration::get('STILOGOPOPUP_NAME') )
        {
            $this->warning = $this->l('Non è stato fornito nessun nome');
        }
    }

    /*
     *  Installazione
     *  In questa funzione definisco anche gli hook per il frontend.
     *  Un elenco degli hook disponibili:   
     *      http://doc.prestashop.com/display/PS15/Hooks+in+PrestaShop+1.5
     */
    public function install()
    {
        if( parent::install() == false )
        {
            return false;
        }               

        //Registro un hook per la homepage
        if( ! $this->registerHook('displayHome') )
            return false;

        //Registro un hook per aggiungere dati all'header
        if( ! $this->registerHook('displayHeader') )
            return false;

        Configuration::updateValue('STILOGOPOPUP_NAME', 'popup');

        //Fatto
        return true;
    }

    public function uninstall()
    {
        if( ! parent::uninstall() )
        {
            return false;
        }

        if( ! Configuration::deleteByName('STILOGOPOPUP_NAME') )
        {
            return false;
        }

        return true;
    }

    /*
     *  Questa funzione viene richiamata dal frontend quando viene eseguito l'hook:
     *      displayHome
     *  In questo modo posso inviare al frontend delle variabili per essere utilizzate
     *  dal template engine smarty.
     *  E' un semplice array che assegna alle variabili il valore delle configurazioni
     *  e recupera il file template che contiene il codice da mostrare in home
     */
    public function hookDisplayHome( $params )
    {
        $this->context->smarty->assign(
            array(
                'stilogopopup_testo'    => Configuration::get('STILOGOPOPUP_TEXT'),
                'stilogopopup_titolo'   => Configuration::get('STILOGOPOPUP_TITLE'),
                'stilogopopup_image'    => Configuration::get('STILOGOPOPUP_IMAGE'),
                'stilogopopup_link'     => $this->context->link->getModuleLink('stilogopopup', 'display')
            )
        );

        return $this->display(__FILE__ , 'stilogopopup.tpl');
    }

    /*
     *  Questa funzione viene richiamata dal frontend quando viene eseguito l'hook:
     *      displayHeader
     *  e permette di inserire all'interno dei tag <head> del codice aggiuntivo,
     *  Utile quando si ha la necessità di inserire file css o js
    */
    public function HookDisplayHeader()
    {
        $this->context->controller->addCSS($this->_path.'css/stilogopopup.css', 'all');
        $this->context->controller->addJS($this->_path.'js/stilogopopup.js', 'all');
    }

    /*
     *  Questa funzione è utilizzata nel backend di prestashop per mostrare il form di configurazione
     *  del modulo.
     *  Gestisce sia il salvataggio dei parametri di configurazione che la stampa del form (tramite funzione esterna)
     */
    public function getContent()
    {
        $output = null;     

        //Controllo se devo salvare dei dati
        if( Tools::isSubmit('submit'.$this->name) )
        {           
            //Recupero i valori degli input
            $stilogopopup_text  = strval(Tools::getValue('STILOGOPOPUP_TEXT'));
            $stilogopopup_title = strval(Tools::getValue('STILOGOPOPUP_TITLE'));            
            $stilogo_image      = $_FILES['STILOGOPOPUP_IMAGE'];

            //Controllo se c'è una immagine da salvare
            if( $stilogo_image['name'] != "" )
            {
                //Formati accettati
                $allowed = array('image/gif', 'image/jpeg', 'image/jpg', 'image/png');

                //Controllo che l'immagine sia in un formato accettato
                if( in_array($stilogo_image['type'], $allowed) )
                {
                    $path = '../upload/';

                    //Controllo se esiste già un file con questo nome

                    //Carico il file
                    if( ! move_uploaded_file($stilogo_image['tmp_name'], $path.$stilogo_image['name']) )
                    {
                        $output .= $this->displayError( $path.$stilogo_image['name'] );
                        return $output.$this->displayForm();
                    }
                }
                else
                {
                    $output .= $this->displayError( $this->l('Formato immagine non valido.') );
                    return $output.$this->displayForm();
                }
            }   

            //Controllo se i campi obbligatori sono effettivamente stati riempiti
            if( ! $stilogopopup_title || empty($stilogopopup_title) || ! Validate::isGenericName($stilogopopup_title) )
            {
                $output .= $this->displayError( $this->l('Devi inserire un titolo.') );
                return $output.$this->displayForm();
            }


            //Se arrivo qui è perchè tutti i campi obbligatori sono stati riempiti quindi aggiorno i valori
            Configuration::updateValue('STILOGOPOPUP_TEXT', $stilogopopup_text);
            Configuration::updateValue('STILOGOPOPUP_TITLE', $stilogopopup_title);
            Configuration::updateValue('STILOGOPOPUP_IMAGE', $stilogopopup_image['name']);

            $output .= $this->displayConfirmation( $this->l('Impostazioni salvate') );                      
        }   

        //Richiamo la funzione di stampa del form e concateno il ritultato (se c'è) del salvataggio
        return $output.$this->displayForm();
    }

    /*
     *  Questa è la funzione che si occupa di generare il form di configurazione del modulo.
     *  Viene richiamata dalla funzione getContent e permette di definire dei campi da mostrare all'utente.
     *  Per generare i campi si utilizza un semplice array.
     *  Qui un elenco di tutti i tipi supportati:
     *      http://doc.prestashop.com/display/PS15/HelperForm
     */
    public function displayForm()
    {
        //Recupero la lingua di default
        $default_lang = (int)Configuration::get('PS_LANG_DEFAULT');

        //Creo i campi del form
        $fields_form[0]['form'] = array(
            'legend' => array(
                'title' => $this->l('Impostazioni')
            ),
            'input' => array(
                array(
                    'type'     => 'text',
                    'label'    => $this->l('Titolo del PopUp'),
                    'name'     => 'STILOGOPOPUP_TITLE',
                    'required' => true
                ),
                array(
                    'type'     => 'textarea',
                    'label'    => $this->l('Testo del PopUp'),
                    'name'     => 'STILOGOPOPUP_TEXT',
                    'required' => false
                ),
                array(
                    'type'     => 'file',
                    'label'    => $this->l('Inserisci una immagine'),
                    'name'     => 'STILOGOPOPUP_IMAGE',
                    'display_image' => true,
                    'required' => false
                ),
            ),
            'submit' => array(
                'title' => $this->l('Salva'),
                'class' => 'button'             
            ),          
        );

        $helper = new HelperForm();

        // Module, token and currentIndex
        $helper->module            = $this;
        $helper->name_controller   = $this->name;
        $helper->token             = Tools::getAdminTokenLite('AdminModules');
        $helper->currentIndex      = AdminController::$currentIndex.'&configure='.$this->name;

        // Language
        $helper->default_form_language     = $default_lang;
        $helper->allow_employee_form_lang  = $default_lang;

        // Title and toolbar
        $helper->title             = $this->displayName;
        $helper->show_toolbar      = true;        // false -> rimuove la toolbar
        $helper->toolbar_scroll    = true;      // yes - > Toolbar is always visible on the top of the screen.
        $helper->submit_action     = 'submit'.$this->name;
        $helper->toolbar_btn       = array(
                                            'save' => array(
                                                            'desc' => $this->l('Salva'),
                                                            'href' => AdminController::$currentIndex.'&configure='.$this->name.'&save'.$this->name.
                                                            '&token='.Tools::getAdminTokenLite('AdminModules'),
                                                      ),
                                            'back' => array(
                                                            'href' => AdminController::$currentIndex.'&token='.Tools::getAdminTokenLite('AdminModules'),
                                                            'desc' => $this->l('Back to list')
                                                      )
                                    );

        // Carico i valori correnti
        $helper->fields_value['STILOGOPOPUP_TEXT']     = Configuration::get('STILOGOPOPUP_TEXT');
        $helper->fields_value['STILOGOPOPUP_TITLE']    = Configuration::get('STILOGOPOPUP_TITLE');

        //Genero il form
        return $helper->generateForm($fields_form);
    }
}

?>

正如您所看到的,我在displayForm函数中添加了应该添加文件输入的代码:

array(
    'type'     => 'file',
    'label'    => $this->l('Inserisci una immagine'),
    'name'     => 'STILOGOPOPUP_IMAGE',
    'display_image' => true,
    'required' => false
),

它确实......在getContent中,根据文档所有保存/显示应该存在我用PHP获取图像(prestashop有更好的内置解决方案吗?)方式:

$stilogo_image      = $_FILES['STILOGOPOPUP_IMAGE'];

            //Controllo se c'è una immagine da salvare
            if( $stilogo_image['name'] != "" )
            {
                //Formati accettati
                $allowed = array('image/gif', 'image/jpeg', 'image/jpg', 'image/png');

                //Controllo che l'immagine sia in un formato accettato
                if( in_array($stilogo_image['type'], $allowed) )
                {
                    $path = '../upload/';

                    //Controllo se esiste già un file con questo nome

                    //Carico il file
                    if( ! move_uploaded_file($stilogo_image['tmp_name'], $path.$stilogo_image['name']) )
                    {
                        $output .= $this->displayError( $path.$stilogo_image['name'] );
                        return $output.$this->displayForm();
                    }
                }
                else
                {
                    $output .= $this->displayError( $this->l('Formato immagine non valido.') );
                    return $output.$this->displayForm();
                }
            }   

然后我在这里保存了图像名称:

Configuration::updateValue('STILOGOPOPUP_IMAGE', $stilogopopup_image['name']);

并以这种方式将其发送到hookDisplayHome函数的前端:

$this->context->smarty->assign(
            array(
                'stilogopopup_testo'    => Configuration::get('STILOGOPOPUP_TEXT'),
                'stilogopopup_titolo'   => Configuration::get('STILOGOPOPUP_TITLE'),
                'stilogopopup_image'    => Configuration::get('STILOGOPOPUP_IMAGE'),
                'stilogopopup_link'     => $this->context->link->getModuleLink('stilogopopup', 'display')
            )
        );

        return $this->display(__FILE__ , 'stilogopopup.tpl');

问题是,智能变量$stilogopopup_imageNULL,只要我在视图中添加{debug}标记,我就能看到它。

有什么问题?其他字段工作

1 个答案:

答案 0 :(得分:1)

getContent()函数中

您使用“$stilogo_image”变量,但是为了保存到数据库(Configuration::updateValue()),您使用另一个变量“$stilogopopup_image”。

我认为这是Configuration::get('STILOGOPOPUP_IMAGE')

中空值的主要原因

此致