0

イメージ フィールドが関連付けられたコンテンツ タイプを作成しました。各ユーザーは、このコンテンツ タイプのすべてのノードのリストを表示でき、適切なフィールドに新しい画像をアップロードできる必要があります。私は多くの解決策を試しましたが、最終的にはフォームと管理されたファイルを試しています。

すべてのノードのリストを含むページで、各ノードのフォームを含むライトボックスを作成しています。各フォームは次のように作成されます。

function coverupload_form($form, &$form_state, $uid, $relid) {

$form['#attributes']['id'] = 'coverup-'.$relid;

$form_state['storage']['rid'] = $relid;

$cliente = cataloghi_user_edit_get_cliente($uid);

$release = node_load($relid);

$form['cover'] = array(
    '#title' => 'Carica la cover per la release '.$release->title,
    '#description' => 'I file caricati devono avere estensione \'.jpeg\', risoluzione di 1440x1440 e dimensione massima di 5MB', 
    '#type' => 'managed_file',
    '#upload_location' => 'public://clienti/'.$cliente->title.'/cover',
    '#upload_validators' => array(
      'file_validate_extensions' => array('jpeg, jpg'),
      // Pass the maximum file size in bytes
      'file_validate_size' => array(5*1024*1024),
      'file_validate_image_resolution' =>array('1440x1440', '1440x1440'),
    ),
);


$form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('CARICA'),
);


return $form;
}

function coverupload_form_submit($form, &$form_state) {

$file = file_load($form_state['values']['cover']);
// Change status to permanent.
$file->status = FILE_STATUS_PERMANENT;
// Save.
file_save($file);


$nodo = node_load($form_state['storage']['rid']);


$nodo->field_release_copertina['und'][0] = (array)$file;

 if($nodo = node_submit($nodo)) { // Prepare node for saving
    node_save($nodo);
 }

}

すべてのフォームには display: none があり、ユーザーがカバーのアップロード ボタンをクリックすると、対応するフォームのみがライトボックスに表示されます。

イメージが検証されると、すべてが正常に機能します。問題は、画像が検証されていない場合に発生します (1440x1440px 未満の場合など)。

インスペクターでライトボックスをチェックすると、正しい数のフォームが生成されますが、それらはすべて同じノードを参照しています (たとえば、すべてのフォームに 'coverup-17' という ID が付けられています)。

私はすべてをチェックしましたが、毎回フォームに正しい値を渡しているように見えるので、フォームの理解が不十分であることに関連する問題である可能性があると考え始めています。

別のタイプのアプローチを試したほうがよいでしょうか?

これが少し厄介な場合は、ありがとうございます。申し訳ありません...

4

1 に答える 1

1

私は問題を解決することができました。同じページに同じフォームの複数のインスタンスがあるという事実に依存していました。

hook_forms() を実装しました。

function mymodule_forms($form_id, $args) {
  $forms = array();
  if(strpos($form_id, 'coverupload_form_') === 0) {
    $forms[$form_id] = array(
      'callback' => 'coverupload_form',
      'callback arguments' => array($args[0], $args[1]),
    );
  }

  return $forms;
}

そして、フォーム呼び出しをに変更しました

drupal_render(drupal_get_form('coverupload_form_'.$relid, $arg1, $arg2));
于 2012-08-09T11:06:03.963 に答える