1<?php 2/* Copyright (C) 2003 Eric Seigne <erics@rycks.com> 3 * Copyright (C) 2003,2005 Rodolphe Quiedeville <rodolphe@quiedeville.org> 4 * Copyright (C) 2004-2011 Laurent Destailleur <eldy@users.sourceforge.net> 5 * Copyright (C) 2004 Sebastien Di Cintio <sdicintio@ressource-toi.org> 6 * Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be> 7 * Copyright (C) 2005-2011 Regis Houssin <regis.houssin@inodbox.com> 8 * Copyright (C) 2011 Juanjo Menent <jmenent@2byte.es> 9 * Copyright (C) 2020 Tobias Sekan <tobias.sekan@startmail.com> 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License as published by 13 * the Free Software Foundation; either version 3 of the License, or 14 * (at your option) any later version. 15 * 16 * This program is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 * GNU General Public License for more details. 20 * 21 * You should have received a copy of the GNU General Public License 22 * along with this program. If not, see <https://www.gnu.org/licenses/>. 23 */ 24 25/** 26 * \file htdocs/admin/external_rss.php 27 * \ingroup external_rss 28 * \brief Page to setupe module ExternalRss 29 */ 30 31require '../main.inc.php'; 32require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; 33require_once DOL_DOCUMENT_ROOT.'/core/class/rssparser.class.php'; 34require_once DOL_DOCUMENT_ROOT.'/core/class/infobox.class.php'; 35 36// Load translation files required by the page 37$langs->load("admin"); 38 39// Security check 40if (!$user->admin) accessforbidden(); 41 42$def = array(); 43$lastexternalrss = 0; 44$action = GETPOST('action', 'aZ09'); 45 46 47/* 48 * Actions 49 */ 50 51// positionne la variable pour le nombre de rss externes 52$sql = "SELECT ".$db->decrypt('name')." as name FROM ".MAIN_DB_PREFIX."const"; 53$sql .= " WHERE ".$db->decrypt('name')." LIKE 'EXTERNAL_RSS_URLRSS_%'"; 54//print $sql; 55$result = $db->query($sql); // We can't use SELECT MAX() because EXTERNAL_RSS_URLRSS_10 is lower than EXTERNAL_RSS_URLRSS_9 56if ($result) 57{ 58 while ($obj = $db->fetch_object($result)) 59 { 60 preg_match('/([0-9]+)$/i', $obj->name, $reg); 61 if ($reg[1] && $reg[1] > $lastexternalrss) $lastexternalrss = $reg[1]; 62 } 63} else { 64 dol_print_error($db); 65} 66 67if ($action == 'add' || GETPOST("modify")) 68{ 69 $external_rss_title = "external_rss_title_".GETPOST("norss", 'int'); 70 $external_rss_urlrss = "external_rss_urlrss_".GETPOST("norss", 'int'); 71 72 if (!empty($_POST[$external_rss_urlrss])) 73 { 74 $boxlabel = '(ExternalRSSInformations)'; 75 //$external_rss_url = "external_rss_url_" . $_POST["norss"]; 76 77 $db->begin(); 78 79 if ($_POST["modify"]) 80 { 81 // Supprime boite box_external_rss de definition des boites 82 /* $sql = "UPDATE ".MAIN_DB_PREFIX."boxes_def"; 83 $sql.= " SET name = '".$db->escape($boxlabel)."'"; 84 $sql.= " WHERE file ='box_external_rss.php' AND note like '".$db->escape($_POST["norss"])." %'"; 85 86 $resql=$db->query($sql); 87 if (! $resql) 88 { 89 dol_print_error($db,"sql=$sql"); 90 exit; 91 } 92 */ 93 } else { 94 // Ajoute boite box_external_rss dans definition des boites 95 $sql = "INSERT INTO ".MAIN_DB_PREFIX."boxes_def (file, note)"; 96 $sql .= " VALUES ('box_external_rss.php','".$db->escape(GETPOST("norss", 'int').' ('.GETPOST($external_rss_title, 'alpha')).")')"; 97 if (!$db->query($sql)) 98 { 99 dol_print_error($db); 100 $err++; 101 } 102 } 103 104 $result1 = dolibarr_set_const($db, "EXTERNAL_RSS_TITLE_".GETPOST("norss", 'int'), GETPOST($external_rss_title, 'alpha'), 'chaine', 0, '', $conf->entity); 105 if ($result1) $result2 = dolibarr_set_const($db, "EXTERNAL_RSS_URLRSS_".GETPOST("norss", 'int'), GETPOST($external_rss_urlrss, 'alpha'), 'chaine', 0, '', $conf->entity); 106 107 if ($result1 && $result2) 108 { 109 $db->commit(); 110 header("Location: ".$_SERVER["PHP_SELF"]); 111 exit; 112 } else { 113 $db->rollback(); 114 dol_print_error($db); 115 } 116 } 117} 118 119if ($_POST["delete"]) 120{ 121 if (GETPOST("norss", 'int')) 122 { 123 $db->begin(); 124 125 // Supprime boite box_external_rss de definition des boites 126 $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."boxes_def"; 127 $sql .= " WHERE file = 'box_external_rss.php' AND note LIKE '".$db->escape(GETPOST("norss", 'int'))." %'"; 128 129 $resql = $db->query($sql); 130 if ($resql) 131 { 132 $num = $db->num_rows($resql); 133 $i = 0; 134 while ($i < $num) 135 { 136 $obj = $db->fetch_object($resql); 137 138 $sql = "DELETE FROM ".MAIN_DB_PREFIX."boxes"; 139 $sql .= " WHERE entity = ".$conf->entity; 140 $sql .= " AND box_id = ".$obj->rowid; 141 $resql = $db->query($sql); 142 143 $sql = "DELETE FROM ".MAIN_DB_PREFIX."boxes_def"; 144 $sql .= " WHERE rowid = ".$obj->rowid; 145 $resql = $db->query($sql); 146 147 if (!$resql) 148 { 149 $db->rollback(); 150 dol_print_error($db, "sql=".$sql); 151 exit; 152 } 153 154 $i++; 155 } 156 157 $db->commit(); 158 } else { 159 $db->rollback(); 160 dol_print_error($db, "sql=".$sql); 161 exit; 162 } 163 164 165 $result1 = dolibarr_del_const($db, "EXTERNAL_RSS_TITLE_".GETPOST("norss", 'int'), $conf->entity); 166 if ($result1) $result2 = dolibarr_del_const($db, "EXTERNAL_RSS_URLRSS_".GETPOST("norss", 'int'), $conf->entity); 167 168 if ($result1 && $result2) 169 { 170 $db->commit(); 171 header("Location: external_rss.php"); 172 exit; 173 } else { 174 $db->rollback(); 175 dol_print_error($db); 176 } 177 } 178} 179 180 181/* 182 * View 183 */ 184 185llxHeader('', $langs->trans("ExternalRSSSetup")); 186 187$linkback = '<a href="'.DOL_URL_ROOT.'/admin/modules.php?restore_lastsearch_values=1">'.$langs->trans("BackToModuleList").'</a>'; 188print load_fiche_titre($langs->trans("ExternalRSSSetup"), $linkback, 'title_setup'); 189print '<br>'; 190 191// Formulaire ajout 192print '<form name="externalrssconfig" action="'.$_SERVER["PHP_SELF"].'" method="post">'; 193print '<input type="hidden" name="token" value="'.newToken().'">'; 194 195print '<table class="noborder centpercent">'; 196print '<tr class="liste_titre">'; 197print '<td colspan="2">'.$langs->trans("NewRSS").'</td>'; 198print '<td>'.$langs->trans("Example").'</td>'; 199print '</tr>'; 200print '<tr class="impair">'; 201print '<td width="100">'.$langs->trans("Title").'</td>'; 202print '<td><input type="text" class="flat minwidth300" name="external_rss_title_'.($lastexternalrss + 1).'" value=""></td>'; 203print '<td>'.$langs->trans('RSSUrlExample').'</td>'; 204print '</tr>'; 205 206print '<tr class="pair">'; 207print '<td>'.$langs->trans('RSSUrl').'</td>'; 208print '<td><input type="text" class="flat minwidth300" name="external_rss_urlrss_'.($lastexternalrss + 1).'" value=""></td>'; 209print '<td>http://news.google.com/news?ned=us&topic=h&output=rss<br>http://www.dolibarr.org/rss</td>'; 210print '</tr>'; 211print '</table>'; 212 213print '<br><div class="center">'; 214print '<input type="submit" class="button" value="'.$langs->trans("Add").'">'; 215print '<input type="hidden" name="action" value="add">'; 216print '<input type="hidden" name="norss" value="'.($lastexternalrss + 1).'">'; 217print '</div>'; 218 219print '</form>'; 220 221print '<br><br>'; 222print '<span class="opacitymedium">'.$langs->trans('RssNote').'</span> - <a href="'.DOL_MAIN_URL_ROOT.'/admin/boxes.php">'.$langs->trans('JumpToBoxes').'</a>'; 223print '<br><br>'; 224 225$sql = "SELECT rowid, file, note FROM ".MAIN_DB_PREFIX."boxes_def"; 226$sql .= " WHERE file = 'box_external_rss.php'"; 227$sql .= " ORDER BY note"; 228 229dol_syslog("select rss boxes", LOG_DEBUG); 230$resql = $db->query($sql); 231if ($resql) 232{ 233 $boxlist = InfoBox::listBoxes($db, 'activated', -1, null); 234 $num = $db->num_rows($resql); 235 $i = 0; 236 237 while ($i < $num) 238 { 239 $obj = $db->fetch_object($resql); 240 241 preg_match('/^([0-9]+)/i', $obj->note, $reg); 242 $idrss = $reg[1]; 243 $keyrsstitle = "EXTERNAL_RSS_TITLE_".$idrss; 244 $keyrssurl = "EXTERNAL_RSS_URLRSS_".$idrss; 245 //print "x".$idrss; 246 247 $rssparser = new RssParser($db); 248 $result = $rssparser->parser($conf->global->$keyrssurl, 5, 300, $conf->externalrss->dir_temp); 249 250 print "<br>"; 251 print '<form name="externalrssconfig" action="'.$_SERVER["PHP_SELF"].'" method="post">'."\n"; 252 253 print '<table class="noborder centpercent">'."\n"; 254 print '<input type="hidden" name="token" value="'.newToken().'">'."\n"; 255 256 print '<tr class="liste_titre">'; 257 print "<td>".$langs->trans("RSS")." ".($i + 1)."</td>"; 258 print '<td class="right">'; 259 print '<input type="submit" class="button buttongen" name="modify" value="'.$langs->trans("Modify").'">'; 260 print " "; 261 print '<input type="submit" class="button buttongen" name="delete" value="'.$langs->trans("Delete").'">'; 262 print '<input type="hidden" name="norss" value="'.$idrss.'">'; 263 print '</td>'; 264 print '</tr>'."\n"; 265 266 267 print '<tr class="oddeven">'; 268 print "<td width=\"100px\">".$langs->trans("Title")."</td>"; 269 print "<td><input type=\"text\" class=\"flat minwidth300\" name=\"external_rss_title_".$idrss."\" value=\"".dol_escape_htmltag($conf->global->$keyrsstitle)."\"></td>"; 270 print '</tr>'."\n"; 271 272 273 print '<tr class="oddeven">'; 274 print "<td>".$langs->trans("URL")."</td>"; 275 print "<td><input type=\"text\" class=\"flat minwidth300\" name=\"external_rss_urlrss_".$idrss."\" value=\"".dol_escape_htmltag($conf->global->$keyrssurl)."\"></td>"; 276 print '</tr>'."\n"; 277 278 279 print '<tr class="oddeven">'; 280 print "<td>".$langs->trans("Status")."</td>"; 281 print "<td>"; 282 if ($result > 0 && empty($rss->error)) 283 { 284 print '<font class="ok">'.$langs->trans("Online").'</div>'; 285 } else { 286 print '<font class="error">'.$langs->trans("Offline"); 287 $langs->load("errors"); 288 if ($rssparser->error) print ' - '.$langs->trans($rssparser->error); 289 print '</div>'; 290 } 291 print "</td>"; 292 print '</tr>'."\n"; 293 294 // Logo 295 if ($result > 0 && empty($rss->error)) 296 { 297 print '<tr class="oddeven">'; 298 print "<td>".$langs->trans("Logo")."</td>"; 299 print '<td>'; 300 $imageurl = $rssparser->getImageUrl(); 301 $linkrss = $rssparser->getLink(); 302 if (!preg_match('/^http/', $imageurl)) $imageurl = $linkrss.$imageurl; 303 if ($imageurl) print '<img height="32" src="'.$imageurl.'">'; 304 else print $langs->trans("None"); 305 print '</td>'; 306 print '</tr>'."\n"; 307 } 308 309 // Active 310 $active = _isInBoxList($idrss, $boxlist) ? 'yes' : 'no'; 311 print '<tr class="oddeven">'; 312 print '<td>'.$langs->trans('WidgetEnabled').'</td>'; 313 print '<td>'.yn($active).'</td>'; 314 print '</tr>'."\n"; 315 316 print '</table>'."\n"; 317 318 print "</form>\n"; 319 320 $i++; 321 } 322} else { 323 dol_print_error($db); 324} 325 326// End of page 327llxFooter(); 328$db->close(); 329 330/** 331 * Check if the given RSS feed if inside the list of boxes/widgets 332 * 333 * @param int $idrss The id of the RSS feed 334 * @param array $boxlist A list with boxes/widgets 335 * @return bool true if the rss feed is inside the box/widget list, otherwise false 336 */ 337function _isInBoxList($idrss, array $boxlist) 338{ 339 foreach ($boxlist as $box) 340 { 341 if ($box->boxcode === "lastrssinfos" && strpos($box->note, $idrss) !== false) 342 { 343 return true; 344 } 345 } 346 347 return false; 348} 349