Override/Extends для AdminTab в модуле.

Как можно в Prestashop в админке добавить собственную страницу или заменить существующую? Например,  в /admin/tabs/… нужно изменить AdminCatalog, AdminProducts или добавить новые поля для зарегистрированных пользователей, клиентов в AdminCustomers и т.д. В prestashop не предусмотрена замена или расширение классов AdminTab. Менять стандартные классы не хочеться, чтобы избежать проблем и дополнительной работы при обновлении. Как сделать замену стандартного класса AdminTab с помощью модуля?

Например, изменим AdminCatalog.

1. Структура модуля Prestashop для замены стандартного класса AdminTab

Структура такая-же как и для любого другого модуля Prestashop.

/modules/mymodule
        + classes
        + js
        + css
        - AdminCatalog.gif (лого для замещенного AdminTab)
        - AdminCatalog.php (AdminTab новый класс)
        - mymodule.php ('controller' модуля )
        - en, es, fr.php (локализация)
        - logo.gif (лого модуля)

2. Замена вкладки каталог для администратора

В prestashop можно заменять, скрывать вкладки в панели администратора для определенных работников магазина. Воспользуемся этой возможностью и заменним вкладку Каталог.

Панель администратора - Вкладки

Подставим наш новый класс, который мы создали в модуле — mymodule.

Панель администратора - Вкладки

На этом можно было бы закончить, но хотелось автоматизировать процесс замены класса AdminTab. Чтобы пользователь установив модуль сразу получал новую вкладку, а при удалении модуля возвращалась старая вкладка.

3. Методы install и uninstall для автоматизации установки или удаления

Добавим два метода в класс модуля.

/**
 * Update a tab classname from a module
 *
 */
public function changeAdminTabClass($originalTabClassName, $newTabClassName, $changeTabIcon=false)
{
//Manage Tab Icon
        if ($changeTabIcon) {
                @copy(_PS_MODULE_DIR_.$this->name.'/logo.gif', _PS_IMG_DIR_.'t/'.$newTabClassName.'.gif');
                @copy(_PS_MODULE_DIR_.$this->name.'/logo.gif', _PS_MODULE_DIR_.$this->name.'/'.$newTabClassName.'.gif');
        }
        else {
  @copy(_PS_IMG_DIR_.'t/'.$originalTabClassName.'.gif', _PS_IMG_DIR_.'t/'.$newTabClassName.'.gif');
                @copy(_PS_IMG_DIR_.'t/'.$originalTabClassName.'.gif', _PS_MODULE_DIR_.$this->name.'/'.$newTabClassName.'.gif');
        }
//Get id from original Tab class
        $idTab = Tab::getIdFromClassName($originalTabClassName);
//If found, proceed to override
        if($idTab != 0) {
          $tab = new Tab ($idTab);
          $tab->class_name = $newTabClassName;
          $tab->module = $this->name;
          return $tab->save();
        }
        return false;
}

Второй метод:

/**
  * Reset a tab from a module
  */
public function resetAdminTabClass ($originalTabClassName, $replacedByTabClassName, $originalTabModule=null)
{
        $idTab = Tab::getIdFromClassName($replacedByTabClassName);
        if($idTab != 0) {
                $tab = new Tab ($idTab);
                $tab->class_name = $originalTabClassName;
          $tab->module = $originalTabModule;
          return $tab->save();
          }
          return false;
}

Используем эти функции для автоматической установки

/**
  * Install
  */
function install () {
  if (
   !parent::install()  
   || !$this->
changeAdminTabClass('AdminCatalog','AdminCatalog')
  )
   return false;
  return true;
}

и удаления новой вкладки через модуль.

/**
  * Uninstall
  */
function uninstall () {
  if (
   !parent::uninstall()
   OR !$this->resetAdminTabClass('AdminCatalog','AdminCatalog')
  )
   return false;
  return true;
}

4. Функции перевода для новой вкладки

Перевод новой вкладки можно обновить вручную через панель администратора, а можно задействовать фунуции ядра.

  /**
  *
  * Override translate
  *
  */
protected function l($string, $class = 'AdminTab', $addslashes = FALSE, $htmlentities = TRUE) {

  global $_LANGADM, $_MODULE;

  //set MD5 key
  $md5Key = md5(str_replace('\'', '\\\'', $string));
  //set module key
  $moduleKey = '';
  //Manage Module translations
  $currentClass = get_class($this);
  if (Module::getModuleNameFromClass($currentClass)) {
   $currentKey = '<{'.strtolower(Module::$classInModule[$currentClass]).'}'.strtolower(_THEME_NAME_).'>'.strtolower($currentClass).'_'.$md5Key;
   $defaultKey = '<{'.strtolower(Module::$classInModule[$currentClass]).'}prestashop>'.strtolower($currentClass).'_'.$md5Key;
  }
  //Tries to find translation within default admin translation or module translations
  if (key_exists('AdminTab'.$md5Key, $_LANGADM))
   $str = $_LANGADM['AdminTab'.$md5Key];
  elseif (key_exists('AdminProducts'.$md5Key, $_LANGADM))
   $str = $_LANGADM['AdminProducts'.$md5Key];
  elseif (key_exists('AdminCatalog'.$md5Key, $_LANGADM))
   $str = $_LANGADM['AdminCatalog'.$md5Key];
  elseif (key_exists($defaultKey, $_MODULE))
   $str = $_MODULE[$defaultKey];
  elseif (key_exists($currentKey, $_MODULE))
   $str = $_MODULE[$currentKey];
  else
   $str = $string;

  $str = $htmlentities ? htmlentities($str, ENT_QUOTES, 'utf-8') : $str;
  return str_replace('"', '&quot;', ($addslashes ? addslashes($str) : stripslashes($str)));
}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *