2015-02-26 3 views
0

Я пытался добавить еще два необязательных поля для адресных страниц, (страницы пользователя, администратора страницы и т.д.)Prestashop добавить еще одно поле в форме адреса

я создал две колонки в ps_address и названный address3 и address4 и измененные файлы, доступные в версии 1.6.0.11 согласно this article

я был в состоянии добавить новые adreess3 и address4 полей в настройках страны адресов. Но нет текстового поля для добавления адресов3 и address4 в AddressesController и списка адресов клиентов.

Ниже приведено мое изменено AddressesController file.

<?php 
/* 
* 2007-2015 PrestaShop 
* 
* NOTICE OF LICENSE 
* 
* This source file is subject to the Open Software License (OSL 3.0) 
* that is bundled with this package in the file LICENSE.txt. 
* It is also available through the world-wide-web at this URL: 
* http://opensource.org/licenses/osl-3.0.php 
* If you did not receive a copy of the license and are unable to 
* obtain it through the world-wide-web, please send an email 
* to [email protected] so we can send you a copy immediately. 
* 
* DISCLAIMER 
* 
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer 
* versions in the future. If you wish to customize PrestaShop for your 
* needs please refer to http://www.prestashop.com for more information. 
* 
* @author PrestaShop SA <[email protected]> 
* @copyright 2007-2015 PrestaShop SA 
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) 
* International Registered Trademark & Property of PrestaShop SA 
*/ 

class AdminAddressesControllerCore extends AdminController 
{ 
    /** @var array countries list */ 
    protected $countries_array = array(); 

