प्रबंधित फ़ाइल: फ़ील्ड में उपयोग की गई फ़ाइल को संदर्भित नहीं किया जा सकता है


39

मुझे प्रबंधित_फाइल प्रकार के साथ कुछ समस्याएँ हो रही हैं । जब भी मैं एक ऐसे फॉर्म को संपादित करने और सहेजने का प्रयास करता हूं जिसमें एक प्रबंधित_ तत्व होता है, तो एक त्रुटि होती है: चित्र फ़ील्ड में उपयोग की गई फ़ाइल को संदर्भित नहीं किया जा सकता है।

यह वह कोड है जिसका मैं उपयोग कर रहा हूं:

function foo_form ($form, &$form_state, $foo) {  
  ...     
  $form['file'] = array(
    '#type' => 'managed_file',
    '#title' => t('Picture'),
    '#default_value' => (isset($foo->file->fid) ? $banner->foo->fid : ''),
    '#upload_location' => variable_get('foo_upload_location'),
  );

  if (isset($foo->file)) {
    $form['current_file'] = array(
      '#type' => 'hidden',
      '#value' => $foo->file->fid,
    );
  }
  ...
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
  );
  return $form;
 }

function foo_form_submit ($form, &$form_state) {
  $foo = (object)$form_state['values'];

  $current_file_set = isset($form_state['values']['current_file']);

  if ($form_state['values']['file'] != 0 && !$current_file_set) {
    // Load the file uploaded in the form.
    $file = file_load($form_state['values']['file']);

    $file->status = FILE_STATUS_PERMANENT;

    file_save($file);

    $foo->file = $file->fid;
  } else if ($form_state['values']['file'] != 0 && $current_file_set) {

    // If we are uploading a different picture, delete the old one and save the
    // new one. If not, don't do anything.
    if ($form_state['values']['current_file'] != $form_state['values']['file']) {
      file_delete(file_load($form_state['values']['current_file']));
      // Load the file uploaded in the form.
      $file = file_load($form_state['values']['file']);

      $file->status = FILE_STATUS_PERMANENT;

      file_save($file);

      $foo->file = $file->fid;
    }
  } else {
    file_delete(file_load($form_state['values']['current_file']));
    $foo->file = null;
  }

  ...
}

मैंने मॉड्यूल / फ़ाइल / file.module में file_managed_file_validate फ़ंक्शन में त्रुटि का पता लगाया, लेकिन फ़ाइल संदर्भों के बारे में कुछ भी नहीं जानता।

जवाबों:


40

फ़ाइल को सहेजे जाने के बाद इसका समाधान file_usage_add में कॉल जोड़ना है। यह कॉल डेटाबेस में फ़ाइल का संदर्भ जोड़ता है। File_managed_file_validate समारोह संदर्भ स्पॉट जाएगा और त्रुटि ट्रिगर नहीं करेगा।

file_usage_add($file, 'foo', 'foo', $foo->id);

यह प्रबंधित API में प्रबंधित नहीं किया गया है API_file उदाहरण के अंतर्गत

इस मुद्दे पर Drupal प्रलेखन मुद्दों पर चर्चा की जा रही है: लिंक


3
+1 बस इस पर हमारे बाल फाड़ रहे थे, एक फ़ाइल उपयोग रिकॉर्ड जोड़ने से समस्या तुरंत हल हो गई। धन्यवाद!
क्लाइव

शुक्र है कि अब इसे Manage_file उदाहरण में जोड़ दिया गया है। लेकिन यह जो भी उदाहरण में नहीं था, तो मैं इस उत्तर के लिए एक जीवनरक्षक था!
जोशुआ स्टीवर्डसन

@Clive टेम्पलेट सेटिंग्स से फ़ाइलों को बचाने के बारे में क्या है ?! उस फ़ंक्शन में पैरामीटर के रूप में कार्य करने के लिए कोई मॉड्यूल नहीं है!
सईदबाक़र

1
@ s @мsєм सिर्फ विषय के नाम का उपयोग करें - स्ट्रिंग ही मान्य नहीं है, बस इसे ट्रैक करने वाली चीज़ के लिए कुछ विशिष्ट होना चाहिए - मॉड्यूल नाम का उपयोग ड्रुपल पर नाम रखने के लिए किया जाता है ताकि सम्मेलन अटक जाए
क्लाइव

@Clive क्या आप इस प्रश्न पर एक नज़र डाल सकते हैं: drupal.stackexchange.com/questions/124373/…
SaidbakR
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.