2017-11-24 9 views
1

AdminOrderController.php에서 재정의를 만들었습니다. {$ followup} 및 {$ code_traking} 변수를 사용하고 Shipped.html에 배치했습니다.Prestashop 1.6.1.14 - 발송 된 이메일 세트에서 대체되지 않는 변수

불행히도, 단일 주문 상태가 변경되는 이유는 불행히도 당황 스럽습니다. 대량으로 업데이트하려고 시도했을 때 {$ followup} 및 {$ code_traking}이 (가) 이메일로 대체되지 않습니다.

{$ firstname}, {$ lastname} 및 {$ id_order}이 (가) 기준에 따라 이메일에 생성됩니다.

아래 코드가 있습니다.

 } elseif (Tools::isSubmit('sendStateEmail') && Tools::getValue('sendStateEmail') > 0 && Tools::getValue('id_order') > 0) { 
     if ($this->tabAccess['edit'] === '1') { 
      $order_state = new OrderState((int)Tools::getValue('sendStateEmail')); 

      if (!Validate::isLoadedObject($order_state)) { 
       $this->errors[] = Tools::displayError('An error occurred while loading order status.'); 
      } else { 
       $history = new OrderHistory((int)Tools::getValue('id_order_history')); 

       $carrier = new Carrier($order->id_carrier, $order->id_lang); 
       $templateVars = array(); 
       $templateVars = array(
        '{followup}' => str_replace('@', $order->shipping_number, $carrier->url), 
        '{url_traking}' => $carrier->url, 
        '{shipping_number}' => $order->shipping_number, 
        '{code_traking}' => $order->shipping_number 
       ); 

       if ($history->sendEmail($order, $templateVars)) { 
        Tools::redirectAdmin(self::$currentIndex.'&id_order='.$order->id.'&vieworder&conf=10&token='.$this->token); 
       } else { 
        $this->errors[] = Tools::displayError('An error occurred while sending the e-mail to the customer.'); 
       } 
      } 
     } else { 
      $this->errors[] = Tools::displayError('You do not have permission to edit this.'); 
     } 

오버라이드에 다음 코드를 추가하려고했지만 여전히 표시되지 않습니다. 나는 캐시를 지웠다.

 public function processBulkUpdateOrderStatus() 
{ 
    if (Tools::isSubmit('submitUpdateOrderStatus') 
     && ($id_order_state = (int)Tools::getValue('id_order_state'))) { 
     if ($this->tabAccess['edit'] !== '1') { 
      $this->errors[] = Tools::displayError('You do not have permission to edit this.'); 
     } else { 
      $order_state = new OrderState($id_order_state); 

      if (!Validate::isLoadedObject($order_state)) { 
       $this->errors[] = sprintf(Tools::displayError('Order status #%d cannot be loaded'), $id_order_state); 
      } else { 
       foreach (Tools::getValue('orderBox') as $id_order) { 
        $order = new Order((int)$id_order); 
        if (!Validate::isLoadedObject($order)) { 
         $this->errors[] = sprintf(Tools::displayError('Order #%d cannot be loaded'), $id_order); 
        } else { 
         $current_order_state = $order->getCurrentOrderState(); 
         if ($current_order_state->id == $order_state->id) { 
          $this->errors[] = $this->displayWarning(sprintf('Order #%d has already been assigned this status.', $id_order)); 
         } else { 
          $history = new OrderHistory(); 
          $history->id_order = $order->id; 
          $history->id_employee = (int)$this->context->employee->id; 

          $use_existings_payment = !$order->hasInvoice(); 
          $history->changeIdOrderState((int)$order_state->id, $order, $use_existings_payment); 

          $carrier = new Carrier($order->id_carrier, $order->id_lang); 
          $templateVars = array(); 
          if ($history->id_order_state == Configuration::get('PS_OS_SHIPPING') && $order->shipping_number) { 
           //$templateVars = array('{followup}' => str_replace('@', $order->shipping_number, $carrier->url)); 
           $templateVars = array(
           '{followup}' => str_replace('@', $order->shipping_number, $carrier->url), 
           '{url_traking}' => $carrier->url, 
           '{shipping_number}' => $order->shipping_number, 
           '{code_traking}' => $order->shipping_number 
          ); 
          } 

          if ($history->addWithemail(true, $templateVars)) { 
           if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT')) { 
            foreach ($order->getProducts() as $product) { 
             if (StockAvailable::dependsOnStock($product['product_id'])) { 
              StockAvailable::synchronize($product['product_id'], (int)$product['id_shop']); 
             } 
            } 
           } 
          } else { 
           $this->errors[] = sprintf(Tools::displayError('Cannot change status for order #%d.'), $id_order); 
          } 
         } 
        } 
       } 
      } 
     } 
     if (!count($this->errors)) { 
      Tools::redirectAdmin(self::$currentIndex.'&conf=4&token='.$this->token); 
     } 
    } 
} 

