001.
<?php
002.
003.
004.
005.
006.
007.
008.
009.
010.
011.
namespace Dms\Index;
012.
013.
use
Gcms\Login;
014.
use
Kotchasan\Database\Sql;
015.
use
Kotchasan\Http\Request;
016.
use
Kotchasan\Language;
017.
018.
019.
020.
021.
022.
023.
024.
025.
class
Model
extends
\Kotchasan\Model
026.
{
027.
028.
029.
030.
031.
032.
033.
034.
035.
public
static
function
toDataTable(
$params
,
$login
)
036.
{
037.
$where
=
array
();
038.
if
(!
empty
(
$params
[
'from'
])) {
039.
$where
[] =
array
(
'A.create_date'
,
'>='
,
$params
[
'from'
]);
040.
}
041.
if
(!
empty
(
$params
[
'to'
])) {
042.
$where
[] =
array
(
'A.create_date'
,
'<='
,
$params
[
'to'
]);
043.
}
044.
$select
=
array
(
'A.id'
,
'A.create_date'
,
'A.document_no'
,
'A.topic'
);
045.
$query
=
static
::createQuery()
046.
->from(
'dms A'
);
047.
$n
= 1;
048.
foreach
(Language::get(
'DMS_CATEGORIES'
)
as
$k
=>
$label
) {
049.
$query
->join(
'dms_meta N'
.
$n
,
'LEFT'
,
array
(
array
(
'N'
.
$n
.
'.dms_id'
,
'A.id'
),
array
(
'N'
.
$n
.
'.type'
,
$k
)))
050.
->join(
'category C'
.
$n
,
'LEFT'
,
array
(
array
(
'C'
.
$n
.
'.category_id'
,
'N'
.
$n
.
'.value'
),
array
(
'C'
.
$n
.
'.type'
,
$k
)));
051.
if
(
$k
==
'department'
) {
052.
$select
[] = Sql::GROUP_CONCAT(
'C'
.
$n
.
'.topic'
,
$k
);
053.
if
(!
empty
(
$login
[
'department'
])) {
054.
$where
[] =
array
(
'N'
.
$n
.
'.value'
,
$login
[
'department'
]);
055.
}
056.
}
else
{
057.
$select
[] =
'C'
.
$n
.
'.topic '
.
$k
;
058.
}
059.
if
(
$params
[
$k
] > 0) {
060.
$where
[] =
array
(
'N'
.
$n
.
'.value'
,
$params
[
$k
]);
061.
}
062.
$n
++;
063.
}
064.
$select
[] =
'A.url'
;
065.
$q1
=
$query
->select(
$select
)
066.
->where(
$where
)
067.
->groupBy(
'A.id'
);
068.
$where
=
array
();
069.
if
(!
empty
(
$params
[
'search'
])) {
070.
$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]%')"
);
071.
}
072.
return
static
::createQuery()
073.
->select(Sql::IFNULL(
'F.id'
, 0,
'id'
),
'F.size'
,
'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'
)
074.
->from(
array
(
$q1
,
'A'
))
075.
->join(
'dms_files F'
,
'LEFT'
,
array
(
'F.dms_id'
,
'A.id'
))
076.
->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'
])))
077.
->where(
$where
);
078.
}
079.
080.
081.
082.
083.
084.
085.
public
function
action(Request
$request
)
086.
{
087.
$ret
=
array
();
088.
089.
if
(
$request
->initSession() &&
$request
->isReferer() &&
$login
= Login::isMember()) {
090.
if
(Login::checkPermission(
$login
,
'can_download_dms'
)) {
091.
092.
$file_id
=
$request
->post(
'id'
)->toInt();
093.
if
(preg_match(
'/(detail|download)_([0-9]+)/'
,
$request
->post(
'action'
)->toString(),
$match
)) {
094.
if
(
$match
[1] ==
'detail'
) {
095.
$document
= \Dms\View\Model::get(
$match
[2]);
096.
if
(
$document
) {
097.
$ret
[
'modal'
] = Language::trans(createClass(
'Dms\View\View'
)->render(
$document
,
$login
));
098.
}
099.
}
elseif
(
$match
[1] ==
'download'
) {
100.
if
(
$file_id
> 0) {
101.
102.
$ret
=
$this
->fileDownload(
$file_id
,
$login
[
'id'
]);
103.
}
else
{
104.
105.
$ret
=
$this
->openUrl(
$match
[2],
$login
[
'id'
]);
106.
}
107.
}
108.
}
109.
}
110.
}
111.
112.
echo
json_encode(
$ret
);
113.
}
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
public
function
openUrl(
$id
,
$member_id
)
124.
{
125.
$download
=
$this
->db()->createQuery()
126.
->from(
'dms_download'
)
127.
->where(
array
(
128.
array
(
'dms_id'
,
$id
),
129.
array
(
'file_id'
, 0),
130.
array
(
'member_id'
,
$member_id
),
131.
))
132.
->first(
'id'
,
'downloads'
);
133.
$save
=
array
(
134.
'downloads'
=>
$download
?
$download
->downloads + 1 : 1,
135.
'dms_id'
=>
$id
,
136.
'file_id'
=> 0,
137.
'member_id'
=>
$member_id
,
138.
'last_update'
=>
date
(
'Y-m-d H:i:s'
),
139.
);
140.
if
(
$download
) {
141.
$this
->db()->update(
$this
->getTableName(
'dms_download'
),
$download
->id,
$save
);
142.
}
else
{
143.
$this
->db()->insert(
$this
->getTableName(
'dms_download'
),
$save
);
144.
}
145.
return
array
();
146.
}
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
public
function
fileDownload(
$file_id
,
$member_id
)
157.
{
158.
$ret
=
array
();
159.
160.
$result
=
$this
->db()->createQuery()
161.
->from(
'dms_files'
)
162.
->where(
array
(
'id'
,
$file_id
))
163.
->first(
'id'
,
'dms_id'
,
'size'
,
'name'
,
'file'
,
'ext'
);
164.
if
(
$result
) {
165.
166.
$file
= ROOT_PATH.DATA_FOLDER.
$result
->file;
167.
if
(
is_file
(
$file
)) {
168.
169.
$download
=
$this
->db()->createQuery()
170.
->from(
'dms_download'
)
171.
->where(
array
(
172.
array
(
'file_id'
,
$result
->id),
173.
array
(
'member_id'
,
$member_id
),
174.
))
175.
->first(
'id'
,
'downloads'
);
176.
$save
=
array
(
177.
'downloads'
=>
$download
?
$download
->downloads + 1 : 1,
178.
'dms_id'
=>
$result
->dms_id,
179.
'file_id'
=>
$result
->id,
180.
'member_id'
=>
$member_id
,
181.
'last_update'
=>
date
(
'Y-m-d H:i:s'
),
182.
);
183.
if
(
$download
) {
184.
$this
->db()->update(
$this
->getTableName(
'dms_download'
),
$download
->id,
$save
);
185.
}
else
{
186.
$this
->db()->insert(
$this
->getTableName(
'dms_download'
),
$save
);
187.
}
188.
189.
$id
= uniqid();
190.
191.
$file
=
array
(
192.
'file'
=>
$file
,
193.
'size'
=>
$result
->size,
194.
);
195.
if
(self::
$cfg
->dms_download_action == 1 && in_array(
$result
->ext,
array
(
'pdf'
,
'jpg'
,
'jpeg'
,
'png'
,
'gif'
))) {
196.
$file
[
'name'
] =
''
;
197.
$file
[
'mime'
] = \Kotchasan\Mime::get(
$result
->ext);
198.
}
else
{
199.
$file
[
'name'
] =
$result
->name.
'.'
.
$result
->ext;
200.
$file
[
'mime'
] =
'application/octet-stream'
;
201.
}
202.
$_SESSION
[
$id
] =
$file
;
203.
204.
$ret
[
'open'
] = WEB_URL.
'modules/dms/filedownload.php?id='
.
$id
;
205.
}
else
{
206.
207.
$ret
[
'alert'
] = Language::get(
'File not found'
);
208.
}
209.
}
210.
return
$ret
;
211.
}
212.
}