Odoo中文网|Odoo实施培训

 找回密码
 立即注册
搜索
热搜: Odoo OpenERP 实施
查看: 2138|回复: 0
打印 上一主题 下一主题

如何在Odoo 18的客户门户中添加自定义菜单、列表视图和过滤

[复制链接]

63

主题

75

帖子

1237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1237
跳转到指定楼层
楼主
发表于 2025-2-12 13:56:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何在Odoo 18的客户门户中添加自定义菜单、列表视图和过滤器
Odoo 18是Odoo广泛的企业管理套件中的最新版本,以其灵活性和全面的功能而闻名。此更新带来了许多增强功能和特性,进一步提升了其对各种规模企业的价值。Odoo的一个突出特点是其客户门户,它允许公司为客户提供对其订单、发票、支持票据等的个性化访问。为了充分利用客户门户的优势,通常需要根据特定的业务需求对其进行自定义。
Odoo 18中的客户门户为客户提供了一个安全的在线空间,用于管理其信息并与公司的服务进行交互。这个直观的平台使客户能够轻松跟踪订单、查看发票、监控交付情况以及访问项目任务等功能,具体取决于您启用的模块。
要在“我的账户”门户中创建新菜单并设置列表/表单视图,请按照以下步骤操作。例如,自定义菜单现已添加到“车队”客户门户中。


添加自定义菜单
要在网站客户门户中添加自定义菜单,请使用以下XML模板:
<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <template id="portal_fleet" name="Fleet" inherit_id="portal.portal_breadcrumbs" priority="30">
        <xpath expr="//ol[hasclass('o_portal_submenu')]" position="inside">
            <li t-if="page_name == 'fleet'" t-attf-class="breadcrumb-item #{'active ' if fleet else ''}">
                <a t-if="fleet" t-attf-href="/fleet?{{ keep_query() }}">车队</a>
                <t t-else="">车队</t>
            </li>
        </xpath>
    </template>
    <template id="portal_my_home_menu_fleet" name="Fleet" inherit_id="portal.portal_my_home"
              customize_show="True" priority="30">
        <xpath expr="//div[hasclass('o_portal_docs')]" position="before">
            <t t-set="portal_client_category_enable" t-value="True"/>
        </xpath>
        <div id="portal_client_category" position="inside">
            <t t-call="portal.portal_docs_entry">
                <t t-set="icon" t-value="'/test_model/static/src/image/fleet_image.jpg'"/>
                <t t-set="title">车队</t>
                <t t-set="url" t-value="'/Fleet'"/>
                <t t-set="text">查看车辆</t>
                <t t-set="placeholder_count" t-value="'portal_fleet'"/>
            </t>
        </div>
    </template>
    <template id="portal_my_home_fleet_views" name="My Fleet">
        <t t-call="portal.portal_layout">
            <t t-set="breadcrumbs_searchbar" t-value="True"/>
            <t t-call="portal.portal_searchbar">
                <t t-set="title">车队</t>
            </t>
            <t t-call="portal.portal_table">
                <thead>
                    <tr class="active">
                        <th class="text-left">车辆名称</th>
                        <th class="text-center">车牌号</th>
                        <th class="text-center">型号</th>
                        <th class="text-end">状态</th>
                    </tr>
                </thead>
                <t t-foreach="fleet" t-as="record">
                    <tr>
                        <td class='text-left'>
                            <span t-field="record.name"/>
                        </td>
                        <td class='text-center'>
                            <span t-field="record.license_plate"/>
                        </td>
                        <td class='text-center'>
                            <span t-field="record.model_id.name"/>
                        </td>
                        <td class='text-end'>
                            <span t-field="record.state_id"/>
                        </td>
                    </tr>
                </t>
            </t>
        </t>
    </template>
</odoo>
创建控制器函数
为了创建自定义菜单并显示它,必须在 Python 控制器中定义一个函数。可以使用以下 Python 代码实现:
from odoo import http
from odoo.http import request
from odoo.addons.portal.controllers.portal import CustomerPortal

class CustomPortal(CustomerPortal):
    def _prepare_home_portal_values(self, counters):
        values = super()._prepare_home_portal_values(counters)
        if 'portal_fleet' in counters:
            values['portal_fleet'] = request.env[
                'fleet.vehicle'].sudo().search_count([])
        return values
