fetchFirst(" select p.ID , p.P_ID , p.M_DIST_TYPE , p.M_DIST_DESC , p.M_DIST_DESC_HTML , p.TV_KARTA_DEVICE_SERIAL from IN7_MK_BAZA_DYSTRYBUCJI p where p.M_DIST_TYPE in ('TV__UMOWA ZAKUPU KANALU') and p.A_STATUS in ('NORMAL','WAITING') and p.ID = {$idProject} "); // DBG::nicePrint($project, '$project'); if (!$project) throw new Exception("Brak projektu '{$idProject}'"); if (empty($project['TV_KARTA_DEVICE_SERIAL'])) throw new Exception("Brak sid dla projektu '{$idProject}' (TV_KARTA_DEVICE_SERIAL)"); $sid = $project['TV_KARTA_DEVICE_SERIAL']; $imgsToya = $this->fetchImagesFromToya(); // DBG::nicePrint($imgsToya[$sid], '$imgsToya['.$sid.']'); if (empty($imgsToya[$sid])) throw new Exception("Brak na stronie toya programu o takim sid '{$sid}'"); if (!empty($imgsToya[$sid]['desc'])) { $affected = DBG::getPDO()->update('IN7_MK_BAZA_DYSTRYBUCJI', 'ID', $idProject, [ 'A_RECORD_UPDATE_DATE' => 'NOW()', 'A_RECORD_UPDATE_AUTHOR' => User::getLogin(), 'M_DIST_DESC_HTML' => $imgsToya[$sid]['desc'], ]); if ($affected) DB::getPDO()->insert('IN7_MK_BAZA_DYSTRYBUCJI_HIST', [ 'A_RECORD_CREATE_DATE' => 'NOW()', 'A_RECORD_CREATE_AUTHOR' => User::getLogin(), 'A_RECORD_UPDATE_DATE' => 'NOW()', 'A_RECORD_UPDATE_AUTHOR' => User::getLogin(), 'M_DIST_DESC_HTML' => $imgsToya[$sid]['desc'], ]); } } public function updateProjectLogoFromToya($idProject) { if (!$idProject) return; $project = DB::getPDO()->fetchFirst(" select p.ID , p.P_ID , p.M_DIST_TYPE , p.M_DIST_DESC , p.M_DIST_DESC_HTML , p.TV_KARTA_DEVICE_SERIAL from IN7_MK_BAZA_DYSTRYBUCJI p where p.M_DIST_TYPE in ('TV__UMOWA ZAKUPU KANALU') and p.A_STATUS in ('NORMAL','WAITING') and p.ID = {$idProject} "); // DBG::nicePrint($project, '$project'); if (!$project) throw new Exception("Brak projektu '{$idProject}'"); if (empty($project['TV_KARTA_DEVICE_SERIAL'])) throw new Exception("Brak sid dla projektu '{$idProject}' (TV_KARTA_DEVICE_SERIAL)"); $sid = $project['TV_KARTA_DEVICE_SERIAL']; $imgsToya = $this->fetchImagesFromToya(); // DBG::nicePrint($imgsToya[$sid], '$imgsToya['.$sid.']'); if (!empty($imgsToya[$sid])) { UI::alert('info', "Pobieram logo '{$imgsToya[$sid]['url']}' ..."); $curl_handle = curl_init(); curl_setopt($curl_handle, CURLOPT_URL, $imgsToya[$sid]['url']); curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); // curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Your application name'); $logo = curl_exec($curl_handle); curl_close($curl_handle); $projectDir = $this->_findProjectDir($idProject); if (!$projectDir) throw new Exception("Brak katalogu projektu!"); UI::alert('info', "Wgrywam logo '{$imgsToya[$sid]['url']}' do katalogu '{$projectDir}' ..."); $today = date('Y-m-d'); $title = preg_replace('/\W/', '_', $imgsToya[$sid]['title']); $logoImg = "{$projectDir}/{$idProject}.ZDJECIE.{$title}.{$today}.1.jpg"; // if (file_exists($logoImg)) UI::alert('info', "Zapisuje logo jako '{$logoImg}' ..."); file_put_contents($this->_getProjectBasePath() . '/' . $logoImg, $logo); } } public function logaTVAction() { UI::gora(); UI::startContainer(); echo UI::h('a', [ 'href' => $this->getLink(), 'class' => 'btn btn-md btn-default' ], "wróć"); echo UI::h('div', [], [ UI::h('div', [], [ 'Loga pobierane są ze strony '.$this->toyaTvUrl.' ', UI::hButtonPost("Pobierz ponownie", [ 'class' => 'btn btn-xs btn-default', 'data' => [ 'force' => '1' ] ]) ]), ]); $updateLogoProjID = V::get('fetch_logo_from_toya', 0, $_POST, 'int'); if ($updateLogoProjID > 0) $this->updateProjectLogoFromToya($updateLogoProjID); $updateDescProjID = V::get('fetch_desc_from_toya', 0, $_POST, 'int'); if ($updateDescProjID > 0) $this->updateProjectDescFromToya($updateDescProjID); $projects = DB::getPDO()->fetchAll(" select p.ID , p.P_ID , p.M_DIST_TYPE , p.M_DIST_DESC , p.M_DIST_DESC_HTML , p.TV_KARTA_DEVICE_SERIAL from IN7_MK_BAZA_DYSTRYBUCJI p where p.M_DIST_TYPE in ('TV__UMOWA ZAKUPU KANALU') and p.A_STATUS in ('NORMAL','WAITING') "); $imgsToya = $this->fetchImagesFromToya($force = V::get('force', '', $_REQUEST)); UI::table([ 'cols_help' => [ 'sid' => "TV_KARTA_DEVICE_SERIAL", 'type' => "M_DIST_TYPE", 'desc' => "M_DIST_DESC", 'html' => "M_DIST_DESC_HTML", 'se' => "Logo wgrane do SE", // 'www' => "Logo na stronie www.biall.net.pl", 'toya' => "Logo na stronie toya.net.pl", ], 'rows' => array_map(function ($row) use ($imgsToya) { $imgSE = ''; $imgWWW = '?'; $sid = (int)$row['TV_KARTA_DEVICE_SERIAL']; $sid = ($sid > 0 && $sid < 1000) ? $sid : 0; $imgTOYA = ($sid > 0) ? UI::h('img', [ 'src' => "https://toya.net.pl/telewizja/kanaly/logo/sid/{$sid}" ]) : 'brak sid!'; $filesToAdd = $this->_findProjectFiles($row['ID'], 'ZDJECIE', array('jpg','png','gif')); // "name":"5641.ZDJECIE.TVPULS2.2016-09-26.1.jpg" // "path":"\/Library\/Server\/Web\/Data\/Sites\/Default\/PLIKI\/PROJEKTY\/5641.sprawy_zwiazane_z_dy_\/5641.ZDJECIE.TVPULS2.2016-09-26.1.jpg" // "www":"" $imgSE = implode(' ', array_map(function ($file) { return UI::h('img', [ 'src' => $file['www'] ]); }, $filesToAdd)); $imgSE .= '
' . UI::hButtonPost("Pobierz z Toya", [ 'class' => 'btn btn-xs btn-link', 'data' => [ 'fetch_logo_from_toya' => $row['ID'], '_route' => 'BiallNet_SyncProjectFiles', '_task' => 'logaTV', ] ]); $descHtml = UI::h('div', [], substr($row['M_DIST_DESC_HTML'], 0, 100) . '...'); if (!empty($imgsToya[$sid]['html'])) { $descHtml .= '
' . UI::hButtonPost("Pobierz z Toya", [ 'class' => 'btn btn-xs btn-link', 'title' => htmlspecialchars($imgsToya[$sid]['html']), 'data' => [ 'fetch_desc_from_toya' => $row['ID'], '_route' => 'BiallNet_SyncProjectFiles', '_task' => 'logaTV', ] ]); } return [ 'ID' => UI::h('a', [ 'href' => Request::getPathUri() . 'index.php?_route=ViewTableAjax&namespace=default_db/IN7_MK_BAZA_DYSTRYBUCJI#FILES/' . $row['ID'] ], $row['ID']), 'sid' => (!empty($row['TV_KARTA_DEVICE_SERIAL']) && !$sid) ? "błędny sid! ({$row['TV_KARTA_DEVICE_SERIAL']})" : $sid, 'P_ID' => $row['P_ID'], 'type' => $row['M_DIST_TYPE'], 'desc' => $row['M_DIST_DESC'], 'html' => $descHtml, 'se' => $imgSE, // 'www' => $imgWWW, 'toya' => $imgTOYA, ]; }, $projects) ]); UI::endContainer(); UI::dol(); } public function fetchImagesFromToya($force = false) { // $html = file_get_contents($this->toyaTvUrl); if (!$force && file_exists('/tmp/toya-net-pl-telewizja.json')) { $json = file_get_contents('/tmp/toya-net-pl-telewizja.json'); if ($json) { $listLogoToya = @json_decode($json, $assoc = true); if (!empty($listLogoToya)) return $listLogoToya; } UI::alert('warning', "cache error - toya.net.pl/telewizja"); } $listLogoToya = []; $curl_handle = curl_init(); curl_setopt($curl_handle, CURLOPT_URL, $this->toyaTvUrl); curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); // curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Your application name'); $html = curl_exec($curl_handle); curl_close($curl_handle); if (!$html) throw new Exception("błąd pobierania strony '{$this->toyaTvUrl}'"); $pos = strpos($html, '
'); if (!$pos) throw new Exception("błąd parsowania strony '{$this->toyaTvUrl}'"); $html = substr($html, $pos); $pos = strpos($html, ''); if ($pos) $html = substr($html, 0, $pos); // echo UI::h('pre', ['style'=>"max-height:400px"], htmlspecialchars($html)); for ($pos = strpos($html, '
'); $pos !== false; ) { $logoToya = []; $nextPos = strpos($html, '
', $pos + 1); $offset = strlen('
'); if (false !== $nextPos) { $tag = trim(substr($html, $pos + $offset, $nextPos - $pos - $offset)); } else { $tag = trim(substr($html, $pos + $offset)); } preg_match_all('/(.*)/', $tag, $matches, PREG_SET_ORDER); // DBG::nicePrint($matches, '$matches'); if (!empty($matches[0]) && count($matches[0]) > 1) { $logoToya['nr'] = $matches[0][1]; } else { DBG::nicePrint($matches, 'TODO: "Na kanale .*" $matches'); } { $pDesc = strpos($tag, '
'); if ($pDesc) { $pDesc = strpos($tag, '

