web-dev-qa-db-ja.com

カスタムフォームプラグインでmanaged_fileフィールドを使用する方法

ユーザーがmanaged_fileフィールドを使用してファイルをアップロードできるようにするカスタムフォームでモジュールを作成しようとしています。私のモジュールの名前はFoundation_settingsで、ファイル構造は次のとおりです。

foundation_settings
  -foundation_settings.info.yml
  -foundation_settings.module
  -src
    -Form
      -FoundationForm.php

FoundationForm.phpの内部次のコードを使用してフォームを作成しています。

public function buildForm(array $form, FormStateInterface $form_state) {
    $config = $this->config('foundation.settings');
        $form['icons'] = [
            '#type'            => 'details',
            '#title'           => t('Front Page Icons'),
            '#open'            => FALSE,
            'icon1'            => [
                '#type'           => 'fieldset',
                '#title'          => t('First Icon'),
                'icon1_file'        => [
                    '#type'            => 'managed_file',
                    '#name'            => 'icon1',
                    '#title'           => t('First Icon Image'),
                    '#default_value'   => $config->get('icon1_file'),
                    '#upload_location' => 'public://',
                ],
            ],
       ];
}

ただし、フォームが送信されているときにmanaged_fileを処理する方法がわかりません。私のsubmitForm関数には

public function submitForm(array&$form, FormStateInterface $form_state) {
    $imageid = $form_state->getValue('icon1_file');
    $file = file_load($imageid[0]);
        if (gettype($file) == 'object') {
            $file->status = FILE_STATUS_PERMANENT;
        }
        $this->config('foundation.settings')
             ->set('icon1_file', $form_state->getValue('icon1_file'))
            ->save();
            $file->save();
}

アップロードと保存は正常に機能しますが、送信した後もこのエラーが発生します

最初のアイコン画像フィールドで使用されるファイルは参照されない可能性があります。

カスタムフォームプラグインでmanaged_fileフィールドをどのように使用する予定ですか?

3
Matt

私たちが抱えていた問題は、「managed_file」タイプを使用したときにフォームが返送してきたデータを理解することだったと思います。これにより、ファイルのエンティティが作成され、画像情報がデータベースの「file_managed」というテーブルに直接格納されますが、送信先に基づいてファイルがディレクトリに保存されます。たとえば、次のコードを見てください。

$form['mainslider_slide_one']['image_dir'] = [
    '#type'                 => 'managed_file',
    '#upload_location'      => 'public://module-images/home-slider-images/',
    '#multiple'             => FALSE,
    '#description'          => t('Allowed extensions: gif png jpg jpeg'),
    '#upload_validators'    => [
      'file_validate_is_image'      => array(),
      'file_validate_extensions'    => array('gif png jpg jpeg'),
      'file_validate_size'          => array(25600000)
    ],
    '#title'                => t('Upload an image file for this slide')
];

「#upload_location」の場合、指定したディレクトリ(sites/sitename/files /ディレクトリ)の下のパブリックフォルダにファイルを保存するように指示しています。これで、実際のファイルが必要な場所に保存され、データがデータベースに保存されました。

(検証中などの)情報が返されると、次のコードが生成されます。

public function validateForm(array &$form, FormStateInterface $form_state) {
    $managedFileId_imageOne = $form_state->getValue(['mainslider_slide_one' => 'image_dir']);

    if (empty($managedFileId_imageOne)) {
        $form_state->setErrorByName('test', 'No image found for image one');
    }
}

$ managedFileId_imageOneの結果は、空の配列(エラーメッセージが返されます)またはfidの配列になります。 fidはデータベース内の場所です。これは、最終的に設定ファイルのデータに保存した情報です。したがって、プログラムに情報をプルするときは、-file(managed)テーブルにある「fid」を Entity :: load メソッドを使用してクエリします。

注/更新:

この方法でアップロードされたファイルは現在、デフォルトで一時的に設定されていることを忘れないでください(「file_managed」テーブルのステータス列)。一時的でないように手動でステータスを1に設定するには、ファイルを永続的に設定する必要があります。これは現在バグである機能であり、将来のリリースで更新される可能性があると考えています。

Jasodeep からのサンプル

   $image = $form_state->getValue('image');
   $file = File::load( $image[0] );
   $file->setPermanent();
   $file->save();

これが少なくともあなたをあなたの道に導くのに役立つことを願っています!

9
Ron