r1 - 07 Sep 2007 - 14:22:07 - CharinyaKlakhangYou are here: SETEC Wiki >  Knowledge Web  > WebTechnologyCategory > RubyOnRails > ECommerceWebsiteLab07

E-commerce Website Lab07

สร้างเว็บไซต์ ส่วนของการส่งสินค้า

A. ขั้นตอนการสร้าง

   1. Run InstantRails
   2. สร้างหน้าจอ แสดงรายการสินค้าที่ถูกสั่งซื้อ (order)
      2.1 แก้ไข admin_controller.rb , เพิ่มเมธอด ship()
      2.2 แก้ไข Model ชื่อ order.rb
      2.3 สร้าง views ชื่อ ship.rhtml
      2.4 สร้าง views ชื่อ _order_line.rhtml
   3. ปรับแต่งการแสดงผล
      3.1 สร้าง Stylesheet ชื่อ admin.css
      3.2 แก้ไข layouts ชื่อ admin.rhtml
   4. สร้างการจัดส่งสินค้า
      4.1 แก้ไข admin_controller.rb
      4.2 แก้ไข Models ชื่อ order.rb
   5. แสดงผลลัพธ์

1. ฟังก์ชั่นแสดงรายการสินค้าที่ถูกสั่งซื้อ

หลังจากที่ลูกค้าได้ checkout รายการสินค้าเป็น order เรียบร้อยแล้ว ผู้ขายต้องส่งสินค้าเหล่านี้ ดังนั้นต้องสร้างส่วนของ shipping สำหรับส่งสินค้าตาม order ที่ได้รับมา โดยมีการระบุวัน-เวลาที่จัดส่งเพิ่มเข้าไปจาก admin

ผลของการเขียน code ในบทนี้คือ ในหน้าของ shipping ของ admin จะมีการแสดง order ที่ลูกค้าแต่ละคนสั่ง และมีปุ่ม checkbox สำหรับให้ admin เช็คว่า order นี้ส่งเรียบร้อยแล้ว

โดยจะต้องสร้างการทำงานนี้ในส่วนของ admin (controller : admin) มีการติดต่อกับ Model : order (เพิ่มวัน-เวลาเข้าไปในตาราง)

1.1 สร้างฟังก์ชั่นแสดงรายการสินค้าที่ถูกสั่งซื้อ (order)

เพิ่ม code ในไฟล์ admin_controller.rb ที่ app/controllers/admin_controller.rb ดังนี้


def ship
    @pending_orders = Order.pending_shipping
end


ecom2_new_product77.png

1.2 สร้างฟังก์ชั่นดึงข้อมูลจากตาราง Order

แก้ไข Model ชื่อ order.rb ที่ app/models/order.rb ดังนี้


def self.pending_shipping
    find(:all, :conditions => "shipped_at is null")
end


ecom2_new_product78.png

1.3 สร้างไฟล์แสดงรายการสินค้าที่ถูกสั่งซื้อ

1.3.1 สร้างไฟล์ views ชื่อ ship.rhtml ที่ app/views/admin/ship.rhtml

<div class="olheader">Orders To Be Shipped</div>

<%= form_tag(:action => "ship") %>

<table cellpadding="5" cellspacing="0">
<%= render(:partial => "order_line", :collection => @pending_orders) %>
</table>

<br />
<input type="submit" value=" SHIP CHECKED ITEMS " />

<%= end_form_tag %>
<br />


ecom2_new_product81.png

1.3.2 สร้างไฟล์ views ชื่อ order_line.rhtml ที่ _app/views/admin/_order_line.rhtml


<tr valign="top">

    <td class="olnamebox">
      <div class="olname"><%= h(order_line.name) %></div>
      <div class="oladdress"><%= h(order_line.address) %></div>
    </td>

    <td class="olitembox">
      <% order_line.line_items.each do |li| %>
        <div class="olitem">
          <span class="olitemqty"><%=  li.quantity %></span>
     <span class="olitemtitle"><%= li.product.title %></span>
        </div>
      <% end %>
    </td>

    <td>
      <%= check_box("to_be_shipped", order_line.id, {}, "yes", "no") %>
    </td>
  </tr>


ecom2_new_product84.png

1.4 ปรับรูปแบบการแสดงผล

แก้ไขไฟล์ Stylesheet ชื่อ admin.css ที่ public/stylesheets/ecommerce.css

/* order shipping screen */
.olheader {
  font: bold large sans-serif;
  color: #411;
  margin-bottom: 2ex;
}
.olnamebox, .olitembox {
  padding-bottom: 3ex;
  padding-right: 3em;
  border-top: 1px dotted #411;
}
.olname {
  font-weight: bold;
}
.oladdress {
  font-size: smaller;
  white-space: pre;
}
.olitemqty {
  font-size: smaller;
  font-weight: bold;
}
.olitemqty:after {
  content: " x ";
}
.olitemtitle {
  font-weight: bold;
}


shippingPage.png

2. ฟังก์ชั่นส่งสินค้า

2.1 เพิ่มฟังก์ชั่นส่งสินค้า

แก้ไขไฟล์ app/controllers/admin_controller.rb ที่ app/controllers/admin_controller.rb


