2016-07-28 11 views
2

"ファイル"タイプのフィールドをテーマの設定に追加しようとしています。私は基本テーマを使用せず、Drupal 7で作業しています。フィールドが正しい場所に表示され、ファイルを選択できますが、設定を保存すると、ファイルは自分のファイルフォルダには表示されず、実行されます設定のtheme_get_settingsは空の文字列を返します。私は間違って何をしていますか?ここでDrupalシステムテーマ設定へのファイルタイプフォームフィールドの追加

は私のフィールドコードです:

// footer settings 
$form['footer_settings'] = array(
    '#type' => 'fieldset', 
    '#title' => t('Footer Settings'), 
    '#collapsible' => TRUE, 
    '#collapsed' => FALSE, 
); 
$form['footer_settings']['footer_logo_path'] = array(
    '#type' => 'textfield', 
    '#title' => t('Footer Logo Path'), 
    '#default_value' => theme_get_setting('footer_logo', ''), 
); 
$form['footer_settings']['footer_logo'] = array(
    '#type' => 'file', 
    '#title' => t('Footer Logo'), 
    '#description' => t('Upload a new logo image to be displayed in the footer of the website here.'), 
    '#upload_location' => file_default_scheme() . '://', 
); 

答えて

0

ファイルのフォームコントロールを使用すると、あなたが検証して提出するメソッドを追加(または既存のものを修正)ファイル自体をアップロードする必要があります。

/modules/system/system.admin.incファイルで =>:

あなたは魔女があなたのテーマで使用するファビコンとロゴファイルを定義することができ、デフォルトのシステムテーマの方法を見てすることができます

... 
    $form['logo']['settings']['logo_upload'] = array(
     '#type' => 'file', 
     '#title' => t('Upload logo image'), 
     '#maxlength' => 40, 
     '#description' => t("If you don't have direct file access to the server, use this field to upload your logo.") 
    ); 
... 
    $form['#submit'][] = 'system_theme_settings_submit'; 
    $form['#validate'][] = 'system_theme_settings_validate'; 
... 
/** 
* Validator for the system_theme_settings() form. 
*/ 
function system_theme_settings_validate($form, &$form_state) { 
    // Handle file uploads. 
    $validators = array('file_validate_is_image' => array()); 

    // Check for a new uploaded logo. 
    $file = file_save_upload('logo_upload', $validators); 
    if (isset($file)) { 
    // File upload was attempted. 
    if ($file) { 
     // Put the temporary file in form_values so we can save it on submit. 
     $form_state['values']['logo_upload'] = $file; 
    } 
    else { 
     // File upload failed. 
     form_set_error('logo_upload', t('The logo could not be uploaded.')); 
    } 
    } 

    $validators = array('file_validate_extensions' => array('ico png gif jpg jpeg apng svg')); 
... 
    // If the user provided a path for a logo or favicon file, make sure a file 
    // exists at that path. 
    if (!empty($form_state['values']['logo_path'])) { 
    $path = _system_theme_settings_validate_path($form_state['values']['logo_path']); 
    if (!$path) { 
     form_set_error('logo_path', t('The custom logo path is invalid.')); 
    } 
    } 
    if (!empty($form_state['values']['favicon_path'])) { 
    $path = _system_theme_settings_validate_path($form_state['values']['favicon_path']); 
    if (!$path) { 
     form_set_error('favicon_path', t('The custom favicon path is invalid.')); 
    } 
    } 
} 
... 

/** 
* Process system_theme_settings form submissions. 
*/ 
function system_theme_settings_submit($form, &$form_state) { 
... 
    if (!empty($values['logo_upload'])) { 
    $file = $values['logo_upload']; 
    unset($values['logo_upload']); 
    $filename = file_unmanaged_copy($file->uri); 
    $values['default_logo'] = 0; 
    $values['logo_path'] = $filename; 
    $values['toggle_logo'] = 1; 
    } 

    // If the user entered a path relative to the system files directory for 
    // a logo or favicon, store a public:// URI so the theme system can handle it. 
    if (!empty($values['logo_path'])) { 
    $values['logo_path'] = _system_theme_settings_validate_path($values['logo_path']); 
    } 
... 
} 

編集

私は以下のコメントで言ったように、あなたは「footer_logo」コンボで受信したファイルを保存し、保存したファイルのパスと「footer_logo_path」の値を移入する必要があります。

// If the user uploaded a new logo, save it to a permanent location 
    if (!empty($values['footer_logo'])) { 
    $file = $values['footer_logo']; 
    unset($values['footer_logo']); 
    $filename = file_unmanaged_copy($file->uri); 
    $values['footer_logo_path'] = $filename; 
    } 

メソッドが2回実行されていても、問題はありません。

+0

応答のおかげで、Tytoo!私は新しいカスタムバリデーションとサブミット機能を追加して実行しましたが、2回実行されているようです。それをどうやって防ぐことができますか? – Colin

+0

明確にするために、私のカスタムsubmit/validate関数が最初に実行され、続いてデフォルトが実行されます。 – Colin

+0

@Colin、フォームの検証と送信メソッドがなぜ2回実行されているのかわかりません。 例のようにすると、 'footer_logo'ファイルを変換する必要があり、アップロードされたファイルパスを 'footer_logo_path'値に入れる必要があります。 – TytooF

関連する問題