2016-09-16 1 views
0

내가 PrestaShop 버전의 V를 사용하고 고객의 백 오피스에 주소 열을 추가 나는 내 고객 섹션 DNI라는 열을 추가하기 위해 노력하고있어는 PrestaShop 버전

를 얻기 위해 노력하고있어 1.6.1.1

백 오피스에. 내가

내가 AdminCustomersController.php이라고이 작업을 수행 할 파일을 알고이 컨트롤러/관리자에 위치하고 시도 무엇

/AdminCustomersController.php는

또한 내가 알고있는이 쿼리 내가 할 수있는 30

CURR,

SELECT ps_address.dni, ps_customer. * 
FROM ps_customer 
INNER JOIN ps_address ON ps_customer.id_customer = ps_address.id_customer 

LIMIT 0 : 데이터베이스에서 데이터를 얻을 고객 섹션에서 엔트 쿼리는 다음과 같습니다

SELECT a.`id_customer`, `firstname`, `lastname`, `email`, a.`active` AS `active`, `newsletter`, `optin` , a.date_add, gl.name as title, (SELECT SUM(total_paid_real/conversion_rate) FROM ps_orders o WHERE o.id_customer = a.id_customer AND o.id_shop IN (2, 1) AND o.valid = 1) as total_spent, (SELECT c.date_add FROM ps_guest g LEFT JOIN ps_connections c ON c.id_guest = g.id_guest WHERE g.id_customer = a.id_customer ORDER BY c.date_add DESC LIMIT 1) as connect, shop.name as shop_name FROM `ps_customer` a LEFT JOIN ps_gender_lang gl ON (a.id_gender = gl.id_gender AND gl.id_lang = 1) LEFT JOIN ps_shop shop ON a.id_shop = shop.id_shop WHERE 1 AND a.`deleted` = 0 AND a.id_shop IN (2, 1) ORDER BY `date_add` DESC LIMIT 0, 50 

은 내가 다른 열을 단지 ps_address.dni 추가하고 또한 얻을 해당 쿼리를 변경하는 방법을 잘 모릅니다

잘 모릅니다.

감사

가 부분적으로 말에 나는 변경 고객/길 백 오피스를 의미 내가 AdminAddressesController.php을 변경 한 AdminCustomersController.php을 변경하지 않은, 잘

를 해결 편집.

난 그냥이 라인을 추가하고 그것의 매력처럼 일 :

$this->fields_list = array(
     'id_address' => array('title' => $this->l('ID'), 'align' => 'center', 'class' => 'fixed-width-xs'), 
     'firstname' => array('title' => $this->l('First Name'), 'filter_key' => 'a!firstname'), 
     'lastname' => array('title' => $this->l('Last Name'), 'filter_key' => 'a!lastname'), 
     'address1' => array('title' => $this->l('Address')), 
     'postcode' => array('title' => $this->l('Zip/Postal Code'), 'align' => 'right'), 
     'dni' => array('title' => $this->l('DNI'), 'align' => 'right'), 
     'city' => array('title' => $this->l('City')), 
     'country' => array('title' => $this->l('Country'), 'type' => 'select', 'list' => $this->countries_array, 'filter_key' => 'cl!id_country')); 

가 지금은 검색 할 수있는 장소가 당신은거야

+0

dni는 고객 당 하나 이상의 주소가 있어야하므로 고객 당 하나의 주소가 더 많기 때문에 ps_address 필드 (주소 모델의 필드)입니다. 논리적으로는 이것을 할 수 없습니다. – sarcom

+0

@ sarcom 그 멋진 대답이지만, 만약 내가 단지 첫 번째 주소를 항상 얻고 싶다면? 그건 1-1 일 수 있습니다 – nanaki

+0

@ sarcom 방금 내 부분적으로 솔루션을 감사 내 게시물을 편집했습니다. – nanaki

답변

0

가 AdminCustomersController을,이 시도 오버라이드 (override) : 당신이 달성하려고하는지

부터는 내가 BO 주문 페이지에서 송장 ID를 추가하려고 예입니다, 프로세스에 대한 매우 비슷해야 새 파일이 prestashop/override/controllers/admin/

