Unit_metadata_wrapper के साथ फ़ाइल फ़ील्ड का मान कैसे सेट करें


24

जब आप Unit_metadata_wrapper का उपयोग कर एक फ़ाइल फ़ील्ड का मान सेट करते हैं?

मैंने इसे कोड में करने की कोशिश की है:

$file = new stdClass();
$file->uid = 1;
$file->uri = $file_path;
$file->filename = basename($file_path);
$file->filemime = file_get_mimetype($file_path);
$file->filesize = filesize($file_path);
$file->status = FILE_STATUS_PERMANENT;
$file->display = '1';
file_save($file); // I also tried: $file = file_save($file);

$node = array(
  'type' => 'news_item',
  'uid' => 1,
  'status' => 1,
  'comment' => 0,
  'promote' => 0,
  'language' => 'en',
);

$entity = entity_create('node', $node);

$ewrapper = entity_metadata_wrapper('node', $entity);

$ewrapper->field_document->set((array) $file); // I also tried: $ewrapper->field_document->set($file);

$ewrapper->save(true);
entity_save('node', $entity);

लेकिन मुझे यह अपवाद मिलता है:

EntityMetadataWrapperException: Invalid data value given. Be sure it matches the required data type and format. in EntityMetadataWrapper->set() (line 122 of C:\wamp\www\drupal\sites\all\modules\entity\includes\entity.wrapper.inc).

किसी भी मदद की बहुत सराहना की है।

जवाबों:


14

फ़ाइल सरणी को दूसरे सरणी में लपेटने से मेरे लिए चाल प्रतीत होती है:

$file = (array) $file;
$items = array($file);
$ewrapper->field_document->set($items);

लेकिन मुझे अभी तक यह पता नहीं चला है कि ...


यह वास्तव में चाल है। आपकी मदद के लिए बहुत बहुत धन्यवाद, इसकी सराहना करते हैं!
स्मॉस

5
मेरा मानना ​​है कि इसका क्षेत्र के डेल्टा सूचकांक के साथ कुछ करना है। यदि आप अपने क्षेत्र (यानी $ ewrapper-> field_name-> set ();) को एक डेल्टा इंडेक्स असाइन नहीं करते हैं, तो आपको इसके चारों ओर एक और सरणी लपेटनी होगी। यदि आप अपने क्षेत्र (यानी $ ewrapper-> फ़ील्ड_नाम [0] - सेट - ();) के लिए एक डेल्टा इंडेक्स असाइन करते हैं, तो आप बस $ फ़ाइल = (सरणी) $ फ़ाइल का उपयोग कर सकते हैं।
Smos

हाँ इस संदर्भ का एक बहुत बनाता है, निम्नलिखित के लिए धन्यवाद
क्लाइव

19

वैसे मुझे सिर्फ इमेज सेट करने का सरल और कम बदसूरत तरीका पता चला ।

$image_file = A FILE OBJECT; //Lot of choices here : new stdClass(), file_load, etc
$wrapper->FIELD_NAME->file->set($image_file);

बस वर्गीकरण या नोड / इकाई संदर्भ के रूप में, फ़ाइल फ़ील्ड नाम बिंदु किसी लोड की गई वस्तु पर, मुझे पता चलता है कि कैसे।


:: एक पश्चाताप संपादित करें ::

यहाँ मैं इसे ओपी प्रश्न के साथ कैसे करूंगा।

// Get the file
$file = file_save_data(file_get_contents('/my_local_path/img1.jpg'), 'public://remote_name.jpg');

// Wrap' it like one of your French girls
$wrapper = entity_metadata_wrapper('node', $node);

// And set the photo
$wrapper->field_photo->file->set($file);

// And save the node
$wrapper->save();

घातक त्रुटि: अशक्त पर एक सदस्य फ़ंक्शन सेट () पर कॉल करें ... मैं कुछ पाठ फ़ील्ड जोड़ने में सक्षम हूं, लेकिन एक फ़ाइल जोड़ने से काम नहीं होता
पैट्रिकएस

