2016-09-16 9 views
0

Я использую PrestaShop v 1.6.1.1Prestashop добавить адрес столбца в BackOffice клиента

Что я пытаюсь получить

Я пытаюсь добавить столбец DNI в моей секции клиента в backoffice.

То, что я пытался

Я знаю, что файл, чтобы сделать это называется AdminCustomersController.php, и он находится в контроллерах/админ/AdminCustomersController.php

Также я знаю, что с этим запросом я могу получить данные в базе данных:

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

LIMIT 0, 30

ТОК лор запрос в разделе клиента является:

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, а также получить другие столбцы.

Благодаря

EDITED частично решаемая

Ну, в конце я не изменил AdminCustomersController.php я изменил AdminAddressesController.php это означает, что изменение клиентов/Направления BackOffice.

Я только что добавил эти строки, и она работала как шарм:

$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')); 

Теперь у меня есть место для поиска DNI-клиент

+0

dni - это поле ps_address (так и для модели Address), потому что у вас должно быть больше одного адреса на одного клиента, поэтому больше одного дня на одного клиента. Логически вы не можете этого сделать. – sarcom

+0

@sarcom это хороший ответ, но, что, если я просто хочу получить первый адрес всегда? это может быть 1-1 – nanaki

+0

@sarcom. Я только что отредактировал свой пост с моим частично решением. – nanaki

ответ

0

Попробуйте это переопределить AdminCustomersController, новый файл в prestashop/override/controllers/admin/ имени AdminCustomersController.php

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') 
     ); 
    } 
} 

Вы не должны делать ничего другого. Однако, если у клиента больше одного адреса, у вас могут быть неожиданные результаты.

+0

Это и мое решение Partially, оба работали благодаря mate! Также отмечены как правильное решение – nanaki

+0

Я рад это слышать;) – sarcom

-1

Ты должны создать новый файл с именем AdminCustomersController.php в ваша папка override/controllers/admin. Прочтите this для получения дополнительной информации.

Затем, в вашей функции __construct(), вам необходимо добавить дополнительный запрос к $this->select и добавить соответствующее поле в $this->fields_list.

Далее приведен пример я сделал, чтобы добавить идентификатор счета-фактуры на странице BO заказов, процесс должен быть очень похож на то, что вы пытаетесь достичь:

<?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 thanks Я уже пробовал это раньше, но я не могу получить данные о backoffice клиента по умолчанию и ps_address.dni вместе. Таким образом, я не могу обозначить, как решил :( – nanaki

Смежные вопросы