Модуль Создание нового (дополнительного) меню

WSCHUDO

Постоялец
Регистрация
17 Окт 2016
Сообщения
83
Реакции
77
Создание нового (дополнительного) меню

138841a3a09846c1880879980bc6cbf4.png
ee7e287d73224ad8bba5f0141658b005.png


Для начала выполним запрос MySQL
Код:
ALTER TABLE `s_menu` MODIFY COLUMN `id` INT AUTO_INCREMENT;

в Файле /api/Simpla.php после строки
Код:
'notify'     => 'Notify'

добавить строку
Код:
'menus'      => 'Menus'

Не забываем про запятые, в конце её нет!

в Файле /api/Managers.php в строке 18 перед
Код:
'license');

добавить
Код:
'menus',

в Файле /api/Pages.php после строк
Код:
class Pages extends Simpla
{

добавить
Код:
private $menus = array();
private $menu;

далее в конце файла добавить, перед закрывающей скобкой "}"
Код:
/*
    *
    * Обновить список меню
    *
    */
    private function init_menu()
    {
        $this->menus = array();
        // Выбираем из базы меню
        $query = "SELECT id, name, position FROM __menu ORDER BY position";
        $this->db->query($query);
      
        $results = $this->db->results();
      
        foreach($results as $c)
        {
            $this->menus[$c->id] = $c;
        }
      
        $this->menu = reset($this->menus);

    }

    /*
    *
    * Создание меню
    *
    */  
    public function add_menu($menu)
    {  
        $query = $this->db->placehold('INSERT INTO __menu SET ?%', $menu);
        if(!$this->db->query($query))
            return false;

        $id = $this->db->insert_id();
        $this->db->query("UPDATE __menu SET position=id WHERE id=?", $id);  
        $this->init_menu();
        return $id;
    }
  
    /*
    *
    * Обновить меню
    *
    */
    public function update_menu($id, $menu)
    {  
        $query = $this->db->placehold('UPDATE __menu SET ?% WHERE id in (?@)', $menu, (array)$id);
        if(!$this->db->query($query))
            return false;
        $this->init_menu();
        return $id;
    }
  
    /*
    *
    * Удалить меню
    *
    */  
    public function delete_menu($id)
    {
        if(!empty($id))
        {
            $query = $this->db->placehold("DELETE FROM __menu WHERE id=? LIMIT 1", intval($id));
            if($this->db->query($query))
                return true;
            $this->init_menu();
        }
        return false;
    }

в Файле /simpla/ajax/update_object.php перед строкой
Код:
case 'label':

добавить строки
Код:
case 'menu':
        if($simpla->managers->access('menus'))
        $result = $simpla->pages->update_menu($id, $values);
        break;

в Файле /simpla/IndexAdmin.php после строки
Код:
'ManagerAdmin'        => 'managers',

добавить строку
Код:
'MenuAdmin'           => 'menus',

в папку /simpla/ добавить файл MenuAdmin.php следующего содержания
Код:
<?PHP

require_once('api/Simpla.php');

########################################
class MenuAdmin extends Simpla
{


