แสดงบทความที่มีป้ายกำกับ alfresco แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ alfresco แสดงบทความทั้งหมด

วันพุธที่ 25 กุมภาพันธ์ พ.ศ. 2558

Fix LibreOffice Transformer on Alfresco 5.0.c community

By default fresh install of Alfresco 5.0.c does not pack require libraries for LibreOffice in the installer. You should install it manually by this instruction http://docs.alfresco.com/5.0/concepts/install-lolibfiles.html

After install all libraries, When you test run LibreOffice with command

/opt/alfresco-5.0.c/libreoffice/program/soffice.bin --nofirststartwizard --nologo --headless --accept=socket,host=localhost,port=8100

It will show some library is missing (libdbus-glib-1-2). Install it.

Then after you install all libraries and restart your alfresco if you still found transformer exception "connection failed: socket,host=localhost,port=8100,tcpNoDelay=1; com.sun.star.lang.IllegalArgumentException". So change your start up script of LibreOffice at

/opt/alfresco-5.0.c/libreoffice/scripts/libreoffice_ctl.sh

From

SOFFICE="$SOFFICEWRAPPER --nofirststartwizard --nologo --headless --accept=socket,host=127.0.0.1,port=$SOFFICE_PORT\;urp\;StarOffice.ServiceManager"

To

SOFFICE="$SOFFICEWRAPPER --nofirststartwizard --nologo --headless "--accept=socket,host=127.0.0.1,port=$SOFFICE_PORT\;urp\;StarOffice.ServiceManager""

(Adding double quote before --accept and end of line). Then restart alfresco again. The transformer exception will fix.

 reference -- https://forums.alfresco.com/forum/installation-upgrades-configuration-integration/configuration/document-preview-problem-was
Continue Reading...

วันเสาร์ที่ 6 กันยายน พ.ศ. 2557

Fix SunCertPathBuilderException: Unable To Find Valid Certification Path To Requested Target in Alfresco

การที่จะให้ Tomcat คุยกับ Server ต่างๆ ผ่าน SSL Protocol นั้นเราต้องทำการ Install Certificate ให้กับตัว Tomcat เสียก่อน (Java) ไม่เว้นแม้แต่กรณีที่เป็น Untrust Certificate ก็จำเป็นต้อง add Certificate ก่อนเพื่อที่จะให้ Tomcat สามารถเชื่อมต่อไปยัง Server ที่ต้องการผ่าน Protocol SSL ได้อย่างสมบูรณ์

โดยหากไม่ทำการ Add Certificate ก่อนจะทำให้เวลา Tomcat คุยไปยัง Server ผ่าน SSL แล้วจะเกิด Exception ขึ้น (SSLHandshakeException) หรือคุยกันไม่รู้เรื่องนั่นเอง

ยกตัวอย่างเช่นบน Alfresco เมื่อเรา config smtps ไปยัง google mail แล้วเราไม่ได้ใส่ Certificate ก็จะเกิด Error SunCertPathBuilderException ขึ้นซึ่งสามารถแก้ไขได้โดย

  1. Request ไปยัง SMTP Server ของ Google ด้วยคำสั่ง openssl s_client -connect smtp.gmail.com:465
  2. Save Certificate เป็นนามสกุล .cert หรือ .pem เช่น gmail.cert โดยให้ใช้ Content ตั้งแต่ ---BEGIN CERTIFICATE--- จนถึง ---END CERTIFICATE---
  3. สั่ง Import Certificate ลงไปใน keystore ที่ใช้รัน Tomcat ของตัว Alfresco โดยใช้คำสั่ง
    sudo keytool -import -alias smtp.gmail.com -keystore /path/to/keystore -file /path/to/gmail.cert
    เช่น
    sudo /opt/alfresco-4.2.c/java/bin/keytool -import -alias smtp.gmail.com -keystore /opt/alfresco-4.2.c/java/jre/lib/security/cacerts -file /home/admins/gmail.cert
  4. ตรวจสอบว่า Certificate ที่เรา add เข้าไปนั้นอยู่ใน keystore แล้วหรือยังด้วยคำสั่ง
    keytool -list -v -keystore /path/to/keystore เช่น /opt/alfresco-4.2.c/java/bin/keytool -list -v -keystore /opt/alfresco-4.2.c/java/jre/lib/security/cacerts
โดยเมื่อ Import สำเร็จแล้ว สั่ง Restart Tomcat ก็จะไม่ Error SunCertPathBuilderException อีกต่อไป
Continue Reading...

วันพฤหัสบดีที่ 6 มีนาคม พ.ศ. 2557

How to login to Alfresco 4 with IE 11

เริ่มที่ IE11 ไม่สามารถ Login เข้า Alfresco ผ่าน Alfresco Share ได้ https://forums.alfresco.com/forum/end-user-discussions/alfresco-share/alfresco-share-login-doesnt-work-internet-explorer-11

