จากคราวก่อนที่ทดลองใส่โค๊ดตัวอย่างลงในเอกสารต้นฉบับเรื่อง python: Adodb Function Reference with example รู้สึกว่าอ่านง่ายดี คล้ายเอกสารของ php ที่เขามีตัวอย่างประกอบตลอด
เลยคิดว่า ถ้าเราสามารถเอาเอกสาร HTML ต้นฉบับ ที่เป็นคู่มือไพธอน เอามาใส่ตัวอย่างเล็ก ๆ น้อย ๆ ด้วยก็น่าจะดี
ลองศึกษา Drupal ดู พบว่ามีโมดูลนึงที่เข้าข่าย คือโมดูล Import HTML
โมดูลนี้ยังไม่สามารถใช้กับ Drupal-5 ได้ และดูท่าว่ายังไม่มีวีแววพัฒนาต่อ
เลยจะทดลองตั้งไซต์ใหม่ เป็น Drupal-4.7 และ import เอกสารเข้ามายังไซต์นี้ และหาทาง Export มายัง Drupal-5 ต่อไป
ทดลองทำดู ยังไม่สำเร็จ แต่ต้องบันทึกเอาไว้ก่อน ไม่งั้นลืมหมด
ผลที่ยังไม่สำเร็จคือ
เริ่มงาน
ไล่ดูตามเอกสารและค้นกูเกิล ได้ผลดังนี้
ติดตั้ง 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
บันทึกการแก้ไขด้วยมือ
จากครั้งก่อน ผมได้สร้างหน้าเปล่าขึ้นมา แล้วแปลงให้เป็น 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)
งานที่ทำคือ
string.strip()
ขั้นตอน
>>> for i in range(2, 101, 1): ... cur = conn.Execute('INSERT INTO book (vid, nid, parent, weight) VALUE (%s, %s, 0, 0)' % (i, i))
>>> cur=conn.Execute('UPDATE node_revisions SET format=1 WHERE nid>1')
>>> cur=conn.Execute('UPDATE node SET type="book" WHERE nid>1')
>>> cur=conn.Execute('UPDATE book SET parent=1 WHERE nid>1')
>>> cur=conn.Execute('UPDATE node SET comment=2 WHERE nid>1')
>>> cur=conn.Execute('UPDATE node SET promote=0 WHERE nid>1')
string.strip()
>>> 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))
เรียงลำดับหน้าหนังสือใหม่ ด้วยมือ
อันนี้นานที่สุด แต่ก็คุ้มกว่าการนำเข้าด้วยมือทั้งหมด