  public function fetch()
  {

           // Обработка действий
          if($this->request->method('post'))
          {
        
            foreach($this->request->post('menu') as $n=>$va)
                foreach($va as $i=>$v)
                    $menus[$i]->$n = $v;  
            
            $menus_ids = array();
            foreach($menus as $menu)
            {
                if($menu->id)
                    $this->pages->update_menu($menu->id, $menu);
                else
                    $menu->id = $this->pages->add_menu($menu);
                 $menus_ids[] = $menu->id;
            }

            // Удалить непереданные меню
            $query = $this->db->placehold('DELETE FROM __menu WHERE id NOT IN(?@)', $menus_ids);
            $this->db->query($query);
          
          
            // Отсортировать меню
            asort($menus_ids);
            $i = 0;
            foreach($menus_ids as $menu_id)
            {
                $this->pages->update_menu($menus_ids[$i], array('position'=>$menu_id));
                $i++;
            }

            // Действия с выбранными
            $action = $this->request->post('action');
            $id = $this->request->post('action_id');
          
            if(!empty($action) && !empty($id))
            switch($action)
            {
                case 'delete':
                {
                    $this->pages->delete_menu($id);  
                    break;
                }
            }      
          
         }

        // Отображение
          $menus = $this->pages->get_menus();
          $menu = $this->pages->get_menu($menu_id);
         $this->design->assign('menu', $menu);
         $this->design->assign('menus', $menus);
        return $this->design->fetch('menu.tpl');
    }
}

в файле /simpla/design/html/index.tpl после строк
Код:
{elseif in_array('managers', $manager->permissions)}
        <li><a href="index.php?module=ManagersAdmin"><img src="design/images/menu/settings.png"><b>Настройки</b></a></li>

добавить строки
Код:
{elseif in_array('menus', $manager->permissions)}
        <li><a href="index.php?module=MenuAdmin"><img src="design/images/menu/settings.png"><b>Настройки</b></a></li>

в папке /simpla/design/html/ файлах currency.tpl, deliveries.tpl, delivery.tpl, manager.tpl, managers.tpl, payment_method.tpl, payment_methods.tpl, settings.tpl перед строкой
Код:
{/capture}

добавить строку
Код:
{if in_array('menus', $manager->permissions)}<li><a href="index.php?module=MenuAdmin">Меню</a></li>{/if}

в папку /simpla/design/html/ добавить файл menu.tpl следующего содержания
Код:
{capture name=tabs}
    {if in_array('settings', $manager->permissions)}<li><a href="index.php?module=SettingsAdmin">Настройки</a></li>{/if}
    {if in_array('currency', $manager->permissions)}<li><a href="index.php?module=CurrencyAdmin">Валюты</a></li>{/if}
    {if in_array('delivery', $manager->permissions)}<li><a href="index.php?module=DeliveriesAdmin">Доставка</a></li>{/if}
    {if in_array('payment', $manager->permissions)}<li><a href="index.php?module=PaymentMethodsAdmin">Оплата</a></li>{/if}
    {if in_array('managers', $manager->permissions)}<li><a href="index.php?module=ManagersAdmin">Менеджеры</a></li>{/if}
    <li class="active"><a href="index.php?module=MenusAdmin">Меню</a></li>
{/capture}

{$meta_title = 'Меню страниц' scope=parent}

{* On document load *}
{literal}
<script src="design/js/jquery/jquery.js"></script>
<script src="design/js/jquery/jquery-ui.min.js"></script>

<script>
$(function() {

    // Сортировка списка
    $("#currencies_block").sortable({ items: 'ul.sortable' , axis: 'y',  cancel: '#header', handle: '.move_zone' });

    // Добавление меню
    var curr = $('#new_currency').clone(true);
    $('#new_currency').remove().removeAttr('id');
    $('a#add_currency').click(function() {
        $(curr).clone(true).appendTo('#currencies').fadeIn('slow').find("input[name*=menu][name*=name]").focus();
        return false;      
    });  
  
    // Удаление меню
    $("a.delete").click(function() {
        $('input[type="hidden"][name="action"]').val('delete');
        $('input[type="hidden"][name="action_id"]').val($(this).closest("ul").find('input[type="hidden"][name*="menu[id]"]').val());
        $(this).closest("form").submit();
    });
  
    $("form").submit(function() {
        if($('input[type="hidden"][name="action"]').val()=='delete' && !confirm('Подтвердите удаление'))
            return false;  
    });

});

</script>
{/literal}

    <!-- Заголовок -->
    <div id="header">
        <h1>Меню страниц</h1>
        <a class="add" id="add_currency" href="#">Добавить</a>
    <!-- Заголовок (The End) -->  
    </div>  

    <form method=post>
    <input type="hidden" name="session_id" value="{$smarty.session.id}">
  