โดยมีผู้ให้คำตอบว่า IE11 นั้นมันเปลี่ยน User Agent จึงทำให้มัน Login ไม่ได้ รายละเอียดอ่านได้จาก link ด้านบน ซึ่งส่วนนั้นเราคงไม่สนใจมันมากกว่า "แล้วจะทำอย่างไรล่ะ" ดังนั้นวันนี้เราจะทำให้ IE11 Login Alfresco ได้กัน

ก่อนอื่นให้เปิด IE11 ก่อนแล้วเข้าไปที่ Alfresco จากนั้นกดปุ่ม F12 เพื่อเปิด Developer Tools ขึ้นมา จากนั้น Scroll แถบเครื่องมือลงไปด้านล่างเพื่อเปิด Emulator ขึ้นมา


ที่ Document mode ให้เปลี่ยนจาก Edge (Default) ไปเป็น 10


จากนั้นให้ Login ตามปกติ จะสามารถ Login ได้แล้ว
Continue Reading...

วันจันทร์ที่ 21 ตุลาคม พ.ศ. 2556

How to add user to Alfresco Sites without invite

โดยปกติแล้วเวลาเราจะ Add Users เข้าไปใน Sites ของ Alfresco นั้นเราจะใช้วิธีการ Invite บุคคลนั้นๆ ผ่านเมนู Invite จากนั้นบุคคลนั้นต้อง Accept Invitation ถึงจะเข้าไปอยู่ใน Site ได้ 

ปัญหาคือบางกรณีเราต้องการทำ Pre Invite Users ให้เรียบร้อยก่อนที่จะเริ่มใช้งานจริง ซึ่งสามารถทำได้ผ่าน REST API ของ Alfresco ครับโดย API ที่เราจะใช้งานคือ Membership API http://wiki.alfresco.com/wiki/Repository_RESTful_API_Reference#Membership

ขั้นแรกเราต้องมี REST Client ก่อนครับ ในส่วนนี้จะใช้ตัวไหนก็ได้นะครับ แต่ผมแนะนำให้เป็น Postman ครับ (ความชอบส่วนตัว) http://www.getpostman.com/

การ Add member สามารถทำได้ผ่าน POST Method ครับโดยรายระเอียดของ Membership POST Method มีดังนี้

Adds a new membership to the site.
POST /alfresco/service/api/sites/{shortname}/memberships
Requirements:
  • Default Format: json
  • Authentication: user
  • Transaction: required
  • Format Style: any
Definition:
  • Id: org/alfresco/repository/site/membership/memberships.post
  • Description: classpath:alfresco/templates/webscripts/org/alfresco/repository/site/membership/memberships.post.desc.xml

ซึ่งรายละเอียดได้ได้บอก JSON Format เรามา ดังนั้นผมจึงเข้าไปดู Code ว่า Format ที่จะใช้งานเป็นอย่างไร  ซึ่งสรุปได้ดังนี้
  1. role : กำหนดเป็น SiteConsumer, SiteContributor, .....
  2. member ที่จะ Add เข้าไปใน Site (person หรือ group)
    1. person : กำหนดเป็นชื่อ userName ของบุคคลที่จะ Add เข้าไปใน Site
    2. group : กำหนดเป็น groupId โดยต้องมี GROUP Prefix ด้วย
Example


จากตัวอย่างเป็นการ Add User tantai เข้าไปที่ site other โดยให้สิทธิ์เป็น SiteContributor สังเกตว่าผมใส่ Basic Authentication และ Content-Type ไว้เรียบร้อยแล้ว โดยเมื่อกด Send Request แล้วสำเร็จ จะได้ผลลัพธ์คือ


เท่านี้เราก็สามารถ Add Member เข้าไปใน Site ได้แล้วครับ แต่ว่าจะทำได้ทีละคน ดังนั้นเราอาจใช้ Python Script หรืออะไรก็ตามทำ loop เพื่อ Add Member ทีละเยอะๆ ได้ครับ
Continue Reading...

วันพุธที่ 16 ตุลาคม พ.ศ. 2556

How to list all user in Alfresco

