Jump to content
thirty bees forum

How To Add A State Column In The Customers->Addresses Overview


Recommended Posts

Posted

Hi all,

I would like to know how I can have the state (Florida, California, etc.) of the customers addresses show in the customers->addresses overview page, so I can filter on state.

Anyone have an idea?

Posted

The fields list is in controllers/admin/AdminAddressesController.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'),
        'city' => array('title' => $this->l('City')),
        'country' => array('title' => $this->l('Country'), 'type' => 'select', 'list' => $this->countries_array, 'filter_key' => 'cl!id_country'));

You can modify it to include the state, I guess.

Posted

I think I need to do something like this, like they did for the country, except for a state, to pullout the states name via it's id... $this->_select = 'cl.`name` as country'; $this->_join = ' LEFT JOIN `'._DB_PREFIX_.'country_lang` cl ON (cl.`id_country` = a.`id_country` AND cl.`id_lang` = '.(int) $this->context->language->id.') LEFT JOIN `'._DB_PREFIX_.'customer` c ON a.id_customer = c.id_customer '; $this->_where = 'AND a.id_customer != 0 '.Shop::addSqlRestriction(Shop::SHARE_CUSTOMER, 'c'); $this->_use_found_rows = false; any thoughts?

Posted

I have never done an SQL join using prestashop helpers, but it might work like this:

  $this->_select = 'st.`name` as state';
    $this->_join = '
        LEFT JOIN `'._DB_PREFIX_.'state` st ON (st.`id_state` = a.`id_state`)
        LEFT JOIN `'._DB_PREFIX_.'customer` c ON a.id_customer = c.id_customer
    ';
    $this->_where = 'AND a.id_customer != 0 '.Shop::addSqlRestriction(Shop::SHARE_CUSTOMER, 'c');
    $this->_use_found_rows = false;
Posted

I tried this, and it didnt work, it broke the country...

``` $this->select = 'cl.name as country'; $this->join = ' LEFT JOIN '._DB_PREFIX_.'country_lang cl ON (cl.id_country = a.id_country AND cl.id_lang = '.(int) $this->context->language->id.') LEFT JOIN '._DB_PREFIX_.'customer c ON a.idcustomer = c.idcustomer '; $this->where = 'AND a.idcustomer != 0 '.Shop::addSqlRestriction(Shop::SHARECUSTOMER, 'c'); $this->usefoundrows = false;

    $this->_select = 'st.`name` as state';
    $this->_join = '
        LEFT JOIN `'._DB_PREFIX_.'state` st ON (st.`id_state` = a.`id_state`)
        LEFT JOIN `'._DB_PREFIX_.'customer` c ON a.id_customer = c.id_customer
    ';
    $this->_where = 'AND a.id_customer != 0 '.Shop::addSqlRestriction(Shop::SHARE_CUSTOMER, 'c');
    $this->_use_found_rows = false;

```

Posted

I'm not a coder, so I don't know if the way I did it was the correct way, but sure....

Copy the file, /controllers/admin/AdminAddressesController.php, to /override/controllers/admin/ How edit that file, replace lines 75-98 with the following code.. ``` $countries = Country::getCountries($this->context->language->id); foreach ($countries as $country) { $this->countriesarray[$country['idcountry']] = $country['name']; }

    $states = State::getStates($this->context->language->id);
    foreach ($states as $state) {
        $this->states_array[$state['id_state']] = $state['name'];
    }

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

    parent::__construct();
    $this->_select = 'cl.`name` as country, st.`name` as state';
    $this->_join = '
        LEFT JOIN `'._DB_PREFIX_.'country_lang` cl ON (cl.`id_country` = a.`id_country` AND cl.`id_lang` = '.(int) $this->context->language->id.')
        LEFT JOIN `'._DB_PREFIX_.'state` st ON (st.`id_state` = a.`id_state`)
        LEFT JOIN `'._DB_PREFIX_.'customer` c ON a.id_customer = c.id_customer
    ';
    $this->_where = 'AND a.id_customer != 0 '.Shop::addSqlRestriction(Shop::SHARE_CUSTOMER, 'c');
    $this->_use_found_rows = false;

``` Here is my override file in it's entirety... 01510089968403AdminAddressesController.php

The way it is, I could setup the state as a dropdown list like country is, but I like it better typing something in.

Posted

Now, if I could only figure out how to do the same at the bottom of the customers view. At the bottom of viewing a customer is a frame with all their addresses, I wanna find out how to add it there as well. Any ideas?

Posted

I figured it out. I had to edit a core file.. /themes/default/template/controllers/customers/helpers/view/view.tpl. Is there a way to make this an override, instead of editing a core file?

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...