    <!-- Меню -->
    <div id="currencies_block">
        <ul id="header">
            <li class="move"></li>
            <li class="menuID">ID</li>  
            <li class="name">Название меню</li>  
        </ul>
        <div id="currencies">
        {foreach from=$menus item=m}
        <ul class="sortable">
            <li class="move"><div class="move_zone"></div></li>
            <li class="menuID"><input name="menu[id][{$m->id}]" type="hidden" value="{$m->id|escape}" /><span>{$m->id|escape}</span></li>
            <li class="name"><input name="menu[name][{$m->id}]" type="" value="{$m->name|escape}" /></li>
            <li class="icons">
            {if !$m@first}
                <a class="delete" href="#" title="Удалить"></a>              
            {/if}
            </li>
        </ul>
        {/foreach}      
        <ul id="new_currency" style='display:none;'>
            <li class="move"><div class="move_zone"></div></li>
            <li class="menuID"><input name="menu[id][]" type="hidden" value="" /></li>
            <li class="name"><input name="menu[name][]" type="" value="" /></li>
            <li class="icons"></li>
        </ul>
        </div>

    </div>
    <!-- Меню (The End)-->

    <div id="action">
        <input type=hidden name=action value=''>
        <input type=hidden name=action_id value=''>
        <input id='apply_action' class="button_green" type=submit value="Применить">
    </div>
    </form>

в файле /simpla/design/css/style.css перед строкой
Код:
span.alert {

добавить стили
Код:
/* Меню */
#currencies_block ul.sortable li.menuID {
    border:1px solid #BFBBB5;
    background:#ffffff;
    height: 20px;
    padding-top:5px
}
#currencies_block li.menuID { width: 50px; }
#currencies_block li.menuID span { width: 30px;     height: 20px;
    font-size: 14px;
    color: #636363;
    margin-top: 0px;
    padding: 2px 0 0 10px;
    margin-left: 2px;
}

в файле /simpla/design/html/manager.tpl перед строкой
Код:
'license'    =>'Управление лицензией'

добавляем
Код:
'menu'     =>'Создание меню',

Удачных экспериментов =)
 
Приветствую!
Можете, пожалуйста, поделиться своими иконками админ-панели? уж очень понравились.

Держи. Хотя, я скорее всего выложу свою доработанную симплу.

Там будут следующие доработки

-Отзывы о магазине

-Ответы к комментариям

-Фотогалерея

-Автоматический слайдер из админки

-Выключение/включение магазина из админки

-Блог с подкатегориями

-Доп поля при регистрации (телефон, город)

-Множественный фильтр товаров (несколько свойств у товара)

-Расширенная статистика

-Авторизация через соц сети

-Правильное дублирование товара при копировании из админки

-Автоматическая скидка при регистрации

-Уведомление о регистрации по почте

-СМС уведомление администратору сайта о заказе (Для просмотра ссылки Войди или Зарегистрируйся)

-ЯндексМетрика в самом сайте

-Можно вывести товары из определённой категории

-Реализовано создание нового (дополнительного) меню

Пока такие, может ещё что допилю =)
 

Вложения

  • menu.zip
    20,2 KB · Просмотры: 82
Ошибка Notice: Undefined variable: menu_id in .../simpla/MenuAdmin.php on line 63
<?PHP

require_once('api/Simpla.php');