บน Alfresco หากเราต้องการที่จะ list user ทั้งหมดออกมาดูจะสามารถหลายวิธี แต่ผมจะแนะนำวิธีง่ายๆ 2 วิธีคือ
  1. แก้ไข share-config-custom.xml ให้ default search length มีค่าเป็น 0 จากนั้นพิมพ์ * ที่ช่อง User Search ได้ทันที
  2. เขียน Script ลง JavaScript Console (http://share-extras.github.io/addons/js-console/) โดยใช้ Person Service ไปดึงค่าออกมา แล้ว log result เพื่อไปทำเป็น Report ต่อไป
โดยตัว Script  สามารถเขียนได้ดังนี้

var ctx = Packages.org.springframework. web.context.ContextLoader.getCurrentWebApplicationContext();
var personService = ctx.getBean("personService");
var all = personService.getAllPeople().toArray();
for (var i = 0 ; i < all.length ; i++) {
  var node = utils.getNodeFromString(all[i]);
  logger.log(node.properties.email + "," + node.properties.firstName + "," + node.properties.lastName + "," + node.properties.userName);
}
Continue Reading...

วันอังคารที่ 8 ตุลาคม พ.ศ. 2556

How to comment to Document with JavaScript in Alfresco

ในบางกรณี เราอาจจำเป็นต้องใช้ JavaScript เพื่อไป Comment เอกสารแต่การที่จะ Comment เอกสารนั้นด้วย JavaScript API ของ Alfresco นั้นไม่ง่ายเลย ผมจึงทำ Function สำหรับ Comment ไปยัง node ของเอกสารไว้เพื่อง่ายต่อการใช้งานภายหลัง
function commentNode(nodeRef, comment) {
   var node = search.findNode(nodeRef);

   if(!node.hasAspect("fm:discussable")) {
      node.addAspect("fm:discussable");
   }
   if(!node.hasAspect("fm:commentsRollup")) {
      node.addAspect("fm:commentsRollup");
   }

   var forums = node.childAssocs["fm:discussion"];
   var forum;
   if(forums.length === 0) {
     forum = node.createNode(node.properties.name + " discussion", "fm:forum", "fm:discussion");
   } else {
     forum = forums[0];
   }

   var topics = forum.childAssocs["cm:contains"];
   var topic;
   if(topics == null || topics.length === 0) {
     topic = forum.createNode("Comments", "fm:topic", [], "cm:contains", "cm:Comments");
   } else {
     topic = topics[0];
   }

   var now = new Date();
   var name = "comment-" + now.getTime();
   var mypost = topic.createNode(name, "fm:post", [], "cm:contains", name);

   mypost.content = comment;
}
ตัว Function จะรับ NodeRef และ CommentText ไปจากนั้นนำ NodeRef ไปหา Node จริง จากนั้น check ว่า Node นั้นมี Aspect discussable กับ commentRollup หรือไม่ โดยหากไม่มีจะใส่ Aspect ให้

จากนั้นตรวจสอบว่ามีการทำ Child Association กับตัว discussion และตัว contains ไว้หรือยัง โดยหากยังก็ให้ Create Child Association ด้วย จากนั้นก็ add comment ลงไปครับ
Continue Reading...

วันจันทร์ที่ 16 กันยายน พ.ศ. 2556

Alfresco Workflow with Activiti

Overview

การสร้าง Custom Workflow บน Alfresco นั้นแบ่งออกเป็น 3 ส่วนใหญ่ๆ คือ
  1. Workflow Definition
  2. Alfresco Model
  3. Share UI

Preparation

ก่อนที่เราจะเริ่มสร้าง Workflow กันเราก็ต้องมาเตรียมความพร้อมกันก่อนโดยสิ่งที่เราต้องเตรียมมีดังนี้
  1. Assume Alfresco Installed in your machine
  2. Eclipse (can be STS) with Activiti Designer http://www.activiti.org/userguide/index.html#eclipseDesignerInstallation

Creating Workflow Definition

หลังจากติดตั้ง Tools กันเรียบร้อยแล้ว ขั้นตอนต่อไปเราจะมาสร้าง (Simple) Custom Workflow  กันโดยมี Step การทำงานซัก 1-2 step โดยมีขั้นตอนดังนี้
  1. Start the Eclipse (or STS)
  2. Create Activiti Diagram ใน project ใดก็ได้ (เนื่องจาก Alfresco ใช้งานเฉพาะ xml definition file ไม่ได้ต้องการ Activiti Project ดังนั้นการสร้างแค่ Diagram จึงทำได้ง่ายกว่า) โดยผมตั้งชื่อเป็น sample.bpmn20.xml
  3. วาด Workflow ตามรูปด้านล่าง
  4. Edit the candidate user or group in text editor

    จากรูปจะเห็นได้ว่ามีการกำหนด formKey ลงไปที่ startEvent และ userTask หมายความว่าเมื่อเรา Deploy Definition นี้ลงไปที่ Alfresco แล้ว เราต้องการให้ใช้ form ใดในการแสดงผลนั่นเอง ซึ่งผมกำหนดไว้ว่า startEvent ให้ใช้ form bpm:startTask และ userTask ต่างๆ ให้ใช้ form ของตัวเองที่ชื่อว่า sample:task1 และ sample:task2

    ในส่วนของ acvititi:assignee นั้นผมกำหนดให้ task วิ่งไปยัง user tantai ซึ่งเมื่อมีการ Start Workflow แล้ว Task ก็จะวิ่งไปยัง user tantai ทันที รวมทั้งเมื่อจบ task1 ก็จะวิ่งไปยัง user tantai เช่นกันที่ task2

    ซึ่งต่อไปเราจะมาสร้าง Workflow Model กันบนฝั่ง Alfresco

    Note :  Recommended to edit workflow definition in the text editor (not in Activiti Designer) because Activiti Designer have a lot of bug in current version (My version is 5.12.0)

Creating Alfresco Model

การสร้าง Model บน Alfresco นั้นประกอบไปด้วย 3 ส่วนคือ
  1. Spring Context files
  2. Model files
  3. Message
Note: แต่ในการสร้าง Workflow Model นั้น Message ใน Model ไม่จำเป็นครับ ผมขอตัดออกไปก่อนเพื่อ Focus ในส่วนของ Workflow จริงๆ

แนะนำให้อ่าน Data Dictionary ของ Alfresco ก่อนครับ http://wiki.alfresco.com/wiki/Data_Dictionary_Guide

เนื่องจาก Alfresco ได้เขียน Spring Config ไว้ให้ import ไฟล์ที่ชื่อตามด้วย -context.xml ทุกไฟล์ใน folder TOMCAT_HOME/shared/classes/alfresco/extension/ ไว้ ขั้นตอนแรกให้เราสร้าง Spring Context file ขึ้นมาโดยต้องตั้งชื่อเป็น sample-context.xml และวางไว้ที่ folder extension config bean ดังนี้



<beans>

   <!-- Registration of new models -->
   <bean depends-on="dictionaryBootstrap" id="sample.model" parent="dictionaryModelBootstrap">
      <property name="models">
         <list>
            <value>alfresco/extension/sample-model.xml</value>
         </list>
      </property>
   </bean>
</beans>
จาก code ด้านบนเมื่อ Start Alfresco แล้ว Alfresco จะ load model จากไฟล์ที่ชื่อว่า sample-model.xml ดังนั้นให้เราสร้างไฟล์ sample-model.xml วางไว้ที่เดียวกันและ config bean ดังนี้




<?xml version="1.0" encoding="UTF-8"?>
<model name="sample:sampleModel" xmlns="http://www.alfresco.org/model/dictionary/1.0">

   <!-- Optional meta-data about the model -->
   <description>Sample Model</description>
   <author>tantai@osdev.co.th</author>
   <version>1.0</version>

   <imports>
      <!-- Import Alfresco Dictionary Definitions -->
      <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>
      <!-- Import Alfresco Content Domain Model Definitions -->
      <import uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/>
      <!-- Import Alfresco BPM Model Definitions -->
      <import uri="http://www.alfresco.org/model/bpm/1.0" prefix="bpm" />
      <!-- Import Alfresco Workflow Model Definitions -->
      <import uri="http://www.alfresco.org/model/workflow/1.0" prefix="wf"/>
   </imports>

   <!-- Introduction of new namespaces defined by this model -->
   <namespaces>
      <namespace uri="http://www.osdev.co.th/sample/workflow" prefix="sample"/>
   </namespaces>

   <types>
      <type name="sample:task1">
         <title>Task1</title>
         <parent>wf:reviewTask</parent>
      </type> 
      <type name="sample:task2">
         <title>Task2</title>
         <parent>wf:reviewTask</parent>
      </type>
   </types> 
</model>

จาก code ด้านบน ผมกำหนด type ขึ้นมา 2 type คือ sample:task1 และ sample:task2  เพื่อให้ Workflow ใช้ type ดังกล่าวในการแสดงผล สังเกตุได้ว่า ผมไม่ได้สร้าง bpm:startTask เนื่องจาก bpm:startTask นั้นมีอยู่แล้วบน Alfresco (สามารถดูได้จากไฟล์ bpmModel.xml) และทั้ง 2 type ที่ผมสร้างขึ้นมาใหม่นั้นใช้ parent เป็น wf:reviewTask ซึ่งมีอยู่แล้วใน Alfresco เช่นกัน โดยเมื่อสร้าง Model เรียบร้อยแล้ว ให้สั่ง Restart Service Alfresco เพื่อให้ Alfresco load model ไปใช้งาน

Deploy Workflow

การ Deploy Workflow บน Alfresco นั้นไม่ยากครับเพราะว่า Alfresco มีหน้า workflow-console เพื่อใช้จัดการพวก Workflow อยู่แล้ว โดยขั้นตอนการ Deploy เราแค่ copy file sample.bpmn20.xml ไปไว้ที่ folder extension จากนั้นไปยัง http://{host}:{port}/alfresco/faces/jsp/admin/workflow-console.jsp เพื่อสั่ง deploy workflow ด้วยคำสั่ง
 
deploy activiti alfresco/extension/sample.bpmn20.xml 
Note: หากเข้า url ดังกล่าวไม่ได้ ให้เช้าไปที่ url http://{host}:{port}/alfresco เพื่อทำการ login ก่อนแล้วจึงเข้าไปยัง url ดังกล่าวอีกครั้ง  

โดยเมื่อสั่ง Deploy แล้ว ที่ Alfresco Share เราจะสามารถสั่ง Start Workflow Sample ที่เราทำได้
 
 แต่เมื่อเลือก Sample Workflow แล้วจะสังเกตุได้ว่า form UI ต่างๆ นั้นจะแสดง properties ทั้งหมดออกมา
ซึ่งตามความเป็นจริงแล้ว เราต้องเลือกที่จะแสดงผล properties อะไรบ้าง ซึ่งจะอธิบายใน Step ต่อไปว่าเราจะกำหนด Share UI กันอย่างไร

Configure Share UI 

 การ Config Share UI นั้นเราสามารถทำได้ที่ไฟล์ share-config-custom.xml ซึ่งอยู่ที่ TOMCAT_HOME/shared/classes/alfresco/web-extension/share-config-custom.xml โดยเราสามารถกำหนดการแสดงผลของแต่ละ form ได้ดังนี้
   
<config evaluator="string-compare" condition="activiti$sample">
   <forms>
      <form>
         <field-visibility>
            <show id="packageItems" />
            <show id="transitions" />
         </field-visibility>
         <appearance>
            <set id="" appearance="title" label-id="workflow.set.general" />
            <set id="items" appearance="title" label-id="workflow.set.items" />
            <set id="response" appearance="title" label-id="workflow.set.response" />

            <field id="packageItems" set="items" />
         </appearance>
      </form>
   </forms>
</config>

<config evaluator="task-type" condition="sample:task1">
   <forms>
      <form>
         <field-visibility>
            <show id="packageItems" />
            <show id="transitions" />
         </field-visibility>
         <appearance>
            <set id="" appearance="title" label-id="workflow.set.general" />
            <set id="items" appearance="title" label-id="workflow.set.items" />
            <set id="response" appearance="title" label-id="workflow.set.response" />

            <field id="packageItems" set="items" />
         </appearance>
      </form>
   </forms>
</config>

<config evaluator="task-type" condition="sample:task2">
   <forms>
      <form>
         <field-visibility>
            <show id="packageItems" />
            <show id="transitions" />
         </field-visibility>
         <appearance>
            <set id="" appearance="title" label-id="workflow.set.general" />
            <set id="items" appearance="title" label-id="workflow.set.items" />
            <set id="response" appearance="title" label-id="workflow.set.response" />

            <field id="packageItems" set="items" />
         </appearance>
      </form>
   </forms>
</config>

จาก config ด้านบนผมกำหนดให้ตอน startEvent, task1, task2 นั้นแสดงผล properties แค่ packageItem เท่านั้นหมายถึงผู้ Start Workflow จะ add file เข้ามาได้เพียงอย่างเดียว
โดยเมื่อ Start Workflow แล้ว Task จะวิ่งไปหา tantai ซึ่งถูกกำหนดไว้ที่ definition แล้ว โดยเมื่อ tantai login เข้ามาในระบบ จะเห็น task ดังนี้
โดยเมื่อคลิกเข้าไปก็จะเห็นหน้าตาดังที่เรา Config ไว้
โดยเมื่อกดปุ่ม Task Done, Task ก็จะวิ่งไปยัง tantai อีกครั้ง (หน้าตาเหมือนกันเพราะ Config ไว้เหมือนกัน)
โดยเมื่อกด Task Done อีกครั้งก็จะจบ Flow

Summary

โดยปกติแล้วการสร้าง Workflow จะมีขั้นตอนพื้นฐานเพียงเท่านี้ แต่หากจะต้องการให้ Workflow ของเราทำงานอื่นๆ ด้วยเช่น ต้องการส่งเมลเตือน, Generate PDF files เราจำเป็นต้องทำเองโดยกำหนด Listener ของแต่ละ userTask เช่น เมื่อจบ task1 ให้สร้าง PDF files และ mail ไปยังบุคคลที่กำหนดไว้ที่ task2 สามารถดูรายละเอียดได้จาก link นี้เลยครับ http://www.activiti.org/userguide/index.html#taskListeners ซึ่งผมแนะนำให้เขียน Listener เป็น ScriptTaskListener พอครับ ไม่จำเป็นต้องเป็น Java Class เนื่องจาก Alfresco ใช้ Rhino เป็น JavaScript Engine ทำให้เราสามารถเรียกใช้งาน Java Class ได้ผ่าน Js ทันที ในส่วนการ Customize form หากต้องการเพิ่ม properties ใดๆ ก็สามารถทำได้ที่ Model จากนั้นก็มา Config การแสดงผลที่ share-config-cuxtom.xml ได้ทันที
Continue Reading...

วันพุธที่ 5 มกราคม พ.ศ. 2554

แก้ปัญหาชื่อภาษาไทยบน Alfresco เละใน Version 3.4 บน Windows

เมื่อลง Alfresco 3.4 บน Windows แล้วเมื่อสร้าง Space หรือไฟล์ที่มีชื่อภาษาไทยแล้ว ชื่อไฟล์ดังกล่าวจะกลายเป็น ????

ปัญหาดังกล่าวเกิดจาก default character set ใน MySQL ไม่ได้ถูกตั้งค่าให้เป็น UTF-8 เหมือน Version ก่อนๆ ทำให้ Table ที่สร้างขึ้นมาไม่ได้มี Collation เป็น UTF-8 เมื่อมีการ Insert ภาษาไทยเข้าไปใน Table จึงทำให้ภาษาไทยเละ

วิธีการแก้ไขคือเราต้อง alter table ให้มันกลายเป็น UTF-8 ซะก่อนซึ่งจะให้ alter ที่ละ table มันก็จะเหนื่อยไปนิด ดังนั้นก็เลยเขียน php เพื่อที่จะ alter table ให้กลายเป็น UTF-8 ทั้งหมดซะ

<?php
  $db = mysql_connect('localhost','username','password');
  if(!$db) echo "Cannot connect to the database - incorrect details";
  mysql_select_db('alfresco');
  mysql_query('ALTER DATABASE CHARACTER SET utf8');
  $result=mysql_query('show tables');
  while($tables = mysql_fetch_array($result)) {
    foreach ($tables as $key => $value) {
      mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
    }
  }
?>

เมื่อรันแล้วให้ลอง restart alfresco ซักทีนึงแล้วก็ลองดูว่าภาษาไทยสามารถใช้งานได้หรือยัง ถ้ายังให้ไป set default character ใน MySQL ให้เป็น UTF-8 ตาม link นี้ครับ http://www.leknarm.com/2010/01/set-mysql-utf8.html
--
Tantai Thanakanok. Open Source Development Co., Ltd.
Tel: +66 38 311816, Fax: +66 38 773128, http://www.osdev.co.th/
Continue Reading...

วันศุกร์ที่ 3 กันยายน พ.ศ. 2553

สร้าง custom workflow บน alfresco

ขั้นตอนการสร้าง custom workflow บน alfresco นั้นมีขั้นตอนหลักๆ อยู่ 4-5 ขั้นตอนครับ ที่บอกว่า 4-5 เพราะว่ามีอยู่ขั้นตอนนึงที่ทำแค่ครั้้งแรกครั้งเดียวเท่านั้นครับ
  •  ขั้นตอนที่ 1 : สร้าง Task Model 
ปกติแล้วเราสามารถสร้าง Task Model ได้หลายวิธีเช้นแก้ไข file workflowModel.xml ใน server แต่การทำเช่นนี้เราจำเป็นต้อง restart server ก่อน Task Model ที่เราแก้ไขจึงจะใช้งานได้ แต่ถ้าเราต้องการสร้าง Task Model โดยที่ไม่จำเป็นต้อง restart server ให้เราไปแก้ที่ Alfresco Explorer แทนครับโดยให้ไปที่ Company Home > Data Dictionary > Models แล้วเลือก Create > Create Content แล้วใส่ค่าตามนี้
  1. Name: ใส่ชื่อของ Model เช่น leknarmModel
  2. Type: เลือกเป็น Content
  3. Content Type เลือกเป็น XML
เสร็จแล้วกด OK
ในหน้า Enter Content ให้ใส่ค่า

<?xml version="1.0" encoding="UTF-8"?>

<model name="osdev:reviewapprovemodel" xmlns="http://www.alfresco.org/model/dictionary/1.0">
  <description>Approve 2 Step Model</description>
  <author>Tantai Thanakanok</author>
  <version>1.0</version>

  <imports>
    <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>
    <import uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/>
    <import uri="http://www.alfresco.org/model/bpm/1.0" prefix="bpm"/>
    <import uri="http://www.alfresco.org/model/system/1.0" prefix="sys" />
  </imports>

  <namespaces>
    <namespace uri="th.co.osdev.model" prefix="osdev"/>
  </namespaces>    
  <types>
    <type name="osdev:submitReviewTask">
      <parent>bpm:startTask</parent>
      <properties>
        <property name="osdev:expiredate">
          <title>Expired date.</title>
          <type>d:date</type>
        </property>            
      </properties>
      <mandatory-aspects>
        <aspect>bpm:assignee</aspect>
      </mandatory-aspects>
    </type>  

    <type name="osdev:reviewTask">
      <parent>osdev:submitReviewTask</parent>
      <overrides>
        <property name="osdev:expiredate">
        </property>
      </overrides>
      <mandatory-aspects>
        <aspect>bpm:assignee</aspect>
      </mandatory-aspects>
    </type>

    <type name="osdev:approveTask">
      <parent>osdev:reviewTask</parent>
      <overrides>
        <property name="osdev:expiredate">
        </property>
      </overrides>
    </type>

  </types>  
</model> 

code ด้านบนนี้เป็นแค่ตัวอย่างเท่านั้น โดย code ดังกล่าวจะไป map กับ jPDL ที่เราวาดหลังจากนี้


เมื่อใส่ code ด้านบนนี้เสร็จแล้วให้กด Finish เพื่อไปยังหน้าถัดไป 
ในหน้า Modify Content Properties ให้เลือก Model Activate ด้วยจากนั้นกด OK
  • ขั้นตอนที่ 2 : สร้าง Workflow Resource Bundle
ให้ไปสร้างไฟล์ที่ Company Home > Data Dictionary > Messages โดยใส่ค่าดังนี้
  1. Name: ชื่อของไฟล์.properties เช่น leknarm-messages.properties
  2. Type: เลือกเป็น Content
  3. Content Type: เลือกเป็น Plain Text
ในหน้า Enter Content ให้ใส่ค่า
osdev_reviewApprove.workflow.title= Osdev Review , Approval of content
osdev_reviewApprove.workflow.description= Osdev Review , Approval of content
osdev_reviewapprovemodel.type.osdev_submitReviewTask.title=Start  Review
osdev_reviewapprovemodel.type.osdev_submitReviewTask.description=Submit documents for review & approval
osdev_reviewapprovemodel.type.osdev_reviewTask.title=Review
osdev_reviewapprovemodel.type.osdev_reviewTask.description=Review Documents to Approve or Reject them
osdev_reviewapprovemodel.type.osdev_approveTask.title=Approve
osdev_reviewapprovemodel.type.osdev_apporveTask.description=Approve to Finishing Documents 
เมื่อใส่ค่าเสร็จแล้วให้กดปุ่ม Finish
ใน่ส่วนของ ไฟล์ Resource Bundle นั้นเราจำเป็นต้อง deploy ด้วยมือ ไม่มี option ที่จะ deploy อัตโนมัติ ดังนั้นให้เราไปที่ url
http://<host>:<port>/alfresco/faces/jsp/admin/repoadmin-console.jsp 
แล้วพิมพ์
reload messages leknarm-messages
  • ขั้นตอนที่ 3 : สร้าง Process Definition
โดยปกติแล้ว การสร้าง Process Definition เท่าที่ทราบ จะสามารถสร้างได้ 2 วิธีคือ 1 สร้างโดยการ import ไฟล์ process definition แล้ว deploy แบบ manual แต่วิธีที่ผมจะใช้นั้นคือการ deploy โดยใช้งาน eclipse ครับ

ใน part นี้ผมขอยกตัวอย่าง การสร้าง jPDL ครับเนื่องจากถ้าลากยาวไปถึงการติดตั้งจะทำให้ยาวเกินไป ขอแยกการติดตั้งไปเป็นอีก part ละกันครับ

ให้สร้างไฟล์ process definition ที่มีรูปแบบดังตัวอย่างด้านล่างนี้


จากนั้นในส่วน code ให้ใส่ค่าตามนี้ครับ

<?xml version="1.0" encoding="UTF-8"?>

<process-definition  xmlns="urn:jbpm.org:jpdl-3.2"  name="osdev:reviewApprove">

    <swimlane name="initiator"></swimlane>
    
    <swimlane name="reviewer">
        <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
            <actor>#{bpm_assignee}</actor>
        </assignment>
    </swimlane>
    
    <swimlane name="approver">
        <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
            <actor>#{bpm_assignee}</actor>
        </assignment>
    </swimlane>

    <start-state name="start">
        <task name="osdev:submitReviewTask" swimlane="initiator"></task>
        <transition to="review"></transition>
    </start-state>


    <task-node name="review">
        <task name="osdev:reviewTask" swimlane="reviewer"></task>
        <transition to="approve"></transition>
    </task-node>

    <task-node name="approve">
        <task name="osdev:approveTask" swimlane="approver"></task>
        <transition to="end"></transition>
    </task-node>


    <end-state name="end"></end-state>

</process-definition>

เมื่อวาด diagram และใส่ code เรียบร้อย ให้ไปที่ Tab Deployment ในส่วนของ Deployment Server Setting ให้ใส่ค่าตามนี้
  1. Server Name: server ของท่านเช่น localhost
  2. Server Port: ให้ใส่ 8080 หรือว่า port ที่ตั้งค่าไว้
  3. Server Deployer: ให้ใส่เป็น /alfresco/jbpm/deployprocess
จากนั้นให้ลองกด Test Connection... ดูว่า connection เราเปิดไว้หรือยัง หาก error ให้ตรวจสอบดูว่าเรา start alfresco หรือยังหรือว่ามีการใส่ค่าอะไรผิดพลาดหรือไม่ จากนั้นกด Deploy Process Archive
  • ขั้นตอนที่ 4 : แก้ไข config ให้ display workflow image 
ขั้นตอนนี้ ทำแค่ครั้งแรกครั้งเดียวเท่านั้นครับ โดยให้ไปที
$ALF_ROOT/tomcat/webapps/alfresco/jsp/workflow/start-workflow-wizard/workflow-options.jsp
และ
$ALF_ROOT/tomcat/webapps/alfresco/jsp/workflow/manage-task-dialog.jsp
ให้แก้ไข code จาก
<a:panel rendered="false" id="workflow-outline" label="#{msg.workflow_outline}" progressive="true" expanded="false"
border="white" bgcolor="white" titleBorder="lbgrey" expandedTitleBorder="dotted" titleBgcolor="white" styleClass="mainSubTitle">
เป็น
<a:panel rendered="true" id="workflow-outline" label="#{msg.workflow_outline}" progressive="true" expanded="true"
border="white" bgcolor="white" titleBorder="lbgrey" expandedTitleBorder="dotted" titleBgcolor="white" styleClass="mainSubTitle">
  • ขั้นตอนที่ 5 : สร้าง Alfresco Exploror Task Dialog
ให้สร้างไฟล์ web-client-config-custom.xml ไว้บนเครื่องของเราโดยมี code ดังนี้

<alfresco-config>

<config evaluator="node-type" condition="osdev:submitReviewTask" replace="true">
    <property-sheet>
        <show-property name="osdev:expiredate" display-label="Expired Date"/>
        <show-association name="bpm:assignee" display-label-id="wf_reviewers" />
    </property-sheet>
</config>

<config evaluator="node-type" condition="osdev:reviewTask" replace="true">
    <property-sheet>
        <show-property name="osdev:expiredate" display-label="Expired Date"/>
        <show-association name="bpm:assignee" display-label-id="wf_approver" />
    </property-sheet>
</config> 

<config evaluator="node-type" condition="osdev:approveTask" replace="true">
    <property-sheet>
        <show-property name="osdev:expiredate" display-label="Expired Date"/>
    </property-sheet>
</config> 

</alfresco-config>
เมื่อใส่ code เสร็จเรียบร้อยให้ไปที่ Company Home > Data Dictionary > Web Client Extension จากนั้นให้  Add Content โดยเลือกไฟล์ที่เราเพิ่งสร้าง แล้วกด Next จน Finish

จากนั้นเราต้อง deploy Web Client Extension เองโดยไปที่ url
http://<host>:<port>/alfresco/faces/jsp/admin/webclientconfig-console.jsp
แล้วพิมพ์คำว่า reload

เมื่อเสร็จขั้นตอนที่หมดแล้ว ให้ลอง logout ออกมาครั้งนึงก่อน จากนั้น login เข้าไปใหม่และให้ลอง test โดยการรัน workflow จากไฟล์ หรือจากที่ใดก็ได้ จะสังเกตุว่ามี custom workflow ที่เราเพิ่งสร้างเกิดขึ้นมาครับ

ที่มา - หนังสือ Alfresco 3 Enterprise Implementation
Continue Reading...

วันศุกร์ที่ 27 สิงหาคม พ.ศ. 2553

แก้ไข default language ของ alfresco

หากใครทำ full text search ภาษาไทยบน alfresco เรียบร้อยแล้ว คงสังเกตุกันว่าการ login ต้องเลือกภาษาเป็นภาษาไทย แต่ว่า login language ดันมีให้เลือก 2 ภาษาหรือหลายภาษา แต่ยังไง default ก็เป็นภาษาอังกฤษอยู่ดี


คราวนี้หากเราต้องการ set ค่า default language ของหน้า login นี้จะต้องไป set ค่าที่
tomcat/shared/classes/alfresco/extension/web-client-config-custom.xml
โดยในส่วน config ของ language ให้แก้ค่าจาก
<config evaluator="string-compare" condition="Languages">
เป็น
<config evaluator="string-compare" condition="Languages" replace="true">
ซึ่งการใส่ replace="true" นั้นหมายความว่า ให้นำ config ดังกล่าว replace config default แทนครับ

ที่มา alfresco forum
Continue Reading...

Blogroll

About