@PatrickS क्या आप सुनिश्चित हैं कि आपने फ़ाइल ऑब्जेक्ट बनाया है? यहां तक ​​कि क्लाइव से विधि काम नहीं आई?
जुडेप्रिएस्ट

मैं ड्रूमल में कुछ जूमला सामग्री को स्थानांतरित करने का प्रयास कर रहा हूं। पहली बार जब मैं फ़ाइलों को स्थानांतरित करता हूं, तो यह काम करता है। यदि मैं सभी उत्पाद मिटा देता हूं और किसी अन्य माइग्रेशन का प्रयास करता हूं, तो यह अब काम नहीं करता है। मुझे काम करने का एकमात्र तरीका एक ताजा स्थापित से है। मैंने एक JSON फ़ाइल में जूमला डेटा संग्रहीत किया है, जिसका उपयोग मैं संस्थाओं को बनाने के लिए करता हूं। जिस समय मैंने टिप्पणी छोड़ी, मुझे अभी तक यह महसूस नहीं हुआ था कि केवल पहला आयात काम कर रहा था और मैं सभी प्रकार की विधियों को बनाने की कोशिश कर रहा था। मुझे पता नहीं था कि क्या चल रहा था क्योंकि मैं छवियों को छोड़कर, सभी क्षेत्रों को बनाने में सक्षम था!
पैट्रिक

1
new stdClass()टिप्पणी मुझे एक छोटे से गुमराह, यह मानते हुए मैं सीधे एक क्षेत्र के लिए नई बनाई गई फ़ाइल वस्तु आवंटित कर सकते हैं। इसका उपयोग करते समय, सुनिश्चित करें कि फ़ाइल में एक फ़िड असाइन किया गया है (यानी इसे कम से कम एक बार सहेजा गया है), अन्यथा यह काम नहीं करेगा।
नियोग 734

आप इसे कई फ़ाइल फ़ील्ड के लिए कैसे लागू करेंगे? मुझे लगता है कि यह कुछ ऐसा होना चाहिए $wrapper->field_photo[]->file->set($file)लेकिन मुझे यकीन नहीं है। क्या आपने कभी इस स्थिति का सामना किया है?
मिकेल कोर्रिया कैसाब्लांका

5

मेरा नोड पहले से मौजूद था और मुझे निम्नलिखित पैरामीटर सेट करने थे:

$wrapper->field_pdf->set(array('fid'=>$fid, 'display'=>1, 'description'=>'This is a PDF'));

अलग-अलग सेट-अप के लिए अलग-अलग मापदंडों की आवश्यकता हो सकती है जो मुझे लगता है। यदि आप अपनी त्रुटि लॉग (व्यवस्थापक / रिपोर्ट / dblog) में देखते हैं तो आप देख सकते हैं कि मापदंडों की क्या आवश्यकता है।


1
इसने मेरे लिए काम किया। मैं फ़ाइल क्षेत्र कोई समस्या नहीं जोड़ सकता है, लेकिन यह नहीं दिखाया जाएगा के रूप में displayथा 0किसी कारण से।
14:00

0

बस किसी के मामले में यह मददगार होगा:

यदि आपके पास वास्तविक फ़ाइल हैंडल नहीं है और केवल आपको पता है कि fidआप इसका उपयोग कर सकते हैं:

$wrapper->field_file->set( array( 'fid'=>1234 ) );

और (उस फ़ाइल को उस fid के साथ मौजूद मानकर) ड्रुपल सही फ़ाइल को संलग्न करेगा $wrapper->save()


0

आपके पास इसे करने के दो तरीके हैं:

// By loading the file object in any way
$file_obj = file_load($fid);
$w_containing_node->field_attachment_content->file->set( $file_obj );


// By passing an array with the fid
$w_containing_node->field_attachment_content->set( array('fid' => $fid) );

यहाँ जानकारी का स्रोत है: https://www.drupal.org/docs/7/api/entity-api/entity-metadata-wrappers#example-value-set-save

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.