কীভাবে প্রোগ্রামে কোনও নোডের সদৃশ করবেন?


11

আমি প্রাপক হিসাবে একটি নতুন ইমেল ঠিকানা দিয়ে আমি তৈরি একটি ওয়েবফর্মটির একটি অনুলিপি তৈরি করতে চাইছি।

আমি নোড_লোড দিয়ে নোড লোড করার পরে, আমি কি কেবল নোড_সেভ দিয়ে এটি সংরক্ষণ করতে পারি? এটি কি নতুন টাইমস্ট্যাম্প এবং আইডি সহ একটি নতুন নোড তৈরি করবে?

নতুন নোডের যে নিড তৈরি হয়েছে তা আমি কীভাবে পেতে পারি?

উত্তর:


17

সবেমাত্র নোড আইডিটি আনসেট করুন unset($node->nid), এবং নোড_সেভ () একটি নতুন নোড তৈরি করবে।

কার্যকর করা কোডটি node_save()নিম্নলিখিতটি হ'ল:

// Insert a new node.
$node->is_new = empty($node->nid);
// ...
if ($node->is_new) {
  _node_save_revision($node, $user->uid);
  drupal_write_record('node', $node);
  db_query('UPDATE {node_revisions} SET nid = %d WHERE vid = %d', $node->nid, $node->vid);
  $op = 'insert';
}    

দ্রুপাল_রাইট_রেকার্ডের শেষ যুক্তিটি পাস করা হয়নি; এর অর্থ এই ফাংশনটি কোনও বিদ্যমান ডাটাবেস সারি আপডেট করবে না।

একবার নোড বস্তুর সঙ্গে সংরক্ষণ করা হয়েছে node_save(), $node->nidনব নির্মিত ডাটাবেসের সারিতে নোড আইডি রয়েছে।


নোডের ওয়েবফর্ম অবজেক্টটিতে তার অ্যারেগুলিতে অনেকগুলি নিড কী রয়েছে যা পুরাতন শূন্যস্থান ধারণ করে, তাদের সম্পর্কে আমার কী করা উচিত?
অ্যারসবোরো

ড্রুপাল শুধু চেক $node->nid। যদি সেই নোড আইডিগুলির কোনওটিই লোড নোডের আইডি না হয়, যা সেভ নোডের আইডি দিয়ে পরিবর্তন করা দরকার, তবে আপনি সেই নোড আইডিগুলি সেভাবেই রেখে যেতে পারেন।
কিমলালুনো

2
আপনি যদি পথের মডিউলটি ব্যবহার করে থাকেন তবে আপনি এটিও করতে চাইতে পারেনunset($node->path);
প্যাট্রিক জেমস ম্যাকডগল

6

আমাকে উত্তর হিসাবে এটি পোস্ট করতে হয়েছিল কারণ আপনার মন্তব্য করার আগে সিস্টেমটির আপনার 50 টি খ্যাতি রয়েছে।

যাইহোক, @ কোইভো এবং তার উত্তরের জবাবে। আমি কেবল আমার জন্য এটি যুক্ত করতে চেয়েছিলাম, সেই কৌশলটিও আনসেট $node->vidনা করে। তাই আমার সেটটি আনসেট করা এবং সংরক্ষণের জন্য

// Load a node
$node = node_load(1);

// unset version and node id's
unset($node->nid);
unset($node->vid);
unset($node->path);

// Save the copy
node_save($node);

2

ডি 7-এ আপনাকে নোড আইডি unset($node->nid)এবং রিভিশন আইডি unset($node->vid)উভয়ই আনসেট করতে হবে । আমি একটি নির্দিষ্ট ধরণের রেড (পণ্য) এর ক্লোন নোডের জন্য একটি ফর্ম তৈরি করি যার একটি নির্দিষ্ট শব্দ রেফারেন্স থাকে (সেই শব্দটির আইডি প্রতিস্থাপনের সাথে)। এখানে চূড়ান্ত জমা দিন:

function MYMODULE_form_submit($form, &$form_state) {
    $old_tid = $form_state['values']['old_tid'];
    $new_tid = $form_state['values']['new_tid'];

    $query = new EntityFieldQuery();
    $result = $query
    ->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'product')
    ->fieldCondition('field_some_term_reference', 'tid', $old_tid)
    ->execute();

    foreach ($result['node'] as $product) {
        $node = node_load($product->nid);
        $node->field_some_term_reference[LANGUAGE_NONE][0]['tid'] = $new_tid;
        unset($node->nid);
        unset($node->vid);
        node_save($node);
    }   
}

আপনি টাইমস্ট্যাম্প resave করার আন্ড বিবেচনা করতে পারেন $node->uidহিসাবে ভাল।


যদি আসল নোডে কোনও স্বত্ত্বের ক্ষেত্র থাকে তবে এটি ক্লোনড নোডের উপর তার মান ধরে রাখছে না এবং নোডের ধরণ নির্দিষ্ট না করার জন্য সত্তাটিফর্মডেক্সেপশনও উত্থাপিত হবে। আমি ডি 7 তে পরীক্ষা করছি। কোন সুত্র?
কিরণিং

2

প্রতিলিপি মডিউল চেষ্টা করুন ।
আমি সম্প্রতি একটি সাইটে খুব সহজেই ক্লোন করা এবং জিনিসগুলি পরিবর্তন করেছিলাম এবং এই মডিউলটি ভালভাবে কাজ করে দেখেছে।
পরীক্ষা করে দেখুন replicate.api.php ফাইল দেখুন কতো সহজে এটি ব্যবহার করতে হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.