class AdminCustomersController extends AdminCustomersControllerCore { 
    public function __construct(){ 
     $this->bootstrap = true; 
     $this->required_database = true; 
     $this->required_fields = array('newsletter','optin'); 
     $this->table = 'customer'; 
     $this->className = 'Customer'; 
     $this->lang = false; 
     $this->deleted = true; 
     $this->explicitSelect = true; 

     $this->allow_export = true; 

     $this->addRowAction('edit'); 
     $this->addRowAction('view'); 
     $this->addRowAction('delete'); 
     $this->bulk_actions = array(
      'delete' => array(
       'text' => $this->l('Delete selected'), 
       'confirm' => $this->l('Delete selected items?'), 
       'icon' => 'icon-trash' 
      ) 
     ); 

     $this->context = Context::getContext(); 

     $this->default_form_language = $this->context->language->id; 

     $titles_array = array(); 
     $genders = Gender::getGenders($this->context->language->id); 
     foreach ($genders as $gender) { 
      /** @var Gender $gender */ 
      $titles_array[$gender->id_gender] = $gender->name; 
     } 

     $this->_join = 'LEFT JOIN '._DB_PREFIX_.'gender_lang gl ON (a.id_gender = gl.id_gender AND gl.id_lang = '.(int)$this->context->language->id.') 
     LEFT JOIN '._DB_PREFIX_.'address addr ON (a.id_customer = addr.id_customer)'; 
     $this->_use_found_rows = false; 
     $this->fields_list = array(
      'id_customer' => array(
       'title' => $this->l('ID'), 
       'align' => 'text-center', 
       'class' => 'fixed-width-xs' 
      ), 
      'title' => array(
       'title' => $this->l('Social title'), 
       'filter_key' => 'a!id_gender', 
       'type' => 'select', 
       'list' => $titles_array, 
       'filter_type' => 'int', 
       'order_key' => 'gl!name' 
      ), 
      'firstname' => array(
       'title' => $this->l('First name'), 
       'filter_key' => 'a!firstname' 
      ), 
      'lastname' => array(
       'title' => $this->l('Last name'), 
       'filter_key' => 'a!lastname' 
      ), 
      'email' => array(
       'title' => $this->l('Email address') 
      ), 
      'dni' => array(// Your new field 
       'title' => $this->l('DNI'), 
       'filter_key' => 'addr!dni' 
      ) 
     ); 

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

     $this->fields_list = array_merge($this->fields_list, array(
      'total_spent' => array(
       'title' => $this->l('Sales'), 
       'type' => 'price', 
       'search' => false, 
       'havingFilter' => true, 
       'align' => 'text-right', 
       'badge_success' => true 
      ), 
      'active' => array(
       'title' => $this->l('Enabled'), 
       'align' => 'text-center', 
       'active' => 'status', 
       'type' => 'bool', 
       'orderby' => false, 
       'filter_key' => 'a!active' 
      ), 
      'newsletter' => array(
       'title' => $this->l('Newsletter'), 
       'align' => 'text-center', 
       'type' => 'bool', 
       'callback' => 'printNewsIcon', 
       'orderby' => false 
      ), 
      'optin' => array(
       'title' => $this->l('Opt-in'), 
       'align' => 'text-center', 
       'type' => 'bool', 
       'callback' => 'printOptinIcon', 
       'orderby' => false 
      ), 
      'date_add' => array(
       'title' => $this->l('Registration'), 
       'type' => 'date', 
       'align' => 'text-right' 
      ), 
      'connect' => array(
       'title' => $this->l('Last visit'), 
       'type' => 'datetime', 
       'search' => false, 
       'havingFilter' => true 
      ) 
     )); 

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

     AdminController::__construct(); // Important 

     $this->_select = ' 
     addr.dni, 
     a.date_add, gl.name as title, (
      SELECT SUM(total_paid_real/conversion_rate) 
      FROM '._DB_PREFIX_.'orders o 
      WHERE o.id_customer = a.id_customer 
      '.Shop::addSqlRestriction(Shop::SHARE_ORDER, 'o').' 
      AND o.valid = 1 
     ) as total_spent, (
      SELECT c.date_add FROM '._DB_PREFIX_.'guest g 
      LEFT JOIN '._DB_PREFIX_.'connections c ON c.id_guest = g.id_guest 
      WHERE g.id_customer = a.id_customer 
      ORDER BY c.date_add DESC 
      LIMIT 1 
     ) as connect'; 

     $this->_group = 'GROUP BY a.id_customer'; // Don't forget this 

     // Check if we can add a customer 
     if (Shop::isFeatureActive() && (Shop::getContext() == Shop::CONTEXT_ALL || Shop::getContext() == Shop::CONTEXT_GROUP)) { 
      $this->can_add_customer = false; 
     } 

     self::$meaning_status = array(
      'open' => $this->l('Open'), 
      'closed' => $this->l('Closed'), 
      'pending1' => $this->l('Pending 1'), 
      'pending2' => $this->l('Pending 2') 
     ); 
    } 
} 

AdminCustomersController.php라는 이름의 당신은 다른 작업을 수행 할 필요가 없습니다. 그러나 고객이 하나 이상의 주소를 가지고 있다면 예기치 않은 결과가 발생할 수 있습니다.

+0

이 부분적인 해결책, 둘 다 덕분에 일했습니다. 올바른 해결책으로도 표시되었습니다. – nanaki

+0

나는 이것을 듣고 기쁩니다;) – sarcom

-1

가에 AdminCustomersController.php라는 이름의 새 파일을 만들 필요가 DNI를-고객 override/controllers/admin 폴더에 있습니다. 자세한 내용은 this을 참조하십시오.

그런 다음 __construct() 함수에서 하위 쿼리를 $this->select에 추가하고 $this->fields_list에 해당 필드를 추가해야합니다.

<?php 
class AdminOrdersController extends AdminOrdersControllerCore 
{ 

public function __construct() 
{ 
    parent::__construct(); 

    $this->_select .= ' 
     , (SELECT MAX(oi.id_order_invoice) FROM '._DB_PREFIX_.'order_invoice oi WHERE oi.id_order = a.id_order) as id_inv 
    '; 

    $this->fields_list = array_merge($this->fields_list, array(
     'id_inv' => array(
      'title' => $this->l('Invoice'), 
      'align' => 'text-center', 
      'class' => 'fixed-width-xs', 
      'orderby' => false, 
      'search' => false 
     ) 
    )); 
} 
[...] 
} 
+0

이 질문에 대한 답을 얻지 못했을 것입니다. – sarcom

+0

@ sarcom 덕분에 이미 저도 해봤지만 기본 고객 백 오피스 데이터와 ps_address.dni를 함께 사용할 수는 없습니다. 그래서 해결 된 것으로 표시 할 수 없습니다. ( – nanaki