|
|
|
ช่วยดูด้วยครับว่าต้องเขียน Link CSS ยังไง ไว้ตรงไหนใน php code นี้ |
|
|
|
|
|
|
|
ช่วยดูด้วยครับว่าต้องเขียน Link CSS ยังไง ไว้ตรงไหนใน php code นี้ ผมก็ทำตามคำแนะนำแบบนี้แต่มันก็ใช้ไม่ได้
Code (PHP)
<?echo "<head><link rel="stylesheet" href="yearpicker.css"></head>" ?>
รบกวนช่วยดูให้ด้วยครับ ว่าต้องเขียนยังไง หรือ วางตรงไหน ขอบคุณครับ (มือใหม่หัดทำ)
Code (PHP)
<?php
namespace Dms\Index;
use Kotchasan\DataTable;
use Kotchasan\Date;
use Kotchasan\Http\Request;
use Kotchasan\Language;
/**
* module=dms
*
*
* @since 1.0
*/
class View extends \Gcms\View
{
/**
* @var object
*/
private $category;
/**
* แสดงรายการเอกสารส่ง.
*
* @param Request $request
* @param array $login
*
* @return string
*/
public function render(Request $request, $login)
{
// ค่าที่ส่งมา
$params = array(
'module' => 'borrow-search',
'from' => $request->request('from')->date(),
'to' => $request->request('to')->date(),
'search' => $request->request('search')->topic(),
);
foreach (Language::get('DMS_CATEGORIES') as $k => $label) {
$params[$k] = $request->request($k)->toInt();
}
// หมวดหมู่
$this->category = \Dms\Category\Model::init();
// URL สำหรับส่งให้ตาราง
$uri = $request->createUriWithGlobals(WEB_URL.'index.php');
// ตาราง
$table = new DataTable(array(
/* Uri */
'uri' => $uri,
/* Model */
'model' => \Dms\Index\Model::toDataTable($params, $login),
/* รายการต่อหน้า */
'perPage' => $request->cookie('dmsIndex_perPage', 30)->toInt(),
/* เรียงลำดับ */
'sort' => 'create_date DESC',
/* ฟังก์ชั่นจัดรูปแบบการแสดงผลแถวของตาราง */
'onRow' => array($this, 'onRow'),
/* คอลัมน์ที่ไม่ต้องแสดงผล */
'hideColumns' => array('id', 'dms_id', 'url','ext', 'file_name', 'create_date', 'document_no', 'downloads', 'detail', 'group'),
/* ตัวเลือกการแสดงผลที่ส่วนหัว */
/* ตั้งค่าการกระทำของของตัวเลือกต่างๆ ด้านล่างตาราง ซึ่งจะใช้ร่วมกับการขีดถูกเลือกแถว */
'action' => 'index.php/dms/model/index/action',
'actionCallback' => 'dataTableActionCallback',
/* ส่วนหัวของตาราง และการเรียงลำดับ (thead) */
'headers' => array(
'create_date' => array(
'text' => '{LNG_Date}',
),
'document_no' => array(
'text' => '{LNG_Document No.}',
),
..............................................................................................................
Tag : PHP, HTML, CSS
|
ประวัติการแก้ไข 2021-05-22 23:19:58 2021-05-22 23:21:28 2021-05-22 23:23:24
|
|
|
|
|
Date :
2021-05-22 23:16:43 |
By :
npolkhet |
View :
2260 |
Reply :
32 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
คุณบอกเองว่าเป็นมือใหม่ คำแนะนำคือ เขียนแบบธรรมดา อย่าพึ่งไปใช้เฟรมเวิรกอิสระที่เป็น mvc เพราะการโปรแกรมคือการทำความเข้าใจลำดับขั้นตอนของโปรแกรม เชื่อหรือไม่ว่างานแก้แพงกว่างานใหม่ งานใหม่เราเขียนเองหมดตามความเข้าใจ ส่วนงานแก้ต้องแกะโปรซีเยอร์และอัลกอริทึมของคนอื่นก่อนจึงจะสามารถแก้ไขเพิ่มเติมงานนั้นได้
หรือถ้าอยากจะดึงดันงมต่อไป ลองศึกษา oop programming concepts ค่อยแกะงานของเขาซึ่งต้องเข้าใจการทำงานของ mvc ด้วย
จากคราวก่อนๆ ที่คุณเคยนำมาโพสต์และบอกที่มา ผมได้ลองว๊าปเข้าไปดูแล้วก็ไม่ได้มีอะไรยากเป็นพิเศษ แต่ถ้าจะให้ศึกษาโครงสร้างต้องใช้เวลาเพราะไม่ใช่เฟรมเวิร์กตามท้องตลาดที่มีเอกสารการใช้งานแบบ well documented ซึ่งผมเองก็ไม่มีเวลาไปไล่ดูขนาดนั้น ส่วนคนอื่นไม่แน่จะรอผู้ใจดีสละเวลามาชี้ทางหรือศึกษาพื้นฐานแล้วแกะเองหรือเปลี่ยนไปใช้แบบธรรมดาก็ลองชั่งใจดู
ส่วนคำตอบของคำถามบอกได้แค่ว่า ไม่น่าจะทำได้เพียงแค่แก้ไขส่วน view เพราะถ้าเกี่ยวข้องกับฐานข้อมูลต้องเช็คทั้ง โมเดล และคอนโทรลเลอร์ประกอบด้วย
|
|
|
|
|
Date :
2021-05-22 23:58:13 |
By :
พญามัจจุราช |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
โดยปกติถ้าเป็น MVC Concept มาตราฐานสากล Included ไว้หน้า view ที่เป็น layout หลักได้เลยครับ
แต่ถ้าคุณเป็นมือใหม่ PHP Framwork ผมเห็นว่าควรย้ายไป Laravel จะดีกว่า Community ใหญ่กว่า หาคำตอบกาแก้ไขปัญหาง่ายกว่า document ชัดเจน pugin ครบไม่ว่าจะเป็น API ฯลฯ
ปล. ผมไม่ได้ Anti Framwork ตัวนี้ แต่ผมแนะนำ Framework ที่สอดคล้องกับตลาดแรงงาน
|
|
|
|
|
Date :
2021-05-23 12:25:12 |
By :
Genesis™ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<?
<?php
ไปเอาตัวอย่างมาจากไหน ขยันเขียนผิดกันได้ทุกปีสิน่า.
|
|
|
|
|
Date :
2021-05-23 13:18:25 |
By :
mr.v |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอขอบคุณสำหรับคำแนะนำของความเห็นท่านที่ 1 และ 2 ที่แรกก็ชั่งใจอยู่ว่าจะเอาแบบนี้ หรือ เขียนขึ้นมาเอง แต่พอดูแล้วระบบหลังบ้านเค้าโอเคเลย และด้วยเวลาที่จำกัด ซึ่งในเวลานี้ทางด้านโปรแกรมมิ่งก็เสร็จสมบูรณ์เกือบหมดแล้ว เหลือแค่ตกแต่งนิดหน่อย โดยจะอาศัย css คือในตอนนี้ผมเพียงต้องการเวลาเพิ่มข้อมูลในรูปแบบปฎิทิน แต่จะให้ขึ้นให้เลือกเฉพาะปีเท่านั้น ซึ่งก็เข้าไปตามเวปแล้วก็มีวิธี แต่ต้องใช้งานผ่าน css ซึ่งผมก็ไม่ทราบจริงๆว่าต้องเขียนรูปแบบยังไงในไฟล์นี้ครับ
|
|
|
|
|
Date :
2021-05-23 15:08:58 |
By :
npolkhet |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
หาทางเพิ่ม ใน html
Code (PHP)
<!doctype html>
<html lang=en >
<head>
<title>xxxxx</title>
<link rel="stylesheet" href="yearpicker.css">
ไม่ใช่เพิ่ม แบบที่เอามาลง ต้องศึกษาไวยกรณ์ของ html ด้วย อย่าสักแต่เอาโค๊ดมาบวกต่อกัน
tag head มันมีอยู่แล้ว ก็ไม่ควรจะมีซ้ำซ้อน
|
|
|
|
|
Date :
2021-05-23 17:01:31 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
มาแนวนี้อีกคนแล้ว หาคำแนะนำให้ บอกว่าทำแล้วแต่ไม่ให้เห็นว่าทำยังไง พอไล่จี้จุดรายละเอียดเล็กน้อย ซึ่งถ้ามันผิดมันก็จะไม่รัน อย่างเช่นการเว้นวรรคหลังแท็กเปิด, การปิด semi colon, การเปิดแสดง error ก็ไม่พอใจอีก
จะให้มันทำงานได้ ดูเหมือนจะเอาเร็วด้วย แต่เวลาจี้จุดรายละเอียดที่มันจะเป็นอุปสรรคได้ก็ไม่ค่อยจะพอใจกัน แต่จะให้มันเวิร์ค
แล้ว framework นี้ก็อย่างที่ข้างบนบอกกันมาหลายแล้ว มันไม่ค่อยแพร่หลาย หาคนช่วยยาก จะหวังให้มันเวิร์คเหมือนพลิกฝ่ามือมันเป็นไปไม่ได้หรอก มันต้องช้าแน่ และก็ต้องค่อยๆไปด้วย ไม่เหมือนกับตัวที่แพร่หลายมาก คนใช้มากก็จะหาคนช่วยได้ง่ายขึ้น
ถ้ามือใหม่แล้วจะแก้เอาให้มันเวิร์คได้ดั่งใจเร็วๆ มันเป็นไปไม่ได้หรือแทบไม่ได้เลย แต่ถ้าจะค่อยเป็นค่อยไปมันก็พอช่วยกันลากไปไหวอยู่ แต่ก็ควรรู้ด้วยว่าการเขียนโปรแกรมมันต้องหมั่นทดลอง, ต้องละเอียด บางครั้งการปรับเปลี่ยนเพียงเล็กน้อยในสายตาคนทั่วไปรู้สึกว่ามันไม่น่ามีผลอะไร แต่มันให้ผลพลิกหน้าพลิกหลังก็มี ดังนั้นเวลาทำอะไรไปแล้วก็ต้องเอามาอัพเดทด้วยว่าอะไรแก้ไปถึงไหน ได้ผลยังไง รับข้อแนะนำ ทดลอง แก้ไขใหม่ ได้ผลยังไงอีก มันก็ต้องไปอย่างงี้ ยกเว้นพวกที่เขาชำนาญเขาก็รับไปทดลองพลิกแพลงเองแป๊บเดียวได้
|
|
|
|
|
Date :
2021-05-25 17:55:43 |
By :
mr.v |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
โค้ดที่ไปเอามาใช้ ไปดาวน์โหลดจากหน้าไหน เอาลิ้งค์มาลงหน่อย ผมและหลายๆคนจะได้ดาวน์โหลดไปทดลองดู บางทีอาจจะเร็วขึ้น ได้แก้พุ่งเป้าได้ทดลองตรงจุดรวดเดียวเลย
|
|
|
|
|
Date :
2021-05-25 18:22:52 |
By :
mr.v |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบคุณสำหรับคำแนะนำของทุกท่าน ผมขอลงลิ้งค์ที่มาของโปรแกรมนี้ให้ด้านล่างครับ ก็ขอขอบคุณสำหรับทุกท่านที่สละเวลาช่วยดูให้ ไม่ได้ไม่เป็นไรครับ ก็คงให้น้องที่ทำงานไปใช้งานก่อน แล้วค่อยหาวิธีแก้ตามเอา ขอบคุณครับ.
https://kotchasan.com/knowledge/%E0%B9%81%E0%B8%88%E0%B8%81%E0%B8%9F%E0%B8%A3%E0%B8%B5_%E0%B8%A3%E0%B8%B0%E0%B8%9A%E0%B8%9A%E0%B8%88%E0%B8%B1%E0%B8%94%E0%B9%80%E0%B8%81%E0%B9%87%E0%B8%9A%E0%B9%80%E0%B8%AD%E0%B8%81%E0%B8%AA%E0%B8%B2%E0%B8%A3%E0%B8%AD%E0%B8%AD%E0%B8%99%E0%B9%84%E0%B8%A5%E0%B8%99%E0%B9%8C_php_electronic_document_manageme.html
|
|
|
|
|
Date :
2021-05-26 13:56:12 |
By :
npolkhet |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตอบความคิดเห็นที่ : 10 เขียนโดย : Chaidhanan เมื่อวันที่ 2021-05-25 17:04:07
รายละเอียดของการตอบ ::
ขอบคุณสำหรับคำแนะนำครับ ผมขอส่งไฟล์ index.php ที่ทำงานสัมพันธ์กัน ทั้งใน 3 ส่วน อันแรกจะอยู่ในส่วนของ Controller อันที่สองเป็นส่วนของ Model ที่จะดึงข้อมูลต่างๆจากฐานข้อมูลออกมา และ อันที่สามเป็นส่วนของ View ที่จะเป็นส่วนจัดการส่วนแสดงผลหน้าเวปครับ
ส่วนแรก Controller/index.php
Code (PHP)
<?php
/**
* @filesource modules/dms/controllers/index.php
*
* @copyright 2016 Goragod.com
* @license http://www.kotchasan.com/license/
*
* @see http://www.kotchasan.com/
*/
namespace Dms\Index;
use Gcms\Login;
use Kotchasan\Html;
use Kotchasan\Http\Request;
use Kotchasan\Language;
/**
* module=dms
*
* @author Goragod Wiriya <[email protected]>
*
* @since 1.0
*/
class Controller extends \Gcms\Controller
{
/**
* แสดงรายการเอกสาร
*
* @param Request $request
*
* @return string
*/
public function render(Request $request)
{
// ข้อความ title bar
$this->title = Language::trans('{LNG_List of} {LNG_Document}');
// เลือกเมนู
$this->menu = 'dms';
// สมาชิก
$login = Login::isMember();
// สามารถดูหรือดาวน์โหลดเอกสารได้
if (Login::checkPermission($login, 'can_download_dms')) {
// แสดงผล
$section = Html::create('section', array(
'class' => 'content_bg',
));
// breadcrumbs
$breadcrumbs = $section->add('div', array(
'class' => 'breadcrumbs',
));
$ul = $breadcrumbs->add('ul');
$ul->appendChild('<li><span class="icon-edocument">{LNG_Document management system}</span></li>');
$ul->appendChild('<li><span>{LNG_Document}</span></li>');
$ul->appendChild('<li><span>{LNG_List of}</span></li>');
$section->add('header', array(
'innerHTML' => '<h2 class="icon-documents">'.$this->title.'</h2>',
));
// ตารางรายการเอกสาร
$section->appendChild(createClass('Dms\Index\View')->render($request, $login));
// คืนค่า HTML
return $section->render();
}
// 404
return \Index\Error\Controller::execute($this, $request->getUri());
}
}
ส่วนที่สอง Model/index.php
Code (PHP)
<?php
/**
* @filesource modules/dms/models/index.php
*
* @copyright 2016 Goragod.com
* @license http://www.kotchasan.com/license/
*
* @see http://www.kotchasan.com/
*/
namespace Dms\Index;
use Gcms\Login;
use Kotchasan\Database\Sql;
use Kotchasan\Http\Request;
use Kotchasan\Language;
/**
* module=dms
*
* @author Goragod Wiriya <[email protected]>
*
* @since 1.0
*/
class Model extends \Kotchasan\Model
{
/**
* Query ข้อมูลสำหรับส่งให้กับ DataTable
*
* @param array $params
* @param array $login
*
* @return \Kotchasan\Database\QueryBuilder
*/
public static function toDataTable($params, $login)
{
$where = array();
if (!empty($params['from'])) {
$where[] = array('A.create_date', '>=', $params['from']);
}
if (!empty($params['to'])) {
$where[] = array('A.create_date', '<=', $params['to']);
}
$select = array('A.id', 'A.create_date', 'A.document_no', 'A.topic');
$query = static::createQuery()
->from('dms A');
$n = 1;
foreach (Language::get('DMS_CATEGORIES') as $k => $label) {
$query->join('dms_meta N'.$n, 'LEFT', array(array('N'.$n.'.dms_id', 'A.id'), array('N'.$n.'.type', $k)))
->join('category C'.$n, 'LEFT', array(array('C'.$n.'.category_id', 'N'.$n.'.value'), array('C'.$n.'.type', $k)));
if ($k == 'department') {
$select[] = Sql::GROUP_CONCAT('C'.$n.'.topic', $k);
if (!empty($login['department'])) {
$where[] = array('N'.$n.'.value', $login['department']);
}
} else {
$select[] = 'C'.$n.'.topic '.$k;
}
if ($params[$k] > 0) {
$where[] = array('N'.$n.'.value', $params[$k]);
}
$n++;
}
$select[] = 'A.url';
$q1 = $query->select($select)
->where($where)
->groupBy('A.id');
$where = array();
if (!empty($params['search'])) {
$where[] = Sql::create("(A.`document_no` LIKE '%$params[search]%' OR A.`topic` LIKE '%$params[search]%' OR F.`topic` LIKE '%$params[search]%')");
}
return static::createQuery()
->select(Sql::IFNULL('F.id', 0, 'id'), 'A.id dms_id', 'A.create_date', 'A.document_no', 'A.topic', 'F.topic file_name', 'F.ext', 'A.department', 'A.cabinet', 'W.downloads', 'A.url')
->from(array($q1, 'A'))
->join('dms_files F', 'LEFT', array('F.dms_id', 'A.id'))
->join('dms_download W', 'LEFT', array(array('W.file_id', Sql::create('CASE WHEN A.`url`="" THEN F.`id` ELSE 0 END')), array('W.dms_id', 'A.id'), array('W.member_id', $login['id'])))
->where($where);
}
/**
* รับค่าจาก action
*
* @param Request $request
*/
public function action(Request $request)
{
$ret = array();
// session, referer, member, สามารถดูหรือดาวน์โหลดเอกสารได้
if ($request->initSession() && $request->isReferer() && $login = Login::isMember()) {
if (Login::checkPermission($login, 'can_download_dms')) {
// ค่าที่ส่งมา
$file_id = $request->post('id')->toInt();
if (preg_match('/(detail|download)_([0-9]+)/', $request->post('action')->toString(), $match)) {
if ($match[1] == 'detail') {
$document = \Dms\View\Model::get($match[2]);
if ($document) {
$ret['modal'] = Language::trans(createClass('Dms\View\View')->render($document, $login));
}
} elseif ($match[1] == 'download') {
if ($file_id > 0) {
// ดาวน์โหลดไฟล์
$ret = $this->fileDownload($file_id, $login['id']);
} else {
// เปิด URL
$ret = $this->openUrl($match[2], $login['id']);
}
}
}
}
}
// คืนค่าเป็น JSON
echo json_encode($ret);
}
/**
* เปิด URL
*
* @param int $id
* @param int $member_id
*
* @return array
*/
public function openUrl($id, $member_id)
{
$download = $this->db()->createQuery()
->from('dms_download')
->where(array(
array('dms_id', $id),
array('file_id', 0),
array('member_id', $member_id),
))
->first('id', 'downloads');
$save = array(
'downloads' => $download ? $download->downloads + 1 : 1,
'dms_id' => $id,
'file_id' => 0,
'member_id' => $member_id,
'last_update' => date('Y-m-d H:i:s'),
);
if ($download) {
$this->db()->update($this->getTableName('dms_download'), $download->id, $save);
} else {
$this->db()->insert($this->getTableName('dms_download'), $save);
}
return array();
}
/**
* ดาวน์โหลดไฟล์
*
* @param int $file_id
* @param int $member_id
*
* @return array
*/
public function fileDownload($file_id, $member_id)
{
$ret = array();
// อ่านรายการที่เลือก
$result = $this->db()->createQuery()
->from('dms_files')
->where(array('id', $file_id))
->first('id', 'dms_id', 'size', 'name', 'file', 'ext');
if ($result) {
// ไฟล์
$file = ROOT_PATH.DATA_FOLDER.$result->file;
if (is_file($file)) {
// สามารถดาวน์โหลดได้
$download = $this->db()->createQuery()
->from('dms_download')
->where(array(
array('file_id', $result->id),
array('member_id', $member_id),
))
->first('id', 'downloads');
$save = array(
'downloads' => $download ? $download->downloads + 1 : 1,
'dms_id' => $result->dms_id,
'file_id' => $result->id,
'member_id' => $member_id,
'last_update' => date('Y-m-d H:i:s'),
);
if ($download) {
$this->db()->update($this->getTableName('dms_download'), $download->id, $save);
} else {
$this->db()->insert($this->getTableName('dms_download'), $save);
}
// id สำหรบไฟล์ดาวน์โหลด
$id = uniqid();
// บันทึกรายละเอียดการดาวน์โหลดลง SESSION
$file = array(
'file' => $file,
'size' => $result->size,
);
if (self::$cfg->dms_download_action == 1 && in_array($result->ext, array('pdf', 'jpg', 'jpeg', 'png', 'gif'))) {
$file['name'] = '';
$file['mime'] = \Kotchasan\Mime::get($result->ext);
} else {
$file['name'] = $result->name.'.'.$result->ext;
$file['mime'] = 'application/octet-stream';
}
$_SESSION[$id] = $file;
// คืนค่า
$ret['open'] = WEB_URL.'modules/dms/filedownload.php?id='.$id;
} else {
// ไม่พบไฟล์
$ret['alert'] = Language::get('File not found');
}
}
return $ret;
}
}
ส่วนที่สาม view/index.php
Code (PHP)
<?php
/**
* @filesource modules/dms/views/index.php
*
* @copyright 2016 Goragod.com
* @license http://www.kotchasan.com/license/
*
* @see http://www.kotchasan.com/
*/
namespace Dms\Index;
use Kotchasan\DataTable;
use Kotchasan\Date;
use Kotchasan\Http\Request;
use Kotchasan\Language;
/**
* module=dms
*
* @author Goragod Wiriya <[email protected]>
*
* @since 1.0
*/
class View extends \Gcms\View
{
/**
* @var object
*/
private $category;
/**
* แสดงรายการเอกสารส่ง.
*
* @param Request $request
* @param array $login
*
* @return string
*/
public function render(Request $request, $login)
{
// ค่าที่ส่งมา
$params = array(
'module' => 'borrow-search',
'from' => $request->request('from')->date(),
'to' => $request->request('to')->date(),
'search' => $request->request('search')->topic(),
);
foreach (Language::get('DMS_CATEGORIES') as $k => $label) {
$params[$k] = $request->request($k)->toInt();
}
// หมวดหมู่
$this->category = \Dms\Category\Model::init();
// URL สำหรับส่งให้ตาราง
$uri = $request->createUriWithGlobals(WEB_URL.'index.php');
// ตาราง
$table = new DataTable(array(
/* Uri */
'uri' => $uri,
/* Model */
'model' => \Dms\Index\Model::toDataTable($params, $login),
/* รายการต่อหน้า */
'perPage' => $request->cookie('dmsIndex_perPage', 30)->toInt(),
/* เรียงลำดับ */
'sort' => 'create_date DESC',
/* ฟังก์ชั่นจัดรูปแบบการแสดงผลแถวของตาราง */
'onRow' => array($this, 'onRow'),
/* คอลัมน์ที่ไม่ต้องแสดงผล */
'hideColumns' => array('id', 'dms_id', 'url'),
/* ตัวเลือกการแสดงผลที่ส่วนหัว */
'filters' => array(
array(
'name' => 'from',
'type' => 'date',
'text' => '{LNG_from}',
'value' => $params['from'],
),
array(
'name' => 'to',
'type' => 'date',
'text' => '{LNG_to}',
'value' => $params['to'],
),
),
/* ตั้งค่าการกระทำของของตัวเลือกต่างๆ ด้านล่างตาราง ซึ่งจะใช้ร่วมกับการขีดถูกเลือกแถว */
'action' => 'index.php/dms/model/index/action',
'actionCallback' => 'dataTableActionCallback',
/* ส่วนหัวของตาราง และการเรียงลำดับ (thead) */
'headers' => array(
'create_date' => array(
'text' => '{LNG_Date}',
),
'document_no' => array(
'text' => '{LNG_Document No.}',
),
'topic' => array(
'text' => '{LNG_Document title}',
),
'file_name' => array(
'text' => '{LNG_File name}',
),
'ext' => array(
'text' => '',
),
'downloads' => array(
'text' => '',
),
),
/* รูปแบบการแสดงผลของคอลัมน์ (tbody) */
'cols' => array(
'ext' => array(
'class' => 'center',
),
'downloads' => array(
'class' => 'center',
),
),
/* ฟังก์ชั่นตรวจสอบการแสดงผลปุ่มในแถว */
'onCreateButton' => array($this, 'onCreateButton'),
/* ปุ่มแสดงในแต่ละแถว */
'buttons' => array(
'download' => array(
'class' => 'icon-download button purple',
'id' => ':dms_id_:id',
'text' => '{LNG_Download}',
),
'detail' => array(
'class' => 'icon-info button orange',
'id' => ':dms_id_:id',
'text' => '{LNG_Detail}',
),
),
));
foreach (Language::get('DMS_CATEGORIES') as $k => $label) {
if ($k != 'department') {
$table->filters[] = array(
'name' => $k,
'text' => $label,
'options' => array(0 => '{LNG_all items}') + $this->category->toSelect($k),
'value' => $params[$k],
);
}
$table->headers[$k] = array(
'text' => $label,
'class' => 'center',
);
$table->cols[$k] = array(
'class' => 'center',
);
}
$table->filters['search'] = array(
'name' => 'search',
'type' => 'text',
'text' => '{LNG_Search}',
'value' => $params['search'],
);
// save cookie
setcookie('dmsIndex_perPage', $table->perPage, time() + 2592000, '/', HOST, HTTPS, true);
// คืนค่า HTML
return $table->render();
}
/**
* จัดรูปแบบการแสดงผลในแต่ละแถว
*
* @param array $item
*
* @return array
*/
public function onRow($item, $o, $prop)
{
$item['create_date'] = Date::format($item['create_date'], 'd M Y');
if ($item['url'] != '') {
$item['ext'] = '';
} else {
$item['ext'] = '<img src="'.(is_file(ROOT_PATH.'skin/ext/'.$item['ext'].'.png') ? WEB_URL.'skin/ext/'.$item['ext'].'.png' : WEB_URL.'skin/ext/file.png').'" alt="'.$item['ext'].'">';
}
$item['downloads'] = '<span id="downloads_'.$item['id'].'" class="icon-valid color-'.(empty($item['downloads']) ? 'silver' : 'green').' notext"></span>';
return $item;
}
/**
* ฟังกชั่นตรวจสอบว่าสามารถสร้างปุ่มได้หรือไม่
*
* @param array $item
*
* @return array
*/
public function onCreateButton($btn, $attributes, $item)
{
if ($btn == 'download') {
if ($item['url'] != '') {
$attributes['href'] = $item['url'];
$attributes['class'] = 'button blue icon-world';
$attributes['text'] = '{LNG_URL}';
$attributes['target'] = '_blank';
}
return $attributes;
} else {
return $attributes;
}
}
}
ขอบคุณครับ
|
|
|
|
|
Date :
2021-05-26 14:17:11 |
By :
npolkhet |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตอบตามหัวกระทู้นะครับ ต้องเขียน link CSS ยังไง
เข้าไปที่่ [folder ที่ติดตั้ง]/skin/default/index.html เปิดไฟล์นี้ขึ้นมา
แก้ลงไปใน <head>...</head> ได้เลย
แต่... จากที่ผมทดลอง
Code
<head>
<meta charset=utf-8>
<meta name=viewport content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="{WEBURL}favicon.ico">
<title>{TITLE}</title>
<link rel=stylesheet href="index.php/css/view/index">
<link rel="stylesheet" href="somewhere.css">
<script src="index.php/js/view/index/{LANGUAGE}"></script>
</head>
มันจะไปมองหาไฟล์ css ที่ [folder ที่ติดตั้ง]/somewhere.css
ซึ่งพอผมสร้างไฟล์ไว้ตรงนั้นมันก็เจอจริงๆ
แต่ถ้าไฟล์ไม่อยู่ตรงนั้น แทนที่มันจะแจ้ง error 404 ให้เหมือนปกติที่ระบบทั่วไปเขาทำกัน ระบบนี้ดันไปเอาหน้า html เดาว่าของ index.html มาแทนแล้วส่ง status 200
คือถ้าทำแบบนี้แล้วไฟล์ไม่มีอยู่จริงจะไม่มีทางรู้ตัวเลย
ผมมองว่าการทำแบบนี้ไม่เป็นมิตรกับทีมออกแบบ แต่ด้วยตัว framework ของเขาคงจะมีวิธีที่ดีกว่านี้ในการเพิ่ม css ซึ่งผมยังไม่ได้ศึกษา.
ทีนี้พอลองดูตัวอย่างจาก css ของเขาที่มี index.php/css/view/index มันก็จะไปเจอที่ไฟล์ [folder ที่ติดตั้ง]/modules/css/views/index.php ให้เปิดไฟล์นี้ขึ้นมาดู
ถ้าจะทำตามแบบเขาก็เพิ่มโค้ดแบบนี้ลงไป
Code (PHP)
public function index()
{
// โหลด css หลัก
$data = file_get_contents(ROOT_PATH.'skin/fonts.css');
$data = preg_replace('/url\(([\'"])?fonts\//isu', 'url(\\1'.WEB_URL.'skin/fonts/', $data);
$data .= file_get_contents(ROOT_PATH.'skin/gcss.css');
// css ของ template
$data2 = file_get_contents(ROOT_PATH.self::$cfg->skin.'/style.css');
$data2 = preg_replace('/url\(([\'"])?(img|fonts)\//isu', 'url(\\1'.WEB_URL.self::$cfg->skin.'/\\2/', $data2);
// ที่เพิ่มเข้ามา
$data3 = file_get_contents(ROOT_PATH.'/somewhere.css');
// โหลดโมดูลที่ติดตั้งแล้ว
$modules = \Gcms\Modules::create();
// ไดเร็คทอรี่โมดูล
$dir = $modules->getDir();
// css ของโมดูล
foreach ($modules->get() as $module) {
if (is_file($dir.$module.'/style.css')) {
$data2 .= preg_replace('/url\(img\//isu', 'url('.WEB_URL.'modules/'.$module.'/img/', file_get_contents($dir.$module.'/style.css'));
}
}
$data2 .= 'header.header,body.admin.welcomepage,.language-menu li>a:hover,.topmenu>ul ul>li.hover>a,.topmenu>ul ul>li.hover>.menu-arrow,.topmenu>ul ul>li:hover>a,.topmenu>ul ul>li:hover>.menu-arrow,.gdpanel a:hover{background-color:'.self::$cfg->bg_color.'}';
$data2 .= 'header.header,.topmenu>ul>li,.language-menu li>a:hover,.topmenu>ul ul>li.hover>a,.topmenu>ul ul>li.hover>.menu-arrow,.topmenu>ul ul>li:hover>a,.topmenu>ul ul>li:hover>.menu-arrow,.gdpanel a:hover{color:'.self::$cfg->color.'}';
$data2 .= '.tab_menus>li.select,.tab_menus>li:hover{background-color:'.self::$cfg->bg_color.';color:'.self::$cfg->color.'}';
$data2 .= '.tab_menus ul>li:hover{background-color:'.self::$cfg->bg_color.';color:'.self::$cfg->color.'}';
$data2 .= '.border-color{border-color:'.self::$cfg->bg_color.'}';
foreach (self::$cfg->color_status as $key => $value) {
$data2 .= '.status'.$key.'{color:'.$value.'}';
}
// compress css
$data = self::compress($data.$data2.$data3);
// Response
$response = new \Kotchasan\Http\Response();
$response->withHeaders(array(
'Content-type' => 'text/css; charset=utf-8',
'Cache-Control' => 'max-age=31557600',
))
->withContent($data)
->send();
}
ผมเพิ่ม $data3 ลงไปเพื่อพอเป็นตัวอย่าง ยังไม่ได้ทดลอง แต่คิดว่าน่าจะพอได้ ตำแหน่งไฟล์ก็คงที่เดียวกันกับที่ผมบอกข้างบนนู่น
ทดลองดูครับ หวังว่าจะได้ผล
|
|
|
|
|
Date :
2021-05-26 14:55:07 |
By :
mr.v |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
framework ตัวนี้มีอะไรแปลกไม่เหมือนคนอื่นหลายอย่างเลย เรื่อง 404 ก็อย่างที่บอกไปแล้วข้างบน
อีกเรื่องคือ Views
อ้างอิงจาก Symfony PHP framework ระดับสากลที่มีมาเก่าแก่ https://symfony.com/doc/2.0/quick_tour/the_view.html
Codeigniter ที่เคยโด่งดัง https://codeigniter.com/userguide3/general/views.html
Laravel https://laravel.com/docs/master/views
จะเห็นว่าทุกตัวเขาใช้ View ในการแสดงผล HTML ทั้งนั้น จะบอกว่า views คือ template ก็พอได้ แต่มันคือส่วนที่แสดงผลออกมาเป็น HTML
ส่วนของ framework เจ้านี้ View เป็น php class .........ทำไมเป็นอย่างนั้นไม่รู้??
ทำให้ตอนแรกผมจะพุ่งเป้าไปที่ไฟล์ views เพื่อแก้แท็ก link css ในนั้น พอเปิดเข้าไปกลายเป็น php class ที่ไม่เกี่ยวกับ views อย่างที่ค่ายอื่นๆเขาเป็นกัน
สุดท้ายต้องมั่วๆไปเข้าโฟลเดอร์ skin ถึงจะเจอ. อันนี้ก็เป็นอีกหนึ่งความสับสนที่เชื่อว่าถ้าคนใช้ framework เจ้าอื่นๆในตลาดมาใช้แบบนี้จะต้องหาไม่เจอ งงเป็นไก่ตาแตกอยู่พักใหญ่แน่นอน
มี framework อีกตัวหนึ่งที่มี view class คล้ายๆกัน คือ FuelPHP https://fuelphp.com/docs/classes/view.html
แต่ว่าของเขาไม่ได้มาลักษณะนี้ เป็นเหมือน class ให้ใช้งานได้เฉยๆ เพราะใน view ปกติของเขานั้น https://fuelphp.com/docs/general/views.html ก็ยังคงเหมือน framework อื่นๆทั่วไป คือเป็น HTML, อยู่ในโฟลเดอร์ที่ไม่ชวนสับสน.
|
|
|
|
|
Date :
2021-05-26 21:35:49 |
By :
mr.v |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
สรุปท่าน จขกท. ได้นำวิธีแก้ปัญหาของ ท่าน V ไปใช้หรือยัง ...ผมรอคำตอบอยู่นะ
ถ้าดีจริงๆ เผื่อภายภาคหน้าจะได้มีโอกาสศึกษากลยุทธ์การสับมือหลอกหรือนำไปใช้บ้าง
|
|
|
|
|
Date :
2021-05-28 13:21:12 |
By :
พญามัจจุราช |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ดูจาก วิวซอร์ส ครับ ว่าที่เราแก้ไข มันได้เข้าไปปรากฏใน css บน browser หรือเปล่า
อาจจะแก้ไขผิด ไฟล์
|
|
|
|
|
Date :
2021-06-01 18:34:48 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Code (PHP)
.card-text {
display: block;
display: -webkit-box;
line-height: 2;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
ข้อความ 3 บรรทัด ตัดด้วย ...
|
ประวัติการแก้ไข 2021-06-01 19:02:27
|
|
|
|
Date :
2021-06-01 19:00:50 |
By :
Genesis™ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ปัญหา CSS ไม่ตัดคำไม่ใช่ว่ามันไม่ตัดหรอกมั้ง มันเป็นเพราะการเขียน override ไม่ถูกไม่ครบรอบของมัน มันเลยไม่ยอม override ให้มากกว่า
คือถ้าของเดิมมันมี css เขียนนำมายังไงก็ต้องเขียนอิงจากเดิมไปเพื่อให้มันทำงานทับ
ตัวอย่างเช่นของเดิมเป็น .table .tr .td จู่ๆไปเขียนให้ทำงานทับแค่ .td มันก็ไม่ได้ผลหรอก เรื่องนี้มันต้องเปิด inspector ดูด้วยเพราะปัญหามันอาจจะมาจากอย่างอื่นอีกก็ได้
ส่วนการเรียกใช้ CSS ก็ตามตย.โค้ดที่ผมเขียนไว้ด้านบนนั่นแหละครับ ทั้งตำแหน่งทั้งชื่อไฟล์
มันเปลี่ยน body background ได้จริงๆผมเคยลองหลักจากโพสต์ข้างบนเสร็จ มันก็เปลี่ยน ที่ไม่เปลี่ยนเพราะมันหาไฟล์ไม่เจอมากกว่า ก็ต้องไล่ดูตามที่ผมบอกจนกว่ามันจะไปเจอตำแหน่งไฟล์ที่ถูกต้อง ซึ่งไม่รู้ด้วยว่าจะไล่ยังไงเพราะ framework เขาไม่เอื้ออำนวยให้อย่างที่บอกไปแล้ว ต้องค่อยๆคลำเอาเองจนกว่าจะได้.
หลังจากผมโพสต์ข้างบนนู่น ลอง css ใน php ได้ผล ผมก็ลบทิ้งหมดแล้วครับ
Code (PHP)
$data3 = file_get_contents(ROOT_PATH.'/somewhere.css');
// ไฟล์อยู่ที่ [folder ที่ติดตั้ง]/somewhere.css
// ...
$data = self::compress($data.$data2.$data3);
|
ประวัติการแก้ไข 2021-06-01 22:29:30 2021-06-01 22:42:29 2021-06-01 22:43:32
|
|
|
|
Date :
2021-06-01 22:24:00 |
By :
mr.v |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ลองศึกษา เรื่อง plagma nocache ดูบ้างครับ ช่วง developer นี่ ใช้งานจะสดวกมากกว่า พอโค๊ดอยู่อยู่ ค่อยเอาออก
|
|
|
|
|
Date :
2021-06-03 17:48:04 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เรื่อง sql ก็เหมือนกันครับ ทำแล้วไม่มา ทำยังไงบ้าง เอาโค้ดมาดูเผื่อมีคนตอบได้
ส่วนผมอย่างที่บอก ผมลองเสร็จก็ลบไปแล้ว จำไม่ได้แล้วล่ะว่าอะไรยังไง
แล้วผมก็ไม่ค่อยแม่น sql ซะด้วย ถ้าดูรู้ก็จะพอตอบได้บ้างนะครับ
|
|
|
|
|
Date :
2021-06-03 17:58:46 |
By :
mr.v |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตอบความคิดเห็นที่ : 31 เขียนโดย : mr.v เมื่อวันที่ 2021-06-03 17:58:46
รายละเอียดของการตอบ ::
จากคำแนะนำของ คุณ mr.v ผมขอเอาโค๊ดมาลงเผื่อท่านใดพอมีคำแนะนำได้ครับ
Code (PHP)
<?php
/**
* @filesource modules/dms/models/index.php
*
* @copyright 2016 Goragod.com
* @license http://www.kotchasan.com/license/
*
* @see http://www.kotchasan.com/
*/
namespace Dms\Index;
use Gcms\Login;
use Kotchasan\Database\Sql;
use Kotchasan\Http\Request;
use Kotchasan\Language;
/**
* module=dms
*
* @author Goragod Wiriya <[email protected]>
*
* @since 1.0
*/
class Model extends \Kotchasan\Model
{
/**
* Query ข้อมูลสำหรับส่งให้กับ DataTable
*
* @param array $params
* @param array $login
*
* @return \Kotchasan\Database\QueryBuilder
*/
public static function toDataTable($params, $login)
{
$where = array();
if (!empty($params['from'])) {
$where[] = array('A.create_date', '>=', $params['from']);
}
if (!empty($params['to'])) {
$where[] = array('A.create_date', '<=', $params['to']);
}
$select = array('A.id', 'A.create_date', 'A.document_no', 'A.topic', 'A.detail', 'A.agency', 'A.author', 'A.syear', 'A.group');
$query = static::createQuery()
->from('dms A');
$n = 1;
foreach (Language::get('DMS_CATEGORIES') as $k => $label) {
$query->join('dms_meta N'.$n, 'LEFT', array(array('N'.$n.'.dms_id', 'A.id'), array('N'.$n.'.type', $k)))
->join('category C'.$n, 'LEFT', array(array('C'.$n.'.category_id', 'N'.$n.'.value'), array('C'.$n.'.type', $k)));
if ($k == 'department') {
$select[] = Sql::GROUP_CONCAT('C'.$n.'.topic', $k);
if (!empty($login['department'])) {
$where[] = array('N'.$n.'.value', $login['department']);
}
} else {
$select[] = 'C'.$n.'.topic '.$k;
}
if ($params[$k] > 0) {
$where[] = array('N'.$n.'.value', $params[$k]);
}
$n++;
}
$select[] = 'A.url';
$q1 = $query->select($select)
->where($where)
->groupBy('A.id');
$where = array();
if (!empty($params['search'])) {
$where[] = Sql::create("(A.`detail` LIKE '%$params[search]%' OR A.`document_no` LIKE '%$params[search]%' OR A.`topic` LIKE '%$params[search]%' OR F.`topic` LIKE '%$params[search]%' OR A.`agency` LIKE '%$params[search]%' OR A.`author` LIKE '%$params[search]%' OR A.`syear` LIKE '%$params[search]%' OR A.`group` LIKE '%$params[search]%')");
}
return static::createQuery()
->select(Sql::IFNULL('F.id', 0, 'id'), 'A.id dms_id', 'A.create_date', 'A.document_no', 'A.topic', 'A.detail', 'A.agency', 'A.author', 'A.syear', 'F.topic file_name', 'F.ext', 'W.downloads', 'A.url', 'A.group', 'A.department')
->from(array($q1, 'A'))
->join('dms_files F', 'LEFT', array('F.dms_id', 'A.id'))
->join('dms_download W', 'LEFT', array(array('W.file_id', Sql::create('CASE WHEN A.`url`="" THEN F.`id` ELSE 0 END')), array('W.dms_id', 'A.id'), array('W.member_id', $login['id'])))
->where($where);
}
/**
* รับค่าจาก action
*
* @param Request $request
*/
public function action(Request $request)
{
$ret = array();
// session, referer, member, สามารถดูหรือดาวน์โหลดเอกสารได้
if ($request->initSession() && $request->isReferer() && $login = Login::isMember()) {
if (Login::checkPermission($login, 'can_download_dms')) {
// ค่าที่ส่งมา
$file_id = $request->post('id')->toInt();
if (preg_match('/(detail|download)_([0-9]+)/', $request->post('action')->toString(), $match)) {
if ($match[1] == 'detail') {
$document = \Dms\View\Model::get($match[2]);
if ($document) {
$ret['modal'] = Language::trans(createClass('Dms\View\View')->render($document, $login));
}
} elseif ($match[1] == 'download') {
if ($file_id > 0) {
// ดาวน์โหลดไฟล์
$ret = $this->fileDownload($file_id, $login['id']);
} else {
// เปิด URL
$ret = $this->openUrl($match[2], $login['id']);
}
}
}
}
}
// คืนค่าเป็น JSON
echo json_encode($ret);
}
/**
* เปิด URL
*
* @param int $id
* @param int $member_id
*
* @return array
*/
public function openUrl($id, $member_id)
{
$download = $this->db()->createQuery()
->from('dms_download')
->where(array(
array('dms_id', $id),
array('file_id', 0),
array('member_id', $member_id),
))
->first('id', 'downloads');
$save = array(
'downloads' => $download ? $download->downloads + 1 : 1,
'dms_id' => $id,
'file_id' => 0,
'member_id' => $member_id,
'last_update' => date('Y-m-d H:i:s'),
);
if ($download) {
$this->db()->update($this->getTableName('dms_download'), $download->id, $save);
} else {
$this->db()->insert($this->getTableName('dms_download'), $save);
}
return array();
}
/**
* ดาวน์โหลดไฟล์
*
* @param int $file_id
* @param int $member_id
*
* @return array
*/
public function fileDownload($file_id, $member_id)
{
$ret = array();
// อ่านรายการที่เลือก
$result = $this->db()->createQuery()
->from('dms_files')
->where(array('id', $file_id))
->first('id', 'dms_id', 'size', 'name', 'file', 'ext');
if ($result) {
// ไฟล์
$file = ROOT_PATH.DATA_FOLDER.$result->file;
if (is_file($file)) {
// สามารถดาวน์โหลดได้
$download = $this->db()->createQuery()
->from('dms_download')
->where(array(
array('file_id', $result->id),
array('member_id', $member_id),
))
->first('id', 'downloads');
$save = array(
'downloads' => $download ? $download->downloads + 1 : 1,
'dms_id' => $result->dms_id,
'file_id' => $result->id,
'member_id' => $member_id,
'last_update' => date('Y-m-d H:i:s'),
);
if ($download) {
$this->db()->update($this->getTableName('dms_download'), $download->id, $save);
} else {
$this->db()->insert($this->getTableName('dms_download'), $save);
}
// id สำหรบไฟล์ดาวน์โหลด
$id = uniqid();
// บันทึกรายละเอียดการดาวน์โหลดลง SESSION
$file = array(
'file' => $file,
'size' => $result->size,
);
if (self::$cfg->dms_download_action == 1 && in_array($result->ext, array('pdf', 'jpg', 'jpeg', 'png', 'gif'))) {
$file['name'] = '';
$file['mime'] = \Kotchasan\Mime::get($result->ext);
} else {
$file['name'] = $result->name.'.'.$result->ext;
$file['mime'] = 'application/octet-stream';
}
$_SESSION[$id] = $file;
// คืนค่า
$ret['open'] = WEB_URL.'modules/dms/filedownload.php?id='.$id;
} else {
// ไม่พบไฟล์
$ret['alert'] = Language::get('File not found');
}
}
return $ret;
}
}
นี่เป็นหน้าแสดงรายการที่ดึงตัวแปร department ออกมาแสดง ซึ่งคำสั่งหลักอยู่ที่บรรทัดที่ 73 (A.department)
Code (PHP)
<?php
/**
* @filesource modules/dms/models/view.php
*
* @copyright 2016 Goragod.com
* @license http://www.kotchasan.com/license/
*
* @see http://www.kotchasan.com/
*/
namespace Dms\View;
/**
* โมเดลสำหรับอ่านเอกสาร
*
* @author Goragod Wiriya <[email protected]>
*
* @since 1.0
*/
class Model extends \Kotchasan\Model
{
/**
* อ่านเอกสารที่ $id
* ไม่พบ คืนค่า null
*
* @param int $id
*
* @return object
*/
public static function get($id)
{
return static::createQuery()
->from('dms A')
->where(array('A.id', $id))
->first('A.id', 'A.document_no', 'A.topic', 'A.member_id', 'A.create_date', 'A.detail', 'A.url', 'A.agency', 'A.author', 'A.syear', 'A.subagen', 'A.group');
}
/**
* อ่านรายการไฟล์
* และ ประวัติการดาวน์โหลดของคนที่ login
*
* @param int $id
* @param array $login
*
* @return array
*/
public static function files($id, $login)
{
$sql = static::createQuery()
->select('D.downloads')
->from('dms_download D')
->where(array(
array('D.file_id', 'F.id'),
array('D.member_id', $login['id']),
));
return static::createQuery()
->select('F.topic', 'F.ext', array($sql, 'downloads'))
->from('dms_files F')
->where(array('F.dms_id', $id))
->cacheOn()
->execute();
}
}
ส่วนอันนี้เป็นหน้าที่แสดงรายละเอียดของรายการใน ตัวอย่างแรก โดยคำสั่งหลักในการดึงข้อมูลมาแสดงจะอยู่ที่บรรทัดที่ 35 ซึ่งถ้าผมเขียนคำสั่งเหมือน ตัวอย่างแรก คือเอา A.department ใส่ลงไป ต่อท้าย A.group จะไม่เป็นผล รบกวนผู้รู้ให้คำแนะนำด้วยครับ
ขอบคุณครับ.
|
|
|
|
|
Date :
2021-06-04 09:30:32 |
By :
npolkhet |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 02
|