Настраиваемая вкладка Prestashop в бэк-офисе

Я разрабатываю модуль для prestashop 1.5.3. Мне нужно создать пользовательскую вкладку администратора во время установки модуля. Я делаю установку так

public function install()
{
    if( (parent::install() == false)||(!$this->_createTab())  )
        return false;
    return true;
}

И метод _createTab:

private function _createTab()
{
    $tab = new Tab();
    $tab->id_parent = 7; // Modules tab
    $tab->class_name='AdminWarranty';
    $tab->module='fruitwarranty';
    $tab->name[(int)(Configuration::get('PS_LANG_DEFAULT'))] = $this->l('Warranty');
    $tab->active=1;
        if(!$tab->save()) return false;
return true;
}

И ничего не происходит... Что я делаю не так... и где найти хороший справочник разработчиков prestashop?


person Vit Kos    schedule 22.02.2013    source источник


Ответы (2)


Чтобы создать пользовательскую вкладку для модуля во время установки, вы можете использовать следующий код.

Примечание. Я рассматриваю тестовый модуль под названием "Новости".

private function _createTab()
{
    /* define data array for the tab  */
    $data = array(
                  'id_tab' => '', 
                  'id_parent' => 7, 
                  'class_name' => 'AdminNews', 
                  'module' => 'news', 
                  'position' => 1, 'active' => 1 
                 );

    /* Insert the data to the tab table*/
    $res = Db::getInstance()->insert('tab', $data);

    //Get last insert id from db which will be the new tab id
    $id_tab = Db::getInstance()->Insert_ID();

   //Define tab multi language data
    $data_lang = array(
                     'id_tab' => $id_tab, 
                     'id_lang' => Configuration::get('PS_LANG_DEFAULT'),
                     'name' => 'News'
                     );

    // Now insert the tab lang data
    $res &= Db::getInstance()->insert('tab_lang', $data_lang);

    return true;

} /* End of createTab*/

Я надеюсь, что приведенный выше код поможет. Спасибо.

person Altaf Hussain    schedule 27.02.2013
comment
что такое class_name в вашем случае? можете ли вы привести пример, пожалуйста? - person Vit Kos; 01.03.2013
comment
В моем случае class_name — AdminNews. Вы можете изменить его на имя вашего класса AdminWarranty . - person Altaf Hussain; 02.03.2013
comment
Да, я понял, но что это за класс? что он представляет? можете показать пожалуйста фрагмент? Заранее спасибо. - person Vit Kos; 05.03.2013
comment
Если вы знаете, каждая вкладка в админке на самом деле представляет файл класса. Если вы посмотрите на controllers/admin/, то там вы увидите несколько классов контроллеров, это классы, связанные с каждой вкладкой в ​​admin. Этот класс предоставляет все функции административного управления. Также обратите внимание, что у каждого класса контроллера может быть другой класс, который мы можем назвать классом модели, который обрабатывает все операции, связанные с базой данных и данными. Prestashop основан на шаблоне MVC. для дальнейшего изучения, пожалуйста, прочитайте programmingtunes.com/ . - person Altaf Hussain; 05.03.2013
comment
Для чего вы используете $res? Учитывая, что вы всегда возвращаете true... - person Ascam; 09.08.2016

Ну, я сам разрабатываю модуль PrestaShop, так что, если кто-то попадет сюда, правильный путь.

Для корневых вкладок:

$rootTab = new Tab();
$rootTab->active = 1;
$rootTab->class_name = 'YourAdminControllerName';
$rootTab->name = array();
foreach (Language::getLanguages(true) as $lang) {
    $rootTab->name[$lang['id_lang']] = $this->l("Root tab");
}
$rootTab->id_parent = 0; // No parent
$rootTab->module = $this->name;
$rootTab->add();

Примечание для версии 1.5: при создании корневой вкладки система будет искать YourAdminControllerName.gif в папке вашего модуля в качестве значка вкладки. Также обратите внимание, что корневые вкладки не работают как ссылки, несмотря на то, что для них требуется class_name.

Для некорневых вкладок:

$tab = new Tab();
$tab->active = 1;
$tab->class_name = 'YourAdminControllerName';
$tab->name = array();
foreach (Language::getLanguages(true) as $lang) {
    $tab->name[$lang['id_lang']] = $this->l("Non-root tab");
}
$tab->id_parent = $rootTab->id; // Set the root tab we just created as parent
$tab->module = $this->name;
$tab->add();

Если вы хотите установить существующую вкладку в качестве родительской, вы можете использовать функцию getIdFromClassName. Например, в вашем случае:

$tab->id_parent = (int)Tab::getIdFromClassName('AdminModules');

Функция add() возвращает false в случае сбоя, поэтому вы можете использовать ее в if(), как вы пытались сделать с функцией save().

К сожалению, PrestaShop на сегодняшний день является худшей документированной системой CMS, с которой мне приходилось работать, и единственный способ действительно кодировать для нее — это читать код, поэтому я надеюсь, что это кому-то поможет.

person Marc    schedule 26.06.2015