Как удалить ссылки на панели управления учетной записью клиента

39

Я хочу удалить следующие ссылки в панели управления учетной записи клиента на левой панели?

  • Мои Приложения
  • Реестр подарков
  • Бонусные очки
  • Ссылка на подарочную карту

Я работаю в Magento 1.7 Community Edition. Любая помощь будет оценена.

Oshan
источник
Вы также можете использовать это бесплатное и простое расширение « включай и работай»
Жерар де Виссер
Magento, где что-то такое, казалось бы, легкое превращается во что-то столь излишне сложное.
Joshua34

Ответы:

52

Шаг 1. Перейдите на (yourPackage / YourTemplate / customer / account / navigation.phtml)

Шаг 2: заменить нижнюю строку

<?php $count = count($links); ?>
        **With**
<?php $_count = count($_links); /* Add or Remove Account Left Navigation Links Here -*/
      unset($_links['account']); /* Account Info */     
      unset($_links['account_edit']); /* Account Info */            
      unset($_links['tags']); /* My Tags */
      unset($_links['invitations']); /* My Invitations */
      unset($_links['reviews']);  /* Reviews */
      unset($_links['wishlist']); /* Wishlist */
      unset($_links['newsletter']); /* Newsletter */
      unset($_links['orders']); /* My Orders */
      unset($_links['address_book']); /* Address */
      unset($_links['enterprise_customerbalance']); /* Store Credit */
      unset($_links['OAuth Customer Tokens']); /* My Applications */
      unset($_links['enterprise_reward']); /* Reward Points */
      unset($_links['giftregistry']); /* Gift Registry */
      unset($_links['downloadable_products']); /* My Downloadable Products */
      unset($_links['recurring_profiles']); /* Recurring Profiles */
      unset($_links['billing_agreements']); /* Billing Agreements */
      unset($_links['enterprise_giftcardaccount']); /* Gift Card Link */
?>

Приведенный выше фрагмент кода содержит способ удалить все навигационные ссылки. Надеюсь, это поможет всем.

Ссылка Ссылка: https://github.com/Aproducktion/Magento-Remove-Dashboard-Links

Oshan
источник
5
Если вы можете что-то исправить, используя XML-макет, я бы посоветовал использовать жестко закодированное решение, подобное этому. @ Мариус, его ответ намного чище.
Сандер Мангель
1
@SanderMangel, ты имеешь в виду If you can't??
Пратик
2
Нет, он имеет в виду «Я бы посоветовал против »
Фабиан Шменглер
Этот ответ не препятствует доступу к базовым функциям систем, которые он пытается удалить - к ответу следует добавить заявление об отказе. Посещение правильных маршрутов или использование curl позволит полный беспрепятственный доступ.
Люк А. Лебер
Нет, он имеет в виду «я бы посоветовал против »
Xenocide8998
28

Я вижу 2 варианта здесь.

Первый и самый простой: просто найдите файлы макетов, которые добавляют эти пункты меню, и закомментируйте код для них.
Например My applicationsдобавляется app/design/frontend/{interface}/{theme}/layout/oauth.xmlчерез этот кусок XML

<customer_account>
    <reference name="customer_account_navigation">
        <action method="addLink" translate="label" module="oauth">
            <name>OAuth Customer Tokens</name>
            <path>oauth/customer_token</path>
            <label>My Applications</label>
        </action>
    </reference>
</customer_account>

Второй способ, который я не уверен на 100%, это добавить этот XML в local.xmlфайл макета вашей темы:

<customer_account>
    <reference name="customer_account_navigation">
        <action method="removeLinkByUrl"><url>oauth/customer_token</url></action>
    </reference>
</customer_account>

Вам нужно добавить один <action>тег для каждой ссылки, которую вы хотите удалить.

Существует также 3-й вариант, если вы вообще не используете модули, просто отключите их. Это также может повысить производительность.
Для этого создайте этот файл: app/etc/modules/Zzzz.xmlс этим содержанием:

<config>
    <modules>
        <Mage_Oauth>
             <active>false</active>
        </Mage_Oauth>
    </modules>
</config>

У вас могут быть некоторые проблемы, вот некоторые другие модули, которые вы хотите использовать, зависит от тех, которые вы хотите отключить.

Мариус
источник
Спасибо @Marius за ответ. Ну, я попробовал второй вариант (removeLinkByUrl), который вы предложили, прежде чем задавать вопрос. Но, похоже, это не сработало для меня.
Ошан
4
Второй вариант не может работать, потому Mage_Customer_Block_Account_Navigationчто не наследуется от Mage_Page_Block_Template_Links.
mpw
26

Существует расширение FOSS, которое добавляет опцию backend к ссылкам удаленной учетной записи.

Есть второй модуль (также FOSS), который добавляет removeLinkметод, чтобы вы могли использовать следующее в вашемlocal.xml

Отказ от ответственности: я разработчик второго расширения.

<customer_account>
        <reference name="customer_account_navigation">
            <action method="removeLink"><name>OAuth Customer Tokens</name></action>
            <action method="removeLink"><name>billing_agreements</name></action>
            <action method="removeLink"><name>recurring_profiles</name></action>
        </reference>
 </customer_account>
Alex
источник
Мои решения с открытым исходным кодом - мои любимые решения, в которых использовались несколько методов от переопределения local.xml до PHP.
Майкл Томпсон
5

Самое простое решение (внедрение и использование) я нашел , чтобы заменить Mage_Customer_Block_Account_Navigationв app/code/localи добавить removeLinkByNameметод, который делает то же самое, что ответ Oshan в делает, но может использоваться из файлов макет. Более традиционное переписывание классов также будет работать, но потенциально может вызвать конфликты с плагином.

Предупреждение! Непроверенные!

Более сложное решение было бы написать свой собственный модуль с Blockкоторой распространяется Mage_Customer_Block_Account_Navigationи включает в себя removeLinkByNameметод. Чтобы это работало, вы должны будете удалить / снять customer_account_navigationблокировку и заменить ее на новую для вашего модуля. С этого момента, когда бы вы ни customer_account_navigationссылались в макете, вы получите экземпляр с removeLinkByName.

теплый морской полярный воздух
источник
Я сделал второй вариант, это изрядная работа, но она работает. Это заняло у меня около двух часов, и я работаю штатным консультантом по Magento и разработчиком PHP / Linux. Если кому-то нужны подробности, пишите мне в личку.
silicrockstar
самое простое решение состоит в том, чтобы переопределить класс Core, когда есть много более аккуратных решений?
Риа Вейпрехт
5

Быстрое решение для удаления всех элементов списка «Моя учетная запись» ниже «Мои заказы», ​​включая соглашения о выставлении счетов, периодические профили, Мои приложения и Мои загружаемые продукты. Также будут удалены ссылки «Мой список желаний» и «Моя рассылка» на сайте, протестированные на Magento 1.9:

Закомментируйте строки 31 - 66 из app / design / frontend / default / YOURTHEME / layout / wishlist.xml (если его там нет, скопируйте его из app / design / frontend / rwd / default / layout / wishlist.xml)

<!--default>
    <reference name="top.links">
        <block type="wishlist/links" name="wishlist_link" />
        <action method="addLinkBlock"><blockName>wishlist_link</blockName></action>
    </reference>

    <!-- Mage_Wishlist -->
    <!--reference name="right">
        <block type="wishlist/customer_sidebar" name="wishlist_sidebar" as="wishlist" after="cart_sidebar" template="wishlist/sidebar.phtml" />
    </reference>
</default-->
<!--customer_account>
    <!-- Mage_Wishlist -->
    <!--reference name="customer_account_navigation">
        <action method="addLink" translate="label" module="wishlist" ifconfig="wishlist/general/active"><name>wishlist</name><path>wishlist/</path><label>My Wishlist</label></action>
    </reference-->
<!--/customer_account-->
<!--customer_account_index>
    <reference name="right">
        <action method="unsetChild"><name>wishlist</name></action>
    </reference>
</customer_account_index-->

Закомментируйте строки 47 - 65 из app / design / frontend / default / YOURTHEME / layout / newsletter.xml (если его там нет, скопируйте его из app / design / frontend / rwd / default / layout / newsletter.xml)

рассылка </ name> рассылка / управление / </ path> подписка на рассылку </ label> </ action> </ reference> </ customer_account ->

<!--newsletter_manage_index translate="label">
    <label>Customer My Account Newsletter Subscriptions</label>
    <update handle="customer_account"/>
    <reference name="my.account.wrapper">
        <block type="customer/newsletter" name="customer_newsletter">
            <block type="page/html_wrapper" name="customer.newsletter.form.before" as="form_before" translate="label">
                <label>Newsletter Subscription Form Before</label>
            </block>
        </block>
    </reference>
</newsletter_manage_index!-->

CSS (настроить в соответствии с вашими требованиями)

.block-account .block-content ul li:nth-last-child(1),  .block-account .block-content ul li:nth-last-child(2),  .block-account .block-content ul li:nth-last-child(3),  .block-account .block-content ul li:nth-last-child(4) {
display: none;
}

.cart-table .cart-links > li:last-child {
display:none;
}
Joshua34
источник
5

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

Вот что я сделал:

Из вашего пакета / YourTemplate / customer / account / navigation.phtml

        <?php foreach ($_links as $_link): ?>
            <?php $_last = ($_index++ >= $_count); ?>
            <?php if ($this->isActive($_link)): ?>
                <li class="current<?php echo ($_last ? ' last' : '') ?>" id="account-link-<?php echo $_index;?>"><strong><?php echo $_link->getLabel() ?></strong></li>
            <?php else: ?>
                <li<?php echo ($_last ? ' class="last"' : '') ?> id="account-link-<?php echo $_index;?>"><a href="<?php echo $_link->getUrl() ?>"><?php echo $_link->getLabel() ?></a></li>
            <?php endif; ?>
        <?php endforeach; ?>

Очевидно, тогда вы можете пойти

        #account-link-1 {
            display:none;
        }

Нет единого способа снять шкуру с кошки, но это быстрый и простой вариант, который не ставит под угрозу функциональность.

Томас Хардинг
источник
1
Следует четко отметить, что это не помешает пользователям получить доступ к функциональности, стоящей за этими функциями. Полный доступ - это либо редактирование CSS, либо быстрое редактирование адресной строки ... так что не полагайтесь на людей, не использующих эти функции.
Люк А. Лебер
Это достаточно справедливо, и я полностью понимаю, откуда ты. Я не хотел полностью удалять эту функциональность, но я хотел скрыть это, потому что клиент определенно чувствовал, что это может запутать их клиентов. Я думаю, каждому свое!
Томас Хардинг
5

Я думал, что лучшим решением было бы переписать блок. Это было упомянуто выше, но не было никакого примера:

Добавьте переписать в ваш config.xml в глобальном разделе:

<blocks>
    <customer>
        <rewrite>
            <account_navigation>Your_Module_Block_Customer_Account_Navigation</account_navigation>
        </rewrite>
    </customer>
</blocks>

Переопределить addLink в Mage_Customer_Block_Account_Navigation:

class Your_Module_Block_Customer_Account_Navigation extends Mage_Customer_Block_Account_Navigation
{
    private $exclude_links = null;

    public function addLink($name, $path, $label, $urlParams=array())
    {
        if (!$this->exclude_links) {
            $this->exclude_links = array(
                'OAuth Customer Tokens', /* My Applications */
                'downloadable_products', /* My Downloadable Products */
                'recurring_profiles', /* Recurring Profiles */
                'billing_agreements' /* Billing Agreements */
            );
        }

        if (!in_array($name, $this->exclude_links)) {
            return parent::addLink($name, $path, $label, $urlParams);
        }
    }
}

