Category Archive Yii

IIS: การตั้ง Virtual Directory

iis เดิมมีเว็บที่เป็น c# อยู่แล้วและไม่สะดวกที่จะเพิ่ม domain name เข้าไปใหม่ จะตั้งเป็น site ให้ใช้อีก port ก็ติด firewall ที่ยอมให้ใช้ port 80 เท่านั้น และเพื่อความปลอดภัย framework อย่าง laravel ไม่ควรวาง folder ให้สามารถเรียกใช้ php ไฟล์อื่นได้นอกจาก /public/index.php จึงเลือกที่ใช้วิธี Virtual Directory คือ การสร้าง folder ใน url ให้ชี้ไปอีก folder ที่อยู่นอก C:\inetpub\wwwroot

การตั้ง Virtual Directory

  1. เปิดโปรแกรม Internet Information Services (IIS) Manager
  2. คลิกขวาที่ site ที่ต้องการ เช่น Default Web Site
  3. Add Virtual Directory
    Alias
    คือ folder จำลอง เช่น punpun_uat
    Physical path:
    คือ path จริง ที่ทำ shortcut ชี้ไปหา เช่น C:\www\punpun_v1_uat
  4. (ไม่จำเป็น) คลิกที่ site หรือ server แล้ว restart
  5. ทดสอบโดยเรียก url เช่น http://localhost/punpun_uat

วิธีนี้จะมีข้อดีคือ

  1. สามารถติดตั้งหลายเว็บ โดยใช้ domain และ port เดียวกันได้
  2. สามารถควบคุมการเข้าถึงไฟล์ที่ไม่ต้องการได้เช่น ถ้าวาง file ของ larave ไว้ใน C:\inetpub\wwwroot ตามปกติ ผู้ไม่หวังดีสามารถเรียกใช้ไฟล์อื่นๆ นอกจากไฟล์ /public/index.php ได้โดยตรงเช่น ไฟล์ php ที่สามารถ upload ไฟล์ได้โดยไม่มีการตรวจสอบสิทธิทำให้ไม่ปลอดภัย
  3. สามารถรัน code เดียวกันโดยใช้ php หลาย version หรือมี config คนละแบบได้โดยใช้วิธี การติดตั้ง PHP หลายเวอร์ชั่น บน IIS
  4. ซ่อน หรือย้าย folder ที่เก็บงานไปไว้ไดร์อื่น

จัดการผู้ใช้และสิทธิใน yii

หากจำเป็นที่จะต้องมีจัดการผู้ใช้และสิทธิการใช้งานใน yii ในรูปแบบที่ซับซ้อน ผู้ใช้มีหลายระดับชั้น แต่ละกลุ่มมีสิทธิในการสร้าง แก้ไข ลบ ดู หรือห้ามใช้งาน ไม่เหมือนกัน yii ได้เตรียม Authentication and Authorization ที่นิยมใช้กันคือ Role-Based Access Control หรือ rbac

แต่เพราะความซับซ้อนในการใช้งาน และต้องเขียน code ควบคุม จึงมักนิยมใช้ extension Yii Users และ Rights มาช่วย การลงไม่ยาก แต่มีหลายขั้นตอน ถ้าทำผิดขั้นตอนอาจจะทำให้ลงไม่สำเร็จ เคยทำตามวิธีทั้งในคู่มือและเว็บบอร์ดแต่ไม่สำเร็จ พยามอยู่นานกว่าจะทำได้ T_T อันนี้เป็นขั้นตอนที่ผมทำจนสำเร็จ

  1. download yii-rights จาก rights แตกใส่ /your-app/protected/modules/rights เช่น D:\xampp\htdocs\yii1\JumpFlower\protected\modules\rights
  2. เปิดไฟล์ ใน \your-app\protected\modules\user\data เช่น D:\xampp\htdocs\yii1\JumpFlower\protected\modules\user\data เลือกไฟล์ schema.mysql.sql ถ้าใช้ tablePrefix อื่นอาจจะมีปัญหาได้ ทางที่ดีไม่ควรใช้ สร้างตารางขึ้นมาใหม่ และแก้ field tbl_users.Lastvisit เป็น lastvisit_at
  3. เปิดไฟล์ /your-app/protected/config/main.php เพิ่มใน array 'components'
    	'components'=>array(
    ...
    		'authManager'=>array(
    				'class'=>'RDbAuthManager',
    				'connectionID'=>'db',
    				'defaultRoles'=>array('Authenticated', 'Guest'),
    		),
    		'user'=>array(
    				'class'=>'RWebUser',
    				// enable cookie-based authentication
    				'allowAutoLogin'=>true,
    				'loginUrl'=>array('/user/login'),
    		),
    ...
    	),

    เพิ่มใน array 'import'

    	'import'=>array(
    ...
    		'application.modules.rights.*',
    		'application.modules.rights.components.*',
    		'application.modules.user.components.*',
    		'application.modules.user.models.*',
    ...
    	),
    

    เพิ่มใน array 'modules'

    	'modules'=>array(
    ...
    		'rights'=>array(
    			'authenticatedName'=>'Authenticated',
    			'debug'=>false,
    			'install'=>true,
    			'superuserName'=>'Admin',
    			'userIdColumn'=>'id',
    			'userNameColumn'=>'username',
    		),
    		'user'=>array(
    			'tableProfileFields' => 'profiles_fields',
    			'tableProfiles' => 'profiles',
    			'tableUsers' => 'users'
    		),
    ...
    	),
    • เปิด browser ไปที่ url http://localhost/yii1/JumpFlower/index.php?r=rights
    • ตอบ yes พยามเปิดทุกอย่างให้กลุ่ม Authenticated อย่าลืม Assign ตัวเองเข้ากลุ่ม Authenticated

