Prestashop 将地址列添加到客户后台
Prestashop add address column to customer backoffice
我正在使用 prestashop v 1.6.1.1
我想得到什么
我想在后台的客户部分添加一个名为 dni 的列。
我试过的
我知道执行此操作的文件名为 AdminCustomersController.php,它位于 controllers/admin/AdminCustomersController。php
我也知道通过这个查询我可以得到数据库中的数据:
SELECT ps_address.dni, ps_customer. *
FROM ps_customer
INNER JOIN ps_address ON ps_customer.id_customer = ps_address.id_customer
限制 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 并获取其他列。
谢谢
已编辑部分解决
嗯,最后我没改AdminCustomersController.php我改了AdminAddressesController.php也就是说改Customer/Directions后台
我刚刚添加了这几行并且效果很好:
$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-customer
您必须在 override/controllers/admin
文件夹中创建一个名为 AdminCustomersController.php
的新文件。阅读 this 了解更多信息。
然后,在您的 __construct()
函数中,您必须将子查询附加到 $this->select
并将相应的字段添加到 $this->fields_list
。
以下是我在 BO 订单页面上添加发票 ID 的示例,该过程应该与您要实现的目标非常相似:
<?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
)
));
}
[...]
}
试试这个,覆盖 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')
);
}
}
您无需执行任何其他操作。但是,如果客户有多个地址,您可能会得到意想不到的结果。
我正在使用 prestashop v 1.6.1.1
我想得到什么
我想在后台的客户部分添加一个名为 dni 的列。
我试过的
我知道执行此操作的文件名为 AdminCustomersController.php,它位于 controllers/admin/AdminCustomersController。php
我也知道通过这个查询我可以得到数据库中的数据:
SELECT ps_address.dni, ps_customer. *
FROM ps_customer
INNER JOIN ps_address ON ps_customer.id_customer = ps_address.id_customer
限制 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 并获取其他列。
谢谢
已编辑部分解决
嗯,最后我没改AdminCustomersController.php我改了AdminAddressesController.php也就是说改Customer/Directions后台
我刚刚添加了这几行并且效果很好:
$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-customer
您必须在 override/controllers/admin
文件夹中创建一个名为 AdminCustomersController.php
的新文件。阅读 this 了解更多信息。
然后,在您的 __construct()
函数中,您必须将子查询附加到 $this->select
并将相应的字段添加到 $this->fields_list
。
以下是我在 BO 订单页面上添加发票 ID 的示例,该过程应该与您要实现的目标非常相似:
<?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
)
));
}
[...]
}
试试这个,覆盖 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')
);
}
}
您无需执行任何其他操作。但是,如果客户有多个地址,您可能会得到意想不到的结果。