Как добавить новую вкладку в форму публикации в ExpressionEngine 2.x - PullRequest
2 голосов
/ 06 декабря 2010

Я пишу расширение, которое вызывается при отправке записи.
Теперь я хочу добавить вкладку с несколькими полями в публикации из?

Могу ли я сделать это из расширения?

Я знаю, что есть крючки EE1.x - publish_form_new_tabs, publish_form_new_tabs_block ....
но мне это нужно для EE 2.x

Ответы [ 2 ]

2 голосов
/ 13 января 2013

Чтобы добавить к первому ответу,

одна вещь, с которой у меня постоянно были проблемы, - это не вызывать метод add_layout_tabs в любом месте файла обновления вашего модуля (т. Е. Файл, начинающийся с * 1004)*)

Итак, предположим, что ваш файл обновления называется: 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;
}

Где field_1_inside_publish_form - это поле, которое будет определено в соответствующем файле вкладки для модуля (т. е. tab.addon_name.php).

Метод установки будет вВ результате сохраните новую вкладку в существующий макет публикации, включающий конфигурацию вкладок вашего модуля.

Однако необходимо добавить метод для удаления вашей конфигурации в методе удаления файла обновления, вызвав метод 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, который вы вызываете в методе установки вашего обновленияфайл должен быть запущен.

Однако этот метод выполняется только при включении модуля.Таким образом, это означает, что вы должны отключить свой модуль, что является перетаскиванием, если ваш модуль добавляет таблицы базы данных.К счастью, вы можете сделать так, чтобы метод обновления вашего файла обновления загружал вашу новую конфигурацию вкладок (в дополнение к добавлению или удалению любых новых таблиц базы данных как части обновлений вашего модуля.)

Идея состоит в том, что вы удаляете свою предыдущую конфигурациюи вы добавляете конфигурацию, которая вызывает метод ваших вкладок с именами новых полей для раздела вкладок вашего модуля.

Итак, предположим, что у вашего метода вкладок есть новое поле с именем '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->version в файле udpate с '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).страница главной панели управления, вероятно, будет соответствовать методу index класса Addon_name_mcp вашей панели управленияФайл страницы el.

Это будет соответствовать ссылке на uri, например: admin.php?S=0&D=cp&C=addons_modules&M=show_module_cp&module=addon_name&method=index

Надеюсь, это поможет.Это немного затянуто, но я написал это больше для себя, чем для кого-либо другого (потому что я потратил впустую 3 часа, пытаясь заставить свой модуль работать).

2 голосов
/ 07 декабря 2010

API модуля 2.x позволяет это.Документация здесь: http://expressionengine.com/user_guide/development/modules.html

Вы можете объединить модуль и расширение одного типа с такой структурой:

/system/expressionengine/third_party/addon_name/
    ext.addon_name.php
    language/
        english/
            lang.addon_name.php
    mcp.addon_name.php
    mod.addon_name.php
    tab.addon_name.php # Add fields to tab here, per API spec
    upd.addon_name.php # Add/remove tab here, per API spec

Когда пользователь устанавливает расширение или модуль, он 'Автоматически спросят, хотят ли они установить оба одновременно.Очевидно, если целью является просто , чтобы добавить вкладку / поля к издателю, ваши классы mcp и mod могут быть как минимум необходимыми для успешной установки модуля.

Надеюсь, это хорошоотправная точка.

...