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


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

www.chinamaker.net 2025-02-12 13:52:38 admin

如何在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  门户    


苏州远鼎

运用前沿科学技术,苏州远鼎信息技术有限公司以开源管理软件产品为核心,为企业和政府组织提供软件及服务,是OpenERP(Odoo)专业服务商,中国开源管理软件服务市场的领跑者。

Read More

远鼎产品

联系远鼎

  • 苏州工业园区星湖街328号22栋301
  • +86-0512-69361217
  • odoo@chinamaker.net
  • www.chinamaker.net