? Editing: Post:21.body Save Delete Cancel
Content changed Sign & Publish new content

未垤

嘗試以 ZeroBlog 作 tweet

訂閱已訂閱

歸檔
標簽

最新評論:

Add new post

Title

21 hours ago · 2 min read ·
3 comments

【標簽】
Body
閱讀餘下部分

ZeroTalk 定製欄位(field)

on Oct 08, 2016
【標簽】ZeroDev

緒言

爲了偷懶,外食記的實作是基於ZeroTalk.
ZeroTalk 主題有標題(title)、正文(body)兩個欄位(其實還有自動生成的id和added)。
下文以添加「城市」(city)欄位爲例介紹ZeroTalk定製欄位的方法。

架構

ZeroNet資料庫,寫入通過data.json文件,讀取通過據json文件生成的sqlite資料庫。添加欄位也從這2個角度入手。

寫入

結構定義

data.json的結構由dbschema.json描述,主要部分是tables.
加入city欄位:

"tables": {
        "topic": {
            "cols": [
                ["city", "TEXT"],

提交

提交通過TopicList.prototype.submitCreateTopic函數。

title = $(".topic-new #topic_title").val().trim();
body = $(".topic-new #topic_body").val().trim();

可以看到,titlebody的處理是一樣的,都是移除多餘空格。類似地,我們加上city:

city = $(".topic-new #topic_city").val().trim();

讀取HTML表單中的數據之後,submitCreateTopic返回User.getData函數,其中涉及到topic結構的是這段:

topic = {
        "topic_id": data.next_topic_id,
        "title": title,
        "body": body,
        "added": Time.timestamp()
};

在其中加上"city": city,即可。

然後User.getData又進一步返回User.publishData函數,在提交數據之後清空表單,
其中清空表單正文的語句爲:

$(".topic-new #topic_body").val("");

類似地,我們清空表單的「城市」欄位:

$(".topic-new #topic_city").val("");

讀取

通過TopicList.prototype.loadTopics函數從sqlite資料庫讀取帖子,
其中sql語句中使用了topic.*, 因此我們剛剛添加的city欄位能被讀取到。

loadTopics中,對每個topic運用TopicList.prototype.applyTopicData函數,
這裏我們把topic.city的內容填入.city元素:

$(".city", elem).text(topic.city);

除了顯示帖子時需要顯示city外,編輯帖子時也需要顯示city:

if (topic.topic_creator_address === Page.site_info.auth_address) {
    ...
    $(".city", elem).attr("data-editable", "city").data("content", topic.city);
}

遷移已有帖子

  1. 編寫腳本修改data.json文件,加上city欄位。
  2. 使用dbRebuild命令重建sqlite資料庫。

習題

  1. 修改HTML和CSS,使city欄位真正顯示在頁面上。
  2. 修改dbschema中的feeds及相應JavaScript, 使得訂閱的newsfeed中也顯示city.
  3. 分別添加地址、電話、營業時間欄位(這些欄位爲空時不顯示)。

2 條評論:

user_name1 day ago
回覆
Body
rainlimeon Oct 14, 2016
回覆

感谢~

p2pon Oct 11, 2016
回覆

终于看到你的博客了,支持!
确实没有ZeroNet点评类网站,外食記是个很好的尝试。
支持克隆的话,就能简单地弄出类豆瓣的电影书籍点评站、类什么值得买的商品优惠点评站……

<< >>
This page is a snapshot of ZeroNet. Start your own ZeroNet for complete experience. Learn More