2016-09-30 15 views
0

受注テーブルに「キャリア」列を追加しようとしています。私はAdminOrdersController.phpのfields_list配列にそのフィールドを追加する必要があることを知っていますが、フィールドに配列を展開すると、carrier私はBOにunknown column 'carrier'エラーがあります。私が間違っていることは何ですか?Prestashopバックオフィスの受注テーブルにキャリア列を追加

答えて

2

マルケスとしての遅れはあなたにそれを行う方法を教えてくれます。私はこのオーバーライドをテストしました。

override/controllers/adminで次のコードを使用して新しいファイルAdminOrdersController.phpを作成します。

<?php 

class AdminOrdersController extends AdminOrdersControllerCore 
{ 
    public function __construct() 
    { 
     $this->bootstrap = true; 
     $this->table = 'order'; 
     $this->className = 'Order'; 
     $this->lang = false; 
     $this->addRowAction('view'); 
     $this->explicitSelect = true; 
     $this->allow_export = true; 
     $this->deleted = false; 
     $this->context = Context::getContext(); 

     $this->_select = ' 
     a.id_currency, 
     a.id_order AS id_pdf, 
     CONCAT(LEFT(c.`firstname`, 1), \'. \', c.`lastname`) AS `customer`, 
     osl.`name` AS `osname`, 
     IF(carrier.`name` = "0", "-", carrier.`name`) AS `carriername`, 
     os.`color`, 
     IF((SELECT so.id_order FROM `'._DB_PREFIX_.'orders` so WHERE so.id_customer = a.id_customer AND so.id_order < a.id_order LIMIT 1) > 0, 0, 1) as new, 
     country_lang.name as cname, 
     IF(a.valid, 1, 0) badge_success'; 

     $this->_join = ' 
     LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = a.`id_customer`) 
     LEFT JOIN `'._DB_PREFIX_.'address` address ON address.id_address = a.id_address_delivery 
     LEFT JOIN `'._DB_PREFIX_.'country` country ON address.id_country = country.id_country 
     LEFT JOIN `'._DB_PREFIX_.'country_lang` country_lang ON (country.`id_country` = country_lang.`id_country` AND country_lang.`id_lang` = '.(int)$this->context->language->id.') 
     LEFT JOIN `'._DB_PREFIX_.'carrier` carrier ON a.id_carrier = carrier.id_carrier 
     LEFT JOIN `'._DB_PREFIX_.'order_state` os ON (os.`id_order_state` = a.`current_state`) 
     LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = '.(int)$this->context->language->id.')'; 
     $this->_orderBy = 'id_order'; 
     $this->_orderWay = 'DESC'; 
     $this->_use_found_rows = true; 

     $statuses = OrderState::getOrderStates((int)$this->context->language->id); 
     foreach ($statuses as $status) { 
      $this->statuses_array[$status['id_order_state']] = $status['name']; 
     } 

     $this->fields_list = array(
      'id_order' => array(
       'title' => $this->l('ID'), 
       'align' => 'text-center', 
       'class' => 'fixed-width-xs' 
      ), 
      'reference' => array(
       'title' => $this->l('Reference') 
      ), 
      'new' => array(
       'title' => $this->l('New client'), 
       'align' => 'text-center', 
       'type' => 'bool', 
       'tmpTableFilter' => true, 
       'orderby' => false, 
       'callback' => 'printNewCustomer' 
      ), 
      'customer' => array(
       'title' => $this->l('Customer'), 
       'havingFilter' => true, 
      ), 
     ); 

     if (Configuration::get('PS_B2B_ENABLE')) { 
      $this->fields_list = array_merge($this->fields_list, array(
       'company' => array(
        'title' => $this->l('Company'), 
        'filter_key' => 'c!company' 
       ), 
      )); 
     } 

