如何结合1个admincontroller中的fields_list + .tpl视图?

问题描述:

我无法弄清楚如何在我的自定义管理控制器中显示1个fields_list + .tpl文件的内容。目标是显示我的产品密钥库存+下面的一些额外功能(来自tpl文件的内容)。如何结合1个admincontroller中的fields_list + .tpl视图?

我可以显示字段列表来自.tpl文件的消息。但没有结合...我在网上找到了一个教程,这非常接近,但不工作。

<?php 

require_once(_PS_MODULE_DIR_ . 'avanto_key/classes/AvantoStock.php'); 

class AdminAvantokeyStockController extends ModuleAdminController 
{ 
    protected $position_identifier = 'id_avanto_keys'; 

    public function __construct() 
    { 
     //$this->fields_form = $this->fieldForm(); 
     $this->bootstrap = true; 
     $this->table = 'avanto_keys'; // DB table name where your object data stored 
     $this->className = "AvantoStock"; // The class name of my object 
     //$this->identifier = 'id_avanto_keys'; 
     //$this->list_id = 'id_avanto_keys'; 
     $this->_defaultOrderBy = 'id_avanto_keys'; 
     //$this->lang = FALSE; 

     $this->addRowAction('edit'); 
     $this->addRowAction('delete'); 

     $this->bulk_actions = array('delete' => array('text' => $this->l('Delete selected'), 
      'confirm' => $this->l('Delete selected items?')),); 

     //Shop::addTableAssociation($this->table, array('type' => 'shop')); 



    parent::__construct(); 
     $this->_select = 'pl.`name` as product_name, a.`serial_key` as serial_display'; 
     $this->_join = 'LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = a.`id_product` AND pl.`id_lang` 
     = '.(int)$this->context->language->id.')'; 
    } 

    public function renderView() 
    { 
     $tpl = $this->context->smarty->createTemplate(
      dirname(__FILE__). 
      '/../../views/templates/admin/view.tpl'); 
     return $tpl->fetch(); 
    } 

    public function renderList() 
    { 
     $this->toolbar_title = $this->l('Stock Management'); 
     $this->toolbar_btn['new'] = null; 
     $this->fields_list = array(
      'id_avanto_keys' => array(
       'title' => $this->l('ID Key'), 
       'width' => 140, 
      ), 
      'id_product' => array(
       'title' => $this->l('Product ID'), 
       'width' => 140, 
      ), 
      'serial_key' => array(
       'title' => $this->l('Serial Keys'), 
       'width' => 140, 
      ), 
      'product_name' => array(
       'title' => $this->l('Product Name'), 
       'width' => 140, 
      ), 
     ); 

     return parent::renderList(); 
    } 


    public function init() 
    { 
     parent::init(); 
    } 

    public function initContent() 
    { 

     $this->context->smarty->assign(array(
      'form' => $form, 
      'base_dir' => _PS_MODULE_DIR_, 
     )); 
     $this->setTemplate('stock.tpl'); 
     $lists = parent::initContent(); 


     $this->renderList(); 
     $lists .= parent::initContent(); 

     return $lists; 
    } 



    public function renderForm() 
    { 
     $this->display = 'edit'; 
     $this->initToolbar(); 

     $this->fields_form = array(
      'tinymce' => true, 
      'legend' => array(
       'title' => $this->l('Edit product key'), 
      ), 
      'input' => array(
       array(
        'type' => 'text', 
        'label' => $this->l('Key ID'), 
        'name' => 'id_product', 
       ), 
       array(
        'type' => 'text', 
        'label' => $this->l('Product ID'), 
        'name' => 'id_avanto_keys', 
       ), 
       array(
        'type' => 'text', 
        'label' => $this->l('Serial Key'), 
        'required' => true, 
        'name' => 'serial_key', 
       ), 
      ), 
      'submit' => array(
       'title' => $this->l('Save'), 
       'class' => 'btn btn-default pull-right' 
      ) 
     ); 

     return parent::renderForm(); 
    } 




} 

?> 

上面的代码只显示消息hello world而不显示我的产品列表。 任何人都有一个想法如何结合这一点?

在此先感谢!

+0

哪个版本的prestashop? – sarcom

+0

对不起,忘记告诉。它的V1.6 – vanhims

+0

没问题,它是自定义模块中的管理控制器? – sarcom

这是一个有点困惑,我们必须做出一些整齐:):

第一:

public function __construct() 
{ 
    $this->module = 'YourModuleName'; // Here you have to put your module name 

    $this->bootstrap = true; 
    $this->table = 'avanto_keys'; // DB table name where your object data stored 
    $this->className = "AvantoStock"; // The class name of my object 

    //$this->identifier = 'id_avanto_keys'; 
    //$this->list_id = 'id_avanto_keys'; 
    $this->_defaultOrderBy = 'id_avanto_keys'; 
    //$this->lang = FALSE; 
    $this->explicitSelect = true; // This if you do a select manually after 

    $this->addRowAction('edit'); 
    $this->addRowAction('delete'); 

    $this->bulk_actions = array('delete' => array('text' => $this->l('Delete selected'), 
     'confirm' => $this->l('Delete selected items?')),); 

    //Shop::addTableAssociation($this->table, array('type' => 'shop')); 


    $this->_select = 'pl.`name` as product_name, a.`serial_key` as serial_display'; 
    $this->_join = 'LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (pl.`id_product` = a.`id_product` AND pl.`id_lang` 
    = '.(int)$this->context->language->id.')'; 

    $this->fields_list = array(
     'id_avanto_keys' => array(
      'title' => $this->l('ID Key'), 
      'width' => 140, 
     ), 
     'id_product' => array(
      'title' => $this->l('Product ID'), 
      'width' => 140, 
     ), 
     'serial_key' => array(
      'title' => $this->l('Serial Keys'), 
      'width' => 140, 
     ), 
     'product_name' => array(
      'title' => $this->l('Product Name'), 
      'width' => 140, 
     ), 
    ); 

    parent::__construct(); 
} 

二:
列表,最好在__construct所以申报的领域
父母renderList方法做其他的东西,让我们从你想要显示的东西分开:

public function renderList() 
{ 
    // Here we retrieve the list (without doing any strange thing) 
    $list = parent::renderList(); 

    // Assign some vars to pass to our custom tpl 
    $this->context->smarty->assign(
     array( 
      'var1' => "Test", 
      'var2' => "Test2" 
      ) 
     ); 

    // Get the custom tpl rendered 
    $content = $this->context->smarty->fetch(_PS_MODULE_DIR_ . "avanto_key/views/templates/admin/avantokeystock/customcontent.tpl"); 

    // return the list plus your content 
    return $list . $content; 
} 


离开父母initContent原样,不会覆盖,因为他做了很多东西

我想这是一个很好的点开始:)
试试这个办法,让我知道;)

+0

嗨Sarcom。非常感谢你:-)现在它的功能就像魅力一样。我会研究你是如何做到的,了解正在发生的事情。我只是把东西放在像render_list()中的fields_list这样的方法中。我认为这是干净的做法。 – vanhims

+0

嗨Sarcom。我试图用initContent()等其他类型替换renderList()方法来查看会发生什么。我认为你的解决方案只适用于renderList()。 你是怎么知道我必须在renderlist()方法中添加smarty fetch的?这真的让我想知道你是怎么想出来的:-) 我试图从中学习,所以我可以在这个论坛上做更多的自己并帮助其他人。 – vanhims

+1

@vanhims列表是加载管理控制器时的默认视图。因此将显示从'renderList()'返回的HTML。 Sarcom结合了网格和自定义模板的HTML。 – TheDrot