web-dev-qa-db-ja.com

プログラムでエンティティフォームを送信するにはどうすればよいですか?

私のユースケース:

  1. 匿名ユーザーがエンティティフォームを介して情報を送信します。
  2. フォームデータ($ _POST)がキャッシュされ、モーダルダイアログボックスにログインフォームが表示されます。
  3. ユーザーが認証され、キャッシュされたフォームデータが取得されて送信されます。

Webフォームでこれを行うことができましたが、エンティティフォームで同じタスクを実行することができませんでした。次のコードを使用してフォームを取得できます...

<?php
$entityform = entityform_empty_load('my_eform_type');
$form = entityform_form_wrapper($entityform);
?>

問題があったのは、キャッシュされた$ _POSTから正しい構造と値で$ form_state配列を作成し、それをdrupal_form_submit( )。私のエンティティフォームには画像、日付、チェックボックスのフィールドがあるため、複雑さが増しています。

次のコードを使用して、エンティティフォームの送信を手動で作成して保存できました...

<?php
$values = array(
  'type' => 'my_eform_type',
  'uid' => $user->uid,
  'created' => time(),
  'changed' => time(),
  'language' => LANGUAGE_NONE,
);

// For brevity's sake, I don't show adding all the fields
// from the cached $_POST to the $values array.

$entityform = entityform_create($values);
$entityform->save();
?>

...しかし、それはフォーム検証を提供せず、エラー機能でリロードしません。間違ったサイズの画像がアップロードされるなどのエラーは、フォームの送信中に捕捉されます。

Entityformが送信されると、entityform通知メールも送信され、ユーザーは確認ページにリダイレクトされます。ユーザー認証の前にこれらのことを実行したくありません。

d.o。ハンドブックの一部のコード はありますが、drupal_form_submit()については触れていません。

Entityform 1.1を使用しています。

3
David

drupal_form_submit()は標準フォームではなくエンティティであるため、entityformを送信できないと思います。

エンティティを保存するのが最善の方法ですが、フォームから送信されたフィールドデータに対して操作を実行するために必要な_field_attach_submit_がありません。

構文は次のとおりです。

_field_attach_submit($entity_type, $entity, $form, &$form_state, $options = array())
_

特定の_$form_state_に基づく例:

_$form_id = $form_state['build_info']['form_id'];
$entity = $form['#entity'] ?: $form_state['build_info']['args'][0];
$entity_type = $entity->entityType();
$entity_info = entity_get_info($entity_type);
$entity_values = drupal_array_get_nested_value($form_state['values'], $form['#parents']);
list(, , $bundle) = entity_extract_ids($entity_type, $entity);

// Copy top-level form values that are not for fields to entity properties,
// without changing existing entity properties that are not being edited by
// this form. Copying field values must be done using field_attach_submit().
$values_excluding_fields = $info['fieldable'] ? array_diff_key($entity_values, field_info_instances($this->entityType, $bundle)) : $entity_values;
foreach ($values_excluding_fields as $key => $value) {
  $entity->$key = $value;
} 
if ($entity_info['fieldable']) {
  field_attach_submit($entity_type, $entity, $form, $form_state);
}
$entity->created = isset($entity->is_new) ? REQUEST_TIME : $entity->created;
$entity->changed = REQUEST_TIME;
entity_save($entity_type, $entity);
_

または、entityform_save()を使用してエンティティフォームを送信することもできます。例:

_$form = new Entityform(array('type' = 'my_entitty_form', 'language' => LANGUAGE_NONE)); 
$form->field_entityform_1 = array(LANGUAGE_NONE => array(array('value' => 'field_1'))); 
$form->field_entityform_2 = array(LANGUAGE_NONE => array(array('value' => 'field_2' ))); 
$form->uid = 1; // this is the form id 
entityform_save($form);
_

出典: sushantpaste's Gist

1
kenorb