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, '
', $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 <