Esempio n. 1
0
function mon_reflet($image) {
   $est = image_reduire($image, 200,150);
   $est = image_recadre($est, 200,75,bottom);
   $est = image_alpha($est, 50);
   $est = image_flip_horizontal($est, "src");
   $ret = image_masque($est, "degrade.png");
     return $ret;
}
/**
 * Massicoter un fichier image
 *
 * La fonction générale qui d'occupe du recadrage des images
 *
 * @param string $fichier : Le fichier
 * @param array $parametres : le tableau des paramètres de massicotage
 *
 * @return string : Un fichier massicoté
 */
function massicoter_fichier($fichier, $parametres)
{
    include_spip('inc/filtres');
    include_spip('inc/filtres_images_mini');
    include_spip('filtres/images_transforme');
    $fichier_original = $fichier;
    /* on vire un éventuel query string */
    $fichier = parse_url($fichier);
    $fichier = $fichier['path'];
    /* la balise #FICHIER sur les boucles documents donne un chemin
       relatif au dossier IMG qu'on ne peut pas retourner tel quel,
       sous peine de de casser le portfolio de la dist.
       (constaté sur SPIP 3.1 RC1) */
    if (!file_exists($fichier)) {
        $fichier = _DIR_IMG . $fichier;
        // Si on n'a toujours rien, c'est probablement un fichier distant
        if (!file_exists($fichier)) {
            return $fichier_original;
        }
    }
    /* ne rien faire s'il n'y a pas de massicotage défini */
    if (!$parametres) {
        return $fichier;
    }
    list($width, $height) = getimagesize($fichier);
    $fichier = extraire_attribut(image_reduire($fichier, $parametres['zoom'] * $width, $parametres['zoom'] * $height), 'src');
    /* on vire un éventuel query string */
    $fichier = parse_url($fichier);
    $fichier = $fichier['path'];
    list($width, $height) = getimagesize($fichier);
    $fichier = extraire_attribut(image_recadre($fichier, $width - $parametres['x1'], $height - $parametres['y1'], 'bottom right'), 'src');
    $fichier = extraire_attribut(image_recadre($fichier, $parametres['x2'] - $parametres['x1'], $parametres['y2'] - $parametres['y1'], 'top left'), 'src');
    return $fichier;
}
Esempio n. 3
0
/**
 * Récupère le contenu d'un média
 * 
 * Arguments possibles :
 * -* login
 * -* pass
 * -* id_article int (Obligatoire)
 * -* champs_demandes string (champs que l'on souhaite récupérer, séparés par une virgule, sinon, on retourne l'ensemble)
 * -* document_largeur int (largeur maximale du document, si c'est une image, défaut largeur du document original)
 * -* document_hauteur int (hauteur maximale du document, si c'est une image, défaut hauteur du document original)
 * -* vignette_format string (carre ou autre, autre n'a pas de fonction)
 * -* vignette_largeur int (largeur de la vignette en px, défaut 100)
 * -* vignette_hauteur int (hauteur de la vignette en px, défaut 100)
 */
