Jump to content

Добавление меню из админки


Recommended Posts

1. в конец файла /api/Pages.php перед последней } вставляем

/*
* Создать меню
*/
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);
return $id;
}

/*
* Обновить меню
*/
public function update_menu($id, $group)
{
$query = $this->db->placehold("UPDATE __menu SET ?% WHERE id=? LIMIT 1", $menu, intval($id));
$this->db->query($query);
return $id;
}

/*
* Удалить меню
*/
public function delete_menu($id)
{
if(!empty($id))
{
$query = $this->db->placehold("UPDATE __pages SET menu_id=NULL WHERE menu_id=? LIMIT 1", intval($id));
$this->db->query($query);

$query = $this->db->placehold("DELETE FROM __menu WHERE id=? LIMIT 1", intval($id));
if($this->db->query($query))
return true;
}
return false;
}

2. в папку /simpla/ добавляем файл MenusAdmin.php следующего содержания

<?PHP

require_once('api/Simpla.php');

class MenusAdmin extends Simpla
{
function fetch()
{
if($this->request->method('post'))
{
// Действия с выбранными
$ids = $this->request->post('check');
if(is_array($ids))
switch($this->request->post('action'))
{
case 'delete':
{
foreach($ids as $id)
$this->pages->delete_menu($id);
break;
}
}
}

$menus = $this->pages->get_menus();

$this->design->assign('menus', $menus);
return $this->body = $this->design->fetch('menus.tpl');
}
}

3. в папку /simpla/ добавляем файл MenuAdmin.php следующего содержания

<?PHP require_once('api/Simpla.php'); class MenuAdmin extends Simpla { public function fetch() { if(isset($_POST)) { $menu->id = $this->request->post('id', 'integer'); $menu->name = $this->request->post('name'); $menu->position = $this->request->post('position'); if(empty($menu->id)) { $menu->id = $this->pages->add_menu($menu); $this->design->assign('message_success', 'Добавлено'); } else { $menu->id = $this->pages->update_menu($menu->id, $menu); $this->design->assign('message_success', 'Обновлено'); } $menu = $this->pages->get_menu(intval($menu->id)); } else { $id = $this->request->get('id', 'integer'); if(!empty($id)) $menu = $this->pages->get_menu(intval($id)); } if(!empty($menu)) { $this->design->assign('menu', $menu); } return $this->design->fetch('menu.tpl'); } }
Link to post
Share on other sites

4. в файле /simpla/design/html/pages.tpl перед {/capture} вставляем строку

<li><a href="{url module=MenusAdmin}">Меню</a></li>

5. в папке /simpla/design/html/ добавляем файл menus.tpl следующего содержания

{* Вкладки *}
{capture name=tabs}
{foreach from=$menus item=m}
<li {if $m->id == $menu->id}class="active"{/if}><a href="{url module=PagesAdmin menu_id=$m->id}">{$m->name}</a></li>
{/foreach}
<li><a href="{url module=MenusAdmin}">Меню</a></li>
{/capture}

{* Title *}
{$meta_title='Список меню' scope=parent}

{* Заголовок *}
<div id="header">
<h1>Список меню</h1>
<a class="add" href="index.php?module=MenuAdmin">Добавить меню</a>
</div>


<!-- Основная часть -->
<div id="main_list">

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

{foreach $menus as $menu}
<div class="row">
<div class="checkbox cell">
<input type="checkbox" name="check[]" value="{$menu->id}"/>
</div>
<div class="group_name cell">
<a href="index.php?module=MenuAdmin&id={$menu->id}">{$menu->name}</a>
</div>
<div class="group_discount cell">
{$menu->position}
</div>
<div class="icons cell">
<a class="delete" title="Удалить" href="#"></a>
</div>
<div class="clear"></div>
</div>
{/foreach}
</div>

<div id="action">
<label id="check_all" class="dash_link">Выбрать все</label>

<span id=select>
<select name="action">
<option value="delete">Удалить</option>
</select>
</span>

<input id="apply_action" class="button_green" type="submit" value="Применить">
</div>


</form>

</div>


{literal}
<script>
$(function() {

// Раскраска строк
function colorize()
{
$("#list div.row:even").addClass('even');
$("#list div.row:odd").removeClass('even');
}
// Раскрасить строки сразу
colorize();

// Выделить все
$("#check_all").click(function() {
$('#list input[type="checkbox"][name*="check"]').attr('checked', 1-$('#list input[type="checkbox"][name*="check"]').attr('checked'));
});

// Удалить
$("a.delete").click(function() {
$('#list input[type="checkbox"][name*="check"]').attr('checked', false);
$(this).closest(".row").find('input[type="checkbox"][name*="check"]').attr('checked', true);
$(this).closest("form").find('select[name="action"] option[value=delete]').attr('selected', true);
$(this).closest("form").submit();
});

// Подтверждение удаления
$("form").submit(function() {
if($('#list input[type="checkbox"][name*="check"]:checked').length>0)
if($('select[name="action"]').val()=='delete' && !confirm('Подтвердите удаление'))
return false;
});

});

