/**
 * 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';
                }
            }
        }
    }
}
示例#2
0
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;
}
示例#3
0
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);
}
示例#4
0
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;
}
示例#8
0
/**
 * 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;
}
示例#9
0
/**
 * 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;
}
示例#13
0
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);
}
示例#14
0
文件: url_.php 项目: nursit/SPIP
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);
}
示例#15
0
/**
 * 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;
}
示例#17
0
/**
 * 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);
}
示例#19
0
文件: quete.php 项目: rhertzog/lcs
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));
}
示例#22
0
文件: criteres.php 项目: rhertzog/lcs
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;
}
示例#24
0
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));
}
示例#25
0
/**
 * 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);
}
示例#26
0
/**
 * 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));
}
示例#27
0
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;
}
示例#29
0
/**
 * 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>[ &gt; <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;
}
示例#30
0
/**
 * 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';
				}
			}
		}
	}
}