Боковая панель администратора Есть решение

на данный момент панель администратора доступна только пользователям у которых в бекенде выставлены права администратора

в этом случае для редактирования карточки товара всем менеджерам и редакторам приходится выставлять админские права, но они начинают лезть везде куда им не следует, а ограничив их права они лишаются возможности с фронтенда сразу открывать редактор карточки товара

существует ли возможность показывать панель администратора не только пользователям из группы администраторов?

5 ответов

  • 2

    Можно сделать через кастом класс.

    В папку wa-apps/shop/lib/classes добавить файл shopCustom.class.php

    Содержимое файла

    <?php
    class shopCustom
    {
        public static function getContactCategories($contact_id)
        {
            $ccm = new waContactCategoriesModel();
            return $ccm->getContactCategories($contact_id);
        }
    
        public static function getContactCategoryIds($contact_id)
        {
            return array_keys(self::getContactCategories($contact_id));
        }
    }

    Создаем в теме саму боковую панель:

    В папке темы сайта создаем файл admin-sidebar.html с наполнением:

    {* ADMIN-only slideout sidebar for real-time theme customization *}
    
    {$settings = $theme_settings_config}
    {$array_name = "parent_settings"}
    {if $wa->param('app') == "site"}
        {$array_name = "settings"}
    {/if}
    
    {* QUICK LINKS ARRAY *}
    {$app = $wa->param('app')}
    {$action = $wa->param('action')}
    {$plugin = $wa->param('plugin')}
    {$quick_links = []}
    {if empty($plugin)}
        {if $app == 'shop' && $action == 'category' && !empty($category)}
            {$quick_links[] = [
                "name" => "[s`Edit`]",
                "href" => "{$wa_backend_url}shop/?action=products#/products/category_id={$category.id}"
            ]}
        {elseif $app == 'shop' && $action == 'product' && !empty($product)}
            {$quick_links[] = [
                "name" => "[s`Edit`]",
                "href" => "{$wa_backend_url}shop/?action=products#/product/{$product.id}/edit/"
            ]}
    
        {elseif $app == 'blog' && $action == 'post' && !empty($post)}
            {$quick_links[] = [
                "name" => "[s`Edit`]",
                "href" => "{$wa_backend_url}blog/?module=post&id={$post.id}&action=edit"
            ]}
    
        {elseif $action == 'page'}
            {$href = false}
            {if $app == 'shop' && !empty($page)}
                {$href = "{$wa_backend_url}{$app}/?action=storefronts#/pages/{$page.id}"}
            {elseif $app == 'blog' && !empty($page)}
                {$href = "{$wa_backend_url}{$app}/?module=pages#/{$page.id}"}
            {/if}
            {if $href}
                {$quick_links[] = [
                    "name" => "[s`Edit`]",
                    "href" => $href
                ]}
            {/if}
    
        {elseif $app == 'site' && !empty($page)}
            {$quick_links[] = [
                "name" => "[s`Edit`]",
                "href" => "{$wa_backend_url}{$app}/#/pages/{$page.id}"
            ]}
        {/if}
    {/if}
    
    {if $settings}
    
    {* Settings Block for Admin *}
    <aside id="s-live-setting-wrapper" class="s-live-setting-wrapper">
    
        <style>
            .s-live-setting-wrapper {
                display: none;
                position: fixed;
                top: 0;
                left: -293px;
                width: 300px;
                height: 100%;
                z-index: 999;
                -webkit-transition: left 400ms ease-in-out;
                -moz-transition: left 400ms ease-in-out;
                -o-transition: left 400ms ease-in-out;
                transition: left 400ms ease-in-out;
                -webkit-box-shadow: 0 0 3px 0 rgba(88,88,88,0.1);
                box-shadow: 0 0 3px 0 rgba(88,88,88,0.1);
                background: rgba(42,42,42,0.95);
                font: normal 14px/1.25 "Helvetica Neue", Arial, "sans-serif" !important;
                color: #fff;
            }
            .s-live-setting-wrapper * { font-family: "Helvetica Neue", Arial, "sans-serif"; }
            .s-live-setting-wrapper.is-shown {
                left: 0;
            }
            .s-live-setting-wrapper.is-shown .s-live-setting-header {
                background: #555;
            }
            .s-live-setting-wrapper.is-shown .s-live-setting-block {
                overflow-y: auto;
            }
            .s-live-setting-wrapper .s-live-setting-block {
                position: relative;
                padding: 0;
                box-sizing: border-box;
                word-wrap: break-word;
                overflow: hidden;
                max-height: 100%;
                z-index: 1;
            }
            .s-live-setting-wrapper .s-live-setting-block .s-live-setting-header {
                text-transform: uppercase;
                font-weight: bold !important;
                padding: 10px 15px;
                margin: 0;
                -webkit-transition: all 300ms ease-in-out;
                -moz-transition: all 300ms ease-in-out;
                -o-transition: all 300ms ease-in-out;
                transition: all 300ms ease-in-out;
                line-height: 21px;
                color: #ccc;
                cursor: pointer;
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper {
    
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper {
                overflow: hidden;
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper.is-active .header-block:after {
                -webkit-transform: rotate(90deg);
                transform: rotate(90deg);
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper.is-active .settings-list {
                padding: 10px;
                height: 100%;
                opacity: 1;
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper .header-block {
                position: relative;
                padding: 10px 42px 10px 15px;
                color: #fff;
                -webkit-transition: all 300ms ease-in-out;
                -moz-transition: all 300ms ease-in-out;
                -o-transition: all 300ms ease-in-out;
                transition: all 300ms ease-in-out;
                cursor: pointer;
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper .header-block:hover {
                color: #ffa;
                background: rgba(0,0,0,0.2);
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper .header-block:after {
                content: "";
                position: absolute;
                top: 0;
                right: 0;
                display: block;
                width: 42px;
                height: 100%;
                background: transparent url("{$wa_theme_url}img/icons/arrow-right.png") 50% no-repeat;
                background-size: 17px;
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper .settings-list {
                height: 0;
                padding: 0 7px;
                opacity: 0;
                overflow: hidden;
                background: rgba(42,42,42,0.6);
                color: #999;
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper .settings-list .set-item {
                padding: 4px;
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper .settings-list .set-item:first-child {
                margin-top: 0;
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper#header_scheme .settings-list,
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper#color_scheme .settings-list {
                line-height: 0;
                font-size: 0;
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper#header_scheme .settings-list .set-image-item,
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper#color_scheme .settings-list .set-image-item {
                display: inline-block;
                vertical-align: top;
                width: 45px;
                border: 2px solid transparent;
                margin: 3px;
                overflow: hidden;
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper#header_scheme .settings-list .set-image-item.is-active,
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper#color_scheme .settings-list .set-image-item.is-active {
                border-color: #fa0;
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper#header_scheme .settings-list .set-image-item img,
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper#color_scheme .settings-list .set-image-item img {
                max-width: 100%;
                margin-bottom: -4px;
                cursor: pointer;
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper#header_scheme .settings-list .set-image-item input,
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .group-wrapper#color_scheme .settings-list .set-image-item input {
                display: none;
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .buttons-wrapper {
                margin: 10px 13px;
            }
            .s-live-setting-wrapper .buttons-wrapper .loading {
                display: none;
                margin: 0 18px;
                vertical-align: baseline;
                height: 33px;
                background-position: 50% 50%;
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .buttons-wrapper.is-loading {
                position: relative;
                overflow: hidden;
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .buttons-wrapper.is-loading .submit-button {
                display: none;
            }
            .s-live-setting-wrapper .s-live-setting-block .theme-settings-wrapper .buttons-wrapper.is-loading .loading {
                display: inline-block;
            }
            .s-live-setting-wrapper .s-live-footer-wrapper {
                visibility: hidden;
                position: absolute;
                width: 100%;
                bottom: 0;
                left: -200%;
                padding: 1em;
                box-sizing: border-box;
                overflow: hidden;
                font-size: 0.9em !important;
                line-height: 1.3em !important;
                text-align: center;
                color: #777;
            }
            .s-live-setting-wrapper .s-live-footer-wrapper.is-shown {
                visibility: visible;
                left: 0;
            }
            .s-live-setting-wrapper .s-live-buttons-wrapper {
                position: absolute;
                left: 100%;
                top: 50%;
                margin: -45px 0 0;
            }
            .s-live-setting-wrapper .s-live-buttons-wrapper .link-item {
                display: block;
                width: 28px;
                height: 28px;
                margin: 6px 0 0;
                padding: 7px;
                background: rgba(42,42,42,0.95) 50% no-repeat;
                background-size: 20px;
    
                -webkit-border-radius: 0 7px 7px 0;
                -moz-border-radius: 0 7px 7px 0;
                border-radius: 0 7px 7px 0;
            }
            .s-live-setting-wrapper .s-live-buttons-wrapper .link-item:first-child {
                margin-top: 0
            }
            .s-live-setting-wrapper .s-live-buttons-wrapper .open-link {
                background-image: url("{$wa_theme_url}img/icons/settings.png");
            }
            .s-live-setting-wrapper .s-live-buttons-wrapper .edit-link {
                background-image: url("{$wa_theme_url}img/icons/edit.png");
                background-color: #fcd630;
            }
            .s-live-setting-wrapper .submit-button,
            .s-live-setting-wrapper button,
            .s-live-setting-wrapper input[type="text"],
            .s-live-setting-wrapper input[type="password"],
            .s-live-setting-wrapper input[type="button"],
            .s-live-setting-wrapper input[type="submit"],
            .s-live-setting-wrapper input[type="reset"],
            .s-live-setting-wrapper textarea {
                display: inline-block;
                vertical-align: top;
                margin: 0;
                padding: 10px 15px;
                box-sizing: border-box;
                outline: none;
                font-weight: normal;
                font-size: 14px;
                line-height: 1.5;
                text-decoration: none;
                color: #fff;
                border: 1px solid #ccc;
                -webkit-border-radius: 4px;
                -moz-border-radius: 4px;
                border-radius: 4px;
            }
            .s-live-setting-wrapper .submit-button {
                background: #fcd630; color: #000; outline: 0; padding: 5px 10px; border: 1px solid rgba(0,0,0,0.3); border-color: rgba(0,0,0,0.2) rgba(0,0,0,0.3) rgba(0,0,0,0.3) rgba(0,0,0,0.3); -webkit-appearance: none; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); border-radius: 3px; text-shadow: 0 1px 0px rgba(255,255,255,0.5);
                background: #fcd630 -moz-linear-gradient(top, rgba(255,255,255,0.5) 0%, rgba(255,255,255,0.0) 100%); /* FF3.6+ */
                background: #fcd630 -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0.5)), color-stop(100%,rgba(255,255,255,0.0))); /* Chrome,Safari4+ */
                background: #fcd630 -webkit-linear-gradient(top, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0.0) 100%); /* Chrome10+,Safari5.1+ */
                background: #fcd630 -o-linear-gradient(top, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0.0) 100%); /* Opera 11.10+ */
                background: #fcd630 -ms-linear-gradient(top, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0.0) 100%); /* IE10+ */
                background: #fcd630 linear-gradient(to bottom, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0.0) 100%); /* W3C */
                filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fde992', endColorstr='#fcd630',GradientType=0 ); /* IE6-9 */
            }
            .s-live-setting-wrapper .submit-button:hover {
                color: #000 !important;
                background: #fcd630 linear-gradient(to bottom, rgba(255,255,255,0.5) 0%,rgba(255,255,255,0.3) 100%);
            }
            .s-live-setting-wrapper .submit-button:active { background: #f3cd27; text-shadow: none; box-shadow: none; }
    
            .s-live-setting-wrapper select {
                width: 100%;
                padding: 10px 7px;
                box-sizing: border-box;
                -webkit-border-radius: 4px;
                -moz-border-radius: 4px;
                border-radius: 4px;
                border: 1px solid #ccc;
            }
            .s-live-setting-wrapper input[type="radio"],
            .s-live-setting-wrapper input[type="checkbox"] {
                position: relative;
                top: 1px;
            }
    
            @media (min-width: 1000px) {
                .s-live-setting-wrapper {
                    display: block;
                }
            }
            @-moz-keyframes infinity-rotate {
                from {
                    transform: rotate(0deg);
                }
                to {
                    transform: rotate(360deg);
                }
            }
            @-webkit-keyframes infinity-rotate {
                from {
                    transform: rotate(0deg);
                }
                to {
                    transform: rotate(360deg);
                }
            }
            @-o-keyframes infinity-rotate {
                from {
                    transform: rotate(0deg);
                }
                to {
                    transform: rotate(360deg);
                }
            }
            @keyframes infinity-rotate {
                from {
                    transform: rotate(0deg);
                }
                to {
                    transform: rotate(360deg);
                }
            }
        </style>
    
        {* Container *}
        
    
        {* Control Link *}
        <div class="s-live-buttons-wrapper">
            {if !empty($quick_links) && count($quick_links)}
                {foreach $quick_links as $link}
                    <a class="link-item edit-link" href="{$link.href}" title="{$link.name}"></a>
                {/foreach}
            {/if}
        </div>
    
        {* Show Admin Theme Settings on Front-End *}
        <script>
            ( function($) {
    
                {* SERVER VARS *}
                var ThemeSettingsHref = "{$wa_backend_url}{$wa_app}/?module=design&theme=default&action=themeSettings",
                    current_color_scheme = ( "{if $theme_settings.color_scheme}{$_color_scheme_class}{/if}" || false),
                    current_font_family = ( "{if $theme_settings.font_family}{$theme_settings.font_family}{/if}" || false),
                    current_font_size = ( "{if $theme_settings.font_size}{$theme_settings.font_size}{/if}" || false);
    
                var storage = {
                    activeWrapperClass: "is-shown",
                    activeGroupClass: "is-active",
                    activeClass: "is-active",
                    showClass: "is-shown",
                    $activeColor: $("#color_scheme .set-image-item.is-active"),
                    $activeHeader: $("#header_scheme .set-image-item.is-active"),
                    settings: {
                        "color-scheme": current_color_scheme,
                        "font-family": current_font_family,
                        "font-size" : current_font_size
                    },
                    getWrapper: function() {
                        return $("#s-live-setting-wrapper");
                    },
                    getSettingsBlock: function() {
                        return this.getWrapper().find(".s-live-setting-block");
                    },
                    getFooter: function() {
                        return this.getWrapper().find(".s-live-footer-wrapper");
                    }
                };
    
                var bindEvents = function() {
                    var $wrapper = storage.getWrapper(),
                        $showLink = $("#show-settings-link");
    
                    $showLink.on("click", function() {
                        toggleWrapper( $wrapper );
                    });
    
                    $wrapper.find(".s-live-setting-block").on("click", ".header-block", function() {
                        var $group = $(this).closest(".group-wrapper");
                        //
                        toggleGroup( $group );
                        //
                        footerToggle();
                    });
    
                    $wrapper.find(".s-live-setting-header").on("click", function() {
                        $showLink.trigger("click");
                    });
    
                    $("#font_size").on("click", "input[type=\"radio\"]", function() {
                        onSettingChange( $(this), "font-size" );
                    });
    
                    $("#font_family").on("click", "input[type=\"radio\"]", function() {
                        onSettingChange( $(this), "font-family" );
                    });
    
                    $("#color_scheme").on("click", "label", function(event) {
                        var $input = $(this).find("input[type=\"radio\"]");
                        $input.attr("checked",true);
                        onColorSchemeChange( $input, "color-scheme" );
                        event.preventDefault();
                    });
    
                    $("#header_scheme").on("click", "label", function(event) {
                        var $input = $(this).find("input[type=\"radio\"]");
                        $input.attr("checked",true);
                        onHeaderSchemeChange( $input );
                        event.preventDefault();
                    });
    
                    $("#save-config-settings-button").on("click", function() {
                        saveConfigSettings( $(this).closest("form") , ThemeSettingsHref);
                    });
                };
    
                var footerToggle = function() {
                    var $wrapper = storage.getWrapper(),
                        $settings = storage.getSettingsBlock(),
                        $footer = storage.getFooter(),
                        wrapper_height = $wrapper.outerHeight(),
                        settings_height = $settings.outerHeight(),
                        footer_height = $footer.outerHeight();
    
                    var show_footer = (wrapper_height - settings_height > footer_height);
    
                    if (show_footer) {
                        $footer.addClass(storage.showClass);
                    } else {
                        $footer.removeClass(storage.showClass);
                    }
                };
    
                var onColorSchemeChange = function( $input, widget_name ) {
                    var $html = $("html"),
                        $imageItem = $input.closest(".set-image-item"),
                        new_html_class = $imageItem.data("value"),
                        current_body_class = storage.settings[widget_name];
    
                    // Remove old Class
                    if (current_body_class) {
                        $html.removeClass(current_body_class);
                    }
    
                    // Add New Class
                    $html.addClass(new_html_class);
    
                    // Clear Old Item
                    var $activeColor = storage.$activeColor;
                    if ($activeColor && $activeColor.length) {
                        $activeColor.removeClass(storage.activeClass);
                    }
    
                    // Marking Item
                    $imageItem.addClass(storage.activeClass);
                    storage.$activeColor = $imageItem;
    
                    // Update widget settings
                    storage.settings[widget_name] = new_html_class;
                };
    
                var onHeaderSchemeChange = function( $input ) {
                    var $imageItem = $input.closest(".set-image-item"),
                        new_html_class = $imageItem.data("value"),
                        $header = $("#globalnav"),
                        activeClass = "light";
    
                    if (new_html_class == "header_scheme_white") {
                        $header.addClass(activeClass);
    
                    } else if (new_html_class == "header_scheme_black") {
                        $header.removeClass(activeClass);
                    }
    
                    // Clear Old Item
                    var $activeColor = storage.$activeHeader;
                    if ($activeColor && $activeColor.length) {
                        $activeColor.removeClass(storage.activeClass);
                    }
    
                    // Marking Item
                    $imageItem.addClass(storage.activeClass);
                    storage.$activeHeader = $imageItem;
                };
    
                var onSettingChange = function($element, widget_name) {
                    var $html = $("html"),
                        old_class = storage.settings[widget_name],
                        new_class = $element.val();
    
                    if (old_class) {
                        $html.removeClass(old_class);
                    }
                    // Add New Class
                    $html.addClass(new_class);
    
                    // Update widget settings
                    storage.settings[widget_name] = new_class;
                };
    
                var saveConfigSettings = function( $form, href ) {
                    var $deferred = $.Deferred(),
                        $button_wrapper = $form.find(".buttons-wrapper");
    
                    // Loading Animation
                    animationIconToggle($button_wrapper);
    
                    $.post( href, $form.serializeArray(), function(request) {
                        $deferred.resolve(request);
                    });
    
                    $deferred.done( function(request) {
                        // Remove animation
                        animationIconToggle($button_wrapper);
    
                        // Hide
                        $("#show-settings-link").trigger("click");
                    });
    
                };
    
                // Loading Animation
                var animationIconToggle = function( $button_wrapper ) {
                    var loading_class = "is-loading";
                    $button_wrapper.toggleClass(loading_class);
                };
    
                var toggleWrapper = function( $wrapper ) {
                    $wrapper.toggleClass(storage.activeWrapperClass);
                };
    
                var toggleGroup = function( $group ) {
                    $group.toggleClass(storage.activeGroupClass);
                };
    
                $(document).ready( function() {
                    //
                    footerToggle();
                    //
                    bindEvents();
                });
    
            })(jQuery);
        </script>
    </aside>
    
    {/if}

    В файл index.php теме сайта добавить

    {if in_array(3, shopCustom::getContactCategoryIds($wa->user('id')))}
           {include file="admin-sidebar.html" inline}
    {/if}

    Где 3 это Id созданной мной категории "Админы и редакторы" (Не путайте категории с группой)

    Как узнать id категории


    • +1
      ®man ®man 19 июля 2016 17:51 #

      добавил класс

      файл admin-sidebar.html взят из дефолтной темы, как я понял

      добавил в index.php код


      {if in_array(3, shopCustom::getContactCategoryIds($wa->user('id')))}
             {include file="admin-sidebar.html" inline}
      {/if}

      при смене прав пользователя:


      боковая иконка (ссылка на редактирование карточки) во фронтэнде исчезает (

  • 1

    А этих пользователей в категорию добавили?

    • +1
      ®man ®man 19 июля 2016 18:10 #

      они изначально там в категории были

      id категории прописываю в код: {if in_array(_,

      захожу под разными пользователями состоящими в одной категории, у пользователя с административным доступом ссылка редактирования присутствует, у пользователя с ограниченным доступом – нет

  • 1
    ®man 19 июля 2016 19:14 #

    на сколько я понял, не важно к какой категории принадлежит пользователь

    если он не состоит в группе администраторов, то боковая панель у него не работает

  • 1

    Очень странно, у меня менеджер, состоящий в созданной группе "Отдел продаж" и включенный в категорию Администраторы и редакторы видит боковую панель... (В группе Администраторы он не состоит. Имеет ограниченный доступ к контактам и магазину)

    Вы, при добавлении shopCustom.class.php тег php не закрывали?

    • +1
      ®man ®man 20 июля 2016 12:24 #

      у группы "Отдел продаж" какие права в бекенде?


      весь код добавлял как указано


  • 1

    Ограниченный доступ...

    • +1
      ®man ®man 20 июля 2016 13:59 #

      повторил всё то же самое локально – работает

      буду ковырять сервер

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите