/** * Permet de faire un comptage par table liee * * @syntaxe `{compteur table[, champ]}` * @link http://www.spip-contrib.net/Classer-les-articles-par-nombre-de#forum409210 * * @example * Pour avoir les auteurs classes par articles et * le nombre d'article de chacun : * * ``` * <BOUCLE1(AUTEURS){compteur articles}{par compteur_articles}> * #ID_AUTEUR : #COMPTEUR{articles} * </BOUCLE1> * ``` * * @note * Avec un seul argument {compteur autre_table} le groupby est fait * implicitement sur la cle primaire de la boucle en cours. * Avec un second argument {compteur autre_table,champ_fusion} * le groupby est fait sur le champ_fusion" * * @param string $idb * Identifiant de la boucle * @param Boucle[] $boucles * AST du squelette * @param Critere $crit * Paramètres du critère dans cette boucle * @param bool $left * true pour utiliser un left join plutôt qu'un inner join. * @return void */ function critere_compteur($idb, &$boucles, $crit, $left = false) { $boucle =& $boucles[$idb]; if (isset($crit->param[1])) { $_fusion = calculer_liste($crit->param[1], array(), $boucles, $boucle->id_parent); } else { $_fusion = "''"; } $params = $crit->param; $table = reset($params); $table = $table[0]->texte; $op = false; if (preg_match(',^(\\w+)([<>=])([0-9]+)$,', $table, $r)) { $table = $r[1]; if (count($r) >= 3) { $op = $r[2]; } if (count($r) >= 4) { $op_val = $r[3]; } } $type = objet_type($table); $type_id = id_table_objet($type); /** * Si la clé primaire est une clé multiple, on prend la première partie * Utile pour compter les versions de spip_versions par exemple */ if (count($types = explode(',', $type_id)) > 1) { $type_id = $types[0]; } $table_sql = table_objet_sql($type); $trouver_table = charger_fonction('trouver_table', 'base'); $arrivee = array($table, $trouver_table($table, $boucle->sql_serveur)); $depart = array($boucle->id_table, $trouver_table($boucle->id_table, $boucle->sql_serveur)); // noter les jointures deja installees $joins = array_keys($boucle->from); if ($compt = calculer_jointure($boucle, $depart, $arrivee)) { if ($_fusion != "''") { // en cas de jointure, on ne veut pas du group_by sur la cle primaire ! // cela casse le compteur ! foreach ($boucle->group as $k => $group) { if ($group == $boucle->id_table . '.' . $boucle->primary) { unset($boucle->group[$k]); } } $boucle->group[] = '".($gb=' . $_fusion . ')."'; } $boucle->select[] = "COUNT({$compt}.{$type_id}) AS compteur_{$table}"; if ($op) { $boucle->having[] = array("'" . $op . "'", "'compteur_" . $table . "'", $op_val); } if ($left) { foreach ($boucle->from as $k => $val) { if (!in_array($k, $joins)) { $boucle->from_type[$k] = 'left'; } } } } }
function shop_liste_etapes($id_panier) { static $lesetapes = array(); $etapes = array('panier', 'qui', 'commande', 'livraison', 'paiement'); if (!$id_panier) { return $etapes; } if (isset($lesetapes["{$id_panier}"])) { return $lesetapes["{$id_panier}"]; } if ($id_auteur = intval(sql_getfetsel('id_auteur', 'spip_paniers', 'id_panier=' . intval($id_panier)))) { $etapes = array_diff($etapes, array('qui')); } $items = sql_allfetsel("*", "spip_paniers_liens", "id_panier=" . intval($id_panier)); $livrable = false; foreach ($items as $item) { $table = table_objet_sql($item['objet']); $primary = id_table_objet($item['objet']); $objet = sql_fetsel("*", $table, "{$primary}=" . intval($item['id_objet'])); if (!isset($objet['immateriel']) or !$objet['immateriel']) { $livrable = true; break; } } if (!$livrable) { $etapes = array_diff($etapes, array('livraison')); } return $lesetapes["{$id_panier}"] = $etapes; }
function formulaires_forum_prive_charger_dist($objet, $id_objet, $id_forum, $afficher_previsu, $statut, $retour = '') { if (!function_exists($f = 'forum_recuperer_titre')) { $f = 'forum_recuperer_titre_dist'; } // si objet, il faut un titre, sinon on est dans un statut privrac/privadm qui permet un forum sans objet if ($objet and $id_objet and !($titre = $f($objet, $id_objet, $id_forum, false))) { return false; } $primary = id_table_objet($objet); $table = table_objet($objet); // Tableau des valeurs servant au calcul d'une signature de securite. // Elles seront placees en Input Hidden pour que inc/forum_insert // recalcule la meme chose et verifie l'identite des resultats. // Donc ne pas changer la valeur de ce tableau entre le calcul de // la signature et la fabrication des Hidden // Faire attention aussi a 0 != '' $ids = array(); $ids[$primary] = ($x = intval($id_objet)) ? $x : ''; $ids['id_objet'] = ($x = intval($id_objet)) ? $x : ''; $ids['objet'] = $objet; $ids['id_forum'] = ($x = intval($id_forum)) ? $x : ''; // ne pas mettre '', sinon le squelette n'affichera rien. $previsu = ' '; // pour les hidden $script_hidden = ""; foreach ($ids as $id => $v) { $script_hidden .= "<input type='hidden' name='{$id}' value='{$v}' />"; } $config = array(); foreach (array('afficher_barre', 'forum_titre', 'forums_texte', 'forums_urlref') as $k) { $config[$k] = ' '; } return array('nom_site' => '', 'table' => $table, 'texte' => '', 'config' => $config, 'titre' => $titre, '_hidden' => $script_hidden, 'url_site' => "http://", 'id_forum' => $id_forum, '_sign' => implode('_', $ids), '_autosave_id' => $ids); }
function genie_depublier_dist($time) { //va chercher les objets de spip_depublies avec une date_depublie pour aujourd'hui include_spip('base/abstract_sql'); $today = date('Y-m-d H:i:s'); if ($depublications = sql_allfetsel('*', 'spip_depublies', 'DATE_FORMAT(date_depublie, "%Y-%m-%d %H:%i:%s") <= ' . sql_quote($today) . ' AND DATE_FORMAT(date_depublie, "%Y-%m-%d %H:%i:%s") >0') and is_array($depublications)) { foreach ($depublications as $depublication) { $objet = $depublication['objet']; $id_objet = $depublication['id_objet']; $statut_depublication = $depublication['statut']; $date_depublie = $depublication['date_depublie']; spip_log("on veut depublier {$objet} {$id_objet} {$statut_depublication}", 'depublication'); //on cherche la table de l'objet donné $_id_objet = id_table_objet($objet); //id_article $table = table_objet_sql($objet); //articles //si le statut est différent de celui demandé if ($a_depublier = sql_getfetsel($_id_objet, $table, "statut != " . sql_quote($statut_depublication) . " AND {$_id_objet} = " . intval($id_objet))) { //si les conditions sont remplies, on change le statut dans cette table sql_updateq($table, array("statut" => $statut_depublication), "{$_id_objet}= " . intval($id_objet)); //et on supprime l'entrée sql_delete('spip_depublies', 'id_objet=' . intval($id_objet) . ' AND objet=' . sql_quote($objet)); } } } return 1; }
/** * Supprimer les révisions des objets disparus */ function optimiser_base_revisions() { /** * On commence par récupérer la liste des types d'objet ayant au moins une révision */ $objets_revises = sql_select('objet', 'spip_versions', 'id_version=1', 'objet'); /** * Pour chaque objet, on va contruire un tableau des identifiants disparus * On supprimera ensuite les occurences dans spip_versions et spip_versions_fragments */ while ($objet = sql_fetch($objets_revises)) { $in = array(); $table = table_objet_sql($objet['objet']); $id_table_objet = id_table_objet($objet['objet']); $res = sql_select("A.id_objet AS id_objet, A.objet AS objet", "spip_versions AS A LEFT JOIN {$table} AS R\n\t\t\t\t\t\t\tON R.{$id_table_objet}=A.id_objet AND A.objet=" . sql_quote($objet['objet']), "R.{$id_table_objet} IS NULL AND A.objet=" . sql_quote($objet['objet']) . " AND A.id_objet > 0", "A.id_objet", "A.id_objet"); while ($row = sql_fetch($res)) { $in[$row['id_objet']] = true; } sql_free($res); /** * Si on a un array * On supprime toute occurence des objets disparus dans : * -* spip_versions * -* spip_versions_fragments */ if ($in) { foreach (array('spip_versions', 'spip_versions_fragments') as $table) { sql_delete($table, sql_in('id_objet', array_keys($in)) . " AND objet=" . sql_quote($objet['objet'])); } } } }
function action_dereferencer_traduction_rubrique_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); list($type, $id_objet) = explode('/', $arg); if (!$type = objet_type($type) or !$id_objet = intval($id_objet)) { if (!_AJAX) { include_spip('inc/minipres'); minipres('Arguments incompris'); } else { spip_log('Arguments incompris dans action dereferencer_traduction_rubrique'); return false; } } $objet = table_objet($type); $_id_objet = id_table_objet($objet); $table = table_objet_sql($objet); $id_trad_old = sql_getfetsel('id_trad', $table, "$_id_objet = " . sql_quote($id_objet)); if ($id_trad_old) { include_spip('inc/modifier'); modifier_contenu($objet, $id_objet, array('invalideur' => "id='$objet/$id_objet'"), array('id_trad' => 0)); // si la deliaison fait qu'il ne reste plus que la source // dans le groupe de traduction on lui remet l'id_trad a 0 if (1 == $nb_dans_groupe = sql_countsel($table, array('id_trad = ' . sql_quote($id_trad_old)))) { modifier_contenu($objet, $id_trad_old, array('invalideur' => "id='$objet/$id_trad_old'"), array('id_trad' => 0)); } } }
/** * Detecter les demande d'acces aux pages restreintes * et re-orienter vers une 401 si necessaire * * @param <type> $contexte * @return <type> */ function accesrestreint_page_indisponible($contexte){ if ($contexte['status']=='404' AND isset($contexte['type'])){ $objet = $contexte['type']; $table_sql = table_objet_sql($objet); $id_table_objet = id_table_objet($objet); if ($id = intval($contexte[$id_table_objet])){ $publie = true; $restreint = false; $trouver_table = charger_fonction('trouver_table','base'); $desc = $trouver_table($table_sql); if (isset($desc['field']['statut'])){ $statut = sql_getfetsel('statut', $table_sql, "$id_table_objet=".intval($id)); if ($statut!='publie') $publie = false; } include_spip('inc/autoriser'); if ($publie AND !autoriser('voir',$objet,$id)){ // c'est un contenu restreint $contexte['status'] = '401'; $contexte['code'] = '401 Unauthorized'; $contexte['fond'] = '401'; $contexte['erreur'] = _T('accesrestreint:info_acces_restreint'); $contexte['cible'] = self(); } } } return $contexte; }
/** * Déclaration des alias de tables et filtres automatiques de champs * * @pipeline declarer_tables_interfaces * @param array $interfaces * Déclarations d'interface pour le compilateur * @return array * Déclarations d'interface pour le compilateur */ function massicot_declarer_tables_interfaces($interfaces) { $interfaces = ajouter_traitement_automatique($interfaces, 'massicoter_document(%s)', 'FICHIER', 'documents'); $interfaces = ajouter_traitement_automatique($interfaces, 'massicoter_logo_document(%s, $Pile[1])', 'LOGO_DOCUMENT'); $interfaces = ajouter_traitement_automatique($interfaces, 'massicoter_document(%s)', 'URL_DOCUMENT', 'documents'); /* On traîte aussi les balises #HAUTEUR et #LARGEUR des documents */ $interfaces = ajouter_traitement_automatique($interfaces, 'massicoter_largeur(%s, $Pile[1])', 'LARGEUR', 'documents'); $interfaces = ajouter_traitement_automatique($interfaces, 'massicoter_largeur(%s, $Pile[1])', 'HAUTEUR', 'documents'); /* Pour chaque objet éditorial existant, ajouter un traitement sur les logos */ if (isset($GLOBALS['spip_connect_version'])) { foreach (lister_tables_objets_sql() as $table => $valeurs) { if ($table !== 'spip_documents') { $interfaces = ajouter_traitement_automatique($interfaces, 'massicoter_logo(%s, ' . objet_type($table) . ', $Pile[1][\'' . id_table_objet($table) . '\'])', strtoupper('LOGO_' . objet_type($table))); $interfaces = ajouter_traitement_automatique($interfaces, 'massicoter_logo(%s, ' . objet_type($table) . ', $Pile[1][\'' . id_table_objet($table) . '\'])', strtoupper('LOGO_' . objet_type($table)) . '_NORMAL'); $interfaces = ajouter_traitement_automatique($interfaces, 'massicoter_logo(%s, ' . objet_type($table) . ', $Pile[1][\'' . id_table_objet($table) . '\'], \'logo_survol\')', strtoupper('LOGO_' . objet_type($table)) . '_SURVOL'); } } } /* sans oublier #LOGO_ARTICLE_RUBRIQUE… */ $interfaces = ajouter_traitement_automatique($interfaces, 'massicoter_logo(%s,null,null,null,$Pile[0])', 'LOGO_ARTICLE_RUBRIQUE'); /* …ni les #LOGO_SITE_SPIP ! */ $interfaces = ajouter_traitement_automatique($interfaces, 'massicoter_logo(%s,"site","0","",$Pile[0])', 'LOGO_SITE_SPIP'); $interfaces = ajouter_traitement_automatique($interfaces, 'massicoter_logo(%s,"site","0","logo_survol",$Pile[0])', 'LOGO_SITE_SPIP_SURVOL'); return $interfaces; }
/** * Supprimer un lien entre un document et un objet * * @param int $id_document * @param string $objet * @param int $id_objet * @param bool $supprime * si true, le document est supprime si plus lie a aucun objet * @param bool $check * si true, on verifie les documents references dans le texte de l'objet * et on les associe si pas deja fait * @return bool */ function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = false, $check = false) { if (!($id_document = intval($id_document))) { return false; } // D'abord on ne supprime pas, on dissocie include_spip('action/editer_liens'); objet_dissocier(array('document' => $id_document), array($objet => $id_objet)); // Si c'est une vignette, l'eliminer du document auquel elle appartient // cas tordu peu probable sql_updateq("spip_documents", array('id_vignette' => 0), "id_vignette=" . $id_document); // verifier son statut apres une suppression de lien include_spip('action/editer_document'); document_instituer($id_document); pipeline('post_edition', array('args' => array('operation' => 'delier_document', 'action' => 'delier_document', 'table' => 'spip_documents', 'id_objet' => $id_document, 'objet' => $objet, 'id' => $id_objet), 'data' => null)); if ($check) { // si demande, on verifie que ses documents vus sont bien lies ! $spip_table_objet = table_objet_sql($objet); $table_objet = table_objet($objet); $id_table_objet = id_table_objet($objet, $serveur); $champs = sql_fetsel('*', $spip_table_objet, addslashes($id_table_objet) . "=" . intval($id_objet)); $marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc'); $marquer_doublons_doc($champs, $id_objet, $objet, $id_table_objet, $table_objet, $spip_table_objet, '', $serveur); } // On supprime ensuite s'il est orphelin // et si demande // ici on ne bloque pas la suppression d'un document rattache a un autre if ($supprime and !sql_countsel('spip_documents_liens', "objet!='document' AND id_document=" . $id_document)) { $supprimer_document = charger_fonction('supprimer_document', 'action'); return $supprimer_document($id_document); } }
/** * Modifier la langue d'un objet * * @param string $objet * @param int $id * @param int $id_rubrique * @param string $changer_lang * @return string */ function action_instituer_langue_objet_dist($objet, $id, $id_rubrique, $changer_lang) { if ($changer_lang) { $table_objet_sql = table_objet_sql($objet); $id_table_objet = id_table_objet($objet); if ($changer_lang != "herit") { sql_updateq($table_objet_sql, array('lang' => $changer_lang, 'langue_choisie' => 'oui'), "{$id_table_objet}=" . intval($id)); include_spip('inc/rubriques'); if ($table_objet_sql == 'spip_rubriques') { calculer_langues_rubriques(); } $langues = calculer_langues_utilisees(); ecrire_meta('langues_utilisees', $langues); } else { $langue_parent = sql_getfetsel("lang", "spip_rubriques", "id_rubrique=" . intval($id_rubrique)); if (!$langue_parent) { $langue_parent = $GLOBALS['meta']['langue_site']; } sql_updateq($table_objet_sql, array('lang' => $langue_parent, 'langue_choisie' => 'non'), "{$id_table_objet}=" . intval($id)); $changer_lang = $langue_parent; if ($table_objet_sql == 'spip_rubriques') { include_spip('inc/rubriques'); calculer_langues_rubriques(); } } } return $changer_lang; }
function action_deplacer_objets_dist() { include_spip('inc/autoriser'); if (!autoriser('ecrire')) { return plan_json_erreur(_T("plan:erreur_autorisation_insuffisante") . " " . _T("plan:erreur_deplacement_impossible")); } include_spip('base/objets'); $objet = objet_type(_request('objet')); $table = table_objet_sql($objet); $_id_table = id_table_objet($table); $ids = _request('id_objet'); $id_rubrique_old = _request('id_rubrique_source'); $id_rubrique_new = _request('id_rubrique_destination'); if (!is_array($ids) or !$objet) { return plan_json_erreur(_T("plan:erreur_aucun_identifiant") . " " . _T("plan:erreur_deplacement_impossible")); } if ($id_rubrique_old == $id_rubrique_new) { return plan_json_erreur(_T("plan:erreur_rubriques_parentes_incorrectes") . " " . _T("plan:erreur_deplacement_impossible")); } if ($objet != 'rubrique' and !$id_rubrique_new) { return plan_json_erreur(_T("plan:erreur_rubriques_parentes_incorrectes") . " " . _T("plan:erreur_deplacement_impossible")); } $ids = array_filter($ids); if ($objet == 'rubrique') { $champ = 'id_parent'; } else { $champ = 'id_rubrique'; } // ne modifier que si les emplacements n'ont pas déjà changé ! $ids = sql_allfetsel($_id_table, $table, array(sql_in($_id_table, $ids), $champ . '=' . sql_quote($id_rubrique_old))); $ids = array_map('array_shift', $ids); include_spip('action/editer_objet'); $errors = $success = array(); $modifs = array('id_parent' => $id_rubrique_new); foreach ($ids as $id) { if (autoriser('modifier', $objet, $id)) { if ($err = objet_modifier($objet, $id, $modifs)) { $errors["{$objet}-{$id}"] = $err; } else { $success["{$objet}-{$id}"] = true; } } else { $errors["{$objet}-{$id}"] = _T("plan:erreur_autorisation_insuffisante") . " " . _T("plan:erreur_deplacement_impossible"); } } // dans certains cas… on ne reçoit pas d'erreur… et pourtant ! if (!$errors) { // on verifie qu'il n'y a plus d'objets à l'ancien emplacement $ids = sql_allfetsel($_id_table, $table, array(sql_in($_id_table, $ids), $champ . '=' . sql_quote($id_rubrique_old))); $ids = array_map('array_shift', $ids); if ($ids) { foreach ($ids as $id) { $errors["{$objet}-{$id}"] = _T("plan:erreur_deplacement"); unset($success["{$objet}-{$id}"]); } } } return plan_json_envoi(array('done' => true, 'success' => $success, 'errors' => $errors)); }
function lister_traductions($id_trad, $objet) { $table_objet_sql = table_objet_sql($objet); $primary = id_table_objet($objet); $rows = sql_allfetsel("{$primary} as id,lang", $table_objet_sql, 'id_trad=' . intval($id_trad)); lang_select(); return $rows; }
function exec_documenter_dist() { $script = _request('script'); // generalisation a tester $iframe = _request('iframe'); $album = _request('s'); $type = _request('type'); $id = intval(_request(id_table_objet($type))); exec_documenter_args($id, $type, $script, $album, $iframe); }
function generer_generer_url($type, $p) { $_id = interprete_argument_balise(1, $p); if (!$_id) { $primary = id_table_objet($type); $_id = champ_sql($primary, $p); } return generer_generer_url_arg($type, $p, $_id); }
/** * Construire un tableau par popularite * classemnt => id_truc * * @param string $type * @param string $serveur * @return array */ function classement_populaires($type, $serveur = '') { static $classement = array(); if (isset($classement[$type])) { return $classement[$type]; } $classement[$type] = sql_allfetsel(id_table_objet($type, $serveur), table_objet_sql($type, $serveur), "statut='publie' AND popularite > 0", "", "popularite DESC", '', '', $serveur); $classement[$type] = array_map('reset', $classement[$type]); return $classement[$type]; }
/** * Afficher un formulaire de gestion des liens aux sites pour les objets associables * * @pipeline affiche_enfants * @param array $flux Données du pipeline * @return array Données du pipeline */ function lier_sites_affiche_droite($flux) { include_spip('inc/config'); $objets_associables = array_map('objet_type', lire_config('lier_sites/objets_sites')); if (in_array($flux['args']['exec'], $objets_associables)) { $objet = $flux['args']['exec']; $id_objet = $flux['args'][id_table_objet($objet)]; $flux['data'] .= recuperer_fond('prive/squelettes/inclure/editer_sites_lies', array('objet' => $objet, 'id_objet' => $id_objet)); } return $flux; }
/** * Boite de configuration des objets articles * * @param array $flux * @return array */ function petitions_afficher_config_objet($flux) { if (($type = $flux['args']['type']) == 'article' and $id = $flux['args']['id']) { if (autoriser('modererpetition', $type, $id)) { $table = table_objet($type); $id_table_objet = id_table_objet($type); $flux['data'] .= recuperer_fond("prive/configurer/petitionner", array($id_table_objet => $id)); } } return $flux; }
function inclure_liste_recherche_par_id($table, $id, $statut, $env) { if (is_string($env)) { $env = unserialize($env); } $env[id_table_objet($table)] = $id; if ($statut) { $env['statut'] = $statut; } unset($env['recherche']); return recuperer_fond("prive/objets/liste/{$table}", $env); }
function quete_parent_lang($table,$id,$connect=''){ static $cache_quete = array(); if (!isset($cache_quete[$connect][$table][$id]) AND in_array($table,array('spip_rubriques','spip_articles','spip_syndic','spip_breves'))){ $select = ($table=='spip_rubriques'?'id_parent':'id_rubrique'); $select .= in_array($table,array('spip_rubriques','spip_articles','spip_breves'))?", lang":""; $_id = id_table_objet(objet_type($table)); $cache_quete[$connect][$table][$id] = sql_fetsel($select, $table,"$_id=".intval($id),'','','','',$connect); } return $cache_quete[$connect][$table][$id]; }
/** * Autorisation de voir les revisions ? * * Il faut : * - des revisions définies pour cet objet * - que l'objet existe * - que l'on soit autorisé à voir l'objet * * @param string $faire Action demandée * @param string $type Type d'objet sur lequel appliquer l'action * @param int $id Identifiant de l'objet * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon */ function autoriser_voirrevisions_dist($faire, $type, $id, $qui, $opt) { $table = table_objet_sql($type); $id_table_objet = id_table_objet($type); include_spip('inc/revisions'); if (!liste_champs_versionnes($table)) { return false; } if (!($row = sql_fetsel("*", $table, "{$id_table_objet}=" . intval($id)))) { return false; } return autoriser('voir', $type, $id, $qui, $opt); }
/** * Retourne le code HTML du portfolio, liste des documents et formulaire d'ajout de documents * * @note * Marque les documents vus dans les textes de l'objet avant le calcul ! * * @uses inc_marquer_doublons_doc_dist() * * @param int $id Identifiant de l'objet * @param string $type Type d'objet * @return string code HTML **/ function inc_documenter_objet_dist($id, $type) { $serveur = ''; // avant de documenter un objet, on verifie que ses documents vus sont bien lies ! $spip_table_objet = table_objet_sql($type); $table_objet = table_objet($type); $id_table_objet = id_table_objet($type, $serveur); $champs = sql_fetsel('*', $spip_table_objet, addslashes($id_table_objet) . "=" . intval($id)); $marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc'); $marquer_doublons_doc($champs, $id, $type, $id_table_objet, $table_objet, $spip_table_objet, '', $serveur); $contexte = array('objet' => $type, 'id_objet' => $id); return recuperer_fond('prive/objets/contenu/portfolio_document', array_merge($_GET, $contexte)); }
function critere_doublons_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; $primary = $boucle->primary; $type = $boucle->type_requete; // Dans le cas NOT, la table du doublon peut etre indiquee // si la table courante a un champ homonyme de sa cle primaire. // Tres utile pour la table des forums. if (isset($crit->param[1])) { $primary = ''; $x = !$crit->not ? '' : calculer_liste($crit->param[1], array(), $boucles, $boucle->id_parent); # attention au commentaire "// x signes" qui precede if (preg_match(",^(?:\s*//[^\n]*\n)?'([^']+)'*$,ms", $x, $m)) { $x = id_table_objet($type = $m[1]); if (isset($boucle->show['field'][$x])) $primary = $x; // sinon erreur declenchee ci-dessous } } if (!$primary OR strpos($primary,',')) { return (array('zbug_doublon_sur_table_sans_cle_primaire')); } $not = ($crit->not ? '' : 'NOT'); $nom = !isset($crit->param[0]) ? "''" : calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent); // mettre un tableau pour que ce ne soit pas vu comme une constante $nom = "'" . $type . "'" . ($nom == "''" ? '' : " . $nom"); $debutdoub = '$doublons[' . (!$not ? '' : ($boucle->doublons . "[]= ")); $findoub = "($nom)]"; $debin = "sql_in('" . $boucle->id_table . '.' . $primary . "', "; $suitin = $debin . $debutdoub; // si autre critere doublon, fusionner pour avoir un seul In foreach ($boucle->where as $k => $w) { if (strpos($w[0], $suitin) ===0) { $boucle->where[$k][0] = $debin . $debutdoub . $findoub . ' . ' . substr($w[0],strlen($debin)); return; } } $boucle->where[]= array($suitin . $findoub . ", '" . $not . "')"); # la ligne suivante avait l'intention d'eviter une collecte deja faite # mais elle fait planter une boucle a 2 critere doublons: # {!doublons A}{doublons B} # (de http://article.gmane.org/gmane.comp.web.spip.devel/31034) # if ($crit->not) $boucle->doublons = ""; }
/** * Detecter les demande d'acces aux pages restreintes * et re-orienter vers une 401 si necessaire * * @param array $contexte * @return array */ function accesrestreint_page_indisponible($contexte) { if ($contexte['status'] == '404') { $objet = ""; if (isset($contexte['type'])) { $objet = $contexte['type']; } elseif (isset($contexte['type-page'])) { $objet = $contexte['type-page']; } elseif (isset($contexte['fond_erreur'])) { include_spip('inc/urls'); define('_DEFINIR_CONTEXTE_TYPE_PAGE', true); $c2 = $contexte; list($fond2, $c2, $url_redirect) = urls_decoder_url(nettoyer_uri(), $contexte['fond_erreur'], $c2, true); $objet = $c2['type-page']; } if ($objet) { $table_sql = table_objet_sql($objet); $id_table_objet = id_table_objet($objet); if ($id = intval($contexte[$id_table_objet])) { $publie = true; if (include_spip("base/objets") and function_exists("objet_test_si_publie")) { $publie = objet_test_si_publie($objet, $id); } else { $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_sql); if (isset($desc['field']['statut'])) { $statut = sql_getfetsel('statut', $table_sql, "{$id_table_objet}=" . intval($id)); if ($statut != 'publie') { $publie = false; } } } include_spip('inc/autoriser'); if ($publie and !autoriser('voir', $objet, $id)) { // c'est un contenu restreint $contexte['status'] = '401'; $contexte['code'] = '401 Unauthorized'; $contexte['fond'] = '401'; $contexte['erreur'] = _T('accesrestreint:info_acces_restreint'); $contexte['cible'] = self(); if (!isset($contexte['objet'])) { $contexte['objet'] = $objet; $contexte['id_objet'] = $id; } } } } } return $contexte; }
function exec_puce_statut_args($id, $type) { if (in_array($type,array('article','breve','site'))) { $table = table_objet_sql($type); $prim = id_table_objet($type); $id = intval($id); $r = sql_fetsel("id_rubrique,statut", "$table", "$prim=$id"); $statut = $r['statut']; $id_rubrique = $r['id_rubrique']; } else { $id_rubrique = intval($id); $statut = 'prop'; // arbitraire } $puce_statut = charger_fonction('puce_statut', 'inc'); ajax_retour($puce_statut($id,$statut,$id_rubrique,$type, true)); }
/** * Calculer le poids (en g) et le volume (en cm3) de N objets * (a livrer dans une commande) * la quantite est fournie en argument car pour certains objets il peut y avoir des effet de seuil * du au packaging * Ex : des bouteilles envoyees par caisse de 6 meme si caisse incomplete * a traiter au cas par cas * * La fonction est specialisable en fonction du type, sous le nom * mesure_{objet}_dist() * * @param string $objet * @param int $id_objet * @param int $quantite * @return array ($poids,$volume) */ function mesure_defaut_dist($objet, $id_objet, $quantite = 1) { $poids = $volume = 0; $table_sql = table_objet_sql($objet); $primary = id_table_objet($objet); $row = sql_fetsel("*", $table_sql, $primary . "=" . intval($id_objet)); if (isset($row['poids'])) { $poids = floatval($row['poids']) * $quantite; } if (isset($row['volume'])) { $volume = floatval($row['volume']) * $quantite; } elseif (isset($row['longueur']) and isset($row['largeur']) and isset($row['hauteur'])) { $volume = floatval($row['longueur']) * floatval($row['largeur']) * floatval($row['hauteur']) * $quantite; } return array($poids, $volume); }
/** * Traitement de l'affichage ajax des puces d'action rapide * * Appelle la fonction de traitement des puces statuts * après avoir retrouvé le statut en cours de l'objet * et son parent (une rubrique) * * @param int $id * Identifiant de l'objet * @param string $type * Type d'objet * @return string Code HTML **/ function exec_puce_statut_args($id, $type) { if ($table_objet_sql = table_objet_sql($type) and $d = lister_tables_objets_sql($table_objet_sql) and isset($d['statut_textes_instituer']) and $d['statut_textes_instituer']) { $prim = id_table_objet($type); $id = intval($id); $r = sql_fetsel("id_rubrique,statut", $table_objet_sql, "{$prim}={$id}"); $statut = $r['statut']; $id_rubrique = $r['id_rubrique']; } else { $id_rubrique = intval($id); $statut = 'prop'; // arbitraire } $puce_statut = charger_fonction('puce_statut', 'inc'); ajax_retour($puce_statut($id, $statut, $id_rubrique, $type, true)); }
function urls_simple_dist($i, &$entite, $args = '', $ancre = '') { if (is_numeric($i)) { include_spip('urls/page'); return _generer_url_simple($entite, $i, $args, $ancre); } // traiter les injections du type domaine.org/spip.php/cestnimportequoi/ou/encore/plus/rubrique23 if ($GLOBALS['profondeur_url'] > 0 and $entite == 'sommaire') { return array(array(), '404'); } // voir s'il faut recuperer le id_* implicite et les &debut_xx; if (is_array($args)) { $contexte = $args; } else { parse_str($args, $contexte); } include_spip('inc/urls'); $r = nettoyer_url_page($i, $contexte); if ($r) { array_pop($r); // nettoyer_url_page renvoie un argument de plus inutile ici return $r; } if ($type = _request(_SPIP_PAGE) and $_id = id_table_objet($type) and $id = _request($_id)) { $contexte[$_id] = $id; return array($contexte, $type, null, $type); } /* * Le bloc qui suit sert a faciliter les transitions depuis * le mode 'urls-propres' vers les modes 'urls-standard' et 'url-html' * Il est inutile de le recopier si vous personnalisez vos URLs * et votre .htaccess */ // Si on est revenu en mode html, mais c'est une ancienne url_propre // on ne redirige pas, on assume le nouveau contexte (si possible) $url = $i; $url_propre = isset($url) ? $url : (isset($_SERVER['REDIRECT_url_propre']) ? $_SERVER['REDIRECT_url_propre'] : (isset($_ENV['url_propre']) ? $_ENV['url_propre'] : '')); if ($url_propre) { if ($GLOBALS['profondeur_url'] <= 0) { $urls_anciennes = charger_fonction('propres', 'urls', true); } else { $urls_anciennes = charger_fonction('arbo', 'urls', true); } return $urls_anciennes ? $urls_anciennes($url_propre, $entite, $contexte) : ''; } /* Fin du bloc compatibilite url-propres */ }
function autoriser_modifierurl($faire, $type = '', $id = 0, $qui = null, $opt = null) { if (autoriser('modifier', $type, $id, $qui, $opt)) { return true; } // si pas le droit de 'modifier', regarder d'un peu plus pres pourquoi if (!$type or !intval($id)) { return false; } // verifier si l'objet existe encore en base $table_sql = table_objet_sql($type); $primary = id_table_objet($type); if (!sql_countsel($table_sql, "{$primary}=" . intval($id))) { return autoriser('administrer', 'url'); } return false; }
/** * Generer a la volee un fond a partir d'une table de contenu * * @param string $type * @param string $table * @param string $table_sql * @param array $desc * @param string $ext * * @return string */ function public_echafauder_dist($type, $table, $table_sql, $desc, $ext) { include_spip('public/interfaces'); $primary = id_table_objet($type); if (!$primary and isset($desc['key']["PRIMARY KEY"])) { $primary = $desc['key']["PRIMARY KEY"]; } /* reperer un titre */ $titre = 'titre'; if (isset($GLOBALS['table_titre'][$table])) { $titre = explode(' ', $GLOBALS['table_titre'][$table]); $titre = explode(',', reset($titre)); $titre = reset($titre); } if (isset($desc['field'][$titre])) { unset($desc['field'][$titre]); $titre = "<h1 class='h1 #EDIT{titre}'>#" . strtoupper($titre) . "</h1>"; } else { $titre = ""; } /* reperer une date */ $date = "date"; if (isset($GLOBALS['table_date'][$table])) { $date = $GLOBALS['table_date'][$table]; } if (isset($desc['field'][$date])) { unset($desc['field'][$date]); $date = strtoupper($date); $date = "<p class='info-publi'>[(#{$date}|nom_jour) ][(#{$date}|affdate)][, <span class='auteurs'><:par_auteur:> (#LESAUTEURS)</span>]</p>"; } else { $date = ""; } $content = array(); foreach ($desc['field'] as $champ => $z) { if (!in_array($champ, array('maj', 'statut', 'idx', $primary))) { $content[] = "[<div><strong>{$champ}</strong><div class='#EDIT{" . $champ . "} {$champ}'>(#" . strtoupper($champ) . "|image_reduire{500,0})</div></div>]"; } } $content = implode("\n\t", $content); $scaffold = "#CACHE{0}\n<BOUCLE_contenu({$table_sql}){" . $primary . "}>\n[(#REM) Fil d'Ariane ]\n<p id='hierarchie'><a href='#URL_SITE_SPIP/'><:accueil_site:></a>[ > <strong class='on'>(#TITRE|couper{80})</strong>]</p>\n\n<div class='contenu-principal'>\n\t<div class='cartouche'>\n\t\t{$titre}\n\t\t{$date}\n\t</div>\n\n\t{$content}\n\n</div>\n\n[<div class='notes surlignable'><h2 class='h2 pas_surlignable'><:info_notes:></h2>(#NOTES)</div>]\n</BOUCLE_contenu>"; $dir = sous_repertoire(_DIR_CACHE, "scaffold", false); $dir = sous_repertoire($dir, "contenu", false); $f = $dir . "{$type}"; ecrire_fichier("{$f}.{$ext}", $scaffold); return $f; }
/** * http://www.spip-contrib.net/Classer-les-articles-par-nombre-de#forum409210 * Permet de faire un comptage par table liee * exemple * <BOUCLE1(AUTEURS){compteur articles}{par compteur_articles}> * #ID_AUTEUR : #COMPTEUR{articles} * </BOUCLE1> * pour avoir les auteurs classes par articles et le nombre d'article de chacun * * @param unknown_type $idb * @param unknown_type $boucles * @param unknown_type $crit */ function critere_compteur($idb, &$boucles, $crit, $left=false){ $boucle = &$boucles[$idb]; $_fusion = calculer_liste($crit->param[1], array(), $boucles, $boucle->id_parent); $params = $crit->param; $table = reset($params); $table = $table[0]->texte; $op = false; if(preg_match(',^(\w+)([<>=])([0-9]+)$,',$table,$r)){ $table=$r[1]; if (count($r)>=3) $op=$r[2]; if (count($r)>=4) $op_val=$r[3]; } $type = objet_type($table); $type_id = id_table_objet($type); $table_sql = table_objet_sql($type); $trouver_table = charger_fonction('trouver_table','base'); $arrivee = array($table, $trouver_table($table, $boucle->sql_serveur)); $depart = array($boucle->id_table,$trouver_table($boucle->id_table, $boucle->sql_serveur)); // noter les jointures deja installees $joins = array_keys($boucle->from); if ($compt = calculer_jointure($boucle,$depart,$arrivee)){ if ($_fusion!="''"){ // en cas de jointure, on ne veut pas du group_by sur la cle primaire ! // cela casse le compteur ! foreach($boucle->group as $k=>$group) if ($group == $boucle->id_table.'.'.$boucle->primary) unset($boucle->group[$k]); $boucle->group[] = '".($gb='.$_fusion.')."'; } $boucle->select[]= "COUNT($compt.$type_id) AS compteur_$table"; if ($op) $boucle->having[]= array("'".$op."'", "'compteur_".$table."'",$op_val); if ($left){ foreach($boucle->from as $k=>$val){ if (!in_array($k, $joins)){ $boucle->from_type[$k] = 'left'; } } } } }