天天看點

odoo路由器系列(Controllers)—— (章節一)

大家好,

今天,我們來講講odoo 中的 Controller(路由器),它的主要功能,是提供将web頁面中的資訊,進行路由。

首先,我們希望得到的最終效果樣式:一個網站頁面,包含:公司、使用者、聯系人等等資訊。

odoo路由器系列(Controllers)—— (章節一)

步驟1:建立路由器

在你建立一個網頁前,你需要做的第一步是建立一個路由器(Controller)。這個路由器,會告訴Odoo 某個URL的具體網頁指向。打開您的子產品,建立一個檔案夾,将其命名為“Controllers”。

在建立好後,建立一個_init_檔案,并添加以下代碼:

# -*- coding: utf-8 -*-
from . import example
           

這樣,你已經成功把example檔案,引入odoo庫

步驟1.1:建立路由器函數

讓我們來建立第一個路由器,首先,我們先看看下面的一段代碼:

# -*- coding: utf-8 -*-
from odoo import http

class Example(http.Controller):
    @http.route('/example', type='http', auth='public', website=True)
    def render_example_page(self):
        return http.request.render('create_webpage_demo.example_page', {})

    @http.route('/example/detail', type='http', auth='public', website=True)
    def navigate_to_detail_page(self):
        # This will get all company details (in case of multicompany this are multiple records)
        companies = http.request.env['res.company'].sudo().search([])
        return http.request.render('create_webpage_demo.detail_page', {
          # pass company details to the webpage in a variable
          'companies': companies})
           

這段代碼的含義是什麼呐?

@http.route 會告訴odoo 我們希望連結 /example 至 一個指定頁面。這個方法裡,我們看到了4個函數:

‘/example’: 這段代碼用于定義,URL的網頁指向

type=’http’:這段代碼,用于說明網頁運作于http協定。(其他協定:)

auth=’public’:告訴Odoo誰可以通路網頁。(其他選項包含:’user’,’public’,’none’)

website=’True’:說明,此方法為網頁

步驟1.2:告訴odoo頁面位置

傳回方法,告訴odoo哪個位置來調用原始頁面。

return http.request.render('create_webpage_demo.example_page', {})
           

這段代碼,http.request.render 會調用odoo架構裡的 渲染器。用來渲染出,相應的效果。這裡的create_webpage_demo是我們的子產品名,example_page是我們的檔案名。

注意:方法裡有個{},這個字典的主要用途是來進行傳值,傳回給網頁。後面會進一步講到。

步驟2:建立網頁視圖

在manifest.py檔案中,建立視圖檔案,example_webpage.xml

然後,編輯檔案: 【首先,讓我們看看代碼】

<odoo>
  <data>
    <template id="example_page" name="Example page" page="True">
      <t t-call="website.layout">
        <div class="oe_structure">
          <div class="container">
            <center><h3>Title</h3></center>
            <p>
              You can add all your content here.<br/>
              <a t-attf-href="/example/detail" class="btn btn-info">Company detail page</a>
            </p>
          </div>
        </div>
      </t>
    </template>
</odoo>
           

代碼一向比較冗長,很難看懂。我們一步一步來看。首先,我們看到有個id = “example_page”。這是什麼?這裡就是我們前面用路由器(Controllers)裡面定義的頁面。這樣,odoo就可以知道,我們需要它渲染的頁面是目前我們正在編輯的代碼。

然後,我們看到 page="True" 标簽,這樣odoo架構才可以知道需要将此xml渲染為網頁,而不是單純的資料傳回。接下來:

這段代碼,是因為前端界面是很多css 檔案,jquery 檔案等等組成,我們的網頁需要通過調用odoo原生的視圖模闆,并把目前xml檔案中的值,填入原生視圖模闆中後,進行渲染出相應的網頁。

這裡的,

,就是用來帶出相應的css、js、jquery等等檔案。

步驟2.1:檢視視圖

現在,我們就可以來看看,我們寫出來的代碼最後是什麼樣子。

打開浏覽器,進入 example 界面,你可以看到如圖所示的網頁。

odoo路由器系列(Controllers)—— (章節一)

步驟2.2:子產品方法二

我們現在為我們的控制器,建立第二個方法。

讓我們看看以下代碼:

@http.route('/example/detail', type='http', auth='public', website=True)
def navigate_to_detail_page(self):
# This will get all company details (in case of multicompany this are multiple records)
    companies = http.request.env['res.company'].sudo().search([])
    return http.request.render('create_webpage_demo.detail_page', {
      # pass company details to the webpage in a variable
      'companies': companies})
           

這段代碼裡,我們把資料通過 字典{},傳入網頁前端。

步驟2.3:方法傳值

我們看到,因為沒有任何代碼用來傳值,您也可以在路由器中讀取資料庫中的值。

通常情況下,我們使用下面的方法在模型中調用資料庫的值。

companies = self.env['res.company'].search([])

但是,在 路由器中,我們是無法使用這個方法的。

必須使用,下面的方法進行資料庫資料調用。

companies = http.request.env['res.company'].sudo().search([])

大家看到,我們這裡添加了 sudo() 方法,為什麼?因為,我們希望路由器中的方法,像管理者一樣,可以随意調用資料庫中的資料,同時不會遇到任何安全問題。

注意:這裡,我們将所有的公司資料都傳入的前端。【{'companies': companies}】

**步驟3:詳細視圖

**

最後,我們來建立我們的詳細視圖。

<template id="detail_page" name="Detail page" page="True">
      <t t-call="website.layout">
        <div class="oe_structure">
          <div class="container">
            <center><h3>Company detail page</h3></center>
            <t t-foreach="companies" t-as="company">
              <h4><span t-esc="company.name"/></h4>
              <table class="table-striped table">
                <tr>
                  <td>Phone:</td>
                  <td><span t-esc="company.phone"/></td>
                </tr>
                <tr>
                  <td>E-mail:</td>
                  <td><span t-esc="company.email"/></td>
                </tr>
                <tr>
                  <td>Address:</td>
                  <td>
       <span t-esc="company.street"/> <span t-esc="company.street2"/><br/>
       <span t-esc="company.city"/> <span t-esc="company.country_id.name"/>
                  </td>
                </tr>
              </table>
            </t>
          </div>
        </div>
      </t>
    </template>
           

初看這段代碼,一臉懵逼。首先,路由器通過 detail_page 定位到目前這個檔案。

然後,我們用了一段循環語句,t t-foreach 來将從後端傳回的資料進行前端展示。

<t t-foreach="companies" t-as="company"> // 這就是循環,類似C 裡面的Loop
           

因為,這裡使用了一個foreach語句,您可以通路一切公司資料。通路文法為:”company.field_name”

<h4><span t-esc="company.name"/></h4>
           

步驟4:檢視效果

最後,就生成了我們希望看到的網頁。(通路: /example/detail)

odoo路由器系列(Controllers)—— (章節一)