def ship
    count = 0
    if things_to_ship = params[:to_be_shipped]
      count = do_shipping(things_to_ship)
      if count > 0
        count_text = pluralize(count, "order")
        flash.now[:notice] = "#{count_text} marked as shipped"
      end
    end
    @pending_orders = Order.pending_shipping
  end

  private

  def do_shipping(things_to_ship)
    count = 0
    things_to_ship.each do |order_id, do_it|
      if do_it == "yes"
        order = Order.find(order_id)
        order.mark_as_shipped
        order.save
        count += 1
      end
    end
    count
  end

  def pluralize(count, noun)
    case count
    when 0: "No #{noun.pluralize}"
    when 1: "One #{noun}"
    else    "#{count} #{noun.pluralize}"
    end
  end

2.2 เพิ่มฟังก์ชั่นในการระบุวันเวลาในการส่ง

แก้ไขไฟล์ order.rb ที่ app/models/order.rb

def mark_as_shipped
    self.shipped_at = Time.now
end

2.3 อธิบายการทำงานของฟังก์ชัน

จาก code ข้างต้น สามารถอธิบายได้ดังนี้

Method : ship()

  • เมื่อ admin เลือก order และกดปุ่ม "SHIP CHECKED ITEMS" แล้ว โปรแกรมจะ action มาที่ ship()
  • ship() เป็น method ใน controller: admin ซึ่งการทำงานหลัก คือการส่งสินค้าตาม order ของลูกค้า
  • และหน้าที่ Update ข้อมูลใน table : order ว่าส่งสินค้าเรียบร้อยแล้ว
 if things_to_ship = params[:to_be_shipped]  
  • เป็นเงื่อนไขว่า ค่าในพารามิเตอร์ชื่อ to_be_shipped มีค่าเป็น True จะนำมาใส่ในตัวแปรชื่อ things_to_ship และเข้าเงื่อนไขทันที
 count = do_shipping(things_to_ship) 
  • เรียก method : do_shipping() โดยส่งพารามิเตอร์ "things_to_ship" เข้าไป
  • do_shipping() จะ return จำนวน order ที่ admin จัดส่งไปมาใส่ตัวแปร count
 
 if count > 0
        count_text = pluralize(count, "order")
        flash.now[:notice] = "#{count_text} marked as shipped"
 end
  • ถ้า count มีค่ามากกว่า 0 จะแสดงข้อความออกมาบอก admin ว่าจัดส่งไปจำนวนกี่ order
 
   @pending_orders = Order.pending_shipping 
  • บรรทัดนี้ Model : order จะดึงทุก row ในตารางที่ติดต่ออยู่(ตาราง orders) ที่เป็นไปตามตามเงื่อนไขใน method : pending_shipping มาใส่ใน ตัวแปร array :@pending_orders

Method : do_shipping()

Method นี้รับค่าพารามิเตอร์เป็น things_to_ship

 
def do_shipping(things_to_ship)
    count = 0
    things_to_ship.each do |order_id, do_it|
      if do_it == "yes"
        order = Order.find(order_id)
        order.mark_as_shipped
        order.save
        count += 1
      end
    end
    count
  end
  • นำค่าของ things_to_ship(เป็นพารามิเตอร์ checkbox ทั้งหมด) มาทำการวนลูป เพื่อเช็คว่า checkbox ของ order ไหนมีค่าเป็น "yes"
  • ถ้าพบก็ให้นำค่า id ของ order (order_id) มา Update field เวลา ซึ่งเดิมเป็น null อยู่
  • โดยเวลาที่จะนำไป Update นั้นมาจาก mark_as_shipped() ซึ่งประกาศอยู่ใน Model : order.rb
  • จะ Update Table: order , Field : shipped_at

Method : pluralize()

method นี้ทำหน้าที่ print ข้อความออกมาแสดงผลให้กับ admin

def pluralize(count, noun)
    case count
      when 0: "No #{noun.pluralize}"
      when 1: "One #{noun}"
    else    "#{count} #{noun.pluralize}"
    end
end

  • รับพารามิเตอร์ count มา check เงื่อนไขแล้วแสดงข้อความออกมา


shippingPage2.png

toggleopenShow attachmentstogglecloseHide attachments
Topic attachments
I Attachment Action Size Date Who Comment
pngpng shippingPage.png manage 139.9 K 08 Jun 2007 - 11:21 UnknownUser  
pngpng ecom2_new_product77.png manage 83.2 K 08 Jun 2007 - 11:23 UnknownUser  
pngpng ecom2_new_product78.png manage 116.9 K 08 Jun 2007 - 11:23 UnknownUser  
pngpng ecom2_new_product81.png manage 81.6 K 08 Jun 2007 - 11:23 UnknownUser  
pngpng ecom2_new_product84.png manage 17.0 K 08 Jun 2007 - 11:25 UnknownUser  
pngpng shippingPage2.png manage 116.1 K 08 Jun 2007 - 11:43 UnknownUser  
Edit | Attach | Printable | Raw View | Backlinks: Web, All Webs | History: r1 | More topic actions
 
Powered by SETEC Wiki
Copyright ©2010 by National Electronics and Computer Technology Center, NECTEC.
Ideas, requests, problems regarding SETEC Wiki? Send feedback