</script>
{/literal}
Link to post
Share on other sites

6.в папке /simpla/design/html/ добавляем файл menu.tpl следующего содержания

{capture name=tabs}
{foreach from=$menus item=m}
<li {if $m->id == $menu->id}class="active"{/if}><a href="{url module=PagesAdmin menu_id=$m->id}">{$m->name}</a></li>
{/foreach}
<li><a href="{url module=MenusAdmin}">Меню</a></li>
{/capture}

{if $menu->id}
{$meta_title = $menu->name scope=parent}
{else}
{$meta_title = 'Новое меню' scope=parent}
{/if}


{if $message_success}
<!-- Системное сообщение -->
<div class="message message_success">
<span>{$message_success}</span>
{if $smarty.get.return}
<a class="button" href="{$smarty.get.return}">Вернуться</a>
{/if}
</div>
<!-- Системное сообщение (The End)-->
{/if}

{if $message_error}
<!-- Системное сообщение -->
<div class="message message_error">
<span>{$message_error}</span>
<a class="button" href="">Вернуться</a>
</div>
<!-- Системное сообщение (The End)-->
{/if}


<!-- Основная форма -->
<form method=post id=product enctype="multipart/form-data">
<input type=hidden name="session_id" value="{$smarty.session.id}">
<div id="name">
<input class="name" name=name type="text" value="{$menu->name|escape}"/>
<input name=id type="hidden" value="{$menu->id|escape}"/>
</div>

<!-- Левая колонка -->
<div id="column_left">

<!-- Позиция меню -->
<div class="block">
<ul>
<li><label class=property>Позиция</label><input name="position" class="simpla_inp" type="text" value="{$menu->position|escape}" /></li>
</ul>
</div>
<!-- Позиция меню (The End)-->
</div>
<!-- Левая колонка (The End)-->

<input class="button_green button_save" type="submit" name="" value="Сохранить" />

</form>
<!-- Основная форма (The End) -->

Вот вроде и все, теперь в админке на Страницах появилась вкладка "Меню"
З.Ы. Для редактирования и создания файлов пользуйтесь notepad++ или AkelPad

Link to post
Share on other sites
  • 3 weeks later...
  • 2 months later...

изначально не добавлялось меню (поставил автоинкрементацию ИД и заработало). Теперь не могу разобраться с редактированием, пишет

Warning: Placeholder substitution error. Diagnostics: "UPDATE s_menu SET UNKNOWN_PLACEHOLDER_0 WHERE id=NULL LIMIT 1" in Z:\home\localhost\www\simpla\api\Database.php on line 143

Warning: Query was empty [] in Z:\home\localhost\www\simpla\api\Database.php on line 116

Link to post
Share on other sites
  • 2 weeks later...
  • 11 months later...

Молодец Кроха!
Довольно часто приходиться добавлять новое меню.
Сам уже давно собираюсь сделать подобное но все руки не доходят. Все более из-за того, что вспоминаю про эту необходимость, когда в базу лезу меню добавить.

Предлагая автору движка, Денису Пикусову добавить этот код в следующие версии движка.

Кто ЗА??

Link to post
Share on other sites

Тут двоякое мнение. Вроде как и надо, но с другой стороны - это надо только 1 раз. Скорее всего стоит включить в функционал.

Link to post
Share on other sites

mart
Тут двоякое мнение


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

Без этого натяжка секционных шаблонов сводится к замазыванию или заполнению ссылками в лоб остальных меню, кроме верхнего.

А должны бы получаться именно управляемые шаблоны примерно такого плана. Пример 1.

Меню сверху - его наполнением управляет админ.
4 меню в подвале: Информация, Контакты, О скидках, О нас - тоже управляются из админпанели.



Еще шаблоны с несколькими управляемыми меню.

Пример 2



Пример 3



Так что нужно добавлять в движок поддержку работы с меню.

Link to post
Share on other sites

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

Link to post
Share on other sites

Какой виджет?! Всего три строки нужно, для вывода меню.

{foreach $pages as $p}{if $p->menu_id == 1}<p><a  href="{$p->url}">{$p->name|escape}</a></p>{/if}{/foreach}

Если сейчас в движок вставлять дополнительные возможности типа "добавление меню виджетами" он станет похожим на друпал или джумлу, где проще самому написать новое расширение чем разобраться с имеющимися возможностями.
А возможность в симпле добавлять меню из админки это приятная мелочь которая ни насколько не нагрузит вычислениями интернет магазин, но зато сэкономит многим не мало времени.
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...