Перейти к содержанию
Официальный форум поддержки Simpla

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


Рекомендуемые сообщения

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'); } }
Ссылка на сообщение
Поделиться на другие сайты

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}
Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты
  • 3 недели спустя...

Код исчез после обновления форума, чуть позже поправлю.
Странно, код на месте, но не отображается :(

Ссылка на сообщение
Поделиться на другие сайты
  • 2 месяца спустя...

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

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

Ссылка на сообщение
Поделиться на другие сайты
  • 2 недели спустя...

нашёл причину и этому:

в файле api/pages в строке:

$query = $this->db->placehold("UPDATE __menu SET ?% WHERE id=? LIMIT 1", $menu, intval($id));

заменить $menu на $group

Ссылка на сообщение
Поделиться на другие сайты
  • 11 месяцев спустя...

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

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

Кто ЗА??

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

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


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

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

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

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



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

Пример 2



Пример 3



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

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Если сейчас в движок вставлять дополнительные возможности типа "добавление меню виджетами" он станет похожим на друпал или джумлу, где проще самому написать новое расширение чем разобраться с имеющимися возможностями.
А возможность в симпле добавлять меню из админки это приятная мелочь которая ни насколько не нагрузит вычислениями интернет магазин, но зато сэкономит многим не мало времени.
Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...