2012-09-19 2 views
0

PHP에서 JavaScript를 처리하려고 할 때 특정 참조 유형의 노드를 다른 참조로 이동하려고합니다. 나는 각 페이지 내부 PAGES
되는 프로젝트 각 프로젝트 내부
이 콜 아웃
을 각 콜 아웃 내부 제품이노드에서 노드 참조를 제거하는 Drupal

이는 구조입니다.

하나의 CALLOUT에서 다른 CALLOUT으로 제품을 가져오고 싶습니다. 나는 이것들을 병합 할 수 있지만, 지금 내가하고 싶은 것은 첫번째 인스턴스를 삭제하는 것이다. 예 :

나는 내가 병합 할 제품을 얻을 수 PAGE 6 선 B.

하여 해당 제품을 병합하고 PAGE 6 콜 아웃 A.에있는 제품 AAG-794200을 가지고 있지만 지금은에서 제거 할 필요 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

실제로이 문제를 직접 해결할 수있었습니다. @ 크리스 - 중괄호가 끝난 후 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 Community를 가져 주셔서 감사합니다.

관련 문제