Desarrollo de un módulo para la publicación de noticias para prestashop 1.7.6. Parte I

Hola a todos, vamos a publicar una serie de artículos donde mostraremos como desarrollar un módulo para prestashop para la publicación de noticias en nuestra tienda. En este primer artículo estaremos configurando el fichero principal del módulo donde se definirán una serie de elementos para poder integrar el módulo a nuestra tienda.

Lo primero que haremos es crear una carpeta con el nombre ps_article, y dentro de ella vamos a poner todos los archivos que iremos desarrollando.

Archivo principal del módulo

Dentro de la carpeta ps_article vamos a crear un archivo llamado ps_article.php y dentro de él vamos a poner los principales elementos de configuración e inicialización de un módulo de prestashop 1.7.6.

Lo primero que vamos a escribir en el fichero ps_article.php es la definición del constructor de la clase:

class Ps_Article extends Module
{
    public function __construct()
    {
        $this->name = 'ps_article';
        $this->tab = 'administration';
        $this->version = '1.0.0';
        $this->author = 'Sacavix Team';
        $this->controllers = array('article','showArticle',);
        $this->bootstrap = true;
        parent::__construct();
        $this->displayName = $this->l('Artículos - Prestashop');
        $this->description = $this->l('Módulo es para publicar artículos');
        $this->ps_versions_compliancy = ['min' => '1.7', 'max' => _PS_VERSION_];
    }
...
}

Notas:

El nombre de la clase tiene que coincidir con el nombre del fichero

  • $this->name : Definición del nombre del módulo
  • $this->tab : Definición del Tab padre en el backoffice donde se pondrá el acceso directo a la adminitración de los elementos del módulo
  • $this->version Versión del módulo
  • $this->author: Desarrollador del módulo
  • $this->controllers: Nombre de los controladores frontales
  • $this->displayName: Nombre del módulo que se muestra en el backoffice
  • $this->description: Descripción del módulo que se muestra en el backoffice
  • $this->ps_versions_compliancy: Rango de versión de compatibilidad con prestashop

Ahora vamos a definir los métodos de la clase, que algunos de ellos lo que harán es sobreescribir los metidos de la clase Modulo para ejecutar las principales acciones que realiza Prestashop con sus módulos como instalar, desinstalar, configurar, entre otros.

Método para definir la persistencia de datos

class Ps_Article extends Module {
...
private function installDB()
    {
        $sqlStatements = "CREATE TABLE IF NOT EXISTS ps_articles (
                         `id` INT NOT NULL AUTO_INCREMENT ,
                         `title` VARCHAR(255) NOT NULL ,
                         `short_description` VARCHAR(255) NOT NULL ,
                          `article` VARCHAR(5000) NOT NULL ,
                         `active` BOOLEAN ,
                         `image` VARCHAR(255) NOT NULL ,
                         `user` VARCHAR(255) NOT NULL ,
                         `userID` VARCHAR(255) NOT NULL ,
                         `review` INT(11) NOT NULL ,
                         `pub_date` VARCHAR(255) NOT NULL ,
                          PRIMARY KEY (`id`)) ENGINE = InnoDB;";
        $database = \PrestaShop\PrestaShop\Adapter\Entity\Db::getInstance();
        try {
            $database->execute($sqlStatements);
            return true;
        } catch (Exception $exception) {
            return false;
        }
    }
rivate function uninstallDB()
    {
        $sqlStatements = "DROP TABLE IF NOT EXISTS ps_download_items";
        $database = \PrestaShop\PrestaShop\Adapter\Entity\Db::getInstance();
        try {
            $database->execute($sqlStatements);
            return true;
        } catch (Exception $exception) {
            return false;
        }
    }
...
}

En este método se crea la tabla en la base de datos para almacenar las noticias.

Método para la definición del menú de acceso

class Ps_Article extends Module {
...
public function getTabs()
    {
        return [
            [   "name" => 'Articulos',
                "parent_class_name" => 'AdminDashboard',
                "class_name" => 'AdminArticle',
                "visible" => true]
        ];
    }
public function uninstallTab()
    {
        $id_tab = (int) Tab::getClassNameById('AdminArticle');
        $tab = new Tab($id_tab);
        return $tab->delete();
    }
public function getContent()
    {
        $redirectLink = $this->context->link->getAdminLink("AdminArticle");
        Tools::redirectAdmin($redirectLink);
    }
...
}

Se define en menú de acceso en el backoffice al controlador AdminArticle que es el encargado de gestionar las noticias.

Método para la configuración del hook.

Los hook son espacios en la tienda donde se pueden insertar vistas que están respaldadas por un controlador para la visualización o gestión de información. En este caso vamos a configurar un hook en la página principal donde pondremos las últimas noticias registradas.

class Ps_Article extends Module {
...
public function hookDisplayHome($params)
    {
        $recentSQL = "SELECT * FROM " . _DB_PREFIX_ . "articles  WHERE active='1' ORDER BY pub_date DESC";
        $recent = Db::getInstance()->ExecuteS($recentSQL);
        $this->context->smarty->assign([
            'recent' => $recent,
            'link' => _PS_BASE_URL_ . "/"
        ]);
        return $this->display(__FILE__, 'articles.tpl');
    }
    public function unregisterHooks() {
        return $this->setupHooks([]);
    }
...
 }

Acá tenemos dos métodos unregisterHooks, este es para ejecutar durante la desinstalación del método para que libere la utilización de los hooks por este módulo y hookDisplayHome.

hookDisplayHome: En este método se define que información se va a mostrar en el hook displayHome, la cual se a visualizar bajo la plantilla articles.tpl

Método para instalar y desinstalar el módulo

class Ps_Article extends Module {
...
 public function install()
    {
        $hook = $this->registerHook('displayHome');
        return   $this->installDB() && parent::install();
    }
public function uninstall()
    {
        return $this->unregisterHooks() && $this->uninstallTab() && $this->uninstallDB() &&parent::uninstall();
    }
...
}

Este método primeramente le brinda permisos para que el modulo puede utilizar el hook displayHome y luego ejecuta los método para la configuración de la base de datos y del módulo.

A continuación les dejo la primera parte del proyecto:

https://github.com/yasielpv1503/ps_article

En el próximo artículo desarrollaremos la administración de las noticias desde el backoffice de prestashop.