Micronewsというカスタムエンティティがあり、その中にマイクロアップデートのバンドルが作成されています。すべてのフィールドのdbにエンティティを書き込むことはできますが、ロケーションモジュールを使用してロケーションを書き込む方法を理解できません。複数のテーブルのdbに格納されているようです。場所をデータベースに保存する標準的な方法はありますか?
function p_save_entity($name, $issue_type, $constituency, $location){
$name = "Testing programmatically";
$issue_type = "electricity";
$constituency = '22';
$e = entity_create('micronews', array(
'type' => 'microupdate',
'name'=>$name,
'created'=> time(),
));
$ew = entity_metadata_wrapper('micronews' ,$e);
$ew->field_type->set($issue_type);
$ew->field_constituency->set($constituency);
$ew->field_location[latitude]->set('65.000000');
$ew->field_location[longitude]->set('65.000000');
$fl = $ew->save();
if ($fl){
return "";
}
else{
return "Something went wrong";
}
これは機能しますが(これはトリックです)、locationに付属するlocation_entityモジュールを有効にした場合のみです。
$location = array(
'latitude' => $latitude,
'street' => $street,
// etc, other elements added here ...
);
$ew->field_location->set($location);
$ew->save();
他の誰もがこれでこれほど多くの時間を失うことはありません。
私は、modulesフォルダーのlocation.test
を参照します。具体的には testCreateLocation() のようなものです。
このコードは、場所フィールドに対して次のことを行います。
135 $node = $this->drupalCreateNode(array(
136 'type' => $location_type,
137 'field_loctest' => array(
138 array(
139 'name' => $location1_name,
140 'street' => '48072 289th St.',
141 'province' => 'SD',
142 'country' => 'us',
143 // 'location_settings' => $settings,
144 ),
145 ),
146 ));
147 cache_clear_all();
148
149 // Reload the node.
150 $node2 = node_load($node->nid, NULL, TRUE);
151 $location = $node2->field_loctest[0];
152
153 $this->assertEqual($location1_name, $location['name'], t('Testing basic save/load'));
エンティティラッパーを使用すると、mightのようになります(場所がさまざまなデータから取得できる場合、テストではStreetを使用し、Lat/Longsを使用します)。
$ew->field_location->set(array(array('latitude' => 65.000000, 'longitude' => 34)));
私は以前にEntityAPIとラッパーを使用したことがありますが、すべてを記憶させるために常に使用することはありません。私はこの他のリンクが役に立ったと感じました: entity_metadata_wrapper()関数の目的は何ですか、なぜそれを使用する必要があるのですか?
上記のEntityAPIスレッドのリンクをたどると、ネストされた配列を使用して$profile_object
が作成されます...
遅い反応だが、誰かを助けると考えた。
「不明なデータプロパティfield_location」も私に起こります。エンティティがまだ初期化されていないためだと思いました。しかし、エンティティを作成してラッパーをリセットしても効果はありませんでした。次の回避策は問題を解決します。
$entity->{$drupal_field}['und'][0] = $location;
// This seems to be necessary
$entity->locations[0] = $location;
$resp = entity_save('node', $entity);
if ($resp == false) {
// do something
}