', $pDesc); if ($pDesc) { $pEndDesc = strpos($tag, '

', $pDesc); if ($pEndDesc) { $desc = trim(substr($tag, $pDesc + strlen('

'), $pEndDesc - $pDesc)); if ('Na kanale' != substr($desc, 0, strlen('Na kanale'))) { $logoToya['desc'] = $desc; } } } } } if (empty($logoToya['desc'])) { $desc = ''; preg_match_all('/<\/span>\n(.*)\W*

\W*Na kanale: /', $tag, $matches, PREG_SET_ORDER); if (!empty($matches[0]) && 2 == count($matches[0])) { $desc = trim($matches[0][1]); } else { DBG::nicePrint([$matches, htmlspecialchars($tag)], 'TODO: "Na kanale .*" $matches'); } if ($desc) { $logoToya['desc'] = $desc; } else { DBG::nicePrint(htmlspecialchars($tag), 'TODO: Brak opisu?'); } } // echo UI::h('pre', [], htmlspecialchars($tag)); if ($logoToya['serial_nr']) $listLogoToya[ $logoToya['serial_nr'] ] = $logoToya; if (false === $nextPos || $pos > 100000000) break; $pos = $nextPos; } // DBG::nicePrint($listLogoToya, '$listLogoToya'); file_put_contents('/tmp/toya-net-pl-telewizja.json', json_encode($listLogoToya)); return $listLogoToya; } public function defaultAction() { UI::gora(); UI::menu(); $configError = null; try { $this->_checkFtpConfig(); } catch (Exception $e) { $configError = $e->getMessage(); } UI::startTag('div', ['class'=>"jumbotron"]); UI::startContainer(['style' => "text-align:center"]); echo UI::h('h3', [], "Synchronizcja plików na stronę www.biall.net.pl z projektów"); if (!empty($configError)) { UI::alert('danger', $configError); } else { echo UI::h('a', [ 'href' => $this->getLink('syncToWwwSite'), 'class' => 'btn btn-md btn-primary' ], "Synchronizuj wszystkie projekty"); } echo ' '; echo UI::h('a', [ 'href' => $this->getLink('logaTV'), 'class' => 'btn btn-md btn-primary' ], "Synchronizuj loga TV ze strony toya.net.pl"); UI::endContainer(); UI::endTag('div');// .jumbotron UI::dol(); } public function syncToWwwSiteAction() { UI::gora(); UI::menu(); echo UI::h('h1', [], "Synchronizcja plików na stronę www.biall.net.pl z projektów:"); UI::startTag('pre', ['style'=>"max-height:400px;border:1px solid silver;overflow:auto"]); $this->syncToWwwSite(); UI::endTag('pre'); UI::dol(); exit; } public function syncToWwwSite() { flush(); $sync_projekty_tmp_folder = '/Users/plabudda/sync-projekty-files-to-www'; $sql_select = array(); $sql_where_and = array(); $sql_select[] = "p.`ID`"; $sql_select[] = "p.`M_DIST_TYPE`"; $sql_select[] = "p.`M_DIST_DESC`"; //$sql_select[] = "p.``"; $sql_project_types = array(); $sql_project_types[] = "'WWW_PRACA'"; $sql_project_types[] = "'WWW_DOKUMENTY'"; $sql_project_types[] = "'WWW_AKTUALNOSCI'"; $sql_project_types[] = "'WWW_AKTUALNOSCI_TV'"; $sql_project_types[] = "'TV__UMOWA ZAKUPU KANALU'"; $sql_where_and[] = "p.`M_DIST_TYPE` in (".implode(",", $sql_project_types).")"; $sql_where_and[] = "p.`A_STATUS` in ('NORMAL','WAITING')"; //$projekt_id = V::get('projekt_id', 0, $_REQUEST, 'int'); //if ($projekt_id > 0) { // $sql_where_and[] = "p.`ID`='".$projekt_id."'"; //} $db = DB::getDB(); $sql_select = implode(", ", $sql_select); $sql_where = implode("\n and ", $sql_where_and); $sql = "select $sql_select from `IN7_MK_BAZA_DYSTRYBUCJI` as p where {$sql_where} "; $projekty = array(); $res = $db->query($sql); while ($r = $db->fetch($res)) { $projekty[$r->ID] = $r; } foreach ($projekty as $idProject => $r) { $files = $this->_findProjectFiles($r->ID);// fetch pdf files for project // fetch more files specific by project type if (in_array($r->M_DIST_TYPE, array('WWW_AKTUALNOSCI', 'WWW_AKTUALNOSCI_TV'))) { $filesToAdd = $this->_findProjectFiles($r->ID, 'ZDJECIE', array('jpg','png','gif')); foreach ($filesToAdd as $f) { $tmp_folder_path = $sync_projekty_tmp_folder.'/'.$r->ID; if (!is_dir($tmp_folder_path)) { mkdir($tmp_folder_path); } Lib::loadClass('DB_Image'); $img_ext = explode('.', $f['name']); $img_ext = end($img_ext); $imBlob = null; $imType = null; if ('jpg' == $img_ext) $imType = "image/jpeg"; else if ('png' == $img_ext) $imType = "image/png"; else if ('gif' == $img_ext) $imType = "image/gif"; if ($imType) { $imBlob = DB_Image::readImageBlobFromFile($f['path'], $imType); } if (!$imBlob) { continue; } $sizes_all = array(array('700', '700'), array('150', '120')); foreach ($sizes_all as $sizes) { $tmp_name = substr($f['name'], 0, -4).'.'.$sizes[0].'x'.$sizes[1].'.'.$img_ext; $tmp_path = $tmp_folder_path.'/'.$tmp_name; $files[] = array('name'=>$tmp_name, 'path'=>$tmp_path); $imResizedBlob = DB_Image::resizeImageFromBlob($imBlob, $imType, $sizes[0], $sizes[1]); DB_Image::writeImageBlobToFile($imResizedBlob, $imType, $tmp_path); } } } else if (in_array($r->M_DIST_TYPE, array('TV__UMOWA ZAKUPU KANALU'))) { $filesToAdd = $this->_findProjectFiles($r->ID, 'ZDJECIE', array('jpg','png','gif')); foreach ($filesToAdd as $f) { $tmp_folder_path = $sync_projekty_tmp_folder.'/'.$r->ID; if (!is_dir($tmp_folder_path)) { mkdir($tmp_folder_path); } Lib::loadClass('DB_Image'); $img_ext = explode('.', $f['name']); $img_ext = end($img_ext); $imBlob = null; $imType = null; if ('jpg' == $img_ext) $imType = "image/jpeg"; else if ('png' == $img_ext) $imType = "image/png"; else if ('gif' == $img_ext) $imType = "image/gif"; if ($imType) { $imBlob = DB_Image::readImageBlobFromFile($f['path'], $imType); } if (!$imBlob) { continue; } $sizes_all = array(array('90', '78')); foreach ($sizes_all as $sizes) { $tmp_name = substr($f['name'], 0, -4).'.'.$sizes[0].'x'.$sizes[1].'.'.$img_ext; $tmp_path = $tmp_folder_path.'/'.$tmp_name; $files[] = array('name'=>$tmp_name, 'path'=>$tmp_path); $imResizedBlob = DB_Image::resizeImageFromBlob($imBlob, $imType, $sizes[0], $sizes[1]); DB_Image::writeImageBlobToFile($imResizedBlob, $imType, $tmp_path); } } } echo "[{$idProject}]:\n"; $this->_syncProjectFiles($idProject, $files); echo "\n"; } } private function _getProjectBasePath() { global $FOLDERS; return $FOLDERS['IN7_MK_BAZA_DYSTRYBUCJI_COLUMN']; } private function _findProjectDir($project_id) { $dir_projekty = $this->_getProjectBasePath(); //$www_projekty = "PROJEKTY/"; $pattern = $dir_projekty.'/'.$project_id.'.*'; $path_projekt = glob($pattern , GLOB_ONLYDIR);// array glob(pattern [, flags]) if (empty($path_projekt)) { return null; } $path_projekt = reset($path_projekt); $dir_projekt = explode('/', $path_projekt); $dir_projekt = end($dir_projekt); return $dir_projekt; } private function _findProjectFiles($project_id, $type = '', $suffix = 'pdf') { $ret = array(); // @see .config:$FOLDERS[IN7_MK_BAZA_DYSTRYBUCJI_COLUMN]="/home/samba/PROJEKTY"; $dir_projekty = $this->_getProjectBasePath(); //$www_projekty = "PROJEKTY/"; $pattern = $dir_projekty.'/'.$project_id.'.*'; $path_projekt = glob( $pattern , GLOB_ONLYDIR);// array glob(pattern [, flags]) if (empty($path_projekt)) { return $ret; } $path_projekt = reset($path_projekt); $dir_projekt = explode('/', $path_projekt); $dir_projekt = end($dir_projekt); if (is_array($suffix)) { $files_projekt_add = array(); foreach ($suffix as $add_suffix) { $files_oferty_pattern = $path_projekt.'/*.'.$add_suffix; if ($type) $files_oferty_pattern = $path_projekt.'/*.'.$type.'.*.'.$add_suffix; $files_projekt_add = glob( $files_oferty_pattern);// array glob(pattern [, flags]) foreach ($files_projekt_add as $f) { $files_projekt[] = $f; } } } else { $files_oferty_pattern = $path_projekt.'/*.'.$suffix; if ($type) $files_oferty_pattern = $path_projekt.'/*.'.$type.'.*.'.$suffix; $files_projekt = glob( $files_oferty_pattern);// array glob(pattern [, flags]) } if (empty($files_projekt)) { return $ret; } foreach ($files_projekt as $v) { $f_name = explode('/', $v); $f_name = end($f_name); // TODO: f_www link do akryptu zmieniajacego nazwe pliku na nazwe projektu //$f_www = 'http://'.$host.'/'.$www_projekty.'/'.$dir_projekt.'/'.$f_name; //$f_www = 'http://'.$host.'/index.php?action=project_file&project='.$project_id.'&f='.$f_name; $f_www = str_replace($dir_projekty, 'https://biuro.biall-net.pl/PLIKI/PROJEKTY/', $v); $ret[] = [ 'name' => $f_name, 'path' => $v, 'www' => $f_www ]; } return $ret; } private function _syncProjectFiles($idProject, $files) { if (function_exists('ftp_connect')) { $ftp_conn = $this->_ftpAuth(); $filesOnSite = ftp_nlist($ftp_conn, "public_html/PROJEKTY/{$idProject}/"); echo "[{$idProject}]\tPliki na www public_html/PROJEKTY/{$idProject}/: "; if (empty($filesOnSite)) { echo "brak\n"; } else { echo implode("\n\t\t - ", $filesOnSite) . "\n"; } $filesToRemove = array(); if (!empty($filesOnSite)) { foreach ($filesOnSite as $remotePath) { $remoteName = explode('/', $remotePath); $remoteName = end($remoteName); $toRemove = true; foreach ($files as $f) { if ($f['name'] == $remoteName) { $toRemove = false; } } if ($toRemove) { $filesToRemove[] = $remotePath; } } } echo "[{$idProject}]\tPliki do usunięcia: "; if (empty($filesToRemove)) { echo "brak\n"; } else { echo implode("\n\t\t - ", $filesToRemove) . "\n"; } foreach ($filesToRemove as $remotePath) { $remoteName = explode('/', $remotePath); $remoteName = end($remoteName); echo "[{$idProject}]\t\t"; if (ftp_delete($ftp_conn, $remotePath)) { echo "Usunięto plik {$remoteName}\n"; } else { echo "Error: Could not delete {$remoteName}\n"; } } if (!empty($files)) { $remoteDir = "public_html/PROJEKTY/{$idProject}/"; if (@ftp_mkdir($ftp_conn, $remoteDir)) { echo "[{$idProject}]\t\tUtworzono katalog: '{$remoteDir}'\n"; } else { //echo "There was a problem while creating $dir\n"; } foreach ($files as $f) { $remotePath = "public_html/PROJEKTY/{$idProject}/{$f['name']}"; echo "[{$idProject}]\t\t"; if (ftp_put($ftp_conn, $remotePath, $f['path'], FTP_BINARY)) { echo "Wgrano plik {$f['name']}\n"; } else { echo "Error: There was a problem while uploading {$f['name']}\n"; } } } ftp_close($ftp_conn); } else { foreach ($files as $f) { // string exec ( string $command [, array &$output [, int &$return_var ]] ) //$sync_project_file_command = 'sync-projekty-files-to-www.sh'; /* #!/bin/bash if [ -z "$1" ]; then echo usage: $0 project_id file exit 1 fi if [ -z "$2" ]; then echo usage: $0 project_id file exit 1 fi #dest_path="public_html/PROJEKTY/$1/" dest_path="public_html/PROJEKTY/$1/"`basename $2` USER="biallnet" PASSWD="***" ftp -v -n www.biall.net.pl <