public function renderList() 
{ 
    if (Tools::isSubmit('submitBulkupdateOrderStatus'.$this->table)) { 
     if (Tools::getIsset('cancel')) { 
      Tools::redirectAdmin(self::$currentIndex.'&token='.$this->token); 
     } 

     $this->tpl_list_vars['updateOrderStatus_mode'] = true; 
     $this->tpl_list_vars['order_statuses'] = $this->statuses_array; 
     $this->tpl_list_vars['REQUEST_URI'] = $_SERVER['REQUEST_URI']; 
     $this->tpl_list_vars['POST'] = $_POST; 
    } 

    return parent::renderList(); 
} 

대량 주문 상태 변경을 위해이 기능을 사용하려면 편집해야 할 다른 영역이 있습니까? 나는 그것이 끝내서 모든 주문을 하나씩 업데이트하는 것이 가능하지 않다는 것을 깨닫지 못한다. 시간이 너무 오래 걸린다. :(

감사합니다.

+0

이메일 템플릿도 게시하십시오. 재정의를 추가 한 후 cache/class_index.php 파일을 삭제 했습니까? 아니면 모듈 설치에 재정의를 설치 했습니까? – sadlyblue

+0

class_index.php를 삭제했지만 여전히 변수가 대량 주문 상태 변경으로 표시되지 않습니다. – Enthu

답변

1

당신은.뿐만 아니라 processBulkUpdateOrderStatus() 메소드를 오버라이드 (override) 할

있을 것이다 그러나 당신은 모듈과 적절한 훅을 사용하는 경우 actionGetExtraMailTemplateVars 이러한 문제가없는 것입니다 그리고 당신은 않을 것 재정의를 필요

모듈 훅이 같은 것입니다 :..

public function hookActionGetExtraMailTemplateVars($params) 
{ 
    // Don't do anything if email template is not for shipped status 
    if ($params['template'] != 'shipped') { 
     return null; 
    } 

    // Read order ID from template vars that was set by OrderHistory class 
    $orderID = $params['template_vars']['{id_order}']; 
    $order = new Order((int)$orderID); 
    $carrier = new Carrier($order->id_carrier, $order->id_lang); 

    /* 
     Merge extra_template_vars because some other modules might already set 
     their custom email variables otherwise they would be lost if you just set 
     it with your own data 
    */ 
    $params['extra_template_vars'] = array_merge(
       $params['extra_template_vars'], 
       array(
        '{followup}' => str_replace('@', $order->shipping_number, $carrier->url), 
        '{url_traking}' => $carrier->url, 
        '{shipping_number}' => $order->shipping_number, 
        '{code_traking}' => $order->shipping_number 
       )); 
} 
+0

나는 오버라이드를 시도했지만 여전히 2 개의 변수를 보여주지 못하고있다. 하지만 내가 재정의하지 않았을지라도 기본값은 processBulkUpdateOrderStatus()에 할당 된대로 {followup} 값을 표시 할 것입니다. 맞습니까? (Line 411) – Enthu

+0

@MuhammadFakhrinBinUmar 값이 표시됩니다. 오버라이드 된 메소드가 전혀 실행되지 않습니까? 그 안의 어딘가에서 죽는 것을 시도해보십시오. 그렇지 않으면'cache/class_index.php'를 삭제해야 할 수도 있습니다. – TheDrot

0

가 해결

솔루션에 대한 안내를 보여주는 @TheDrot에 감사드립니다. AdminOrdersController.php를 재정의하는 것이 중요합니다. 우리는 processBulkOrderStatus()를 포함 할 필요가 있으며 다음 코드를 제거하여 대량 변수 순서를 추가 변수로 적절하게 변경합니다. 아래 조건을 제거하지 않으면 아무 쓸모가 없습니다.

//remove the condition below 
if ($history->id_order_state == Configuration::get('PS_OS_SHIPPING') && 
$order->shipping_number) { 
//leave the rest of the codes intact 
} 

감사합니다.