SyncProjectFiles.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. Lib::loadClass('UI');
  4. /**
  5. * @requires config file config/.cnf--zasob_638-biuro.biall-net.pl.ini.php:
  6. ;<?php
  7. ;die(); // For further security
  8. ;// ftp for www.biall.net.pl
  9. type="ftp"
  10. host="www.biall.net.pl"
  11. user="***"
  12. pass="***"
  13. */
  14. class Route_BiallNet_SyncProjectFiles extends RouteBase {
  15. public $sync_projekty_tmp_folder = '/Users/plabudda/sync-projekty-files-to-www';
  16. public $toyaTvUrl = 'https://toya.net.pl/telewizja';
  17. public function handleAuth() {
  18. if (!User::logged()) {
  19. throw new HttpException('Unauthorized', 401);
  20. }
  21. }
  22. public function updateProjectDescFromToya($idProject) {
  23. if (!$idProject) return;
  24. $project = DB::getPDO()->fetchFirst("
  25. select p.ID
  26. , p.P_ID
  27. , p.M_DIST_TYPE
  28. , p.M_DIST_DESC
  29. , p.M_DIST_DESC_HTML
  30. , p.TV_KARTA_DEVICE_SERIAL
  31. from IN7_MK_BAZA_DYSTRYBUCJI p
  32. where p.M_DIST_TYPE in ('TV__UMOWA ZAKUPU KANALU')
  33. and p.A_STATUS in ('NORMAL','WAITING')
  34. and p.ID = {$idProject}
  35. ");
  36. // DBG::nicePrint($project, '$project');
  37. if (!$project) throw new Exception("Brak projektu '{$idProject}'");
  38. if (empty($project['TV_KARTA_DEVICE_SERIAL'])) throw new Exception("Brak sid dla projektu '{$idProject}' (TV_KARTA_DEVICE_SERIAL)");
  39. $sid = $project['TV_KARTA_DEVICE_SERIAL'];
  40. $imgsToya = $this->fetchImagesFromToya();
  41. // DBG::nicePrint($imgsToya[$sid], '$imgsToya['.$sid.']');
  42. if (empty($imgsToya[$sid])) throw new Exception("Brak na stronie toya programu o takim sid '{$sid}'");
  43. if (!empty($imgsToya[$sid]['desc'])) {
  44. $affected = DBG::getPDO()->update('IN7_MK_BAZA_DYSTRYBUCJI', 'ID', $idProject, [
  45. 'A_RECORD_UPDATE_DATE' => 'NOW()',
  46. 'A_RECORD_UPDATE_AUTHOR' => User::getLogin(),
  47. 'M_DIST_DESC_HTML' => $imgsToya[$sid]['desc'],
  48. ]);
  49. if ($affected) DB::getPDO()->insert('IN7_MK_BAZA_DYSTRYBUCJI_HIST', [
  50. 'A_RECORD_CREATE_DATE' => 'NOW()',
  51. 'A_RECORD_CREATE_AUTHOR' => User::getLogin(),
  52. 'A_RECORD_UPDATE_DATE' => 'NOW()',
  53. 'A_RECORD_UPDATE_AUTHOR' => User::getLogin(),
  54. 'M_DIST_DESC_HTML' => $imgsToya[$sid]['desc'],
  55. ]);
  56. }
  57. }
  58. public function updateProjectLogoFromToya($idProject) {
  59. if (!$idProject) return;
  60. $project = DB::getPDO()->fetchFirst("
  61. select p.ID
  62. , p.P_ID
  63. , p.M_DIST_TYPE
  64. , p.M_DIST_DESC
  65. , p.M_DIST_DESC_HTML
  66. , p.TV_KARTA_DEVICE_SERIAL
  67. from IN7_MK_BAZA_DYSTRYBUCJI p
  68. where p.M_DIST_TYPE in ('TV__UMOWA ZAKUPU KANALU')
  69. and p.A_STATUS in ('NORMAL','WAITING')
  70. and p.ID = {$idProject}
  71. ");
  72. // DBG::nicePrint($project, '$project');
  73. if (!$project) throw new Exception("Brak projektu '{$idProject}'");
  74. if (empty($project['TV_KARTA_DEVICE_SERIAL'])) throw new Exception("Brak sid dla projektu '{$idProject}' (TV_KARTA_DEVICE_SERIAL)");
  75. $sid = $project['TV_KARTA_DEVICE_SERIAL'];
  76. $imgsToya = $this->fetchImagesFromToya();
  77. // DBG::nicePrint($imgsToya[$sid], '$imgsToya['.$sid.']');
  78. if (!empty($imgsToya[$sid])) {
  79. UI::alert('info', "Pobieram logo '{$imgsToya[$sid]['url']}' ...");
  80. $curl_handle = curl_init();
  81. curl_setopt($curl_handle, CURLOPT_URL, $imgsToya[$sid]['url']);
  82. curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
  83. curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
  84. // curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Your application name');
  85. $logo = curl_exec($curl_handle);
  86. curl_close($curl_handle);
  87. $projectDir = $this->_findProjectDir($idProject);
  88. if (!$projectDir) throw new Exception("Brak katalogu projektu!");
  89. UI::alert('info', "Wgrywam logo '{$imgsToya[$sid]['url']}' do katalogu '{$projectDir}' ...");
  90. $today = date('Y-m-d');
  91. $title = preg_replace('/\W/', '_', $imgsToya[$sid]['title']);
  92. $logoImg = "{$projectDir}/{$idProject}.ZDJECIE.{$title}.{$today}.1.jpg";
  93. // if (file_exists($logoImg))
  94. UI::alert('info', "Zapisuje logo jako '{$logoImg}' ...");
  95. file_put_contents($this->_getProjectBasePath() . '/' . $logoImg, $logo);
  96. }
  97. }
  98. public function logaTVAction() {
  99. UI::gora();
  100. UI::startContainer();
  101. echo UI::h('a', [
  102. 'href' => $this->getLink(),
  103. 'class' => 'btn btn-md btn-default'
  104. ], "wróć");
  105. echo UI::h('div', [], [
  106. UI::h('div', [], [
  107. 'Loga pobierane są ze strony <a href="'.$this->toyaTvUrl.'">'.$this->toyaTvUrl.'</a> ',
  108. UI::hButtonPost("Pobierz ponownie", [
  109. 'class' => 'btn btn-xs btn-default',
  110. 'data' => [
  111. 'force' => '1'
  112. ]
  113. ])
  114. ]),
  115. ]);
  116. $updateLogoProjID = V::get('fetch_logo_from_toya', 0, $_POST, 'int');
  117. if ($updateLogoProjID > 0) $this->updateProjectLogoFromToya($updateLogoProjID);
  118. $updateDescProjID = V::get('fetch_desc_from_toya', 0, $_POST, 'int');
  119. if ($updateDescProjID > 0) $this->updateProjectDescFromToya($updateDescProjID);
  120. $projects = DB::getPDO()->fetchAll("
  121. select p.ID
  122. , p.P_ID
  123. , p.M_DIST_TYPE
  124. , p.M_DIST_DESC
  125. , p.M_DIST_DESC_HTML
  126. , p.TV_KARTA_DEVICE_SERIAL
  127. from IN7_MK_BAZA_DYSTRYBUCJI p
  128. where p.M_DIST_TYPE in ('TV__UMOWA ZAKUPU KANALU')
  129. and p.A_STATUS in ('NORMAL','WAITING')
  130. ");
  131. $imgsToya = $this->fetchImagesFromToya($force = V::get('force', '', $_REQUEST));
  132. UI::table([
  133. 'cols_help' => [
  134. 'sid' => "TV_KARTA_DEVICE_SERIAL",
  135. 'type' => "M_DIST_TYPE",
  136. 'desc' => "M_DIST_DESC",
  137. 'html' => "M_DIST_DESC_HTML",
  138. 'se' => "Logo wgrane do SE",
  139. // 'www' => "Logo na stronie www.biall.net.pl",
  140. 'toya' => "Logo na stronie toya.net.pl",
  141. ],
  142. 'rows' => array_map(function ($row) use ($imgsToya) {
  143. $imgSE = '';
  144. $imgWWW = '?';
  145. $sid = (int)$row['TV_KARTA_DEVICE_SERIAL'];
  146. $sid = ($sid > 0 && $sid < 1000) ? $sid : 0;
  147. $imgTOYA = ($sid > 0)
  148. ? UI::h('img', [
  149. 'src' => "https://toya.net.pl/telewizja/kanaly/logo/sid/{$sid}"
  150. ])
  151. : 'brak sid!';
  152. $filesToAdd = $this->_findProjectFiles($row['ID'], 'ZDJECIE', array('jpg','png','gif'));
  153. // "name":"5641.ZDJECIE.TVPULS2.2016-09-26.1.jpg"
  154. // "path":"\/Library\/Server\/Web\/Data\/Sites\/Default\/PLIKI\/PROJEKTY\/5641.sprawy_zwiazane_z_dy_\/5641.ZDJECIE.TVPULS2.2016-09-26.1.jpg"
  155. // "www":""
  156. $imgSE = implode(' ', array_map(function ($file) {
  157. return UI::h('img', [
  158. 'src' => $file['www']
  159. ]);
  160. }, $filesToAdd));
  161. $imgSE .= '<br>' . UI::hButtonPost("Pobierz z Toya", [
  162. 'class' => 'btn btn-xs btn-link',
  163. 'data' => [
  164. 'fetch_logo_from_toya' => $row['ID'],
  165. '_route' => 'BiallNet_SyncProjectFiles',
  166. '_task' => 'logaTV',
  167. ]
  168. ]);
  169. $descHtml = UI::h('div', [], substr($row['M_DIST_DESC_HTML'], 0, 100) . '...');
  170. if (!empty($imgsToya[$sid]['html'])) {
  171. $descHtml .= '<br>' . UI::hButtonPost("Pobierz z Toya", [
  172. 'class' => 'btn btn-xs btn-link',
  173. 'title' => htmlspecialchars($imgsToya[$sid]['html']),
  174. 'data' => [
  175. 'fetch_desc_from_toya' => $row['ID'],
  176. '_route' => 'BiallNet_SyncProjectFiles',
  177. '_task' => 'logaTV',
  178. ]
  179. ]);
  180. }
  181. return [
  182. 'ID' => UI::h('a', [
  183. 'href' => Request::getPathUri() . 'index.php?_route=ViewTableAjax&namespace=default_db/IN7_MK_BAZA_DYSTRYBUCJI#FILES/' . $row['ID']
  184. ], $row['ID']),
  185. 'sid' => (!empty($row['TV_KARTA_DEVICE_SERIAL']) && !$sid)
  186. ? "<span style=\"color:red\">błędny sid! ({$row['TV_KARTA_DEVICE_SERIAL']})</span>"
  187. : $sid,
  188. 'P_ID' => $row['P_ID'],
  189. 'type' => $row['M_DIST_TYPE'],
  190. 'desc' => $row['M_DIST_DESC'],
  191. 'html' => $descHtml,
  192. 'se' => $imgSE,
  193. // 'www' => $imgWWW,
  194. 'toya' => $imgTOYA,
  195. ];
  196. }, $projects)
  197. ]);
  198. UI::endContainer();
  199. UI::dol();
  200. }
  201. public function fetchImagesFromToya($force = false) {
  202. // $html = file_get_contents($this->toyaTvUrl);
  203. if (!$force && file_exists('/tmp/toya-net-pl-telewizja.json')) {
  204. $json = file_get_contents('/tmp/toya-net-pl-telewizja.json');
  205. if ($json) {
  206. $listLogoToya = @json_decode($json, $assoc = true);
  207. if (!empty($listLogoToya)) return $listLogoToya;
  208. }
  209. UI::alert('warning', "cache error - toya.net.pl/telewizja");
  210. }
  211. $listLogoToya = [];
  212. $curl_handle = curl_init();
  213. curl_setopt($curl_handle, CURLOPT_URL, $this->toyaTvUrl);
  214. curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
  215. curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
  216. // curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Your application name');
  217. $html = curl_exec($curl_handle);
  218. curl_close($curl_handle);
  219. if (!$html) throw new Exception("błąd pobierania strony '{$this->toyaTvUrl}'");
  220. $pos = strpos($html, '<div class="offer-more-channel">');
  221. if (!$pos) throw new Exception("błąd parsowania strony '{$this->toyaTvUrl}'");
  222. $html = substr($html, $pos);
  223. $pos = strpos($html, '<!-- grafika i tekst -->');
  224. if ($pos) $html = substr($html, 0, $pos);
  225. // echo UI::h('pre', ['style'=>"max-height:400px"], htmlspecialchars($html));
  226. for ($pos = strpos($html, '<div class="offer-more-channel">'); $pos !== false; ) {
  227. $logoToya = [];
  228. $nextPos = strpos($html, '<div class="offer-more-channel">', $pos + 1);
  229. $offset = strlen('<div class="offer-more-channel">');
  230. if (false !== $nextPos) {
  231. $tag = trim(substr($html, $pos + $offset, $nextPos - $pos - $offset));
  232. } else {
  233. $tag = trim(substr($html, $pos + $offset));
  234. }
  235. preg_match_all('/<img src="(.*)" alt="(.*)"/', $tag, $matches, PREG_SET_ORDER);
  236. // DBG::nicePrint($matches, '$matches');
  237. if (!empty($matches[0]) && 3 == count($matches[0])) {
  238. $url = 'https://toya.net.pl' . $matches[0][1];
  239. $logoToya['url'] = $url;
  240. $logoToya['serial_nr'] = substr($url, strrpos($url, '/') + 1);
  241. $logoToya['title'] = $matches[0][2];
  242. } else {
  243. DBG::nicePrint($matches, 'TODO: logo/title $matches');
  244. }
  245. preg_match_all('/Na kanale: (\d*)\W*<\/p>/', $tag, $matches, PREG_SET_ORDER);
  246. // DBG::nicePrint($matches, '$matches');
  247. if (!empty($matches[0]) && 2 == count($matches[0])) {
  248. $logoToya['nr'] = $matches[0][1];
  249. } else {
  250. DBG::nicePrint($matches, 'TODO: "Na kanale .*" $matches');
  251. }
  252. {
  253. $pDesc = strpos($tag, '<div class="channel-tooltip-content">');
  254. if ($pDesc) {
  255. $pDesc = strpos($tag, '<p>', $pDesc);
  256. if ($pDesc) {
  257. $pEndDesc = strpos($tag, '</p>', $pDesc);
  258. if ($pEndDesc) {
  259. $desc = trim(substr($tag, $pDesc + strlen('<p>'), $pEndDesc - $pDesc));
  260. if ('Na kanale' != substr($desc, 0, strlen('Na kanale'))) {
  261. $logoToya['desc'] = $desc;
  262. }
  263. }
  264. }
  265. }
  266. }
  267. if (empty($logoToya['desc'])) {
  268. $desc = '';
  269. preg_match_all('/<\/span>\n(.*)\W*<p>\W*Na kanale: /', $tag, $matches, PREG_SET_ORDER);
  270. if (!empty($matches[0]) && 2 == count($matches[0])) {
  271. $desc = trim($matches[0][1]);
  272. } else {
  273. DBG::nicePrint($matches, 'TODO: "Na kanale .*" $matches');
  274. }
  275. if ($desc) {
  276. $logoToya['desc'] = $desc;
  277. } else {
  278. DBG::nicePrint(htmlspecialchars($tag), 'TODO: Brak opisu?');
  279. }
  280. }
  281. // echo UI::h('pre', [], htmlspecialchars($tag));
  282. if ($logoToya['serial_nr']) $listLogoToya[ $logoToya['serial_nr'] ] = $logoToya;
  283. if (false === $nextPos || $pos > 100000000) break;
  284. $pos = $nextPos;
  285. }
  286. // DBG::nicePrint($listLogoToya, '$listLogoToya');
  287. file_put_contents('/tmp/toya-net-pl-telewizja.json', json_encode($listLogoToya));
  288. return $listLogoToya;
  289. }
  290. public function defaultAction() {
  291. UI::gora();
  292. UI::menu();
  293. $configError = null;
  294. try {
  295. $this->_checkFtpConfig();
  296. } catch (Exception $e) {
  297. $configError = $e->getMessage();
  298. }
  299. UI::startTag('div', ['class'=>"jumbotron"]);
  300. UI::startContainer(['style' => "text-align:center"]);
  301. echo UI::h('h3', [], "Synchronizcja plików na stronę www.biall.net.pl z projektów");
  302. if (!empty($configError)) {
  303. UI::alert('danger', $configError);
  304. } else {
  305. echo UI::h('a', [
  306. 'href' => $this->getLink('syncToWwwSite'),
  307. 'class' => 'btn btn-md btn-primary'
  308. ], "Synchronizuj wszystkie projekty");
  309. }
  310. echo ' ';
  311. echo UI::h('a', [
  312. 'href' => $this->getLink('logaTV'),
  313. 'class' => 'btn btn-md btn-primary'
  314. ], "Synchronizuj loga TV ze strony toya.net.pl");
  315. UI::endContainer();
  316. UI::endTag('div');// .jumbotron
  317. UI::dol();
  318. }
  319. public function syncToWwwSiteAction() {
  320. UI::gora();
  321. UI::menu();
  322. echo UI::h('h1', [], "Synchronizcja plików na stronę www.biall.net.pl z projektów:");
  323. UI::startTag('pre', ['style'=>"max-height:400px;border:1px solid silver;overflow:auto"]);
  324. $this->syncToWwwSite();
  325. UI::endTag('pre');
  326. UI::dol();
  327. exit;
  328. }
  329. public function syncToWwwSite() {
  330. flush();
  331. $sync_projekty_tmp_folder = '/Users/plabudda/sync-projekty-files-to-www';
  332. $sql_select = array();
  333. $sql_where_and = array();
  334. $sql_select[] = "p.`ID`";
  335. $sql_select[] = "p.`M_DIST_TYPE`";
  336. $sql_select[] = "p.`M_DIST_DESC`";
  337. //$sql_select[] = "p.``";
  338. $sql_project_types = array();
  339. $sql_project_types[] = "'WWW_PRACA'";
  340. $sql_project_types[] = "'WWW_DOKUMENTY'";
  341. $sql_project_types[] = "'WWW_AKTUALNOSCI'";
  342. $sql_project_types[] = "'WWW_AKTUALNOSCI_TV'";
  343. $sql_project_types[] = "'TV__UMOWA ZAKUPU KANALU'";
  344. $sql_where_and[] = "p.`M_DIST_TYPE` in (".implode(",", $sql_project_types).")";
  345. $sql_where_and[] = "p.`A_STATUS` in ('NORMAL','WAITING')";
  346. //$projekt_id = V::get('projekt_id', 0, $_REQUEST, 'int');
  347. //if ($projekt_id > 0) {
  348. // $sql_where_and[] = "p.`ID`='".$projekt_id."'";
  349. //}
  350. $db = DB::getDB();
  351. $sql_select = implode(", ", $sql_select);
  352. $sql_where = implode("\n and ", $sql_where_and);
  353. $sql = "select $sql_select
  354. from `IN7_MK_BAZA_DYSTRYBUCJI` as p
  355. where
  356. {$sql_where}
  357. ";
  358. $projekty = array();
  359. $res = $db->query($sql);
  360. while ($r = $db->fetch($res)) {
  361. $projekty[$r->ID] = $r;
  362. }
  363. foreach ($projekty as $idProject => $r) {
  364. $files = $this->_findProjectFiles($r->ID);// fetch pdf files for project
  365. // fetch more files specific by project type
  366. if (in_array($r->M_DIST_TYPE, array('WWW_AKTUALNOSCI', 'WWW_AKTUALNOSCI_TV'))) {
  367. $filesToAdd = $this->_findProjectFiles($r->ID, 'ZDJECIE', array('jpg','png','gif'));
  368. foreach ($filesToAdd as $f) {
  369. $tmp_folder_path = $sync_projekty_tmp_folder.'/'.$r->ID;
  370. if (!is_dir($tmp_folder_path)) {
  371. mkdir($tmp_folder_path);
  372. }
  373. Lib::loadClass('DB_Image');
  374. $img_ext = explode('.', $f['name']);
  375. $img_ext = end($img_ext);
  376. $imBlob = null;
  377. $imType = null;
  378. if ('jpg' == $img_ext) $imType = "image/jpeg";
  379. else if ('png' == $img_ext) $imType = "image/png";
  380. else if ('gif' == $img_ext) $imType = "image/gif";
  381. if ($imType) {
  382. $imBlob = DB_Image::readImageBlobFromFile($f['path'], $imType);
  383. }
  384. if (!$imBlob) {
  385. continue;
  386. }
  387. $sizes_all = array(array('700', '700'), array('150', '120'));
  388. foreach ($sizes_all as $sizes) {
  389. $tmp_name = substr($f['name'], 0, -4).'.'.$sizes[0].'x'.$sizes[1].'.'.$img_ext;
  390. $tmp_path = $tmp_folder_path.'/'.$tmp_name;
  391. $files[] = array('name'=>$tmp_name, 'path'=>$tmp_path);
  392. $imResizedBlob = DB_Image::resizeImageFromBlob($imBlob, $imType, $sizes[0], $sizes[1]);
  393. DB_Image::writeImageBlobToFile($imResizedBlob, $imType, $tmp_path);
  394. }
  395. }
  396. }
  397. else if (in_array($r->M_DIST_TYPE, array('TV__UMOWA ZAKUPU KANALU'))) {
  398. $filesToAdd = $this->_findProjectFiles($r->ID, 'ZDJECIE', array('jpg','png','gif'));
  399. foreach ($filesToAdd as $f) {
  400. $tmp_folder_path = $sync_projekty_tmp_folder.'/'.$r->ID;
  401. if (!is_dir($tmp_folder_path)) {
  402. mkdir($tmp_folder_path);
  403. }
  404. Lib::loadClass('DB_Image');
  405. $img_ext = explode('.', $f['name']);
  406. $img_ext = end($img_ext);
  407. $imBlob = null;
  408. $imType = null;
  409. if ('jpg' == $img_ext) $imType = "image/jpeg";
  410. else if ('png' == $img_ext) $imType = "image/png";
  411. else if ('gif' == $img_ext) $imType = "image/gif";
  412. if ($imType) {
  413. $imBlob = DB_Image::readImageBlobFromFile($f['path'], $imType);
  414. }
  415. if (!$imBlob) {
  416. continue;
  417. }
  418. $sizes_all = array(array('90', '78'));
  419. foreach ($sizes_all as $sizes) {
  420. $tmp_name = substr($f['name'], 0, -4).'.'.$sizes[0].'x'.$sizes[1].'.'.$img_ext;
  421. $tmp_path = $tmp_folder_path.'/'.$tmp_name;
  422. $files[] = array('name'=>$tmp_name, 'path'=>$tmp_path);
  423. $imResizedBlob = DB_Image::resizeImageFromBlob($imBlob, $imType, $sizes[0], $sizes[1]);
  424. DB_Image::writeImageBlobToFile($imResizedBlob, $imType, $tmp_path);
  425. }
  426. }
  427. }
  428. echo "[{$idProject}]:\n";
  429. $this->_syncProjectFiles($idProject, $files);
  430. echo "\n";
  431. }
  432. }
  433. private function _getProjectBasePath() {
  434. global $FOLDERS;
  435. return $FOLDERS['IN7_MK_BAZA_DYSTRYBUCJI_COLUMN'];
  436. }
  437. private function _findProjectDir($project_id) {
  438. $dir_projekty = $this->_getProjectBasePath();
  439. //$www_projekty = "PROJEKTY/";
  440. $pattern = $dir_projekty.'/'.$project_id.'.*';
  441. $path_projekt = glob($pattern , GLOB_ONLYDIR);// array glob(pattern [, flags])
  442. if (empty($path_projekt)) {
  443. return null;
  444. }
  445. $path_projekt = reset($path_projekt);
  446. $dir_projekt = explode('/', $path_projekt);
  447. $dir_projekt = end($dir_projekt);
  448. return $dir_projekt;
  449. }
  450. private function _findProjectFiles($project_id, $type = '', $suffix = 'pdf') {
  451. $ret = array();
  452. // @see .config:$FOLDERS[IN7_MK_BAZA_DYSTRYBUCJI_COLUMN]="/home/samba/PROJEKTY";
  453. $dir_projekty = $this->_getProjectBasePath();
  454. //$www_projekty = "PROJEKTY/";
  455. $pattern = $dir_projekty.'/'.$project_id.'.*';
  456. $path_projekt = glob( $pattern , GLOB_ONLYDIR);// array glob(pattern [, flags])
  457. if (empty($path_projekt)) {
  458. return $ret;
  459. }
  460. $path_projekt = reset($path_projekt);
  461. $dir_projekt = explode('/', $path_projekt);
  462. $dir_projekt = end($dir_projekt);
  463. if (is_array($suffix)) {
  464. $files_projekt_add = array();
  465. foreach ($suffix as $add_suffix) {
  466. $files_oferty_pattern = $path_projekt.'/*.'.$add_suffix;
  467. if ($type) $files_oferty_pattern = $path_projekt.'/*.'.$type.'.*.'.$add_suffix;
  468. $files_projekt_add = glob( $files_oferty_pattern);// array glob(pattern [, flags])
  469. foreach ($files_projekt_add as $f) {
  470. $files_projekt[] = $f;
  471. }
  472. }
  473. } else {
  474. $files_oferty_pattern = $path_projekt.'/*.'.$suffix;
  475. if ($type) $files_oferty_pattern = $path_projekt.'/*.'.$type.'.*.'.$suffix;
  476. $files_projekt = glob( $files_oferty_pattern);// array glob(pattern [, flags])
  477. }
  478. if (empty($files_projekt)) {
  479. return $ret;
  480. }
  481. foreach ($files_projekt as $v) {
  482. $f_name = explode('/', $v);
  483. $f_name = end($f_name);
  484. // TODO: f_www link do akryptu zmieniajacego nazwe pliku na nazwe projektu
  485. //$f_www = 'http://'.$host.'/'.$www_projekty.'/'.$dir_projekt.'/'.$f_name;
  486. //$f_www = 'http://'.$host.'/index.php?action=project_file&project='.$project_id.'&f='.$f_name;
  487. $f_www = str_replace($dir_projekty, 'https://biuro.biall-net.pl/PLIKI/PROJEKTY/', $v);
  488. $ret[] = [
  489. 'name' => $f_name,
  490. 'path' => $v,
  491. 'www' => $f_www
  492. ];
  493. }
  494. return $ret;
  495. }
  496. private function _syncProjectFiles($idProject, $files) {
  497. if (function_exists('ftp_connect')) {
  498. $ftp_conn = $this->_ftpAuth();
  499. $filesOnSite = ftp_nlist($ftp_conn, "public_html/PROJEKTY/{$idProject}/");
  500. echo "[{$idProject}]\tPliki na www public_html/PROJEKTY/{$idProject}/: ";
  501. if (empty($filesOnSite)) {
  502. echo "brak\n";
  503. } else {
  504. echo implode("\n\t\t - ", $filesOnSite) . "\n";
  505. }
  506. $filesToRemove = array();
  507. if (!empty($filesOnSite)) {
  508. foreach ($filesOnSite as $remotePath) {
  509. $remoteName = explode('/', $remotePath);
  510. $remoteName = end($remoteName);
  511. $toRemove = true;
  512. foreach ($files as $f) {
  513. if ($f['name'] == $remoteName) {
  514. $toRemove = false;
  515. }
  516. }
  517. if ($toRemove) {
  518. $filesToRemove[] = $remotePath;
  519. }
  520. }
  521. }
  522. echo "[{$idProject}]\tPliki do usunięcia: ";
  523. if (empty($filesToRemove)) {
  524. echo "brak\n";
  525. } else {
  526. echo implode("\n\t\t - ", $filesToRemove) . "\n";
  527. }
  528. foreach ($filesToRemove as $remotePath) {
  529. $remoteName = explode('/', $remotePath);
  530. $remoteName = end($remoteName);
  531. echo "[{$idProject}]\t\t";
  532. if (ftp_delete($ftp_conn, $remotePath)) {
  533. echo "Usunięto plik {$remoteName}\n";
  534. } else {
  535. echo "Error: Could not delete {$remoteName}\n";
  536. }
  537. }
  538. if (!empty($files)) {
  539. $remoteDir = "public_html/PROJEKTY/{$idProject}/";
  540. if (@ftp_mkdir($ftp_conn, $remoteDir)) {
  541. echo "[{$idProject}]\t\tUtworzono katalog: '{$remoteDir}'\n";
  542. } else {
  543. //echo "There was a problem while creating $dir\n";
  544. }
  545. foreach ($files as $f) {
  546. $remotePath = "public_html/PROJEKTY/{$idProject}/{$f['name']}";
  547. echo "[{$idProject}]\t\t";
  548. if (ftp_put($ftp_conn, $remotePath, $f['path'], FTP_BINARY)) {
  549. echo "Wgrano plik {$f['name']}\n";
  550. } else {
  551. echo "Error: There was a problem while uploading {$f['name']}\n";
  552. }
  553. }
  554. }
  555. ftp_close($ftp_conn);
  556. } else {
  557. foreach ($files as $f) {
  558. // string exec ( string $command [, array &$output [, int &$return_var ]] )
  559. //$sync_project_file_command = 'sync-projekty-files-to-www.sh';
  560. /*
  561. #!/bin/bash
  562. if [ -z "$1" ]; then
  563. echo usage: $0 project_id file
  564. exit 1
  565. fi
  566. if [ -z "$2" ]; then
  567. echo usage: $0 project_id file
  568. exit 1
  569. fi
  570. #dest_path="public_html/PROJEKTY/$1/"
  571. dest_path="public_html/PROJEKTY/$1/"`basename $2`
  572. USER="biallnet"
  573. PASSWD="***"
  574. ftp -v -n www.biall.net.pl <<SCRIPT
  575. user $USER $PASSWD
  576. binary
  577. put $2 $dest_path
  578. quit
  579. SCRIPT
  580. exit 0;
  581. */
  582. $cmd = $sync_project_file_command." ".$r->ID." ".$f['path'];
  583. $output = array();
  584. $ret_val = 0;
  585. exec($cmd, $output, $ret_val);
  586. $completed = false;
  587. if ($ret_val == 0) {
  588. foreach ($output as $out_line) {
  589. if (strpos($out_line, 'Transfer complete') !== false) {
  590. $completed = true;
  591. }
  592. }
  593. }
  594. echo "\n cmd:{$cmd} ret({$ret_val}) ";print_r($output);exit;
  595. if ($completed) {
  596. echo "Plik skopiowano.\n";
  597. } else {
  598. echo "Error: prawdopodobnie nie udalo sie skopiowac pliku.\n";
  599. foreach ($output as $out_line) {
  600. echo $out_line."\n";
  601. }
  602. }
  603. }
  604. }
  605. }
  606. private function _ftpAuth() {
  607. $cnf = $this->_checkFtpConfig();
  608. $connFTP = ftp_connect($cnf['host']) or die("Couldn't connect to ftp_server");
  609. if (!ftp_login($connFTP, $cnf['user'], $cnf['pass'])) {
  610. die("Couldn't login to ftp_server");
  611. }
  612. return $connFTP;
  613. }
  614. private function _checkFtpConfig() {
  615. $cnf = Config::getZasobConf(638);// SERVER www.biall.net.pl
  616. if (empty($cnf)) throw new Exception("Error: Empty config for ftp www.biall.net.pl");
  617. if (empty($cnf['host'])) throw new Exception("Error: Config host is empty");
  618. if (empty($cnf['user'])) throw new Exception("Error: Config user is empty");
  619. if (empty($cnf['pass'])) throw new Exception("Error: Config pass is empty");
  620. return $cnf;
  621. }
  622. }