    public function __construct() 
    { 
     $this->bootstrap = true; 
     $this->required_database = true; 
     $this->required_fields = array('company', 'address2', 'address3', 'address4', 'postcode', 'other', 'phone', 'phone_mobile', 'vat_number', 'dni'); 
     $this->table = 'address'; 
     $this->className = 'Address'; 
     $this->lang = false; 
     $this->addressType = 'customer'; 
     $this->explicitSelect = true; 
     $this->context = Context::getContext(); 

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

     $this->allow_export = true; 

     if (!Tools::getValue('realedit')) 
      $this->deleted = true; 

     $countries = Country::getCountries($this->context->language->id); 
     foreach ($countries as $country) 
      $this->countries_array[$country['id_country']] = $country['name']; 

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

     parent::__construct(); 

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

    public function initToolbar() 
    { 
     parent::initToolbar(); 
     if (!$this->display) 
      $this->toolbar_btn['import'] = array(
       'href' => $this->context->link->getAdminLink('AdminImport', true).'&import_type=addresses', 
       'desc' => $this->l('Import') 
      ); 
    } 

    public function initPageHeaderToolbar() 
    { 
     if (empty($this->display)) 
      $this->page_header_toolbar_btn['new_address'] = array(
       'href' => self::$currentIndex.'&addaddress&token='.$this->token, 
       'desc' => $this->l('Add new address', null, null, false), 
       'icon' => 'process-icon-new' 
      ); 

     parent::initPageHeaderToolbar(); 
    } 

    public function renderForm() 
    { 
     $this->fields_form = array(
      'legend' => array(
       'title' => $this->l('Addresses'), 
       'icon' => 'icon-envelope-alt' 
      ), 
      'input' => array(
       array(
        'type' => 'text_customer', 
        'label' => $this->l('Customer'), 
        'name' => 'id_customer', 
        'required' => false, 
       ), 
       array(
        'type' => 'text', 
        'label' => $this->l('Identification Number'), 
        'name' => 'dni', 
        'required' => false, 
        'col' => '4', 
        'hint' => $this->l('DNI/NIF/NIE') 
       ), 
       array(
        'type' => 'text', 
        'label' => $this->l('Address alias'), 
        'name' => 'alias', 
        'required' => true, 
        'col' => '4', 
        'hint' => $this->l('Invalid characters:').' &lt;&gt;;=#{}' 
       ), 
       array(
        'type' => 'textarea', 
        'label' => $this->l('Other'), 
        'name' => 'other', 
        'required' => false, 
        'cols' => 15, 
        'rows' => 3, 
        'hint' => $this->l('Forbidden characters:').' &lt;&gt;;=#{}' 
       ), 
      ), 
      'submit' => array(
       'title' => $this->l('Save'), 
      ) 
     ); 
     $id_customer = (int)Tools::getValue('id_customer'); 
     if (!$id_customer && Validate::isLoadedObject($this->object)) 
      $id_customer = $this->object->id_customer; 
     if ($id_customer) 
     { 
      $customer = new Customer((int)$id_customer); 
      $token_customer = Tools::getAdminToken('AdminCustomers'.(int)(Tab::getIdFromClassName('AdminCustomers')).(int)$this->context->employee->id); 
     } 

     $this->tpl_form_vars = array(
      'customer' => isset($customer) ? $customer : null, 
      'tokenCustomer' => isset ($token_customer) ? $token_customer : null 
     ); 

     // Order address fields depending on country format 
     $addresses_fields = $this->processAddressFormat(); 
     // we use delivery address 
     $addresses_fields = $addresses_fields['dlv_all_fields']; 

     // get required field 
     $required_fields = AddressFormat::getFieldsRequired(); 

     // Merge with field required 
     $addresses_fields = array_unique(array_merge($addresses_fields, $required_fields)); 

     $temp_fields = array(); 

     foreach ($addresses_fields as $addr_field_item) 
     { 
      if ($addr_field_item == 'company') 
      { 
       $temp_fields[] = array(
        'type' => 'text', 
        'label' => $this->l('Company'), 
        'name' => 'company', 
        'required' => in_array('company', $required_fields), 
        'col' => '4', 
        'hint' => $this->l('Invalid characters:').' &lt;&gt;;=#{}' 
       ); 
       $temp_fields[] = array(
        'type' => 'text', 
        'label' => $this->l('VAT number'), 
        'col' => '2', 
        'name' => 'vat_number', 
        'required' => in_array('vat_number', $required_fields) 
       ); 
      } 
      elseif ($addr_field_item == 'lastname') 
      { 
       if (isset($customer) && 
        !Tools::isSubmit('submit'.strtoupper($this->table)) && 
        Validate::isLoadedObject($customer) && 
        !Validate::isLoadedObject($this->object)) 
        $default_value = $customer->lastname; 
       else 
        $default_value = ''; 

       $temp_fields[] = array(
        'type' => 'text', 
        'label' => $this->l('Last Name'), 
        'name' => 'lastname', 
        'required' => true, 
        'col' => '4', 
        'hint' => $this->l('Invalid characters:').' 0-9!&amp;lt;&amp;gt;,;?=+()@#"�{}_$%:', 
        'default_value' => $default_value, 
       ); 
      } 
      elseif ($addr_field_item == 'firstname') 
      { 
       if (isset($customer) && 
        !Tools::isSubmit('submit'.strtoupper($this->table)) && 
        Validate::isLoadedObject($customer) && 
        !Validate::isLoadedObject($this->object)) 
        $default_value = $customer->firstname; 
       else 
        $default_value = ''; 

       $temp_fields[] = array(
        'type' => 'text', 
        'label' => $this->l('First Name'), 
        'name' => 'firstname', 
        'required' => true, 
        'col' => '4', 
        'hint' => $this->l('Invalid characters:').' 0-9!&amp;lt;&amp;gt;,;?=+()@#"�{}_$%:', 
        'default_value' => $default_value, 
       ); 
      } 
      elseif ($addr_field_item == 'address1') 
      { 
       $temp_fields[] = array(
        'type' => 'text', 
        'label' => $this->l('Address'), 
        'name' => 'address1', 
        'col' => '6', 
        'required' => true, 
       ); 
      } 
      elseif ($addr_field_item == 'address2') 
      { 
       $temp_fields[] = array(
        'type' => 'text', 
        'label' => $this->l('Address').' (2)', 
        'name' => 'address2', 
        'col' => '6', 
        'required' => in_array('address2', $required_fields), 
       ); 
      } 
      elseif ($addr_field_item == 'address3') 
      { 
       $temp_fields[] = array(
        'type' => 'text', 
        'label' => $this->l('Address').' (3)', 
        'name' => 'address3', 
        'col' => '6', 
        'required' => in_array('address3', $required_fields), 
       ); 
      } 
      elseif ($addr_field_item == 'address4') 
      { 
       $temp_fields[] = array(
        'type' => 'text', 
        'label' => $this->l('Address').' (4)', 
        'name' => 'address4', 
        'col' => '6', 
        'required' => in_array('address4', $required_fields), 
       ); 
      } 
      elseif ($addr_field_item == 'postcode') 
      { 
       $temp_fields[] = array(
        'type' => 'text', 
        'label' => $this->l('Zip/Postal Code'), 
        'name' => 'postcode', 
        'col' => '2', 
        'required' => true, 
       ); 
      } 
      elseif ($addr_field_item == 'city') 
      { 
       $temp_fields[] = array(
        'type' => 'text', 
        'label' => $this->l('City'), 
        'name' => 'city', 
        'col' => '4', 
        'required' => true, 
       ); 
      } 
      elseif ($addr_field_item == 'country' || $addr_field_item == 'Country:name') 
      { 
       $temp_fields[] = array(
        'type' => 'select', 
        'label' => $this->l('Country'), 
        'name' => 'id_country', 
        'required' => in_array('Country:name', $required_fields) || in_array('country', $required_fields), 
        'col' => '4', 
        'default_value' => (int)$this->context->country->id, 
        'options' => array(
         'query' => Country::getCountries($this->context->language->id), 
         'id' => 'id_country', 
         'name' => 'name' 
        ) 
       ); 
       $temp_fields[] = array(
        'type' => 'select', 
        'label' => $this->l('State'), 
        'name' => 'id_state', 
        'required' => false, 
        'col' => '4', 
        'options' => array(
         'query' => array(), 
         'id' => 'id_state', 
         'name' => 'name' 
        ) 
       ); 
      } 
      elseif ($addr_field_item == 'phone') 
      { 
       $temp_fields[] = array(
        'type' => 'text', 
        'label' => $this->l('Home phone'), 
        'name' => 'phone', 
        'required' => in_array('phone', $required_fields) || Configuration::get('PS_ONE_PHONE_AT_LEAST'), 
        'col' => '4', 
        'hint' => Configuration::get('PS_ONE_PHONE_AT_LEAST') ? sprintf($this->l('You must register at least one phone number.')) : '' 
       ); 
      } 
      elseif ($addr_field_item == 'phone_mobile') 
      { 
       $temp_fields[] = array(
        'type' => 'text', 
        'label' => $this->l('Mobile phone'), 
        'name' => 'phone_mobile', 
        'required' => in_array('phone_mobile', $required_fields) || Configuration::get('PS_ONE_PHONE_AT_LEAST'), 
        'col' => '4', 
        'hint' => Configuration::get('PS_ONE_PHONE_AT_LEAST') ? sprintf($this->l('You must register at least one phone number.')) : '' 
       ); 
      } 
     } 

     // merge address format with the rest of the form 
     array_splice($this->fields_form['input'], 3, 0, $temp_fields); 

     return parent::renderForm(); 
    } 

    public function processSave() 
    { 
     if (Tools::getValue('submitFormAjax')) 
      $this->redirect_after = false; 

     // Transform e-mail in id_customer for parent processing 
     if (Validate::isEmail(Tools::getValue('email'))) 
     { 
      $customer = new Customer(); 
      $customer->getByEmail(Tools::getValue('email'), null, false); 
      if (Validate::isLoadedObject($customer)) 
       $_POST['id_customer'] = $customer->id; 
      else 
       $this->errors[] = Tools::displayError('This email address is not registered.'); 
     } 
     elseif ($id_customer = Tools::getValue('id_customer')) 
     { 
      $customer = new Customer((int)$id_customer); 
      if (Validate::isLoadedObject($customer)) 
       $_POST['id_customer'] = $customer->id; 
      else 
       $this->errors[] = Tools::displayError('This customer ID is not recognized.'); 
     } 
     else 
      $this->errors[] = Tools::displayError('This email address is not valid. Please use an address like [email protected]'); 
     if (Country::isNeedDniByCountryId(Tools::getValue('id_country')) && !Tools::getValue('dni')) 
      $this->errors[] = Tools::displayError('The identification number is incorrect or has already been used.'); 

     /* If the selected country does not contain states */ 
     $id_state = (int)Tools::getValue('id_state'); 
     $id_country = (int)Tools::getValue('id_country'); 
     $country = new Country((int)$id_country); 
     if ($country && !(int)$country->contains_states && $id_state) 
      $this->errors[] = Tools::displayError('You have selected a state for a country that does not contain states.'); 

     /* If the selected country contains states, then a state have to be selected */ 
     if ((int)$country->contains_states && !$id_state) 
      $this->errors[] = Tools::displayError('An address located in a country containing states must have a state selected.'); 

     $postcode = Tools::getValue('postcode'); 
     /* Check zip code format */ 
     if ($country->zip_code_format && !$country->checkZipCode($postcode)) 
      $this->errors[] = Tools::displayError('Your Zip/postal code is incorrect.').'<br />'.Tools::displayError('It must be entered as follows:').' '.str_replace('C', $country->iso_code, str_replace('N', '0', str_replace('L', 'A', $country->zip_code_format))); 
     elseif(empty($postcode) && $country->need_zip_code) 
      $this->errors[] = Tools::displayError('A Zip/postal code is required.'); 
     elseif ($postcode && !Validate::isPostCode($postcode)) 
      $this->errors[] = Tools::displayError('The Zip/postal code is invalid.'); 

     if (Configuration::get('PS_ONE_PHONE_AT_LEAST') && !Tools::getValue('phone') && !Tools::getValue('phone_mobile')) 
      $this->errors[] = Tools::displayError('You must register at least one phone number.'); 

     /* If this address come from order's edition and is the same as the other one (invoice or delivery one) 
     ** we delete its id_address to force the creation of a new one */ 
     if ((int)Tools::getValue('id_order')) 
     { 
      $this->_redirect = false; 
      if (isset($_POST['address_type'])) 
       $_POST['id_address'] = ''; 
     } 

     // Check the requires fields which are settings in the BO 
     $address = new Address(); 
     $this->errors = array_merge($this->errors, $address->validateFieldsRequiredDatabase()); 

     if (empty($this->errors)) 
      return parent::processSave(); 
     else 
      // if we have errors, we stay on the form instead of going back to the list 
      $this->display = 'edit'; 

     /* Reassignation of the order's new (invoice or delivery) address */ 
     $address_type = ((int)Tools::getValue('address_type') == 2 ? 'invoice' : ((int)Tools::getValue('address_type') == 1 ? 'delivery' : '')); 
     if ($this->action == 'save' && ($id_order = (int)Tools::getValue('id_order')) && !count($this->errors) && !empty($address_type)) 
     { 
      if (!Db::getInstance()->execute('UPDATE '._DB_PREFIX_.'orders SET `id_address_'.$address_type.'` = '.Db::getInstance()->Insert_ID().' WHERE `id_order` = '.$id_order)) 
       $this->errors[] = Tools::displayError('An error occurred while linking this address to its order.'); 
      else 
       Tools::redirectAdmin(Tools::getValue('back').'&conf=4'); 
     } 
    } 

    public function processAdd() 
    { 
     if (Tools::getValue('submitFormAjax')) 
      $this->redirect_after = false; 

     return parent::processAdd(); 
    } 

    /** 
    * Get Address formats used by the country where the address id retrieved from POST/GET is. 
    * 
    * @return array address formats 
    */ 
    protected function processAddressFormat() 
    { 
     $tmp_addr = new Address((int)Tools::getValue('id_address')); 

     $selected_country = ($tmp_addr && $tmp_addr->id_country) ? $tmp_addr->id_country : (int)Configuration::get('PS_COUNTRY_DEFAULT'); 

     $inv_adr_fields = AddressFormat::getOrderedAddressFields($selected_country, false, true); 
     $dlv_adr_fields = AddressFormat::getOrderedAddressFields($selected_country, false, true); 

     $inv_all_fields = array(); 
     $dlv_all_fields = array(); 

     $out = array(); 

     foreach (array('inv','dlv') as $adr_type) 
     { 
      foreach (${$adr_type.'_adr_fields'} as $fields_line) 
       foreach (explode(' ', $fields_line) as $field_item) 
        ${$adr_type.'_all_fields'}[] = trim($field_item); 

      $out[$adr_type.'_adr_fields'] = ${$adr_type.'_adr_fields'}; 
      $out[$adr_type.'_all_fields'] = ${$adr_type.'_all_fields'}; 
     } 

     return $out; 
    } 

    /** 
    * Method called when an ajax request is made 
    * @see AdminController::postProcess() 
    */ 
    public function ajaxProcess() 
    { 
     if (Tools::isSubmit('email')) 
     { 
      $email = pSQL(Tools::getValue('email')); 
      $customer = Customer::searchByName($email); 
      if (!empty($customer)) 
      { 
       $customer = $customer['0']; 
       echo Tools::jsonEncode(array('infos' => pSQL($customer['firstname']).'_'.pSQL($customer['lastname']).'_'.pSQL($customer['company']))); 
      } 
     } 
     die; 
    } 

    /** 
    * Object Delete 
    */ 
    public function processDelete() 
    { 
     if (Validate::isLoadedObject($object = $this->loadObject())) 
      if (!$object->isUsed()) 
       $this->deleted = false; 

     return parent::processDelete(); 
    } 

    /** 
    * Delete multiple items 
    * 
    * @return boolean true if succcess 
    */ 
    protected function processBulkDelete() 
    { 
     if (is_array($this->boxes) && !empty($this->boxes)) 
     { 
      $deleted = false; 
      foreach ($this->boxes as $id) 
      { 
       $to_delete = new Address((int)$id); 
       if ($to_delete->isUsed()) 
       { 
        $deleted = true; 
        break; 
       } 
      } 
      $this->deleted = $deleted; 
     } 

     return parent::processBulkDelete(); 
    } 
} 

Я также попытался очистить кеш, используя расширенные параметры> Производительность, а также сделал ручную очистку кеша.

В чем может быть проблема не показывать новые поля адреса в бэкэнд или интерфейсе?

ответ

1

Попробуйте также удалить (не стоит беспокоиться, что он будет переиздан) файл class_index.php в папке с кешем вашего магазина

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