กว่าจะได้ แต่ถ้าได้คุ้มแน่นอน

ติดตั้ง YII

ลง yii ไม่อยาก ไม่กี่นาทีก็ได้โครงของโปรเจคแล้ว

  1. โหลดตัว framework มาก่อนจาก yiiframework
  2. แตกไฟล์ใส่ htdocs folder ของผมอยู่ที่ D:\xampp\htdocs (ปกติคือ C:\xampp\htdocs)
  3. ถ้าแตกไฟล์เก็บไว้ใน folder D:\xampp\htdocs\yii1 เปิด command พิมพ์
    • d: กด enter
    • พิมพ์ cd D:\xampp\htdocs\yii1\framework กด enter
  4. สร้าง Skeleton Application ถ้าต้องการสร้าง project ชื่อ JumpFlower (คืออะไรหาได้ใน google) เก็บที่ D:\xampp\htdocs\yii1\JumpFlower พิมพ์
    yiic webapp <b>D:\xampp\htdocs\yii1\JumpFlower

    แล้ว enter ตอบ yes รอจนขึ้นข้อความ “your application has been create successfully under …”

  5. เปิดไฟล์ D:\xampp\htdocs\yii1\JumpFlower\protected\config\database.php แก้ เอา comment ออก ใส่ชื่อ database username password ใม่ตามที่ใช้จริง
    <?php
    
    // This is the database connection configuration.
    return array(
    	'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
    	'connectionString' => 'mysql:host=localhost;dbname=yii1',
    	'emulatePrepare' => true,
    	'username' => 'root',
    	'password' => '',
    	'charset' => 'utf8',
    	'tablePrefix'=>'tbl_',
    );

เสร็จ!

แก้ YII Assets ย้าย static cache folder

โดยปกติ yii จะเก็บไฟล์ static บางไฟล์ที่เป็น CSS, JavaScript ทั้งที่เป็น framework อย่าง jQuery หรือไฟล์ที่เกิดจากการใช้คำสั่ง Yii::app()->getClientScript()->registerScript(‘featured’ ,”…”); หรือ Yii::app()->clientScript->registerCoreScript(‘jquery’); ไว้ใน folder assets/ค่าสุ่ม บางครั้งเราแก้ไขไปแล้ว แต่ไฟล์พวกนี้ยัง cache ของเดิมอยู่เพราะว่า hash ไม่ได้ต่างจากเดิม หน้าเว็บจึงทำงานไม่ถูกต้องตามที่ตั้งใจไว้ วิธีแก้คือการที่จะต้องเข้าไปลบออกทั้งโฟลเดอร์ ซึ่งไม่สดวกนักเพราะว่าใน assets ยังมีไฟล์ที่เป็นดาต้าจริงๆ อยู่ด้วย ทางที่จึงควรแยกไฟล์ที่เป็น static cache พวกนี้ออกไปไว้ที่อื่นเพื่อความสดวกในการทดสอบและปลอดภัยของข้อมูล

สมมุติว่าสร้างโฟลเดอร์เก็บไฟล์ static cache ไว้ที่ D:/xampp/htdocs/yiiTest/assetsRuntime (user ต้องเข้าถึงได้จาก internet และต้องกำหนดให้ php มีสิทธิเขียน / ลบไฟล์ อย่างน้อย cmod ต้องเป็น 0755 ) แล้วไปที่ protectedconfig main.php เพิ่มบรรทัดตามตัวอย่าง

	'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
	'name'=>'My Web Application',
…
	// application components
	'components'=>array(
		'assetManager'=>array(
			'basePath'=>'D:/xampp/htdoc/syiiTest/assets/Runtime',
			'baseUrl'=>'/yiiTest/assetsRuntime/'
		),
…

อาจจะลบโฟลเดอร์ static cache ใน assets เก่าออก ครั้งต่อไปที่เขียนไฟล์ จะเขียนลงที่ใหม่