function geodiv_lire_media($args)
{
    global $spip_xmlrpc_serveur;
    if (!intval($args['id_article']) > 0) {
        $erreur = _T('xmlrpc:erreur_identifiant', array('objet' => 'article'));
        return new IXR_Error(-32601, attribut_html($erreur));
    }
    $champs_demandes = is_array($args['champs_demandes']) ? $args['champs_demandes'] : array();
    $format_vignette = $args['vignette_format'];
    $config = lire_config('geol', array());
    $secteur_medias = intval($config['secteur_medias']) > 0 ? $config['secteur_medias'] : 1;
    $args_media = array_merge($args, array('objet' => 'article', 'id_objet' => $args['id_article']));
    $res = $spip_xmlrpc_serveur->read($args_media);
    if (!$res) {
        return $spip_xmlrpc_serveur->error;
    }
    $id_secteur = $res['result'][0]['id_secteur'] ? $res['result'][0]['id_secteur'] : sql_getfetsel('id_secteur', 'spip_articles', 'id_article=' . intval($args['id_article']));
    /**
     * Sécurité : L'article demandé n'est pas un média
     */
    if ($id_secteur != $secteur_medias) {
        $erreur = _T('xmlrpc_geodiv:erreur_article_media', array('id_article' => $args['id_article']));
        return new IXR_Error(-32601, attribut_html($erreur));
    }
    /**
     * Si on demande précisément certains champs, on ne fait que les renvoyer
     */
    if (count($champs_demandes) != 0) {
        foreach ($res['result'][0] as $champ => $valeur) {
            if (!in_array($champ, array('id_article')) && !in_array($champ, $champs_demandes)) {
                unset($res['result'][0][$champ]);
            }
        }
    }
    /**
     * On ajoute le booléen "modifiable" :
     * Uniquement si on ne demande pas de champs spécifique ou qu'il soit dedans
     */
    if (count($champs_demandes) == 0 || in_array('modifiable', $champs_demandes)) {
        if (autoriser('modifier', 'id_article', $args['id_article'], $GLOBALS['visiteur_session'])) {
            $res['result'][0]['modifiable'] = 1;
        } else {
            $res['result'][0]['modifiable'] = 0;
        }
    }
    /**
     * On ajoute le logo de l'article :
     * Uniquement si on ne demande pas de champs spécifique ou qu'il soit dedans
     */
    if (count($champs_demandes) == 0 || in_array('logo', $champs_demandes)) {
        $logo = quete_logo('id_article', 'on', $res['result'][0]['id_article'], '', false);
        if (is_array($logo)) {
            $res['result'][0]['logo'] = url_absolue($logo[0]);
        }
    }
    /**
     * On a les infos de l'article, on récupère maintenant :
     * (si pas de champs demandés spécifiés ou les champs en question sont demandés)
     * -* Son document
     * -* Sa vignette
     * -* Sa géoloc
     * -* Ses mots clés
     * -** tags
     * -** échelle
     * -* Ses commentaires
     */
    /**
     * On commence par le document principal
     */
    if (count($champs_demandes) == 0 || in_array('document', $champs_demandes) || in_array('vignette', $champs_demandes)) {
        $document = sql_fetsel('*', 'spip_documents as documents LEFT JOIN spip_documents_liens AS lien ON documents.id_document=lien.id_document', 'lien.objet=' . sql_quote('article') . ' AND lien.id_objet=' . intval($args['id_article']), array(), array(), 1);
        if (is_array($document)) {
            include_spip('inc/documents');
            include_spip('inc/filtres_images_mini');
            include_spip('filtres/images_transforme');
            if (count($champs_demandes) == 0 || in_array('document', $champs_demandes)) {
                $largeur_document = $args['document_largeur'];
                $hauteur_document = $args['document_hauteur'];
                if (in_array($document['extension'], array('gif', 'png', 'jpg')) && ($largeur_document || $hauteur_document)) {
                    $res['result'][0]['document'] = url_absolue(extraire_attribut(image_reduire(get_spip_doc($document['fichier']), $largeur_document, $hauteur_document), 'src'));
                } else {
                    $res['result'][0]['document'] = url_absolue(get_spip_doc($document['fichier']));
                }
                $res['result'][0]['media'] = $document['media'];
                $res['result'][0]['extension'] = $document['extension'];
            }
            if (count($champs_demandes) == 0 || in_array('vignette', $champs_demandes)) {
                $largeur_vignette = $args['vignette_largeur'] ? $args['vignette_largeur'] : 100;
                $hauteur_vignette = $args['vignette_hauteur'] ? $args['vignette_hauteur'] : 100;
                if ($format_vignette == 'carre') {
                    $vignette = extraire_attribut(quete_logo_document($document, $lien, $align, $mode_logo, '', '', $connect = NULL), 'src');
                    $res['result'][0]['vignette'] = url_absolue(extraire_attribut(image_recadre(image_passe_partout($vignette, $largeur_vignette, $hauteur_vignette), $largeur_vignette, $hauteur_vignette), 'src'));
                } else {
                    $vignette = liens_absolus(quete_logo_document($document, $lien, $align, $mode_logo, $largeur_vignette, $hauteur_vignette, $connect = NULL));
                    $res['result'][0]['vignette'] = extraire_attribut($vignette, 'src');
                }
            }
        }
    }
    /**
     * On ajoute les auteurs
     * On met juste leur id_auteur + nom, si besoin de plus une autre requête sur l'auteur est à effectuer 
     */
    if (count($champs_demandes) == 0 || in_array('auteurs', $champs_demandes)) {
        $auteurs = sql_select('auteurs.nom, auteurs.id_auteur', 'spip_auteurs AS auteurs INNER JOIN spip_auteurs_liens AS L1 ON L1.id_auteur = auteurs.id_auteur INNER JOIN spip_articles AS L2 ON L2.id_article = L1.id_objet', "L1.objet='article' AND auteurs.statut != '5poubelle' AND L2.id_article = " . intval($res['result'][0]['id_article']));
        while ($auteur = sql_fetch($auteurs)) {
            $res['result'][0]['auteurs'][] = $auteur;
        }
    }
    /**
     * On ajoute les points de géoloc
     */
    if (defined('_DIR_PLUGIN_GIS') && count($champs_demandes) == 0 || in_array('gis', $champs_demandes)) {
        include_spip('gis_xmlrpc', 'inc');
        $tous_gis = sql_select('gis.id_gis', 'spip_gis AS `gis` INNER JOIN spip_gis_liens AS L1 ON L1.id_gis = gis.id_gis', 'L1.id_objet = ' . intval($args['id_article']) . ' AND (L1.objet = ' . sql_quote('article') . ')');
        while ($gis = sql_fetch($tous_gis)) {
            $args['id_gis'] = $gis['id_gis'];
            $res['result'][0]['gis'][] = spip_lire_gis($args);
        }
    }
    /**
     * On ajoute les tags
     * On met juste leur id_mot + titr, si besoin de plus une autre requête sur le mot est à effectuer 
     */
    if (count($champs_demandes) == 0 || in_array('tags', $champs_demandes)) {
        $tags_group = intval($config['groupe_tags']) > 0 ? intval($config['groupe_tags']) : intval(lire_config('spipicious/groupe_mot'));
        if ($tags_group > 0) {
            $tous_tags = sql_select('mots.id_mot, mots.titre', 'spip_mots AS `mots` INNER JOIN spip_mots_liens AS L1 ON ( L1.id_mot = mots.id_mot )', 'L1.id_objet = ' . intval($args['id_article']) . ' AND (L1.objet = "article") AND (mots.id_groupe = ' . $tags_group . ')');
            while ($tag = sql_fetch($tous_tags)) {
                $res['result'][0]['tags'][] = $tag;
            }
        }
    }
    /**
     * Et on ajoute l'échelle
     * On met juste son id_mot + titre, si besoin de plus une autre requête sur le mot est à effectuer 
     */
    if (count($champs_demandes) == 0 || in_array('echelle', $champs_demandes)) {
        $echelle_group = intval($config['groupe_echelle']) > 0 ? intval($config['groupe_echelle']) : 0;
        if ($echelle_group > 0) {
            $echelle = sql_fetsel('mots.id_mot, mots.titre', 'spip_mots AS `mots` INNER JOIN spip_mots_liens AS L1 ON ( L1.id_mot = mots.id_mot )', 'L1.id_objet = ' . intval($args['id_article']) . ' AND (L1.objet = "article") AND (mots.id_groupe = ' . $echelle_group . ')');
            if (is_array($echelle)) {
                $res['result'][0]['echelle'][] = $echelle;
            }
        }
    }
    /**
     * Et on ajoute les forums
     * On n'affiche que les forums publiés (statut publie)
     * 
     * On met juste :
     * -* id_forum
     * -* id_thread 
     * -* titre
     * -* auteur
     * -* id_auteur
     * Si besoin de plus une autre requête sur le forum est à effectuer 
     */
    if (count($champs_demandes) == 0 || in_array('forums', $champs_demandes)) {
        $forums = sql_select('id_forum, id_thread,titre,auteur,id_auteur', 'spip_forum', 'objet=' . sql_quote('article') . ' AND id_objet = ' . intval($args['id_article']) . ' AND (statut = ' . sql_quote('publie') . ')');
        while ($forum = sql_fetch($forums)) {
            $res['result'][0]['forums'][] = $forum;
        }
    }
    $media_struct = $res['result'][0];
    $media_struct = array_filter($media_struct);
    return $media_struct;
}