Массив exclude_links может извлечь из настроек конфигурации, если вы не хотите жестко кодировать исключенные ссылки.

Н Льюис
источник
3

это то, что я гуглил по этому поводу: http://magebase.com/magento-tutorials/5-useful-tricks-for-your-magento-local-xml/

Мы можем изменить почти все аспекты макета стандартного макета Magento, однако в некоторых случаях такой подход не работает. Примечательно, что это проявляется в ту минуту, когда вы хотите изменить блок top.links. Элементы в этом блоке добавляются с помощью метода действия addLink, поэтому, если вам интересно, как удалить некоторые ссылки из набора по умолчанию, ответ - вы не можете! К сожалению, класс блока page / template_links не реализует метод действия 'removeLink', поэтому прибегните к удалению всего блока, используя подход unsetChild, и добавьте блок ссылок обратно с нашими собственными ссылками, добавленными к нему в local.xml.

melaxon
источник
2

Сначала я хотел бы, чтобы вы сказали, что есть разные способы решения ваших проблем.

  1. Это самый простой способ найти код в layout.xmlфайле внутри базы, который вы хотите удалить, например: если я хочу удалить «Мои теги», просто прокомментируйте часть.

    <customer_account>
        <!-- Mage_Tag -->
        <reference name="customer_account_navigation">
            <action method="addLink" translate="label" module="tag"><name>tags</name><path>tag/customer/</path><label>My Tags</label></action>
        </reference>
    </customer_account>

    Но вы знаете, что мы не должны изменять базовый файл, поэтому можно выполнить еще один простой метод

  2. Отключение ссылки в файле шаблона. Для этого скопируйте navigation.phtmlфайл в тему (Примечание: структура папок должна быть такой же) из base\default\template\customer\account\navigation.phtml. что показано в ответе выше.

  3. Еще одна утомительная задача - переписать ваш основной модуль и создать метод «RemoveLinkByName».

aton1004
источник
2

Полное решение по удалению функций панели учетных записей включает в себя модификации как на стороне клиента, так и на стороне сервера. Если только клиентская часть удалена и / или скрыта, то ничто не мешает технически подкованным пользователям по-прежнему получать доступ к функциям, создавая маршруты в своем браузере вручную или используя более сложную «атаку» CURL (которая может включать в себя Токен CSRF и промах прямо).

Клиентская сторона легко достигается с помощью обновлений XML, о чем свидетельствует множество уже предоставленных ответов.

Серверная часть немного сложнее и требует понимания функциональности, которая удаляется.

Лично я бы пошел путем использования наблюдателей для условного возврата запрещенных кодов состояния HTTP на каждом из маршрутов удаляемой функции. Чтобы выяснить, какие маршруты следует соблюдать, откройте соответствующий файл контроллера и найдите каждое из интерфейсных действий, которые больше не должны быть доступны. Затем создайте модуль, который определяет поля конфигурации системы для мягкого отключения указанной функции. Используя эти поля конфигурации системы, условно обновите XML макета внешнего интерфейса и аналогично условно верните правильные коды ответов HTTP для каждого наблюдаемого маршрута.

Примеры кода для каждого из вышеперечисленных шагов можно найти через ваш любимый поисковик.

Люк А. Лебер
источник
1

Добавьте в файл local.xml этот код

<customer_account>
    <reference name="customer_account_navigation">
           <action method="addLink"><name>tags</name></action>
           <action method="addLink"><name>recurring_profiles</name></action>
           <action method="addLink"><name>newsletter</name></action>
           <action method="addLink"><name>billing_agreements</name></action>
           <action method="addLink"><name>OAuth Customer Tokens</name></action>
           <action method="addLink"><name>downloadable_products</name></action>
   </reference>   
</customer_account>

Протестировано в Magento 1.7.0.2

lavb
источник
В Magento 1.8.1.0 это приводит к предупреждению: отсутствует аргумент 2 для Mage_Customer_Block_Account_Navigation :: addLink ()
Энтони