सामग्री प्रकार में एक नया फ़ील्ड जोड़ने के बाद एक डिफ़ॉल्ट फ़ील्ड के साथ सभी नोड्स को अपडेट करें


15

मेरे पास कई नोड्स के साथ एक मौजूदा सामग्री प्रकार है। मैंने अभी "बंद" के डिफ़ॉल्ट मान के साथ एक नया बूलियन फ़ील्ड जोड़ा है।

हालाँकि, जब तक मैं प्रत्येक नोड को फिर से सहेजता हूँ डिफ़ॉल्ट मान सेट नहीं होता है, इसलिए एक दृश्य जिसे केवल उन नोड्स को दिखाना चाहिए जहां नया फ़ील्ड डिफ़ॉल्ट मान का उपयोग कर रहा है वर्तमान में खाली है।

उस फ़ील्ड को उसके डिफ़ॉल्ट मान पर सेट करने के लिए, फ़ील्ड में जोड़े जाने से पहले बनाए गए मौजूदा नोड्स को मैं कैसे अपडेट कर सकता हूं?


: मैं दृश्य संचालन और नियम थोक के रूप में इस शानदार वीडियो में उल्लिखित का उपयोग कर इस समस्या का समाधान commerceguys.com/resources/articles/217
Danh

Resave nodes मॉड्यूल अद्यतन नोड्स को बाध्य करने में आपकी मदद कर सकता है।
सुप्रिया राजगोपाल

जवाबों:


9

अफसोस की बात है, ऐसा करने का कोई बहुत सरल तरीका नहीं है (वीबीओ / नियमों के अलावा), लेकिन यहां कोड मैं अपने कस्टम मॉड्यूल में अपडेट फ़ंक्शन में उपयोग करता हूं जब एक नया फ़ील्ड जोड़ने के बाद मुझे एक निश्चित नोड प्रकार के लिए फ़ील्ड मानों को प्रॉपॉप्युलेट करने की आवश्यकता होती है इस मामले में, 'पृष्ठ' नोड्स):

<?php
// Get all nodes of 'page' type, populate the field with a value of '1'.
$pages = db_query("SELECT nid, vid FROM {node} WHERE type = 'page'")->fetchAllAssoc('nid');
foreach ($pages as $nid => $values) {
  $fields = array(
    'entity_type' => 'node',
    'bundle' => 'page',
    'deleted' => 0,
    'entity_id' => $values->nid,
    'revision_id' => $values->vid,
    'language' => LANGUAGE_NONE,
    'delta' => 0,
    'field_page_new_field_value' => 1,
  );
  db_insert('field_data_field_page_new_field')
    ->fields($fields)
    ->execute();
  db_insert('field_revision_field_page_new_field')
    ->fields($fields)
    ->execute();
}
?>

इस उत्तर में वर्णित एक अन्य मैनुअल विधि EntityFieldQuery का उपयोग करता है और प्रत्येक नोड को लोड / बचाता है। अधिक Drupal- y, लेकिन जिस तरह से कम प्रदर्शन ... (एक पूर्ण नोड लोड और प्रत्येक नोड के लिए ऑपरेशन को बचाने की आवश्यकता है!)।


यह बहुत दुख की बात है
AlxVallejo

क्या आपने फील्ड डिफॉल्ट्स मॉड्यूल देखा है? dgo.to/field_defaults
वन

इकाई लोड कैश से सभी प्रभावित नोड्स को फ्लश किए बिना भी इस तरह कोड चलाना एक बग है: entity_get_controller('node')->resetCache($nids);- अन्यथा बाद में node_load()कैश से बासी डेटा लोड हो सकता है, और node_save()उस ऑब्जेक्ट में से कोई भी उस बासी डेटा को डेटाबेस में वापस लिख देगा ।
फोल्स

2

सर्वश्रेष्ठ शर्त सीधे MySQl में है। तालिकाओं की तरह दिखेगा:

field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname

यदि आप उन्हें देखते हैं तो यह बहुत सीधा है - क्या आपको मेरी ज़रूरत है कि आप इस पर शुरुआत करें कि क्वेरी कैसी दिखेगी या आप यहाँ से ठीक हैं?


