機能APIを介したDrupalへのデータ転送-エクスポート用の新しいコンポーネントを追加

最近、メタタグモジュールの設定をローカルサーバーからバトルサーバーに転送する必要がありました。 これを行うには、 機能モジュールを使用したかったのですが、がっかりしました-メタタグモジュールは機能APIをサポートしていません。 グーグルは何も与えませんでした。「metatags_configテーブルをダンプして、戦場でリクエストを実行する」などの松葉杖をいくつか見つけました。 そのため、「機能」を介して転送するための新しいエンティティを追加する方法を見つけることにしました。





例として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 $オブジェクト ;

}

}

}


フック自体に、「機能」のコードに従ってデータベースのデータを更新するコードを実装する必要があります。

以上で、この記事が役立つことを願っています。



メタタグモジュールのパッチへのリンク



All Articles