drupal: ลองติดตั้งโมดูล Import HTML

จากคราวก่อนที่ทดลองใส่โค๊ดตัวอย่างลงในเอกสารต้นฉบับเรื่อง python: Adodb Function Reference with example รู้สึกว่าอ่านง่ายดี คล้ายเอกสารของ php ที่เขามีตัวอย่างประกอบตลอด
เลยคิดว่า ถ้าเราสามารถเอาเอกสาร HTML ต้นฉบับ ที่เป็นคู่มือไพธอน เอามาใส่ตัวอย่างเล็ก ๆ น้อย ๆ ด้วยก็น่าจะดี
ลองศึกษา Drupal ดู พบว่ามีโมดูลนึงที่เข้าข่าย คือโมดูล Import HTML

โมดูลนี้ยังไม่สามารถใช้กับ Drupal-5 ได้ และดูท่าว่ายังไม่มีวีแววพัฒนาต่อ
เลยจะทดลองตั้งไซต์ใหม่ เป็น Drupal-4.7 และ import เอกสารเข้ามายังไซต์นี้ และหาทาง Export มายัง Drupal-5 ต่อไป

ทดลองทำดู ยังไม่สำเร็จ แต่ต้องบันทึกเอาไว้ก่อน ไม่งั้นลืมหมด
ผลที่ยังไม่สำเร็จคือ

  • หน้าที่อิมพอร์ตเข้ามา เป็น page ได้อย่างเดียว จริง ๆ เราต้องการเป็นแบบ book มากกว่า เพื่อคราวหลังจะได้ export ไปยังไซต์อื่นด้วย
  • การอิมพอร์ตพวกไฟล์รูปภาพและ css ยังไม่ค่อยสมบูรณ์

เริ่มงาน
ไล่ดูตามเอกสารและค้นกูเกิล ได้ผลดังนี้

ติดตั้ง apache2-dev
# aptitude install apache2-dev libapr1-dev libaprutil1-dev libapache2-modxslt php5-xsl php5-tidy

แก้ php.ini ให้รับ xslt (เพราะ php5 ไม่มี xslt)
# vi /etc/php5/apache2/php.ini

...
extension=domxml.so
extension=xsl.so
...

เริ่ม apache2 ใหม่
# /etc/init.d/apache2 restart

จะข้ามขั้นตอนติดตั้ง Drupal-4.7 ไปถึงตอนติดตั้งโมดูลเลย

เปลี่ยนเป็น webmaster และติดตั้งโมดูล
# su webmaster
$ cd /var/www/drupal/modules
$ wget http://ftp.osuosl.org/pub/drupal/files/projects/import_html-4.7.x-1.x-dev.tar.gz
$ tar xfz import_html-4.7.x-1.x-dev.tar.gz
$ cd import_html

ต้องแก้โค๊ดนิดนึง ตามเอกสาร Drupal - Fatal Error on Line 1225
$ vi import_html.module
:1225

...
//dsm($node);
drupal_set_message($node);
...

เสร็จแล้ว

ตั้งค่าโมดูลด้วย
administer -> modules -> เปิดให้ import_html ทำงาน

ตั้งค่าการใช้งานด้วย
administer -> access control -> เลือก role ที่จะเปิดให้ใช้

ตรวจสอบและตั้งค่าการอิมพอร์ต
administer -> settings -> import_html
ถ้าไม่ฟ้องข้อผิดพลาด ก็แสดงว่าใช้ได้แล้ว

เรียกใช้งานได้ทางเดียว
administer -> Import HTML Site

drupal: แก้ไขงานของโมดูล Import HTML

บันทึกการแก้ไขด้วยมือ
จากครั้งก่อน ผมได้สร้างหน้าเปล่าขึ้นมา แล้วแปลงให้เป็น book เตรียมไว้
แล้วจึงนำเข้าเอกสาร ด้วยโมดูล import HTML ดังนั้น หน้าเปล่าของเราจะเป็น node/1 และเอกสารที่นำเข้า จะเริ่มต้นตั้งแต่ node/2 เป็นต้นไป จนถึงหน้าสุดท้าย สมมุติว่าเป็น node/100 แล้วกัน