धन्यवाद माइक, नहीं, यह एक समस्या नहीं है जो मैं एसक्यूएल को वास्तव में संभाल सकता हूं। मुझे बस ऐसा लगता है कि एक 'री-सेव' विकल्प होना चाहिए या बल्क ऑपरेशन के रूप में कुछ दिया जाना चाहिए, मुझे लगता है कि मैं वास्तव में इसके लिए वीबीओ और नियम एकीकरण को देख सकता हूं।
DanH

समझ लिया। मैं एक समान स्थिति में हूं, मैं एक और सीएमएस से लगभग 30,000 लेखों को Drupal में स्थानांतरित कर रहा हूं। एसक्यूएल जल्दी और गंदे होने पर मुझे एक और मॉड्यूल जोड़ने की बात नहीं दिखी। हो सकता है कि आप एक त्वरित फ़ंक्शन भी लिख सकते हैं जो आपके सभी नोड्स के लिए नोड_लोड () कहेगा, यह भी काम कर सकता है।
माइक

0

बस बोले तर्क की कोशिश करो। बहुत तेजी से और इसके द्वारा सभी हुक कार्यान्वयन भी पास करते हैं। अधिक जानकारी । आप एक सरल प्रत्यक्ष db_select क्वेरी लिख सकते हैं ताकि सभी nid प्राप्त कर सकें और इस नमूना कोड के साथ इसे लूप कर सकें।

$node = new stdClass();
$node->nid = $val;
$node->type = 'NODETYPE';
$node-field_whatever[LANGUAGE_NONE][0]['value'] = 'VALUE';
field_attach_presave('node', $node);
field_attach_update('node', $node);

0

sql का उपयोग करना, यह देखते हुए कि क्षेत्र मान के साथ नोड सेट नहीं हैं

SELECT nid,vid
 from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

field_data_field_pr_choix_du_document मेरे क्षेत्र के अनुरूप तालिका होने के नाते और एंट्री आईडी मान के साथ सेट एक प्रविष्टि बराबर मान वाले नोड को शामिल करें

मैंने SQL इन्सर्ट का उपयोग किया है ... सिंटैक्स का चयन करें

https://dev.mysql.com/doc/refman/5.5/en/insert-select.html

INSERT INTO `field_data_field_pr_choix_du_document` (`entity_type`, `bundle`, `deleted`, `entity_id`, `revision_id`, `language`, `delta`, `field_pr_choix_du_document_value`)
SELECT 'node','procedure',0,nid,vid,'und',0,'Importer un document'
from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

0

इंस्‍टॉल बल्क ऑपरेशंस मॉड्यूल को इंस्‍टॉल करें और सक्षम करें और पेज डिस्प्ले के साथ एक दृश्य बनाएं।

ऐड => बल्क ऑपरेशंस: कंटेंट (कंटेंट) फील्ड को ध्यान में रखते हुए।

देखें

यहाँ छवि विवरण दर्ज करें

डिफ़ॉल्ट मान सेट करने के लिए इच्छित फ़ील्ड का चयन करें।

दृश्य सहेजें, और उसके द्वारा बनाए गए पृष्ठ पर जाएं। यदि आपके पास परिणामों के एक से अधिक पृष्ठ हैं, तो आप वर्तमान पृष्ठ पर सभी आइटम, सभी पृष्ठों पर सभी आइटम का चयन करना चुन सकते हैं, या आप व्यक्तिगत नोड्स के अनुरूप बक्से को मैन्युअल रूप से जांच सकते हैं। आगे बढ़ने के लिए कम से कम एक चेकबॉक्स की जाँच करनी चाहिए।

अब आप डिफ़ॉल्ट मान सेट करें और इसे सहेजें।


0

मुझे इस मॉड्यूल के साथ सामग्री प्रकार में फ़ील्ड (अपडेट) को अपडेट करने का एक आसान तरीका मिला: फील्ड डिफॉल्ट्स

स्क्रीन शॉट देखें। आप मौजूदा सामग्री को डिफ़ॉल्ट मान (अपडेट) के साथ अपडेट कर सकते हैं या मौजूदा मान रख सकते हैं।

मैंने इसे डी 7 पर परीक्षण किया है और यह काम करता है।

यहाँ छवि विवरण दर्ज करें

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