0

刚刚到达 Prestashop 1.5,我正在制作一个非常简单的模块:一周的视频,与需要出现在它旁边的多个产品相关联。

我决定从后台开始。现在,我可以查看、添加、编辑和删除所有视频条目,但我对如何映射视频及其相关产品之间的 NN 关联有点迷茫……缺乏文档也无济于事。

任何想法如何解决这个问题?

这是我的一些代码, Video 类由以下内容定义:

class Video extends ObjectModel {

    public $id_video;
    public $title;
    public $url;
    public $active;

    public static $definition = array(
        'table'     => 'video',
        'primary'   => 'id_video',
        'multilang' => false,
        'fields' => array(
            'id_video' => array(
                'type' => ObjectModel :: TYPE_INT
            ),
            'title' => array(
                'type' => ObjectModel :: TYPE_STRING, 
                'required' => true
            ),
            'url' => array(
                'type' => ObjectModel :: TYPE_STRING, 
                'required' => true
            ), 
            'active' => array(
                'type'      => ObjectModel :: TYPE_BOOL, 
                'required'  => true
            )
        ),
    );

(...)

和 AdminVideo 类在这里:

class AdminVideoController extends ModuleAdminController {

    public function __construct()
    {
        $this->table = 'video';
        $this->className = 'Video';
        $this->lang = false;

        $this->fields_list['id_video'] = array(
            'title' => $this->l('ID'),
            'align' => 'center',
        );

        $this->fields_list['title'] = array(
            'title' => $this->l('Title'),
            'width' => 'auto'
        );

        $this->fields_list['url'] = array(
            'title' => $this->l('URL'),
            'width' => 'auto'
        );

        $this->fields_list['active'] = array(
            'title' => $this->l('Active'),
            'width' => '70',
            'align' => 'center',
            'active' => 'status',
            'type' => 'bool',
            'orderby' => false
        );

        parent::__construct();
    }

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

    public function renderList()
    {
        $this->addRowAction('edit');
        $this->addRowAction('delete');
        $this->addRowAction('details');

        return parent::renderList();
    }

    public function renderForm()
    {
        if (!($obj = $this->loadObject(true)))
            return;

        $this->fields_form = array(
            'legend' => array(
                'title' => $this->l('This weeks video'),
                'image' => '../img/admin/world.gif'
            ),
            'input' => array(
                array(
                    'type' => 'text',
                    'label' => $this->l('Nome'),
                    'name' => 'title',
                    'size' => 33,
                    'required' => true,
                    'desc' => $this->l('Title')
                ),
                array(
                      'type' => 'text',
                      'label' => $this->l('URL'),
                      'name' => 'url',
                      'size' => 33,
                      'required' => true,
                      'desc' => $this->l('Video URL')
                ),
                array(
                    'type' => 'radio',
                    'label' => $this->l('Active:'),
                    'name' => 'active',
                    'required' => false,
                    'class' => 't',
                    'is_bool' => true,
                    'values' => array(
                        array(
                            'id' => 'active_on',
                            'value' => 1,
                            'label' => $this->l('Enabled')
                        ),
                        array(
                            'id' => 'active_off',
                            'value' => 0,
                            'label' => $this->l('Disabled')
                        )
                    ),
                    'desc' => $this->l('Only one video can be active at any given time')
                ),
            )
        );

        if (Shop::isFeatureActive())
        {
            $this->fields_form['input'][] = array(
                'type' => 'shop',
                'label' => $this->l('Shop association:'),
                'name' => 'checkBoxShopAsso',
            );
        }

        $this->fields_form['submit'] = array(
            'title' => $this->l('   Save   '),
            'class' => 'button'
        );

        if (!($obj = $this->loadObject(true)))
            return;

        return parent::renderForm();
    }
  }

另一件事:是否可以在后台添加视频预览?我试图回应 YouTube 的嵌入代码,但它甚至在标题之前就被插入了。有没有一种干净的方法可以做到这一点,还是我必须使用一些 jQuery 技巧?我基本上是在 postProcess() 结束之前对 YT 的嵌入代码做一个回显。

提前致谢!

4

1 回答 1

2

将视频与产品相关联的最简单方法是在“视频”表中添加“产品”文本字段,以存储关联产品 ID 的逗号分隔列表(例如:1、10、27)。即使它有点初级,它也应该工作。
或者,您可以使用这样的表:

create table video_product (
  id_association int not null auto_increment,
  id_video int,
  id_product int,
  primary key (id_association)
);

这个解决方案的问题是 PrestaShop ObjectModel 核心没有提供任何自动更新或删除相关表的方法(至少据我所知),所以你必须插入代码来管理你的“video_product”表“视频”课。
如果您想要一个如何执行此操作的示例,您应该查看classes/Product.php脚本,该脚本管理产品表及其所有相关表(类别、标签、功能、附件等)。
要了解 Prestashop 数据库的结构,请查看docs/dbmodel.mwb包含数据库架构的文件;可以使用MySQL Workbench应用程序查看此文件。

于 2012-11-11T20:52:08.720 回答