เมื่อทำการอิมพอร์ตเข้ามาแล้ว จะพบจุดผิดพลาดมากมาย ขอบันทึกการแก้ไขไว้นิดนึง เผื่อจะขยายขอบเขตไปถึงการแก้ไขโค๊ดต้นฉบับ

ตอนอิมพอร์ต ผมเลือกที่จะไม่เพิ่มรายการในเมนูแบบอัตโนมัติ
เราจึงต้องยกเลิกหัวข้อ Add each page to menu

ตอนนี้ศึกษาเรื่อง adodb อยู่ เลยใช้ไพธอนในการทำงานไปด้วยเลย

เริ่มต้น
$ python

Python 2.4.4 (#2, Oct 20 2006, 00:23:25) 
[GCC 4.1.2 20061015 (prerelease) (Debian 4.1.1-16.1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import adodb
>>> driver = 'mysql'
>>> host = 'localhost'
>>> user = 'user'         # MYSQL USER
>>> password = 'password' # MYSQL PASSWORD
>>> db = 'testdrupal47'   # DRUPAL-4.7 DATABASENAME
>>> conn = adodb.NewADOConnection(driver)
>>> cur = conn.Connect(host,user,password,db)

งานที่ทำคือ

  • เปลี่ยน page เป็น book
  • แก้ไข title ล้น โดยใช้ฟังก์ชั่น string.strip()
  • เรียงลำดับหน้าหนังสือใหม่ ด้วยมือ

ขั้นตอน

เพิ่มหมายเลข node ลงในตาราง book ตั้งแต่ node/2 ถึง node/100
>>> for i in range(2, 101, 1):
...   cur = conn.Execute('INSERT INTO book (vid, nid, parent, weight) VALUE (%s, %s, 0, 0)' % (i, i))
เปลี่ยนฟิลด์ format ในตาราง node_revisions เป็น 1
>>> cur=conn.Execute('UPDATE node_revisions SET format=1 WHERE nid>1')
เปลี่ยนฟิลด์ type ในตาราง node เป็น 'book'
>>> cur=conn.Execute('UPDATE node SET type="book" WHERE nid>1')
เปลี่ยนให้ทุก node ที่เพิ่งอิมพอร์ตเข้ามา เข้าอยู่ภายใต้หน้าว่างคือ node/1
>>> cur=conn.Execute('UPDATE book SET parent=1 WHERE nid>1')
เปลี่ยนฟิลด์ comment ในตาราง node เป็น 2 (ไม่รู้ว่าคืออะไร)
>>> cur=conn.Execute('UPDATE node SET comment=2 WHERE nid>1')
ไม่ต้อง Promoted to front page โดยให้ฟิลด์ promote ในตาราง node เป็นศูนย์
>>> cur=conn.Execute('UPDATE node SET promote=0 WHERE nid>1')
แก้ไข title โดยใช้ฟังก์ชั่น string.strip()
ตาราง node
>>> for i in range(2, 101, 1):
...   cur=conn.Execute('SELECT title FROM node WHERE nid=%s' % (i))
...   title=cur.fields[0].strip()
...   cur=conn.Execute('UPDATE node SET title="%s" WHERE nid=%s' % (title, i))

ตาราง node_revisions

>>> for i in range(2, 101, 1):
...   cur=conn.Execute('SELECT title FROM node_revisions WHERE nid=%s' % (i))
...   title=cur.fields[0].strip()
...   cur=conn.Execute('UPDATE node_revisions SET title="%s" WHERE nid=%s' % (title, i))

เรียงลำดับหน้าหนังสือใหม่ ด้วยมือ
อันนี้นานที่สุด แต่ก็คุ้มกว่าการนำเข้าด้วยมือทั้งหมด