########################################
class MenuAdmin extends Simpla
{


public function fetch()
{

// Обработка действий
if($this->request->method('post'))
{

foreach($this->request->post('menu') as $n=>$va)
foreach($va as $i=>$v)
$menus[$i]->$n = $v;

$menus_ids = array();
foreach($menus as $menu)
{
if($menu->id)
$this->pages->update_menu($menu->id, $menu);
else
$menu->id = $this->pages->add_menu($menu);
$menus_ids[] = $menu->id;
}

// Удалить непереданные меню
$query = $this->db->placehold('DELETE FROM __menu WHERE id NOT IN(?@)', $menus_ids);
$this->db->query($query);


// Отсортировать меню
asort($menus_ids);
$i = 0;
foreach($menus_ids as $menu_id)
{
$this->pages->update_menu($menus_ids[$i], array('position'=>$menu_id));
$i++;
}

// Действия с выбранными
$action = $this->request->post('action');
$id = $this->request->post('action_id');

if(!empty($action) && !empty($id))
switch($action)
{
case 'delete':
{
$this->pages->delete_menu($id);
break;
}
}

}

// Отображение
$menus = $this->pages->get_menus();
$menu = $this->pages->get_menu($menu_id);
$this->design->assign('menu', $menu);
$this->design->assign('menus', $menus);
return $this->design->fetch('menu.tpl');
}
}
{capture name=tabs}
{if in_array('settings', $manager->permissions)}<li><a href="index.php?module=SettingsAdmin">Настройки</a></li>{/if}
{if in_array('currency', $manager->permissions)}<li><a href="index.php?module=CurrencyAdmin">Валюты</a></li>{/if}
{if in_array('delivery', $manager->permissions)}<li><a href="index.php?module=DeliveriesAdmin">Доставка</a></li>{/if}
{if in_array('payment', $manager->permissions)}<li><a href="index.php?module=PaymentMethodsAdmin">Оплата</a></li>{/if}
{if in_array('managers', $manager->permissions)}<li><a href="index.php?module=ManagersAdmin">Менеджеры</a></li>{/if}
<li class="active"><a href="index.php?module=MenusAdmin">Меню</a></li>
{/capture}

{$meta_title = 'Меню страниц' scope=parent}

{* On document load *}
{literal}
<script src="design/js/jquery/jquery.js"></script>
<script src="design/js/jquery/jquery-ui.min.js"></script>

<script>
$(function() {

// Сортировка списка
$("#currencies_block").sortable({ items: 'ul.sortable' , axis: 'y', cancel: '#header', handle: '.move_zone' });

// Добавление меню
var curr = $('#new_currency').clone(true);
$('#new_currency').remove().removeAttr('id');
$('a#add_currency').click(function() {
$(curr).clone(true).appendTo('#currencies').fadeIn('slow').find("input[name*=menu][name*=name]").focus();
return false;
});

// Удаление меню
$("a.delete").click(function() {
$('input[type="hidden"][name="action"]').val('delete');
$('input[type="hidden"][name="action_id"]').val($(this).closest("ul").find('input[type="hidden"][name*="menu[id]"]').val());
$(this).closest("form").submit();
});

$("form").submit(function() {
if($('input[type="hidden"][name="action"]').val()=='delete' && !confirm('Подтвердите удаление'))
return false;
});

});

</script>
{/literal}

<!-- Заголовок -->
<div id="header">
<h1>Меню страниц</h1>
<a class="add" id="add_currency" href="#">Добавить</a>
<!-- Заголовок (The End) -->
</div>

<form method=post>
<input type="hidden" name="session_id" value="{$smarty.session.id}">

<!-- Меню -->
<div id="currencies_block">
<ul id="header">
<li class="move"></li>
<li class="menuID">ID</li>
<li class="name">Название меню</li>
</ul>
<div id="currencies">
{foreach from=$menus item="m"}
<ul class="sortable">
<li class="move"><div class="move_zone"></div></li>
<li class="menuID"><input name="menu[id][{$m->id}]" type="hidden" value="{$m->id|escape}" /><span>{$m->id|escape}</span></li>
<li class="name"><input name="menu[name][{$m->id}]" type="" value="{$m->name|escape}" /></li>
<li class="icons">
{if !$m@first}
<a class="delete" href="#" title="Удалить"></a>
{/if}
</li>
</ul>
{/foreach}
<ul id="new_currency" style='display:none;'>
<li class="move"><div class="move_zone"></div></li>
<li class="menuID"><input name="menu[id][]" type="hidden" value="" /></li>
<li class="name"><input name="menu[name][]" type="" value="" /></li>
<li class="icons"></li>
</ul>
</div>

</div>
<!-- Меню (The End)-->

<div id="action">
<input type=hidden name=action value=''>
<input type=hidden name=action_id value=''>
<input id='apply_action' class="button_green" type=submit value="Применить">
</div>
</form>
 
Назад
Сверху