
例としてmetatagモジュールを使用してこれを行う方法を説明します。
まず、features_apiフックを実装する必要があります。これは、「機能」を介してエクスポートするコンポーネントを定義します。
/ **
* hook_features_api()を実装します。
* /
関数 metatag_features_api ( ) {
$コンポーネント = 配列 (
'metatags' => 配列 (
'name' => t ( 'metatags' ) 、
'features_source' => TRUE 、
'default_hook' => 'metatag_export_default' 、
'default_file' => FEATURES_DEFAULTS_INCLUDED 、
'file' => drupal_get_path ( 'module' 、 'metatag' ) 。 '/metatag.features.inc' 、
) 、
) ;
$コンポーネントを 返し ます 。
}
default_hook配列のキーに注意する価値があります。 機能からデータを取得するために使用されるフックを定義します。 「機能」がモジュールであることは誰にとっても秘密ではないと思います。 このモジュールにmetatag_export_defaultフックを実装し、そこにエクスポートされたデータを結合します。 別のmetatag.features.incファイルに入れた残りのフック
もう1つの重要な点は、hook_features_apiは通常のフックであり、MODULE_NAME_features_apiとして機能することです。 説明する残りのフックは、通常のモジュール名ではなく、エクスポートされたコンポーネントの名前を使用して形成されます。 たとえば、features_export_optionsをフックします。
このフックでは、「機能」を介して転送できるアイテムを含む配列を返します。 メタタグモジュールの場合、これはさまざまなページタイプ(グローバル、ノード、taxonomy_termなど)にメタタグを設定するためのオプションへのポインターの配列です。
/ **
* hook_features_export_options()を実装します。
* /
関数 metatags_features_export_options ( ) {
$インスタンス = metatag_config_instance_info ( ) ;
foreach ( $ instance as $ key => $ instance ) {
$ options [ $ key ] = $ key ;
} ;
$オプションを 返し ます 。
}
これらのアイテムは、新しい「機能」を作成するときに、対応するメタタグセクションで利用可能になります

次のfeatures_export_renderフックは、エクスポートされたデータが保存される「機能」ファイルのコードを生成します。
/ **
* hook_features_export_render()を実装します。
* /
function metatags_features_export_render ( $ module_name 、 $ data 、 $ export = NULL ) {
$コード = 配列 ( ) ;
$ code [ ] = '$ config = array();' ;
$ code [ ] = '' ;
foreach ( $ data as $ key => $ name ) {
if ( is_object ( $ name ) ) {
$ name = $ name- > instance ;
}
if ( $ config = metatag_config_load ( $ name ) ) {
$ export = new stdClass ( ) ;
$ export- > instance = $ config- > instance ;
$ export- > config = $ config- > config ;
$ export = features_var_export ( $ export 、 '' ) ;
$ key = features_var_export ( $ name ) ;
$ code [ ] = "//エクスポートされたメタタグ設定インスタンス: {$ name} 。" ;
$ code [ ] = " $ config [ {$ key} ] = {$ export} ;" ;
$ code [ ] = "" ;
}
}
$ code [ ] = 'return $ config;' ;
$ code = implode ( "n" 、 $ code ) ;
return array ( 'metatag_export_default' => $ code ) ;
}
$データ配列はフックに渡されます。 最初のスクリーンショットで「機能」を作成するときに選択したアイテムそのものが含まれています。 これらのポイントでは、ほぼそのようなコードが生成されます

フックコードとスクリーンショットは、features_apiで最初に定義したものと同じmetatag_export_defaultフックを示していることに注意してください。
features_exportフックを使用すると、$ data配列を使用して$ export配列にデータを書き込むことができます。 また、保存されたデータをカテゴリに分割することにより、構造を複雑にすることもできます。
/ **
* hook_features_exportを実装
* /
function metatags_features_export ( $ data 、 & $ export 、 $ module_name = '' 、 $ type = 'metatags' ) {
foreach ( $ data as $ name ) {
$ export [ 'features' ] [ $ type ] [ $ name ] = metatag_config_load ( $ name ) ;
}
}
「機能」を介してエクスポートされたアイテムは、$データ配列に転送されます。 これらのアイテムについては、データベースに保存されている状態がロードされます。
「機能」状態とデータベース内の状態の違いを見つけるために、「features_export」および「metatag_export_default」フックが使用されます。 最初はデータベースから状態を取得し、2番目は「機能」でデータの状態を返します。 これらの状態が比較され、スクリーンショットのように違いを見ることができます

「機能」とデータベースの状態に違いがある場合、2つのオプションが可能です。
1つ目は、たとえばdrush fu FEATURE_NAMEコマンドを使用して、機能を更新することです。 この場合、features_exportおよびfeatures_export_renderフックが使用されます。 その結果、機能コードはデータベースの状態に応じて更新されます。
2番目のオプションは復帰です-データベースの状態を「機能」に保存されている状態にリセットします。 元に戻すには、features_revertフックが必要です。
/ **
* hook_features_revert()を実装します。
* /
function metatags_features_revert ( $ module ) {
$ function = " {$ module} _metatag_export_default" ;
$ feature_conf = $ function ( ) ;
if ( $ default_config = features_get_default ( 'metatags' ) )) {
foreach ( array_keys ( $ default_config ) as $ config ) {
if ( $ conf = metatag_config_load ( $ config ) ) {
db_delete ( 'metatag_config' ) -> condition ( 'instance' 、 $ config ) -> execute ( ) ;
}
設定解除 ( $ feature_conf [ $ config ] [ 'cid' ] ) ;
$ object = new stdClass ( ) ;
$ object- > cid = NULL ;
$ object- > instance = $ config ;
$ object- > config = $ feature_conf [ $ config ] [ 'config' ] ;
metatag_config_save ( $オブジェクト ) ;
}
}
}
フック自体に、「機能」のコードに従ってデータベースのデータを更新するコードを実装する必要があります。
以上で、この記事が役立つことを願っています。
メタタグモジュールのパッチへのリンク