2015-06-09 24 views
5

Vorrei sapere come aggiungere un campo personalizzato a una categoria e come posso modificare nel back office (sotto il campo della descrizione). campo vorrei aggiungere è il nome description_longPrestashop 1.6 - Aggiungi campo personalizzato alla categoria

Il tipo di campo è TEXT

ho già sovrascritto il mio ufficio anteriore, e il mio campo è ben visualizzato.

di override \ Classes \ category.php

<?php 

class Category extends CategoryCore 
{ 

    public $description_long; 

    /** 
    * @see ObjectModel::$definition 
    */ 
    public static $definition = array(
     'table' => 'category', 
     'primary' => 'id_category', 
     'multilang' => true, 
     'multilang_shop' => true, 
     'fields' => array(
      'nleft' =>    array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), 
      'nright' =>    array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), 
      'level_depth' =>  array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), 
      'active' =>    array('type' => self::TYPE_BOOL, 'validate' => 'isBool', 'required' => true), 
      'id_parent' =>   array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), 
      'id_shop_default' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 
      'is_root_category' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'), 
      'position' =>   array('type' => self::TYPE_INT), 
      'date_add' =>   array('type' => self::TYPE_DATE, 'validate' => 'isDate'), 
      'date_upd' =>   array('type' => self::TYPE_DATE, 'validate' => 'isDate'), 
      // Lang fields 
      'name' =>    array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isCatalogName', 'required' => true, 'size' => 128), 
      'link_rewrite' =>  array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isLinkRewrite', 'required' => true, 'size' => 128), 
      'description' =>  array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'), 
      'description_long' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'), // CUSTOM FIELD 
      'meta_title' =>   array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 128), 
      'meta_description' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255), 
      'meta_keywords' =>  array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255), 
     ), 
    ); 
} 

non abbiamo trovato nessun walktrough, chiunque può aiutare?

risposta

3

per aggiungere un campo nel backoffice è necessario eseguire l'override di AdminCategoriesController, precisamente la funzione renderForm() e aggiungere il nuovo campo al suo interno. Per ottenere ciò, creare un nuovo file AdminCategoriesController sotto/override/controller/admin /, quindi dichiarare in esso l'estensione del controller originale e copiare nella funzione renderForm (completamente) dal file core originale.

class AdminCategoriesController extends AdminCategoriesControllerCore 
{ 

    public function renderForm() 
    { 
     ... 
    } 
} 

ora abbiamo di modificarla in un paio di posto, prima dobbiamo aggiungere il nuovo campo sotto la descrizione, in modo da cercare la dichiarazione 'name' => 'Descrizione' all'interno del vostro renderForm() , vedrai che è una lista di array e ognuno descrive un campo modulo. Subito dopo la descrizione array consente aggiungere il nostro nuovo campo:

array(
        'type' => 'textarea', 
        'label' => $this->l('Description long'), 
        'name' => 'description_long', 
        'lang' => true, 
        'autoload_rte' => true, 
        'hint' => $this->l('Invalid characters:').' <>;=#{}', 
       ), 

questa dichiarazione chiede Prestashop per creare un nuovo campo con le seguenti caratteristiche:

  • un campo textarea
  • un campo multilingua
  • il plug-in javascript per modificare

  • il nome "description_long"

Dichiarando un campo in questo modo ci permetterà di elaborare PrestaShop proprio come qualsiasi altra proprietà di classe, quindi non sarà necessario alcun lavoro da parte nostra per aggiungere e aggiornare il campo nel database.

Ora c'è un'ultima cosa da fare sul nostro renderForm() funzione, in questo momento l'ultima istruzione è un parent::renderForm(), che nella classe originale stava chiamando l'AdminController per chiedere che a rendere la forma, ma in questo momento poiché stiamo estendendo la classe, l'istruzione chiama il nostro genitore AdminCategoriesControllerCore, ignorando tutto il nostro lavoro e visualizzando il modulo predefinito. Per evitare questo, modificare parent::renderForm a AdminController::renderForm(), esplicitando la chiamata alla classe interessata.

+0

funzionato come un fascino! Grazie ! –

+0

Questo è molto fuorviante per chiunque sia al fianco di OP! Un terzo della risposta è qui, un altro terzo è nell'OP e l'ultima parte (aggiornamento db) è lasciata a chiunque di indovinare – Thony

0

aggiungere questa riga nel vostro __construct funzione di classe override

public function __construct($id_category = null, $id_lang = null, $id_shop = null) 
    { 

self::$definition['fields']['description_long'] = array('type' => self::TYPE_HTML, 'lang' => true); 

parent::__construct($id_category, $id_lang, $id_shop); 

} 

dove description_long è il tuo nuovo nome di campo.

10

Per tutti coloro che lottano qui è una risposta completa:

Per aggiungere un nuovo campo description_long a una categoria in Prestashop Categoria necessari 3 passi:

  1. aggiornamento DB

Aggiungi il campo denominato description_long alla tabella category_lang, puoi imitare la descrizione caratteristiche colonna

  1. Override Categoria classe

Creare un file qui /override/classes/Category.php con questo codice:

class Category extends CategoryCore 
{ 

    public $description_long; 

    public function __construct($id_category = null, $id_lang = null, $id_shop = null){ 
     self::$definition['fields']['description_long'] = array('type' => self::TYPE_HTML, 'lang' => true); 
     parent::__construct($id_category, $id_lang, $id_shop); 
    } 

} 
  1. Override classe AdminCategoriesControllerCore

Creare un file qui /override/controllers/admin/AdminCategoriesController.php con questo codice:

class AdminCategoriesController extends AdminCategoriesControllerCore{ 


    public function renderForm() 
    { 
     $this->fields_form_override =array(
      array(
       'type' => 'textarea', 
       'label' => $this->l('Description long'), 
       'name' => 'description_long', 
       'lang' => true, 
       'autoload_rte' => true, 
       'hint' => $this->l('Invalid characters:').' <>;=#{}', 
      ), 
     ); 

     return parent::renderForm(); 
    } 
} 
+0

Questo è molto più utile della risposta accettata. Molte grazie! – jmarceli

+0

Ottima risposta. Non ero a conoscenza di fields_form_override, che è ereditato dalla classe genitore di AdminController, quindi ho sempre scavalcato l'intero metodo .. Bene! Grazie! – Stratboy

+0

Ho notato che questo aggiunge il nuovo campo alla fine della pagina. Sarei ancora più davvero super bello se ci fosse un modo per riordinare i campi, o in altre parole, per posizionare il nuovo su una certa posizione specifica. – Stratboy

Problemi correlati