为了重定向到模板中指定的车队列表视图,必须创建一个控制器函数来显示列表视图。可以将其放在同一个 Python 控制器中。
    @http.route(['/Fleet', '/Fleet/page/<int:page>'], type='http', auth="user", website=True)
    def portal_fleet(self, search=None, search_in='All'):
        """To search the fleet vehicles data in the portal"""
        searchbar_inputs = {
            'All': {'label': 'All', 'input': 'All', 'domain': []},
            'Vehicle Name': {'label': 'Vehicle Name', 'input': 'Vehicle Name', 'domain': [('name', 'like', search)]},
            'License Plate': {'label': 'License Plate', 'input': 'License Plate', 'domain': [('license_plate', 'like', search)]},
            'Status': {'label': 'Status', 'input': 'Status', 'domain': [('state_id.name', 'like', search)]},
        }
        search_domain = searchbar_inputs[search_in]['domain']
        fleet = request.env['fleet.vehicle'].sudo().search([
            ('driver_id', '=', request.env.user.partner_id.id)])
        search_fleet = fleet.search(search_domain)
        return request.render('test_model.portal_my_home_fleet_views',
                              {
                                  'fleet': search_fleet,
                                  'page_name': 'fleet',
                                 'search': search,
                                 'search_in': search_in,
                                  'searchbar_inputs':searchbar_inputs
                              })
以下是带有搜索选项的列表视图,其中记录是根据指定的搜索值提取的。


添加搜索栏过滤器
要在列表视图中添加搜索栏筛选器,需要以字典格式定义它们,其中每个筛选器对应一个标签和一个域。例如:
        # Define the search bar filters
        searchbar_filters = {
            'All': {'label': 'All', 'domain': []},
            'Registered': {'label': 'Registered', 'domain': [('state_id.name', '=', 'Registered')]},
            'Downgraded': {'label': 'Downgraded', 'domain': [('state_id.name', '=', 'Downgraded')]},
        }
filter_domain = searchbar_filters.get(filterby, searchbar_filters['All'])['domain']
以下图片展示了应用筛选器后的列表视图更新版本。在这个示例中,筛选器仅显示已注册的车辆。如果选择 “全部”,则会显示完整列表,不应用任何筛选器。


完整的控制器代码
这是完整更新后的列表视图控制器,包含更新后的筛选和搜索功能。
from odoo import http
from odoo.http import request
from odoo.addons.portal.controllers.portal import CustomerPortal
class CustomPortal(CustomerPortal):
    def _prepare_home_portal_values(self, counters):
        values = super()._prepare_home_portal_values(counters)
        if 'portal_fleet' in counters:
            values['portal_fleet'] = request.env[
                'fleet.vehicle'].sudo().search_count([])
        return values
    @http.route(['/Fleet', '/Fleet/page/<int:page>'], type='http', auth="user", website=True)
    def portal_fleet(self, search=None, search_in='All', filterby='All',groupby='none'):
        """To search the fleet vehicles data in the portal"""
        searchbar_inputs = {
            'All': {'label': 'All', 'input': 'All', 'domain': []},
            'Vehicle Name': {'label': 'Vehicle Name', 'input': 'Vehicle Name', 'domain': [('name', 'like', search)]},
            'License Plate': {'label': 'License Plate', 'input': 'License Plate', 'domain': [('license_plate', 'like', search)]},
            'Status': {'label': 'Status', 'input': 'Status', 'domain': [('state_id.name', 'like', search)]},
        }
        # Define the search bar filters
        searchbar_filters = {
            'All': {'label': 'All', 'domain': []},
            'Registered': {'label': 'Registered', 'domain': [('state_id.name', '=', 'Registered')]},
            'Downgraded': {'label': 'Downgraded', 'domain': [('state_id.name', '=', 'Downgraded')]},
        }
        search_domain = searchbar_inputs[search_in]['domain']
        filter_domain = searchbar_filters.get(filterby, searchbar_filters['All'])['domain']
        combined_domain = search_domain + filter_domain
        fleet = request.env['fleet.vehicle'].sudo().search([
            ('driver_id', '=', request.env.user.partner_id.id)])
        search_fleet = fleet.search(combined_domain)
        return request.render('test_model.portal_my_home_fleet_views',
                              {
                                  'fleet': search_fleet,
                                  'page_name': 'fleet',
                                 'search': search,
                                 'search_in': search_in,
                                  'searchbar_inputs': searchbar_inputs,
                                  'filterby': filterby,
                                  'searchbar_filters': searchbar_filters,
                                  'default_url': '/Fleet',
                              })
总结
通过在Odoo 18的客户门户中添加自定义菜单、列表视图和过滤器,可以显著改善用户交互体验。通过设置特定的菜单项、开发用于数据管理的控制器以及直观的搜索和过滤功能,您可以打造一个高效且用户友好的体验。这种自定义使用户能够轻松访问和管理其信息,从而提高参与度和满意度。





相关标签 TAG :  odoo  门户   



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|技术支持|开发手册|Odoo中文网-远鼎旗下odoo培训网站 ( 苏ICP备15039516号 )

GMT+8, 2025-5-9 23:36 , Processed in 0.100412 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表