2

我正在编写一个在提交条目时调用的扩展。
现在我想在发布时添加一个包含几个字段的选项卡?

我可以从扩展中做到这一点吗?

我知道有 EE1.x 钩子 - publish_form_new_tabs, publish_form_new_tabs_block....
但我需要 EE 2.x

4

2 回答 2

2

2.x 模块 API 允许这样做。此处的文档:http: //expressionengine.com/user_guide/development/modules.html

您可以将相同类型的模块和扩展与如下结构组合:

/system/expressionengine/third_party/addon_name/
    ext.addon_name.php
    语言/
        英语/
            lang.addon_name.php
    mcp.addon_name.php
    mod.addon_name.php
    tab.addon_name.php # 根据 API 规范将字段添加到此处的选项卡
    upd.addon_name.php # 在此处添加/删除选项卡,根据 API 规范

当用户安装扩展或模块时,系统会自动询问他们是否要同时安装两者。显然,如果目的只是向发布者添加选项卡/字段,那么您的 mcp 和 mod 类可能只是成功安装模块所需的最低限度。

希望这是一个好的起点。

于 2010-12-06T22:57:54.177 回答
2

要添加到第一个答案,

我经常遇到的一件事是没有add_layout_tabs在模块的更新文件中的任何地方调用该方法(即以 . 开头的文件upd.

所以假设你的更新文件被称为:upd.addon_name.php. 然后install看起来像这样(注意:以下函数都是Addon_name_upd更新文件中类的一部分:

function install () {

  // ... create databases or any necessary code for your module

  $this->EE->load->library('layout');
  $this->EE->layout->add_layout_tabs($this->tabs(), 'addon_name');

  return TRUE;
}

注意对$this->tabs()方法的调用:该方法看起来像这样:

function tabs() {
  $tabs['addon_name'] = array(
    'field_1_inside_publish_form' => array(
    'visible'   => 'true',
    'collapse'=> 'false',
    'htmlbuttons'   => 'true',
    'width' => '100%'
    )
  );

  return $tabs;
}

Wherefield_1_inside_publish_form是在模块的相应选项卡文件中定义的字段(即tab.addon_name.php)。

install 方法实际上会将一个新选项卡保存到现有的发布布局中,其中包括模块的选项卡配置。

但是,您必须通过调用如下delete_layout_tabs方法在更新文件的卸载方法中添加一个方法来删除您的配置:

function uninstall() {

  // necessary code to drop your database tables or whatever

 $this->EE->load->library('layout');
 $this->EE->layout->delete_layout_tabs($this->tabs(), 'addon_name');

 return TRUE;

} 

还有一件事,如果你像我一样开发:在这里做一点改变,测试你的改变,回去再编码一些,然后你会发现如果tab.addon_name.php在你的模块启用后添加到选项卡文件的新字段不出现在发布页面的新标签中。原因是add_layout_tabs您在更新文件的安装方法中调用的方法需要运行。

但是,此方法仅在您启用模块时才会执行。所以这意味着您必须禁用您的模块,如果您的模块添加数据库表,这是一个拖累。幸运的是,您可以让更新文件的更新方法加载您的新选项卡配置(除了添加或删除任何新的数据库表作为模块更新的一部分。)

这个想法是您删除以前的配置并添加配置,该配置调用您的 tabs 方法,该方法具有模块选项卡部分的新字段的名称。

因此,假设您的 tabs 方法有一个名为 'field_2_inside_publish_form' 的新字段,如下所示:

function tabs() {
 $tabs['addon_name'] = array(
    'field_1_inside_publish_form' => array(
    'visible'   => 'true',
    'collapse'=> 'false',
    'htmlbuttons'   => 'true',
    'width' => '100%'
   ),
   'field_2_inside_publish_form' => array(
    'visible'   => 'true',
    'collapse'=> 'false',
    'htmlbuttons'   => 'true',
    'width' => '100%'
   )
 );   
}

那么您的更新方法可以像这样更新布局(假设您已将$this->versionudpate 文件中的属性从“1.0”更新为“1.5”。

function update($current='') {
  // don't do anything if the version hasn't changed
  if($current == $this->version) {  
    return FALSE;
  }

  // the version property has  a version higher than current version in db
  // this means the module is being updated.
  if($current < $this->version) {
    // update the tab layout

    // delete old layout
    $this->EE->load->library('layout');
    $this->EE->layout->delete_layout_tabs($this->tabs(), 'addon_name');

    // add new tab layout which calls tabs method with updated code
    $this->EE->load->library('layout');
    $this->EE->layout->add_layout_tabs($this->tabs(), 'addon_name');

  }
  return TRUE;
}   

请记住,每次您在模块控制面板页面文件中定义的模块控制面板页面(即mcp.addon_name.php)中时,都会运行模块更新文件的更新方法。您的模块的主控制面板页面可能对应于Addon_name_mcp您的控制面板页面文件的类的 index 方法。

它将对应于这样的链接 uri:admin.php?S=0&D=cp&C=addons_modules&M=show_module_cp&module=addon_name&method=index

希望有帮助。这有点啰嗦,但我写它是为了我自己的利益而不是为了其他任何人(因为我浪费了大约 3 个小时试图让我的模块工作。)

于 2013-01-13T00:56:56.917 回答