     $this->fields_list = array_merge($this->fields_list, array(
      'total_paid_tax_incl' => array(
       'title' => $this->l('Total'), 
       'align' => 'text-right', 
       'type' => 'price', 
       'currency' => true, 
       'callback' => 'setOrderCurrency', 
       'badge_success' => true 
      ), 
      'payment' => array(
       'title' => $this->l('Payment') 
      ), 
      'carriername' => array(
       'title' => $this->l('Carrier'), 
       'type' => 'text', 
       'align' => 'text-center', 
       'class' => 'fixed-width-xl', 
       'filter_key' => 'carrier!name', 
       'filter_type' => 'text', 
       'order_key' => 'carrier!name' 
      ), 
      'osname' => array(
       'title' => $this->l('Status'), 
       'type' => 'select', 
       'color' => 'color', 
       'list' => $this->statuses_array, 
       'filter_key' => 'os!id_order_state', 
       'filter_type' => 'int', 
       'order_key' => 'osname' 
      ), 
      'date_add' => array(
       'title' => $this->l('Date'), 
       'align' => 'text-right', 
       'type' => 'datetime', 
       'filter_key' => 'a!date_add' 
      ), 
      'id_pdf' => array(
       'title' => $this->l('PDF'), 
       'align' => 'text-center', 
       'callback' => 'printPDFIcons', 
       'orderby' => false, 
       'search' => false, 
       'remove_onclick' => true 
      ) 
     )); 

     if (Country::isCurrentlyUsed('country', true)) { 
      $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' 
      SELECT DISTINCT c.id_country, cl.`name` 
      FROM `'._DB_PREFIX_.'orders` o 
      '.Shop::addSqlAssociation('orders', 'o').' 
      INNER JOIN `'._DB_PREFIX_.'address` a ON a.id_address = o.id_address_delivery 
      INNER JOIN `'._DB_PREFIX_.'country` c ON a.id_country = c.id_country 
      INNER JOIN `'._DB_PREFIX_.'country_lang` cl ON (c.`id_country` = cl.`id_country` AND cl.`id_lang` = '.(int)$this->context->language->id.') 
      ORDER BY cl.name ASC'); 

      $country_array = array(); 
      foreach ($result as $row) { 
       $country_array[$row['id_country']] = $row['name']; 
      } 

      $part1 = array_slice($this->fields_list, 0, 3); 
      $part2 = array_slice($this->fields_list, 3); 
      $part1['cname'] = array(
       'title' => $this->l('Delivery'), 
       'type' => 'select', 
       'list' => $country_array, 
       'filter_key' => 'country!id_country', 
       'filter_type' => 'int', 
       'order_key' => 'cname' 
      ); 
      $this->fields_list = array_merge($part1, $part2); 
     } 

     $this->shopLinkType = 'shop'; 
     $this->shopShareDatas = Shop::SHARE_ORDER; 

     if (Tools::isSubmit('id_order')) { 
      // Save context (in order to apply cart rule) 
      $order = new Order((int)Tools::getValue('id_order')); 
      $this->context->cart = new Cart($order->id_cart); 
      $this->context->customer = new Customer($order->id_customer); 
     } 

     $this->bulk_actions = array(
      'updateOrderStatus' => array('text' => $this->l('Change Order Status'), 'icon' => 'icon-refresh') 
     ); 

     AdminController::__construct(); 
    } 

} 
マルクスのexplanantionように同じ

、私はjoinnedいるcarrierテーブルをクエリに追加した名前を選択します(表示するように設定されている - ノーキャリアの場合)と表示されましたそれはfield_listのフィルタとオーダーを使用しています。 このオーバーライドではparent::__construct();ではなく、AdminController::__construct();に電話する必要はありません。 必要に応じてPrestaShopキャッシュもクリアしてください。

2

キャリアを表示するには、$ this - > _ select、$ this - > _ joinおよび$ this-> field_list変数を編集する必要があります。

$この - > _参加するには、次に、選択して使用すると、カーテーブルを持っているので、あなたがキャリアを取得するには

carr.name as `carriername` 

を使用することができ、次の

LEFT JOIN `'._DB_PREFIX_.'order_carrier` oc ON (a.`id_order` = oc.`id_order`) 
LEFT JOIN `'._DB_PREFIX_.'carrier` carr ON (oc.`id_carrier` = carr.`id_carrier`) 

が含まれている必要があります。その後、フィールドがリストにあなたが最初の2つの項目は、有効なSQLでなければならないこと

'carriername' => array(
    'title' => $this->l('Carrier') 
), 

実行(Do)の心のようなものを使用する必要がありますので、(あなたは、コードを追加した場所に応じて)適切な場所にスペースやカンマを使用します。また、この機能のオーバーライドを使用する必要があるため、Prestashopアップデートを入手することもできます(http://doc.prestashop.com/display/PS16/Overriding+default+behaviors#Overridingdefaultbehaviors-Overridingacontroller参照)。

関連する問題