प्रोग्रामेटिक रूप से फाइल अटैच करना


25

मैंने "गैलरी" सामग्री प्रकार बनाया है, और दो फ़ील्ड जोड़े हैं: "फोटो," और "दस्तावेज़।" मैंने तब "दस्तावेज़" फ़ील्ड में फ़ाइल अपलोड करने के लिए निम्नलिखित कोड का उपयोग किया:

$file = file_save_upload('document', array(
    'file_validate_extensions' => array('txt doc'), // Validate extensions.
));

// If the file passed validation:
if ($file) {
// Move the file, into the Drupal file system
if ($file = file_move($file, 'public://')) {
  $file->status = FILE_STATUS_PERMANENT;
 // $file->file_display = 1;
  $file = file_save($file);

} else {
  $output = t('Failed to write the uploaded file the site\'s file folder.');
}       
 } else {
$output = t('No file was uploaded.');
 }

मैं निम्नलिखित कोड का उपयोग करके इस फ़ाइल को नोड में संलग्न कर रहा हूं:

$customNode->field_document[$customNode->language][0] = (array)$file;

जब मैं node_submit()फ़ंक्शन को कॉल करता हूं, तो मुझे निम्न त्रुटि मिलती है:

अखंडता बाधा उल्लंघन: 1048 कॉलम 'field_document_display' शून्य नहीं हो सकता

क्या किसी को पता है कि मैं क्या गलत कर रहा हूं?

जवाबों:


29

मैं आमतौर पर (array)$fileलाइन नहीं फेंकता क्योंकि वास्तव में केवल फ़ील्ड डेटा की ज़रूरत ही फ़िड, वर्णन और प्रदर्शन है। इसलिए मैं आमतौर पर निम्नलिखित कार्य करता हूं:

$node->field_image[LANGUAGE_NONE][] = array(
  'fid' => $file->fid,
  'display' => 1,
  'description' => '',
);
node_save( $node );

इस तरह अगर प्रदर्शन की आवश्यकता होती है, तो मुझे कोई त्रुटि नहीं मिलती है। लेकिन यह सिर्फ मुझे है ...


मुझे यह भ्रम क्यों है कि इसमें डिफ़ॉल्ट मान नहीं हैं।
32i

आप डिफ़ॉल्ट मान नहीं देखते हैं क्योंकि यह प्रत्यक्ष असाइनमेंट है।
लेस्टर पीबॉडी

7

आपका समाधान लगभग सही है; हालाँकि, कुछ मामलों में यह आवश्यक है कि आप प्रदर्शन और विवरण भी सेट करें।

अपना कोड काम करने के लिए यह करें:

$file = file_save_upload('document', array(
    'file_validate_extensions' => array('txt doc'), // Validate extensions.
));

// If the file passed validation:
if ($file) {
// Move the file, into the Drupal file system
if ($file = file_move($file, 'public://')) {
  $file->status = FILE_STATUS_PERMANENT;
 // $file->file_display = 1;
  $file = file_save($file);
  //set the extra values needed to make node_save work
  $file->display = 1;
  $file->description = "";
} else {
  $output = t('Failed to write the uploaded file the site\'s file folder.');
}       
 } else {
$output = t('No file was uploaded.');
 }

2

मुझे लगता है कि यहां प्रमुख हैं वे लाइनें

$file->display = 1;
$file->description = "";

एरिक वैन एल्डिक ने बताया। मैं ठीक उसी मुद्दे के साथ संघर्ष कर रहा था, बस जोड़ रहा था

$file->display = 1;

मदद नहीं की, लेकिन

$file->description = "";

मेरा दिन बना दिया।


0

प्रोग्राम को नोड में जोड़ने के लिए आप उपयोग कर सकते हैं

$managed = TRUE; // Whether or not to create a Drupal file record
$filename = 'public://imdb-cast-' . time() . '.jpg';
$iamge_file = system_retrieve_file($url,$filename , $managed);
if($iamge_file){
$file = file_load(db_query('SELECT MAX(fid) FROM {file_managed}')->fetchField());
$node->field_image['und'][0] = (array) $file;
  }
}

0

बस अपना समाधान यहां पेस्ट करने जा रहा हूं, मुझे एक नया नोड बनाने की जरूरत है, और एक छवि को प्रोग्रामिक रूप से अपलोड करें।

$filepath = variable_get('file_public_path') . '/xmas_banner.jpg';
$file_temp = file_get_contents($filepath);
$file_temp = file_save_data($file_temp, file_default_scheme() . '://' .'xmas_banner_nl.jpg', FILE_EXISTS_RENAME);

$node = new stdClass();
$node->type = 'carousel'; // custom content type
$node->title = 'XMAS NL';
$node->field_banner_image['und'][0] = (array) $file_temp;
$node->uid = 1;
$node->status = 0;
$node->active = 0;
$node->promote = 0;
node_save($node);

0

Drupal 8 में प्रोग्रामेटिक रूप से कई फाइलें संलग्न करें:

foreach ($fileIds as $fid) {
  $node->field_images[] = [
    'target_id' => $fid,
    'alt' => 'ALT TEXT',
    'title' => 'TITLE TEXT'
  ];
}
$node->save();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.