エンティティメタデータラッパーを使用してentity->export()
を複製しようとしています。 entity_metadata_wrappedエンティティ(この場合はフィールドコレクション)でvalue()
を呼び出すと、entity->export()
が提供するすべてに加えて、_entity_key:protected
_フィールドの束も取得します。保護されていないものはすべてエクスポートで提供されたものと同じ値を提供するので、これらを取り除きたいと思います。
例wrapper->value()
結果:
_Object
(
[fieldInfo:protected] =>
[hostEntity:protected] =>
[hostEntityId:protected] =>
[hostEntityRevisionId:protected] =>
[hostEntityType:protected] =>
[langcode:protected] => und
[item_id] => 9
[revision_id] => 9
[field_name] => field_treatment_categories
[default_revision] => 1
[archived] => 0
[entityType:protected] => field_collection_item
[entityInfo:protected] => Array
(
[label] => Field collection item
[label callback] => entity_class_label
[uri callback] => entity_class_uri
[entity class] => FieldCollectionItemEntity
[controller class] => EntityAPIController
[base table] => field_collection_item
[revision table] => field_collection_item_revision
[fieldable] => 1
[redirect] =>
[entity keys] => Array
(
[id] => item_id
[revision] => revision_id
[bundle] => field_name
[uuid] => uuid
)
[module] => field_collection
[view modes] => Array
(
[full] => Array
(
[label] => Full content
[custom settings] =>
)
[token] => Array
(
[label] => Tokens
[custom settings] =>
)
)
[access callback] => field_collection_item_access
[metadata controller class] => FieldCollectionItemMetadataController
[bundles] => Array
(
[field_treatment_categories] => Array
(
[label] => Field collection field_treatment_categories
[admin] => Array
(
[path] => admin/structure/field-collections/%field_collection_field_name
[real path] => admin/structure/field-collections/field-treatment-categories
[bundle argument] => 3
[access arguments] => Array
(
[0] => administer field collections
)
)
[rdf_mapping] => Array
(
)
)
[field_treatments] => Array
(
[label] => Field collection field_treatments
[admin] => Array
(
[path] => admin/structure/field-collections/%field_collection_field_name
[real path] => admin/structure/field-collections/field-treatments
[bundle argument] => 3
[access arguments] => Array
(
[0] => administer field collections
)
)
[rdf_mapping] => Array
(
)
)
)
[static cache] => 1
[field cache] => 1
[load hook] => field_collection_item_load
[translation] => Array
(
)
[schema_fields_sql] => Array
(
[base table] => Array
(
[0] => item_id
[1] => revision_id
[2] => field_name
[3] => archived
[4] => uuid
)
[revision table] => Array
(
[0] => revision_id
[1] => item_id
)
)
[token type] => field_collection_item
[apachesolr] => Array
(
[indexable] =>
[status callback] =>
[document callback] =>
[reindex callback] =>
[bundles changed callback] =>
)
[configuration] =>
[uuid] => 1
)
[idKey:protected] => item_id
[nameKey:protected] => item_id
[statusKey:protected] => status
[defaultLabel:protected] =>
[uuid] => c1d3982f-31c8-4640-89b4-2f54334e4803
[field_tc_short_description] => Array
(
[und] => Array
(
[0] => Array
(
[value] => short desc 2
[format] =>
[safe_value] => short desc 2
)
)
)
[field_tc_short_title] => Array
(
[und] => Array
(
[0] => Array
(
[value] => Short title 2
[format] =>
[safe_value] => Short title 2
)
)
)
[field_tc_title] => Array
(
[und] => Array
(
[0] => Array
(
[value] => Treatment Category 2
[format] =>
[safe_value] => Treatment Category 2
)
)
)
[field_treatments] => Array
(
[und] => Array
(
[0] => Array
(
[value] => 10
[revision_id] => 10
)
[1] => Array
(
[value] => 11
[revision_id] => 11
)
)
)
[rdf_mapping] => Array
(
)
[entity_view_prepared] => 1
)
_
削除する_[fieldInfo:protected]
_フィールドですが、削除するオプション/メソッドが見つかりません。何かご意見は?
これを行おうとしている人にとって、答えは非常に簡単です。
entity_metadata_wrapper-> value()は、保護されたプロパティを備えたオブジェクトを返します。結果から値のみを取得するには、phpのget_object_vars()関数を使用できます。
これは、データに関して通常のentity-> export()呼び出しと同等のデータを返しますが、exportはここで取得した配列の代わりにJSONを返すと思います。
そう:
// Wrap an existing entity.
$wrapper = entity_metadata_wrapper('entity_type', $entity);
// Get the object representation of that entity.
$entity_data = $wrapper->value();
// Strip all properties (including :protected),
// and get an array representation of that data.
// This is the same data you get from entity->export(),
// but in array form.
$final_data = get_object_vars($entity_data);
これが誰かを助けることを願っています。
_array_walk
_を使用してエンティティ配列をスキャンし、key
にサブストリング_:protected
_が含まれているかどうかを確認します。はいの場合、unset()
配列キー。
array ではなく object ではないため、保護されたプロパティを単に設定解除することはできません。 保護理由によります。
保護されていると宣言されたメンバーは、クラス自体内および継承されたクラスによってのみアクセスできます。
これが PHP OOP visibility の仕組みです。クラスのメンバーを変更するか、そのクラスを拡張して定義する適切なゲッター/セッターメソッドを見つける必要があります。