2012-09-19 177 views
0

好吧,试图处理脚本,PHP和JavaScript,我将一个特定的内容类型NODE从一个引用移动到另一个脚本。这是结构:Drupal从节点删除节点引用

我有一个项目
每个项目中都PAGES
每个页面中都标注
每个呼出里面是产品。

我想要做的是从一个CALLOUT到另一个CALLOUT。我能够合并这些,但现在我想要做的是删除第一个实例。举个例子:

我有产品AAG-794200是在第6页呼出A.我的合并,第6页呼出B.

该产品,我可以得到的产品进行合并,但现在我需要从删除CALLOUT A.这是我的代码:

$merge = explode(',', $merge); //Merge SKUs 
$mpages = explode(',', $mpages); //Merge Pages 
$mcallouts = explode(',', $mcallouts); //Merge Callouts 
$mcallout_nid = explode(',', $mcallout_nid); //Merge Current callout 

$length = count($merge); 
$e = 0; 
while ($e < $length) { 
    //Where is the SKU going to? 
    $to_callout_letter = strtoupper($mcallouts[$e]); 
    $to_page_num = $mpages[$e]; 
    $sku = $merge[$e]; 
    $from_callout = $mcallout_nid[$e]; 

    //Where is the SKU coming from?  
    $other_callout = node_load($from_callout); 

    //Need page ID of current callout for project purposes 
    $page_nid = $other_callout->field_page[0]['nid']; 
    $page = node_load($page_nid); 
    //Need the project NID 
    $project_nid = $page->field_project[0]['nid']; 

    //We need to get the NID of the page we are going to 
    $page_nid = db_query('SELECT * FROM content_type_page WHERE field_page_order_value = "%d" and field_project_nid = "%d" ORDER BY vid DESC LIMIT 1', $to_page_num, $project_nid); 

    $page_nid_res = db_fetch_array($page_nid); 
    $to_page_nid = $page_nid_res['nid']; 

    //We need to get the NID of the callout here 
    $co_nid = db_query('SELECT * FROM content_type_callout WHERE field_identifier_value = "%s" and field_page_nid = "%d"', $to_callout_letter, $to_page_nid); 
    $co_nid_res = db_fetch_array($co_nid); 
    $to_callout_letter_nid = $co_nid_res['nid']; 


    //Load the present callout the SKU resides on 
    $f_callout = node_load($from_callout); 

    $callout = node_load($to_callout_letter_nid); 
    $long = count($f_callout->field_skus); 
    $deletecallout = array(); 
    foreach($f_callout->field_skus as $skus) { 
     $s = 0; 
     while ($s < $long) { 
      if($skus['nid'] == $sku) { 
       $callout->field_skus[] = $skus; 
       $s++; 
      } 
      else { 
       $deletecallout[] = $skus; 
       $s++; 
      } 
     } 
    } 


    foreach($other_callout->field_images as $old_image) { 
     $callout->field_images[] = $old_image; 
    } 
    foreach($other_callout->field_line_art as $old_image) { 
     $callout->field_line_art[] = $old_image; 
    } 
    foreach($other_callout->field_swatches as $old_image) { 
     $callout->field_swatches[] = $old_image; 
    } 

    $callout->field_copy_text[0]['value'] .= $other_callout->field_copy_text[0]['value']; 
    $callout->field_notes[0]['value'] .= $other_callout->field_notes[0]['value']; 
    $callout->field_image_notes[0]['value'] .= $other_callout->field_image_notes[0]['value']; 
    $callout->field_status[0]['value'] = 'In Process'; 
    node_save($callout); 

这会导致产品合并,但不会删除原件。

感谢您的任何帮助。我知道这很简单,这将是一个手掌对面的时刻。

+0

您的代码段不够长,无法理解正在发生的事情。那里有变数,没有任何解释。请提供更多信息。 – kekkis

+0

@kekkis - 已发布全部功能。 – webdevsoup

+0

它看起来像你在foreach循环中填充一个$ deletecallout数组,但随后没有做任何事情。那是缺少的吗?而你的代码仍然不完整。 while($ e <$ length)循环的结束括号在哪里? –

回答

0

我实际上能够自己解决这个问题。 @Chris - 大括号在node_save(callout);后结束,我一定错过了,当我复制和粘贴。然而,这里是我最后使用的代码:

$merge = explode(',', $merge); //Merge SKUs 
$mpages = explode(',', $mpages); //Merge Pages 
$mcallouts = explode(',', $mcallouts); //Merge Callouts 
$mcallout_nid = explode(',', $mcallout_nid); //Merge Current callout 
if($merge[0] !== '0') { 
    //Store NIDs of Old Callouts to the proper SKU 
    $oc_sku = array(); 
    $oc_sku_e = count($merge); 
    $oc_sku_ee = 0; 
    while ($oc_sku_ee < $oc_sku_e) { 
     $curr_sku = $merge[$oc_sku_ee]; 
     $curr_oldco = $mcallout_nid[$oc_sku_ee]; 
     $oc_sku[$curr_sku] = $curr_oldco; 
     $oc_sku_ee++; 
    } 

    //Convert page numbers to page_nids 
    $pc = count($mpages); //How many pages are we getting 
    $pc_e = 0; 
    while($pc_e < $pc) { 
     $nid = $mpages[$pc_e]; 
     $sql = db_query('SELECT * FROM content_type_page WHERE field_page_order_value = "%d" AND field_project_nid = "%d" ORDER BY vid DESC LIMIT 1', $nid, $project_nid); 
     $res = db_fetch_array($sql); 
     if($res) { 
      $npage_arr[] = $res['nid']; 
     } else { //If there is no page, we need to create it here. 
      $node = new StdClass(); 
      $node->type = 'page'; 
      $node->title = 'Page ' . $nid . ' of ' . $project->title; 
      $node->field_project[0]['nid'] = $project_nid; 
      $node->field_page_order[0]['value'] = $nid; 
      $node = node_submit($node); 
      node_save($node); 
      $npage_arr[] = $node->nid; 
     } 
    $pc_e++; 
    } 


    // Convert callout letters to callout_nids 
    $coc = count($mcallouts); 
    $coc_e = 0; 
    while($coc_e < $coc) { 
     $cnid = strtoupper($mcallouts[$coc_e]); 
     $pnid = $npage_arr[$coc_e]; 
     $page_node = node_load($pnid); 
     $sql = db_query('SELECT * FROM content_type_callout WHERE field_identifier_value = "%s" AND field_page_nid = "%d" ORDER BY vid DESC LIMIT 1', $cnid, $pnid); 
     $res = db_fetch_array($sql); 
     if($res) { 
      $cpage_arr[] = $res['nid']; 
     } else { //If there is no callout that exists, we need to make it here. 
      $callout_node = new stdClass(); 
      $callout_node->type = 'callout'; 
      $callout_node->field_page[0]['nid'] = $pnid; 
      $callout_node->field_identifier[0]['value'] = $cnid; 
      $callout_node->field_sequence[0]['value'] = 0; 
      $callout_node->title = "Callout ".$callout." on page ".$page_node->field_page_order[0]['value']; 
      $callout_node->field_project[0]['nid'] = $project->nid; 
      $callout_node->field_wholesaler[0]['value'] = $project->field_wholesaler[0]['value']; 
      $callout_node->field_skus = array(); 

      $callout_node->status = 1; 
      $callout_node->uid = 1;    
      $callout_node->revision = true; 
      $callout_node = node_submit($callout_node); 
      node_save($callout_node); 
      $cpage_arr[] = $callout_node->nid; 
     } 
    $coc_e++; 
    } 

    //Now we need to assign the skus to the appropriate callout for processing 
    $coc2 = count($cpage_arr); 
    $coc_e2 = 0; 
    while($coc_e2 < $coc2) { 
     $co = $cpage_arr[$coc_e2]; 
     if($co !== '0') { 
      $sku = $merge[$coc_e2]; 
      $m_arr[$co][] = $sku; 
     } 
    $coc_e2++; 
    } 

    //we need a way to centrally store all NID's of SKUs to the callouts they belong to 
    $oc_arr = array(); 
    $oc = count($mcallout_nid); 
    $oc_e = 0; 
    while($oc_e < $oc) { 
     $f_callout = $mcallout_nid[$oc_e]; 
     $former_callout = node_load($f_callout); 
     foreach($former_callout->field_skus as $key=>$skus) { 
      $oc_arr[] = $skus; 
     } 
     $oc_e++; 
    } 

    //Now we are processing the Pages/Callouts/SKUs to save 
    $pc_e2 = 0; 
    foreach($m_arr as $key=>$values) { 
     $callout = node_load($key); 
     foreach($values as $value) { 
      $oc = count($oc_arr); 
      $oc_e = 0; 
      while($oc_e < $oc) { 
       $skus = $oc_arr[$oc_e]; 
       if($value == $skus['nid']) { 
        $callout->field_skus[] = $skus; 
        //$nid = $oc_sku[$value]; 
        $old_callout_info[] = $oc_sku[$value]; 
        $oc_e = $oc; 
       } 
       else { 
        $oc_e++; 
       } 
      } 
     } 

     foreach($old_callout_info as $nid) { 
/*   $nid = $oc_sku[$value]; */ 
      $former_callout = node_load($nid); 
      foreach($former_callout->field_images as $old_image) { 
      $callout->field_images[] = $old_image; 
      } 
      foreach($former_callout->field_line_art as $old_image) { 
       $callout->field_line_art[] = $old_image; 
      } 
      foreach($former_callout->field_swatches as $old_image) { 
       $callout->field_swatches[] = $old_image; 
      } 
      $callout->field_copy_text[0]['value'] .= $former_callout->field_copy_text[0]['value']; 
     } 
     $callout->field_notes[0]['value'] .= $former_callout->field_notes[0]['value']; 
     $callout->field_image_notes[0]['value'] .= $former_callout->field_image_notes[0]['value']; 
     $callout->field_logos = $former_callout->field_logos; 
     $callout->field_affiliations = $former_callout->field_affiliations; 
     $callout->field_graphics = $former_callout->field_graphics; 
     $callout->revision = 1; 



     $callout->field_status[0]['value'] = 'inprocess'; 
     node_save($callout); 
     $pc_e2++; 
    } 
    } 

我知道这也许可以在某种程度上被简化,但就目前而言,这工作完全考虑到我想要做的事。到目前为止,没有客户投诉。感谢您看看Drupal社区。