<?php
namespace TheatreCore\Traits;
use Doctrine\DBAL\Exception as DBALException;
use Doctrine\DBAL\FetchMode;
use Doctrine\ORM\Query;
use Michelf\MarkdownExtra;
use Psr\Log\LoggerInterface;
use Symfony\Component\Cache\Adapter\AdapterInterface;
use TheatreCore\Entity\Classifications;
use TheatreCore\Entity\Extranetusers;
use TheatreCore\Entity\Files;
use TheatreCore\Entity\Multimedias;
use TheatreCore\Entity\News;
use TheatreCore\Entity\Playlists;
use TheatreCore\Entity\Podcasts;
use TheatreCore\Entity\Spectacles;
use TheatreCore\Entity\TextAide;
use TheatreCore\Entity\Texts;
use App\Service\Cleantext;
use App\Service\wiki2xhtml\wiki2xhtml;
define('AUTOQUERY_INSERT', 1);
define('AUTOQUERY_UPDATE', 2);
trait TheatreTrait
{
private $datas;
private $rows;
private $obj;
private $translator;
private $func;
private $count;
private $doctrine;
private $stats_base = 'statistiques';
private $countriesLoaded = [];
private ?LoggerInterface $logger = null;
private array $setFields = [];
public function setCount($count = true)
{
$this->count = $count;
}
public function getCount()
{
return $this->count;
}
function execute($sql)
{
$conn = $this->getEntityManager()->getConnection();
return $conn->exec($sql);
}
function queryOne($sql)
{
return $this->getEntityManager()->getConnection()->fetchOne($sql);
}
function queryCol($sql)
{
$conn = $this->getEntityManager()->getConnection();
$query = $conn->executeQuery($sql);
return $query->fetchFirstColumn();
}
function queryRow($sql)
{
$conn = $this->getEntityManager()->getConnection();
$query = $conn->executeQuery($sql);
return $query->fetch();
}
function loadResult($data)
{
if (!empty($data)) {
foreach ($data as $key => $value) {
$this->$key = $value;
}
}
}
function query($sql)
{
$conn = $this->getEntityManager()->getConnection();
$this->rows = 0;
$this->obj = new $this->__table_object();
$query = $conn->executeQuery($sql);
$this->datas = $datas = $query->fetchAll();
return $datas;
}
public function numRows()
{
return count($this->datas);
}
function fetch()
{
$total = count($this->datas);
$this->currentRow = $line = $this->rows;
if ($total > $line) {
$this->rows++;
if (!empty($this->datas[$line])) {
foreach ($this->datas[$line] as $key => $value) {
$this->$key = $value;
}
return $this->datas[$line];
}
}
return false;
}
public function queryAll($sql, $params1 = null, $params2 = null, $params3 = null)
{
$this->rows = 0;
$conn = $this->getEntityManager()->getConnection();
$query = $conn->executeQuery($sql);
if ($params3) {
return $query->fetchAll(FetchMode::ASSOCIATIVE); //|\PDO::FETCH_COLUMN nécessaire pour TypesstructuresRepository->getTypeStructureList
} else {
return $query->fetchAll();
}
}
public function fetchRow()
{
$total = count($this->datas);
$line = $this->rows;
if ($total > $line) {
$this->rows++;
return $this->datas[$line];
}
return false;
}
function free()
{
}
public function escape($value)
{
if (is_array($value)) {
foreach ($value as $key => $item) {
$value[$key] = addslashes($item);
}
return $value;
}
return addslashes($value);
}
public function get($value, $column = null)
{
if (is_null($column)) {
$query = $this->createQueryBuilder('u')
->select('u')
->where('u.' . $this->__idtable . ' =:value')->setParameter('value', $value);
$this->datas = $x = $query->getQuery()
->getOneOrNullResult(Query::HYDRATE_ARRAY);
} else {
$this->datas = $this->createQueryBuilder('u')
->select('u')
->where('u.' . $column . ' =:value')->setParameter('value', $value)
->getQuery()
->getOneOrNullResult(Query::HYDRATE_ARRAY);
}
return $this->datas;
}
public function autoExecute($__table, $setFields, $type, $where = null, LoggerInterface $logger = null)
{
$conn = $this->getEntityManager()->getConnection();
if ($type === AUTOQUERY_UPDATE) {
$sql = "UPDATE `$__table` SET ";
$params = [];
$first = true;
foreach ($setFields as $k => $v) {
if (!$first) {
$sql .= ', ';
}
if (is_null($v) || (empty($v) && !is_numeric($v))) {
$sql .= $k . " = :$k";
$params[$k] = null;
} else {
$sql .= $k . " = :$k";
$params[$k] = strip_tags($v);
}
$first = false;
}
if (!is_null($where)) {
$sql .= " WHERE $where";
}
$stmt = $conn->prepare($sql);
$stmt->executeStatement($params);
return $conn->lastInsertId();
}
// else if($type == AUTOQUERY_INSERT){
//
// $conn = $this->getEntityManager()->getConnection();
// $conn->insert($__table, $setFields);
//
// return $conn;
// }
}
// test si la variable est en entier valide (attention, n'est pas is_int())
function my_is_int($x)
{
return (is_numeric($x) ? intval($x) == $x : false);
}
function noPunct($array)
{
if (is_array($array)) {
if (!empty($array)) {
end($array);
$k = key($array);
$array[$k]['nopunct'] = true;
return $array;
} else {
return array();
}
} else {
return $array;
}
}
/*
*type de requete (mdb2 ou dbdo)
*/
public $typefind;
public $queryfind;
/*
* verifier les droits ou pas ?
*/
public $checkRights = false;
/*
* liste des valeurs d'object acceptées, voir setValidObjects()
*/
private $object_accept = array();
/*
* publié ou pas
*/
public $publish_status = 2;
/*
* infos pagination
*/
public $paged_data = array();
/*
* requête courante
*/
private $currentQuery;
private $currentRow;
public $db;
// constantes pour marquer les différents types d'id
public $IDNUM = 0; // identifiant numérique (28)
public $IDSTR = 1; // identifiant textuel ('class_truc')
public function quote($value)
{
return '\'' . $value . '\'';
}
// {{{ objToArray()
public function getListSearchRelation()
{
$query = $this->createQueryBuilder('e');
$query->select('e');
return $query;
}
// }}}
// {{{ objToArray()
/** Redéfinition de DataObject::toArray()
*
*
* @access public
* @return array
*/
public function objToArray($query = null)
{
$conn = $this->getEntityManager();
$values = [];
if (!is_null($query)) {
$values = $query->getSingleResult(Query::HYDRATE_ARRAY);
$this->loadResult($values);
}
return $values;
}
// }}}
// {{{ setData()
/** Mettre a jour ou inserer les informations
*
* permet de mettre a jour globalement les informations ou de
* creer un nouvel enregistrement
*
* @see setUpdateFields
* @access private
*/
public function setData($id = null, $last = false, $allRights = true, $where = null, LoggerInterface $logger = null)
{
$this->logger = $logger;
// ajouter des backquote
// $this->setOption('quote_identifier', true);
// desactiver la verification des droits
if ($allRights) {
$rights = array('insert' => 1, 'update' => 1);
}
// checker les droits
if (!$allRights || $this->isCheckRights()) {
$extranetusers = $this->getEntityManager()->getRepository(Extranetusers::class);
$rights = $extranetusers->getRights();
}
// si $id existe on update
if (!empty($id) || $where) {
// on doit avoir le droit d'update'
if (isset($rights) && $rights['update'] == 1) {
// where simple ou complexe
if (!$where) {
$where = $this->__idtable . "='$id'";
}
$this->r = $this->autoExecute($this->__table, $this->setFields, AUTOQUERY_UPDATE, $where, $logger);
} else {
throw new \Exception($GLOBALS['tr']->trans('no_right') . 'setData-update');
}
// sinon on insére
} else {
if (isset($rights) && $rights['insert'] == 1) {
try {
$conn = $this->getEntityManager()->getConnection();
$conn->insert($this->__table, $this->setFields);
} catch (DBALException $e) {
$this->logError($e->getMessage());
$this->logError($e->getTraceAsString());
}
} else {
$this->logError($GLOBALS['tr']->trans('no_right') . 'setData-insert');
}
}
if (is_null($id) || $id === '') {
if ((isset($conn))) {
if ($conn->lastInsertId()) {
return $conn->lastInsertId();
}
return true;
}
return false;
} else {
return $id;
}
}
private function logError(string $message)
{
if ($this->logger) {
$this->logger->error($message);
} else {
error_log($message);
}
}
// }}}
// {{{ getSelectfields()
/** Passe les champs souhaités sous forme de chaine
*
* Récupère sous forme de string les champs qu'on souhaite pour une
* requête. Si selectfields n'est pas précisé on prendra tous les champs
* comme pour un SELECT étoile.
*
* @access public
* @return string
*/
public function getSelectfields()
{
if (empty($this->selectfields)) {
$this->selectfields = $this->fields;
}
$field_string = '';
foreach ($this->selectfields as $field) {
if ($field_string) $field_string .= ', ';
$field_string .= $this->aliastable . '.' . $field;
}
return $field_string;
}
// }}}
// {{{ selectFields()
/** Récupére les champs souhaités
*
* Récupére sous forme de array les champs qu'ont souhaite pour une
* requête. Si selectfields n'est pas précisé, on prendra tous les champs
* comme pour un SELECT étoile.
*
* @param array $fieldsext Les champs précisés dans un tableau
* @access public
* @return array
* @see setUpdatefields()
* @see getSelectfields()
*/
public function selectFields($fieldsext = null)
{
if (!empty($fieldsext)) {
$this->selectfields = $fieldsext;
}
}
// }}}
// {{{ setUpdatefields()
/** Précise les champs à updater ou insérer
*
* Précise dans un tableau les champs à updater ou à insérer. Le nom du champ
* et sa valeur nécessaire à la classe DB
*
* @param array $fieldsext Les champs précisés dans un tableau
* @access public
* @return array
*/
public function setUpdatefields($fieldsext, $quote_identifier = false)
{
// ajouter les identifiers
if ($quote_identifier) {
foreach ($fieldsext as $k => $v) {
$fieldsext['`' . $k . '`'] = $v;
}
}
$this->setFields = $fieldsext;
}
// }}}
// {{{ setExec()
/** Executer ou non la requete
*
* On peux avoir simplement besoin de retourner la requete
* Pour une clause LIMIT ou un count
*
* Par defaut, on execute
*
* @param bool $exec execution
* @see specialQuery()
* @access public
*/
public function setExec($exec = true)
{
$this->exec = $exec;
}
// }}}
// {{{ specialQuery()
/** Requete MDB2 ou find de DBDO
*
* Permet de savoir si on est dans le cas d'une requete
* qui passe par MDB2 ou d'une requete qui passe par DB_Dataobject
* Pour le pager, les clauses limit, les count... c'est important de le savoir
*
* Si query est vide, ca signifie que tout est passe par DBDO
*
* @param string $query la requete
* @see find()
* @see findData()
* @see setOrderBy()
* @access public
* @see setExec()
*/
public function specialQuery($query = null, $save_query = false)
{
if (!empty($query)) {
// definir au besoin un order de tri
if (isset($this->setOrder)) {
// $query .= ' ORDER BY '.$this->setOrder;
$query->orderBy($this->setOrder, $this->setDirection);
}
$this->queryfind = $query;
if ($save_query) {
// $this->setCurrentQuery($query);
}
$this->typefind = 'mdb2';
//if($this->exec) {
// $query = $this->executeQuery($sql);
// $subQuery = $query->getQuery();
// $this->datas = $subQuery->getResult();
// $this->query($query);
//error_log('DEBUG - EXECUTE DANS THEATRE MDB2 : '.$query);
//}
} else {
//if(isset($this->exec)) {
// definir au besoin un order de tri
if (isset($this->setOrder)) {
$this->orderBy($this->setOrder);
}
// $x = $this->findAll();
//error_log('DEBUG - EXECUTE DANS THEATRE DBDO');
//}
$this->typefind = 'dbdo';
}
return $this->datas;
}
// }}}
// {{{ setOrderBy()
/** Definir un ordre de tri en dehors du pager
*
* @param string $order le tri
* @see specialQuery()
* @access public
*/
public function setOrderBy($order = null, $direction = null)
{
if (!empty($order)) {
$this->setOrder = $order;
}
if (!empty($direction)) {
$this->setDirection = $direction;
}
}
// }}}
// {{{ setCurrentQuery()
/** Enregistrer la requête proposée via specialQuery
*
* @param string $query la requête
* @see specialQuery()
* @access public
*/
public function setCurrentQuery($query)
{
$this->currentQuery = $query;
}
// }}}
// {{{ getCurrentQuery()
/** récupèrer la requête courante
*
* @see specialQuery()
* @access public
*/
public function getCurrentQuery()
{
return $this->currentQuery;
}
// }}}
// {{{ dbLimit()
/** Limitation du nombre de resultat
*
*
* @access public
*/
public function dbLimit($limit, $offset = 0)
{
if (empty($offset)) {
$offset = 0;
}
return ' LIMIT ' . $offset . ',' . $limit;
}
// }}}
// {{{ getPagination()
/** Récupère les élèments de navigation
*
*
* @access public
*/
public function getPagination($replace_pattern = null)
{
if ($replace_pattern) {
//$pat = 'href="\/index\.php\?pageID\=([0-9]+)"';
$pat = 'href="([a-z,0-9,\.,\/]+)\?pageID\=([0-9]+)"';
//$this->paged_data['links'] = preg_replace('/'.$pat.'/','href="'.$replace_pattern.'?pageID=$2"',$this->paged_data['links']);
$this->paged_data['links'] = str_replace('evenements/view/index.php', '', $this->paged_data['links']);
}
return $this->paged_data;
}
// }}}
// {{{ setCheckRights()
/** preciser si il faut verifier les droits ou pas
*
* Précise si il faudra checker les droits dans les methodes
*
* @param bool $right
* @access public
* @return bool
*/
public function setCheckRights($right = false)
{
return $this->checkRights = $right;
}
// }}}
// {{{ isCheckRights()
/** verifier si on doit utiliser les droits ou pas
*
* @access public
* @return bool
*/
public function isCheckRights()
{
return $this->checkRights;
}
// }}}
// {{{ setToArray()
/** Liste des enregistrements dans un tableau associatif
*
* Tableau associatif notament utilisé pour lister les informations sur les enregistrements
* Utile pour générer les tableaux HTML de listes des enregistrements
*
* @access public
* @return array
* @see findData()
*/
public function setToArray($spec = true)
{
// desactive si pager
if ($spec == true) {
$this->findData();
}
// declaration
$values = array();
$color = null;
$nb = 0;
while ($this->fetch()) {
// infos sur l'enregistrement
$values[$nb] = $this->getInfosObject();
// couleur de ligne alternative
$color = $this->colorAlternate($color);
$values[$nb]['colorline'] = $color;
$nb++;
}
return $values;
}
// }}}
// {{{ deleteData()
/** Suppression
*
* Permet de supprimer l'enregistrement
*
* @access public
* @param int $id Id de l'enregistrement principal
* @param string $table Nom de la table de relation
* @param bool $allRights Checker les droits
* @param bool $delete_relationa Faut-il supprimer également les relations (non FK) ?
* @param bool $log_deletion Loguer les suppressions
* @return bool
*/
public function deleteData($id, $table = null, $key = null, $allRights = true, $delete_relation = null, $log_deletion = null)
{
// ne pas checker les droits
if ($allRights) {
$rights = array('delete' => 1);
}
if ($this->setCheckRights() || !$allRights) {
$extranetusers = Theatre_Extranetusers::factory('extranetusers');
$rights = $extranetusers->getRights();
}
if (isset($rights) && $rights['delete'] == 1) {
if (!empty($table) && !empty($key)) {
$req = 'DELETE FROM ' . $table . ' WHERE ' . $key . '=\'' . $id . '\'';
} else {
$req = 'DELETE FROM ' . $this->__table . ' WHERE ' . $this->__idtable . '=\'' . $id . '\'';
}
$del = $this->execute($req);
// logguer les delete
$this->logDeletion($req);
if ($del) {
// supprimer également les relations qui ne sont pas supprimées automatiquement via des foreigh keys
if (!empty($delete_relation)) {
// ont récup le tableau des relations
$infos_links = $this->getRelationsArray('all');
foreach ($infos_links as $k => $v) {
// si marqué comme silent_delete_relation à true et use_constraint à false
// on va construire la requête de suppression avec getLinkedObject
if (!empty($v['silent_delete_relation']) && !empty($v['do_constraint'])) {
// trouver les items liés
$items = $this->getLinkedObject($v, $id, $k, $this->__table);
if (!empty($items)) {
// si il s'agit d'une table 'by_object' ont doit supprimer dans join table mais pas des la table des destination
if (!empty($v['join_table']) &&
(strpos($v['join_table'], 'object_') !== false
|| strrpos($v['join_table'], '_by_object') !== false)) {
// contient _by_object
if (strrpos($v['join_table'], '_by_object') !== false) {
$v['join_table'] = str_replace('_by_object', '', $v['join_table']);
$dest_table = $v['join_table'];
}
//echo 'supprimer '.$id.' '.$this->__table.' de la table '.$dest_table.' <br />';
// sinon, effacement classique dans la table de destination
} else {
// table ou l'on doit supprimer
$dest_table = $v['dest_table'];
$delete_items = array();
foreach ($items as $kb => $vb) {
$delete_items[] = $kb;
}
//echo 'supprimer '.join(',', $delete_items).' de la table '.$dest_table.' <br />';
}
}
}
}
}
return true;
}
} else {
throw new Exception($GLOBALS['tr']->get('no_rights') . ' deleteData');
}
}
// }}}
// {{{ getLinkedObject()
/** Liste des items liés
*
* Retourne un tableau associatif contenant la liste des items liés
*
* @access public
* @param array $infos_link Tableau de description de la relation
* @param int $idobject Id de l'objet source
* @params string $type nom de la relation
* @params string $src nom de la table source pour laquelle on cherche une relation
* @params array $params paramètres en plus
* @return array
* @see getRelationsArray()
*/
public function getLinkedObject($infos_link, $idobject, $type, $src, $params = array())
{
// type => soit un champ (field), soit une table (object)
// si on veux utiliser une methode type_join=method
$dbjoin = $_ENV['TH_BDD'];
$dbsource = $_ENV['TH_BDD'];
$itemslist = array();
// via une méthode
if (!empty($infos_link['type_join']) && $infos_link['type_join'] == 'method') {
if (!empty($infos_link['method_params'])) {
return $this->{$infos_link['method']}($idobject, $type, $infos_link['method_params']);
} else {
return $this->{$infos_link['method']}($idobject, $type);
}
}
if (!empty($infos_link['type_join']) && ($infos_link['type_join'] == 'multiple' || $infos_link['type_join'] == 'simple')) {
// objet source (exemple : on veux les adaptation liées a un texte, l'objet source est 'texts')
$src = $dbdo = str_replace('_', '', ucwords($src, '_'));
$src_obj = $this->getEntityManager()->getRepository('TheatreCore\Entity\\' . ucfirst($src));
// table source si précisée
if (!empty($infos_link['src_table'])) {
$src_table = $infos_link['src_table'];
} else {
$src_table = $src_obj->__table;
}
// si on precise un champ index différent pour la source
if (!empty($infos_link['src_table_field'])) {
$src_table_field = $infos_link['src_table_field'];
} else {
$src_table_field = $src_obj->__idtable;
}
// => objet lié (pour l'exemple : texts de l'adaptation)
// table de destination si précisée
if (!empty($infos_link['dest_table'])) {
$dest_obj = $this->getEntityManager()->getRepository('TheatreCore\Entity\\' . implode('', array_map(function ($m) {
return ucfirst($m);
}, explode('_', $infos_link['dest_table']))));
$dest_table = $dest_obj->__table;
}
// si on precise un champ index différent pour la destination
if (!empty($infos_link['dest_table_field'])) {
$dest_table_field = $infos_link['dest_table_field'];
// si le champ de destination est idobject alors il faut object
if ($dest_table_field == 'idobject') {
$join_object_table_constraint = 'j1.object=\'' . $src_table . '\' ';
}
} else {
$dest_table_field = $dest_obj->__idtable;
}
// table de jointure
if (!empty($infos_link['join_table'])) {
$join_table = $infos_link['join_table'];
}
// si on precise un champ de jointure différent
if (!empty($infos_link['join_field_src'])) {
$join_field_src = $infos_link['join_field_src'];
} else {
// sinon le même que celui de la table source
$join_field_src = $src_table_field;
}
// si on precise un champ de jointure différent
if (!empty($infos_link['join_field_dest'])) {
$join_field_dest = $infos_link['join_field_dest'];
} else {
// sinon le même que celui de la table source
$join_field_dest = $dest_table_field;
}
// contrainte sur la table de jointure (par exemple object_xxx)
/*if(!empty($infos_link['join_table_constraint'])) {
$join_table_constraint = $infos_link['join_table_constraint'];
}*/
// si la table de jointure commence par object_ ou contient by_object, alors la contrainte du
// du champ object correspond au nom de la table source et idobject à l'identifiant
if (!empty($infos_link['join_table']) &&
(strpos($infos_link['join_table'], 'object_') !== false || strrpos($infos_link['join_table'], '_by_object') !== false)) {
// contient _by_object
if (strrpos($infos_link['join_table'], '_by_object') !== false) {
$infos_link['join_table'] = str_replace('_by_object', '', $infos_link['join_table']);
$join_table = $infos_link['join_table'];
}
// si object a un nom différent de la table source
if (!empty($infos_link['join_table_object'])) {
$join_table_object = $infos_link['join_table_object'];
} else {
$join_table_object = $src_table;
}
// contrainte
$join_object_table_constraint = 'j2.object=\'' . $join_table_object . '\' AND j2.idobject=' . (int)$idobject;
$join_field_src = 'idobject';
}
// select invers (exemple : trouver les personnes lié à un multimedia depuis le multimédia, en passant par object_multimedia)
if (!empty($infos_link['join_from_object'])) {
$join_field_src = $src_table_field; // idmultimedia
$join_field_dest = 'idobject'; // sur object_multimedia => idobject
$join_object_table_constraint = ' j2.object=\'' . $infos_link['dest_table'] . '\' ';
}
// ajouter l'alias sur les champs de 'destination'
foreach ($infos_link['fields'] as $f) {
$fields_alias[] = 'j1.' . $f;
}
// ajouter l'alias sur les champs de la table de jointure
if (!empty($infos_link['fields_join_table'])) {
foreach ($infos_link['fields_join_table'] as $f) {
$fields_alias[] = 'j2.' . $f;
}
}
// compter uniquement
if (!empty($params['count_only'])) {
$select = 'COUNT(*)';
} else {
$select = implode(',', $fields_alias);
}
// début de la requête
$sql = 'SELECT ' . $select . ' ';
// ajouter la clé de la table source dans le select si diff de la table dest
if (property_exists($src_obj, '__idtable') && !in_array($src_obj->__idtable, $infos_link['fields'])) {
if (!empty($infos_link['fields_dest_table'])) {
foreach ($infos_link['fields_dest_table'] as $f) {
$fields_alias[] = 'j3.' . $f;
}
} else {
$sql .= ',j3.' . $src_obj->__idtable . ' ';
}
}
// dans la cas d'une jointure avec 3 tables
if ($infos_link['type_join'] == 'multiple') {
$sql .= 'FROM ' . $dbsource . '.' . $dest_table . ' j1, ' . $dbjoin . '.' . $join_table . ' j2, ' . $dbsource . '.' . $src_table . ' j3
WHERE j3.' . $src_table_field . '=j2.' . $join_field_src . '
AND j1.' . $dest_table_field . '=j2.' . $join_field_dest . '
AND j3.' . $src_table_field . '=' . (int)$idobject;
// requete avec jointure sur 3 tables
if (!empty($join_object_table_constraint)) {
$sql .= ' AND ' . $join_object_table_constraint;
}
}
// une jointure avec une table
if ($infos_link['type_join'] == 'simple') {
// requete avec jointure sur 1 table
$sql .= 'FROM ' . $dbsource . '.' . $dest_table . ' j1, ' . $dbjoin . '.' . $src_table . ' j3
WHERE j1.' . $dest_table_field . '=j3.' . $join_field_src . '
AND j3.' . $src_table_field . '=' . (int)$idobject;
// requete avec jointure sur 3 tables
if (!empty($join_object_table_constraint)) {
$sql .= ' AND ' . $join_object_table_constraint;
}
}
// ajouter une contrainte sur la table de destination
if (!empty($infos_link['constraint_dest'])) {
$sql .= ' AND j1.' . $infos_link['constraint_dest'];
}
// contrainte ou autre en plus
if (!empty($infos_link['where'])) {
$sql .= ' ' . $infos_link['where'];
}
// contrainte ou autre en plus
if (!empty($infos_link['sql_more'])) {
$sql .= ' ' . $infos_link['sql_more'];
}
// ajouter une contrainte sur la table du miliue par exemple idrole précis
if (!empty($params['count_only'])) {
$nb_items = $this->queryOne($sql);
return $nb_items;
}
$itemslist = $this->getEntityManager()->getConnection()->fetchAllAssociativeIndexed($sql);
// paramètres pour getObjecTtitle
if (!empty($infos_link['title_params'])) {
$params = $infos_link['title_params'];
} else {
$params = array();
}
if (!empty($itemslist)) {
$color = null;
// index principal
$idfield = $infos_link['fields'][0];
foreach ($itemslist as $key => $value) {
// remettre le idtruc dans le tableau
$value[$idfield] = $key;
$itemslist[$key][$idfield] = $key;
// noms pour des listes standard
$itemslist[$key]['id'] = $key;
if (method_exists($dest_obj, 'getObjectTitle')) {
$itemslist[$key]['view_name'] = $dest_obj->getObjectTitle($key, $value, $params);
}
// couleur alternative
$color = $this->colorAlternate($color);
$itemslist[$key]['colorline'] = $color;
}
}
}
return $itemslist;
}
// }}}
// {{{ setRelationSelect()
/** Enregistrement dans les table relationnelle
*
* Permet l'enregistrement multiple de valeur dans les tables
* de relation
*
* @access public
* @param string $table Nom de la table de relation
* @param string $key Clé dans le tableau
* @param string $col Colonne
* @param array $array_values Valeur à enregistrer
* @param int $id Id de l'enregistrement principal
* @return bool
*/
public function setRelationSelect($table, $key, $col, $array_values, $id, $allRights = true, $sup_key = array(), $save_order = array())
{
$dbco = $this->getEntityManager()->getConnection();
if ($allRights) {
$rights = array('update' => 1);
}
if ($this->isCheckRights() || !$allRights) {
$extranetusers = $this->getEntityManager()->getRepository(Extranetusers::class);
$rights = $extranetusers->getRights();
}
if (isset($rights) && $rights['update'] == 1) {
// on supprime puis on insère (replace ne marche pas)
$sql_del = 'DELETE FROM ' . $table . ' WHERE ' . $col . '=\'' . $id . '\'';
// aussi le role
if (!empty($sup_key)) {
foreach ($sup_key as $k => $v) {
$sql_del .= ' AND ' . htmlspecialchars($k) . '=' . $this->escape($v);
}
}
$del = $dbco->exec($sql_del);
// si array_values est vide, c'est qu'on veux supprimer ?
if (empty($array_values)) {
return true;
}
if (!is_array($array_values)) {
$array_values_stack = $array_values;
$array_values = array();
$array_values[] = $array_values_stack;
}
// on prepare l'insertion
$sql = 'INSERT INTO ' . $table . ' (' . $key . ', ' . $col;
// le role NON UTILISE ???
if (!empty($sup_key)) {
foreach ($sup_key as $k => $v) {
$sql_keys[] = $k;
$sql_values[] = strip_tags($v);
}
}
// le classement
if (!empty($save_order)) {
$sql_keys[] = $save_order['order_field'];
$sql_values[] = '?';
}
// ajout des clés en plus
if (!empty($sql_keys)) {
$sql .= ', ' . join(',', $sql_keys);
}
$sql .= ') VALUES ( ?, ?';
// ajout des valeurs en plus
if (!empty($sql_values)) {
$sql .= ', ' . join(',', $sql_values);
}
$sql .= ')';
$i = 1;
foreach ($array_values as $key => $value) {
if ($save_order) {
$prep_values = array($value, $id, $i);
$res = $dbco->executeQuery($sql, $prep_values);
} else {
$prep_values = array($value, $id);
$res = $dbco->executeQuery($sql, $prep_values);
}
$i++;
}
if (!empty($res)) {
return $res;
} else {
return false;
}
}
}
// }}}
// {{{ deleteDataRelation()
/** Suppression
*
* Permet de supprimer l'enregistrement dans une relation
*
* @access public
* @param int $id Id de l'enregistrement principal
* @param string $table Nom de la table de relation
* @param string $key Clé dans la tableau
* @return bool
*/
public function deleteDataRelation($table, $key, $id, $key_relation = null, $id_relation = null, $object = null, $objectvalue = null, $allRights = true)
{
if ($allRights) {
$rights = array('delete' => 1);
}
if ($this->isCheckRights() || !$allRights) {
$extranetusers = Theatre_Extranetusers::factory('extranetusers');
$rights = $extranetusers->getRights();
}
if (isset($rights) && $rights['delete'] == 1) {
$req = 'DELETE FROM ' . $table . '
WHERE ' . $key . '=\'' . $this->escape($id) . '\'';
if (!empty($object)) {
$req .= ' AND ' . $object . '=\'' . $this->escape($objectvalue) . '\'';
if (!empty($key_relation)) {
$req .= ' AND ' . $key_relation . '=\'' . $this->escape($id_relation) . '\'';
}
}
$conn = $this->getEntityManager()->getConnection();
//echo 'query : $req<br/>';
//executer la requete
$del = $conn->prepare($req);
$del->execute();
// logguer les delete
$this->logDeletion($req);
return true;
} else {
throw new \Exception($GLOBALS['tr']->get('no_right') . 'deleteDataRelation');
}
}
// }}}
// {{{ getInforelation()
/** Permet de récupérer les relations qui sont liées lors d'une suppression
*
* FIXME: à revoir totalement
*
* @access public
* @param string $table Relation a vérifier
* @param string $id Clé dans la tableau
* @return array $datadelete Tableau des données
*/
public function getInfoRelation($relation, $id, $retour = null)
{
//traductions
$tr = $this->translator;
//nombre d'enregistrements trouvés
$nbdata = 0;
$compteur = 0;
//parcourir chaque requete
foreach ($relation as $key => $value) {
//compteur
$compteur++;
$lien = $value[3];
//selection simple
$req = 'SELECT DISTINCT(' . $value[2] . ') AS clevue,' . $value[0] . ' FROM ' . $key . ' WHERE ' . $value[1] . '=\'' . $id . '\'';
if (!empty($value[6])) {
$req .= ' ' . $value[6];
}
$tab = $this->queryAll($req);
if ($retour) {
return $tab;
}
if ($tab) {
//créer un tableau vide
$tabdata = array();
//mise en forme de la réponse
foreach ($tab as $cle => $valeur) {
//enregistrement trouvés
foreach ($valeur as $clevaleur => $valeurvaleur) {
//conserver la clé
if ('clevue' == $clevaleur) {
//stocker les valeurs dans le tableau
$cle = $valeurvaleur;
}
//conserver l'attribut à afficher
if ($value[0] == $clevaleur) {
//vérifier si on a une fonction liée pour l'affichage
if (!empty($value[5])) {
$fonctionliee = $value[5];
}
//on veut utiliser une autre fonction pour récupérer le champ de l'objet à afficher
if (!empty($fonctionliee)) {
//instancier un objet correspondant
$object = $this->getEntityManager()->getRepository('TheatreCore\Entity\\' . ucfirst($value[4]));
//déclencher la fonction souhaitée
$affichage = $object->$fonctionliee($cle);
//mettre notre nouvelle valeur
$valeurvaleur = $affichage;
//clé pour déclencher la bonne action dans le lien
$key = $value[4];
}
//stocker les valeurs dans le tableau sous forme de lien ou pas
if ($lien) {
$tabdata[] = array('link' => $key . '/edit/id/' . $cle, 'field' => $valeurvaleur);
} else {
$tabdata[] = array('link' => '', 'field' => $valeurvaleur);
}
$nbdata++;
break;
}
}
}
//stocker le nouveau tableau (avec un nom unique donc utilisation du compteur)
$datadelete[$key . '_' . $compteur] = $tabdata;
$compteur++;
}
}
//si on a des enregistrements, retourner le tableau, sinon retourner le tableau vidé
if ($nbdata > 0) {
$compteur = 0;
//mettre en forme les donnees
foreach ($datadelete as $key => $value) {
//enlever le _ et le chiffre ex : texts_3 devient texts et on recupere la traduction
$type = substr($key, 0, strrpos($key, '_'));
//echo 'key $key<br/>';
//mettre en forme les données si elles sont présentes
if (!empty($value)) {
$tabtraduction[$tr->trans('text_title_' . $type) . $compteur] = array($key => $value);
}
$compteur++;
}
return $tabtraduction;
} else {
return array();
}
}
// }}}
// {{{ getRelationsArray()
/** Tableau des relations
*
* Relations communes, sinon, redéfini dans la classe fille
*
* @access public
* @param string $type all/autre info sur une relation précise
* @return array $array_types Tableau des relations / de la relation
*/
public function getRelationsArray($type)
{
$array_types = array(
// bookmark_extranetuser idobject/object
'bookmark_extranetuser' => array(// enregistrement bookmarké
'type_join' => 'multiple',
'dest_table' => 'extranetusers',
'join_table' => 'bookmark_extranetuser_by_object',
'fields' => array('idextranetuser', 'lastname', 'login', 'email'),
'description' => 'Utilisateur(s) ayant bookmarké cet enregistrement',
'silent_delete_relation' => true,
'do_constraint' => 'bookmark_extranetuser',
),
// comments idobject/object
'comments' => array(// commentaires sur l'enregistrement
'type_join' => 'simple',
'dest_table' => 'comments',
'dest_table_field' => 'idobject', // link également avec object
'fields' => array('idcomment', 'lastnamefirstname', 'comment', 'module'),
'description' => 'Commentaire(s) lié(s) à cet enregistrement',
'silent_delete_relation' => true,
'do_constraint' => true,
),
// faqgroups idobject/object
'faqgroups' => array(// faq sur cet enregistrement
'type_join' => 'simple',
'dest_table' => 'faqgroups',
'dest_table_field' => 'idobject', // link également avec object
'fields' => array('idfaqgroup', 'module', 'title'),
'description' => 'Faq(s) liée(s) à cet enregistrement',
'do_constraint' => true,
),
// object_content idobject/object
'object_content' => array(// contenus associé à cet enregistrement
'type_join' => 'multiple',
'dest_table' => 'contents',
'join_table' => 'object_content',
'fields' => array('idcontent', 'title', 'text'),
'description' => 'Contenu(s) associé(s) à l\'enregistrement (méthode 2)',
'do_constraint' => true,
),
// object_file idobject/object
'object_file' => array(// fichiers associés à cet enregistrement
'type_join' => 'multiple',
'dest_table' => 'files',
'join_table' => 'object_file',
'fields' => array('idfile', 'title', 'file'),
'description' => 'Fichier(s) associé(s) à l\'enregistrement',
'do_constraint' => true,
),
// object_multimedia idobject/object
'object_multimedia' => array(// multimedias associés à cet enregistrement
'type_join' => 'multiple',
'dest_table' => 'multimedias',
'join_table' => 'object_multimedia',
'fields' => array('idmultimedia', 'sujet_titre', 'description'),
'description' => 'Document(s) multimedia(s) associé(s) à cet enregistrement',
'do_constraint' => true,
),
// quizgroups idobject/object
'quizgroups' => array(// commentaires sur des contacts
'type_join' => 'simple',
'dest_table' => 'quizgroups',
'dest_table_field' => 'idobject', // link également avec object
'fields' => array('idquizgroup', 'module', 'description'),
'description' => 'Quiz(s) lié(s) à ce contact',
'do_constraint' => true,
),
// user_action idobject/object (obligatoire)
'user_action' => array(// action sur cette fiche
'type_join' => 'multiple',
'dest_table' => 'extranetusers',
'join_table' => 'user_action_by_object',
'fields' => array('idextranetuser', 'login', 'email'),
'description' => 'Utilisateur(s) ayant travaillé(s) ce contact',
'silent_delete_relation' => true,
'hide_relation' => true,
'do_constraint' => 'user_action',
),
// stats idobject/object (obligatoire)
/*'stats' => array(// statistiques sur cette fiche
'type_join' => 'multiple',
'dest_table' => 'stats',
'join_table' => 'stats_by_object',
'fields' => array('idstat','object','idobject'),
'description' => 'Statistique(s) sur cet objet',
'silent_delete_relation' => true,
'hide_relation' => true,
'do_constraint' => 'stats',
),
// stats idobject/object (obligatoire)
'statscumul' => array(// statistiques sur cette fiche
'type_join' => 'multiple',
'dest_table' => 'statscumul',
'join_table' => 'statscumul_by_object',
'fields' => array('idstat','object','idobject'),
'description' => 'Statistique(s) sur cet objet (cumul)',
'silent_delete_relation' => true,
'hide_relation' => true,
'do_constraint' => 'statscumul',
),*/
);
if ($type == 'all') {
return $array_types;
} else {
return null;
}
}
// }}}
/** checker toutes les relations d'un objet
*
* @param int $idobject Id de l'objet
* @param string $object Type d'objet
* @param stringa $filtre Filtrer les éléments à ne pas afficher
* @return array
* @access public
*/
public function checkAllRelations($idobject, $object, $filtre = null)
{
$linked_items = array();
// on boucle sur le tableau des relations
$infos_links = $this->getRelationsArray('all');
foreach ($infos_links as $k => $v) {
if (empty($v['hide_relation'])) {
// les items liés
$items = $this->getLinkedObject($v, $idobject, $k, $object);
if (!empty($items) and !empty($v['dest_table'])) {
$infos_linked = array(
'description' => $v['description'],
'object' => $v['dest_table'],
);
// pour le calendrier, on affiche seulement un message
if (!empty($v['only_message'])) {
$infos_linked['message'] = count($items);
} else {
$infos_linked['values'] = $items;
}
// ne pas afficher les liens d'é"ditions"'
if (!empty($v['no_edit_links'])) {
$infos_linked['no_edit_links'] = true;
}
// afficher les liens de destinationation
if (!empty($v['dest_table_field'])) {
$infos_linked['dest_table_field'] = $v['dest_table_field'];
}
// filtrer par silent_delete_relation
if (!empty($filtre)) {
// sépare ceux qui sont effacé sans préavis et les autres
if (!empty($v['silent_delete_relation'])) {
$linked_items['silent'][$k] = $infos_linked;
} else {
$linked_items['check'][$k] = $infos_linked;
}
} else {
$linked_items[$k] = $infos_linked;
}
}
}
}
return $linked_items;
}
// }}}
// {{{ isOnline()
/** En ligne ou hors ligne
*
* Permet de vérifier si un enregistrement est en ligne ou pas
*
* @param int $id Valeur du champ index pour l'enregistrement
* @return boolean
* @access public
*/
public function isOnline($id)
{
return $this->publish != 0;
}
// }}}
// {{{ setStatus()
/** Change le statut en ligne ou hors ligne
*
* La pluspart du temps, mets à yes ou no le champ 'publish'
*
* @param int $id Valeur du champ index pour l'enregistrement
* @return boolean
* @access public
*/
public function setStatus($id = null, $status = 1, $field = null, $allRights = true)
{
// on a les droits de changer le status ?
if ($allRights) {
$rights = array('isadmin' => 1);
}
if ($this->setCheckRights() || !$allRights) {
$extranetusers = Theatre_Extranetusers::factory('extranetusers');
$rights = $extranetusers->getRights();
}
if (isset($rights) && $rights['isadmin'] == 1) {
if (empty($id)) {
$id = $this->id;
}
if (empty($field)) {
$field = 'publish';
}
// champ à mettre à jour
$this->selectAdd();
$this->selectAdd($field);
$this->get($id);
$this->$field = $status;
return $this->update();
} else {
throw new \Exception($GLOBALS['tr']->get('no_rights') . ' setStatus');
}
}
// }}}
// {{{ setPublishStatus()
/** Définir si on veut les contenus publiés ou pas
*
* Par défaut => tous
*
* @access public
* @param int $publish 1 = publie, 0 = non publie, 2 = tous
*/
public function setPublishStatus($publish_status = 2)
{
$this->publish_status = $publish_status;
}
// }}}
// {{{ getCountry()
/** Récupére le nom d'un pays
*
*
* @access public
* @param string $code Le code du pays
* @return string
*/
public function getNameCountry($code = null)
{
if ($code) {
if (!empty($this->countriesLoaded[$code])) {
return $this->countriesLoaded[$code];
}
$country = $this->queryOne('SELECT fr FROM countries WHERE id=\'' . $code . '\'');
$this->countriesLoaded[$code] = $country;
return $country;
}
}
// }}}
// {{{ getCachedList()
/** Méthode générique pour les listes, avec mise en cache
*
*
* @param string $name nom de la liste
* @param string $req la requête pour obtenir la liste
* @param boolean $order utilisé form_def
* @param string $form_def clé langterms pour la valeur par défaut (tête de liste)
* @access protected
* @return array la liste
*/
protected function getCachedList($name, $req, $order = true, $form_def = null, $clear = true)
{
// cache
// require_once PATH_LIBS.'Cache/Theatre_cache.php';
// $optCache = array(
// 'cacheDir' => PATH_TMP.'other/',
// 'lifeTime' => 3600*24,
// 'fileNameProtection' => false,
// );
// $c = new Theatre_cache($optCache);
$id = $name . '_fr' . ((int)$order);
// vider le cache si on le demande ou si cache désacvtiver avec USE_CACHE
// if($this->canUpdateCache($name) || !USE_CACHE) {
// $c->remove($id);
// }
// il y a le cache
// if ($data = $c->get($id)) {
// return unserialize($data);
// }
// pas en cache, on execute la requête
$list = $this->queryAll($req, array(), null, true);
//Placeolder obselète.
// if($order && $form_def) {
// array_unshift($list, $this->translator->trans($form_def));
// }
if ($clear) {
foreach ($list as $key => $value) {
if (is_array($value)) {
$list[$key] = reset($value);
} else {
$list[$key] = $value;
}
}
}
$list = array_flip($list);
// sauvegarde la liste dans le cache
// $c->save(serialize($list));
return $list;
}
// }}}
// {{{ getCachedListForCountries()
/** Méthode générique pour les listes, avec mise en cache
* Modifiée car ne fonctionnait comme souhaité pas pour la liste des pays
*
*
* @param string $name nom de la liste
* @param string $req la requête pour obtenir la liste
* @param boolean $order utilisé form_def
* @param string $form_def clé langterms pour la valeur par défaut (tête de liste)
* @access protected
* @return array la liste
*/
protected function getCachedListForCountries($name, $req, $order = true, $form_def = null, $clear = true)
{
$id = $name . '_fr' . ((int)$order);
// pas en cache, on execute la requête
$list = $this->queryAll($req, array(), null, true);
$listToReturn = [];
if ($clear) {
foreach ($list as $key => $value) {
if (is_array($value)) {
$listToReturn[reset($value)] = $value['id'];
}
}
}
return $listToReturn;
}
// }}}
// {{{ getCountryList()
/** Récupére la liste des pays
*
* Récupére tous les pays pour les listes
* déroulantes par exemple (mis en cache)
*
* @access public
* @return array
* @see getCountry()
*/
public function getCountryList($order = true)
{
$name = 'country_list';
// $req = 'SELECT id,' . $GLOBALS['lng'] . ' FROM countries ORDER BY orderby,' . $GLOBALS['lng'];
$req = 'SELECT ' . $GLOBALS['lng'] . ', id FROM countries ORDER BY orderby,' . $GLOBALS['lng'];
$form_def = 'form_def_country';
return $this->getCachedListForCountries($name, $req, $order, $form_def);
}
// }}}
// {{{ getContinentList()
/** Récupére la liste des continents
*
* Récupére tous les continents pour les listes
* déroulantes par exemple
*
* @access public
* @return array
* @see getCountry()
*/
public function getContinentList($order = false)
{
$name = 'continent_list';
$req = 'SELECT id,fr FROM continents';
$form_def = null;
return $this->getCachedList($name, $req, $order, $form_def);
}
// }}}
// {{{ getLanguageList()
/** Récupére toutes les langues
*
* Récupére toutes les langues pour les listes
* déroulantes par exemple
*
* @access public
* @return array
* @see getLanguage()
*/
public function getLanguageList($order = true)
{
$name = 'language_list';
$req = 'SELECT id,fr FROM languages ORDER BY orderby,fr';
$form_def = 'form_def_language';
return $this->getCachedList($name, $req, $order, $form_def);
}
// }}}
// {{{ getItemsList()
/** Récupération des items dans les champs relation_select
*
* @access public
* @param $idobject Identifiant de l'objet
* @param $type Type de données à récupérer
* @return string
*/
public function getItemsList($idobject = null, $type, $src = null)
{
$infos_link = $this->getRelationsArray($type);
// retourne le tableau des items liés
if (!empty($infos_link)) {
$itemslist = $this->getLinkedObject($infos_link, $idobject, $infos_link['type'], $this->__table);
return $itemslist;
}
return 'Aucune fonction de recherche pour le type <strong>' . $type . '</strong> dans la méthode !';
}
// }}}
// {{{ getLanguage()
/** Récupére le nom d'une langue
*
*
* @access public
* @param string $code Le code de la langue
* @return string
*/
public function getNameLanguage($code = null, $lng = null)
{
// renvoyer dans la langue
if ($lng) {
$field = $lng;
} else {
$field = $GLOBALS['lng'];
}
if ($code) {
return $this->queryOne('SELECT ' . $field . ' FROM languages WHERE id=\'' . $code . '\'');
}
}
// }}}
// {{{ colorAlternate()
/** Alternance des couleurs
*
* permet d'alterner les couleurs dans les les tableaux de données
*
* @access public
* @param $color La couleur en cours
* @return string
*/
public function colorAlternate($color)
{
if (!isset($color) || $color == 'two') {
return 'one';
} else {
return 'two';
}
}
// }}}
// {{{ cutSentence()
/** Coupe une phrase
*
* coupe un phrase et colle les petits points
*
* @access public
* @param string $texte le texte a couper
* @param int $nbcar le nombre de cacractère
* @return string
*/
public function cutSentence($texte, $nbcar = null, $simple = null)
{
// taille
$taille_texte = strlen($texte);
if ($simple) {
$new_texte = mb_substr($texte, 0, $nbcar);
if ($taille_texte > strlen($new_texte)) {
return $new_texte . '...';
} else {
return $new_texte;
}
}
if ($taille_texte > $nbcar && (0 != $nbcar)) {
$Tmp_Tb = explode(' ', $texte);
$Tmp_Count = 0;
$Tmp_O = '';;
foreach ($Tmp_Tb as $key) {
if (strlen($Tmp_O) >= $nbcar) break;
$Tmp_O .= $key . ' ';
}
$Tmp_O = substr($Tmp_O, 0, strlen($Tmp_O) - 1);
if (count($Tmp_Tb) > 1)
$Tmp_O .= '...';
} else {
$Tmp_O = $texte;
}
return $Tmp_O;
}
// }}}
// {{{ getFormeDate()
/** Mise en forme de la date pour entree ou sortie
*
*
* @access public
* @param string $dateentree date en entree
* @param string $sortie format de sortie
* @return string
*/
public function getFormeDate($dateentree, $sortie = 'Y-m-d', $st = false)
{
// si il y a des / = format FR
if (gettype($dateentree) == 'string') {
$exp = explode('/', $dateentree);
if (count($exp) > 1) {
$dateentree = $exp[2] . '-' . $exp[1] . '-' . $exp[0];
}
if ($st) {
setLocale(LC_TIME, "fr_FR.utf8");
/* @Deprecated in php 8.1 */
return strftime($sortie, strtotime($dateentree));
} else {
return date($sortie, strtotime($dateentree));
}
} else if (!empty($dateentree)) {
$fmt = datefmt_create(
'fr_FR',
\IntlDateFormatter::FULL,
\IntlDateFormatter::FULL,
'Europe/Paris',
\IntlDateFormatter::GREGORIAN,
"EEEE d MMMM y"
);
return $fmt->format($dateentree);
}
}
// }}}
// {{{ getYear()
/** Retourne l'année pour une date donnée
*
* @access public
* @param string $date date
* @param string $fmt format (date()) 'Y' par défaut
* @return string|boolean false si erreur, l'annee sinon
*/
public function getYear($date = null, $fmt = 'Y')
{
if (!empty($date)) {
$timestamp = strtotime($date);
if ($timestamp !== false) {
$year = date($fmt, $timestamp);
if ((int)$year !== 0) return $year;
}
}
return false;
}
// }}}
// {{{ getThumbnail()
/** Crée les images redimensionnee
*
* Cree des images a la taille voulue et les mets dans le reprertoire de la taille en question
* cree le rep si il n'existe pas, renvoi l'image simplement si elle exsiste
*
* @access public
* @param imgfile string Image originale
* @return array
* @see Theatre_Images::getThumbnail
*
*/
public function getThumbnail($imgfile, $thumb_size = 100, $direction = 'normal', $params = array())
{
return $this->images->getThumbnail($imgfile, $thumb_size, $direction, $params);
}
// }}}
// {{{ checkAccess()
/** Verifier l'acces pour la partie public
*
* @access public
* @return string
*/
public function checkAccess($sql, $tabdroits)
{
// verifier la langue
if ((IS_LANGUAGE || !empty($this->checkLanguage))
&& !empty($tabdroits['language'])) {
$sql .= ' AND ' . $tabdroits['language'] . '=\'' . $GLOBALS['lng'] . '\'';
}
// verifier la presence en ligne
if ($_ENV['CHECK_IF_ONLINE'] && !empty($tabdroits['publish'])) {
$sql .= ' AND ' . $tabdroits['publish'] . '=1';
}
return $sql;
}
// }}}
// {{{ checkLanguage()
/** Verifier la langue
*
* @access public
* @return string
*/
public function setCheckLanguage($val = true)
{
// verifier la langue
$this->checkLanguage = $val;
}
// }}}
// {{{ wikiTransform()
/** Transformer les champs wiki en html
*
* @access public
* @param string $str chaine au format wiki
* @return string
*/
public function wikiTransform($str, $markdown = false)
{
if ($markdown) {
$parser = new MarkdownExtra();
return $parser->transform($str);
}
$wiki = new wiki2xhtml();
return $wiki->transform($str);
}
// }}}
// {{{ getUrlClean()
/** Retourne l"url clean d'un objet
*
* @access public
* @return bool
*/
public function getUrlClean($idobject, $object)
{
$idx = 'id' . substr($object, 0, -1);
return $this->queryOne('SELECT url_clean FROM ' . $object . ' WHERE ' . $idx . '=\'' . $idobject . '\'');
}
// }}}
// {{{ getIdByUrl()
/** Retourne l'id d'un objet à partir de son url
*
* @access public
* @param string $url_clean L'URL
* @return false|int
*/
public function getIdByUrl($url_clean, $strict = true, $return_array = false, $operator = '=')
{
// recherche strict = pâs de résultat aprochant = un seul résultat ou rien
if ($strict) {
// multimedias
if ($this->__table == 'multimedias') {
$sql_id = 'SELECT DISTINCT(`' . $this->__idtable . '`) as id, url_clean
FROM ' . $this->__table . '
WHERE url_clean' . $operator . '\'' . $this->escape($url_clean) . '\'
OR code=\'' . $this->escape($url_clean) . '\' ';
} else {
$sql_id = 'SELECT DISTINCT(`' . $this->__idtable . '`) as id, url_clean
FROM ' . $this->__table . '
WHERE url_clean' . $operator . '\'' . $this->escape($url_clean) . '\' ';
}
if ($return_array) {
$id = $this->queryAll($sql_id);
return $id;
} else {
$id = $this->queryOne($sql_id);
if ($id && $id > 0) {
return $id;
}
return false;
}
// recherche pouvant renvoyer plusieurs résultats
} else {
// convertit l'URL dans un bon format comme dans la base
if (!isset($this->ct)) {
$ct = new Cleantext($this->getEntityManager());
$this->ct = $ct;
}
// recherche prénom/nom ou nom/prénom
if ($this->__table == 'persons') {
$urls = explode(' ', $url_clean);
if (count($urls) == 2) {
$sql_ids = 'SELECT DISTINCT(`' . $this->__idtable . '`) as id, url_clean
FROM ' . $this->__table . '
WHERE
url_clean LIKE \'%' . $this->escape($ct->str2URL($urls[0] . '-' . $urls[1])) . '%\'
OR url_clean LIKE \'%' . $this->escape($ct->str2URL($urls[1] . '-' . $urls[0])) . '%\' ';
} else {
$sql_ids = 'SELECT DISTINCT(`' . $this->__idtable . '`) as id, url_clean
FROM ' . $this->__table . '
WHERE url_clean LIKE \'%' . $this->escape($ct->str2URL($url_clean)) . '%\' ';
}
} else {
$sql_ids = 'SELECT DISTINCT(`' . $this->__idtable . '`) as id, url_clean
FROM ' . $this->__table . '
WHERE url_clean LIKE \'%' . $this->escape($ct->str2URL($url_clean)) . '%\' ';
}
$ids = $this->queryAll($sql_ids);
if (!empty($ids)) {
return $ids;
}
return array();
}
}
// }}}
// {{{ canUpdateCache()
/** Peux t'on vider le cache ?
*
* @access public
* @return bool
*/
public function canUpdateCache($type_cache = 'all')
{
if (isset($_GET['calcul'])
&& (isset($_COOKIE['delcache']) || isset($_SESSION['extranet']))
&& (isset($_GET['type_cache']) &&
($_GET['type_cache'] == 'all' || $_GET['type_cache'] == $type_cache))
) {
// A FAIRE : ecrire les caches qui sont vide dans un logs ?
return true;
}
return false;
}
// }}}
// {{{ setDebugView()
/** Enregistrer des informatons des debugages
*
* @access protected
* @return bool
*/
protected function setDebugView($debug, $methode)
{
$this->debug_view[] = $debug;
}
// }}}
// {{{ getDebugView()
/** Consulter les informations de debugage
*
* @access public
* @return bool
*/
public function getDebugView($active = true)
{
if (isset($this->debug_view)) {
return $this->debug_view;
}
}
// }}}
// {{{ getObjectsList()
/** Liste des valeurs acceptables du champ object
*
*
* @access public
* @param array $list liste optionnelle des valeurs acceptées
* @return array
* @see setValidObjects()
*/
public function getObjectsList($list = null)
{
if (!empty($list)) {
$this->setValidObjects($list);
}
$sql = 'SHOW COLUMNS FROM ' . $this->__table . ' WHERE Field = \'object\'';
$res = $this->queryAll($sql);
$tmp_object_values = array();
if (isset($res[0]['Type'])) {
$tmp_object_values = explode(',', substr($res[0]['Type'], 5, -1));
}
$possible_object_values = array();
foreach ($tmp_object_values as $v) {
$v = trim($v, '\''); // suppression des '' autour des valeurs
if (empty($this->object_accept) || in_array($v, $this->object_accept)) {
$possible_object_values[$v] = ucfirst($v);
}
}
return $possible_object_values;
}
// }}}
// {{{ setValidObjects()
/** Définie les valeurs acceptables pour le champ object
*
*
* @access public
* @param array $list tableau des valeurs
* @return array
* @see getObjectsList()
*/
public function setValidObjects($list = null)
{
if (empty($list) || !is_array($list)) {
$this->object_accept = array();
return;
}
$this->object_accept = $list;
}
// }}}
// {{{ splitKeywords()
/** Sépare les mots clés en deux listes: une contenant les nombres, et une autre contenant tout
*
*
* @param string $keywords la chaine contenant les mots clés
* @param string $separator le séparateur à utiliser (par défaut l'espace)
* @access public
* @return array|bool retourne un tableau contenant un ou deux sous-tableaux indexés par $this->IDNUM et $this->IDSTR
*/
public function splitKeywords($keywords, $separator = ' ')
{
$list = array();
if (!empty($keywords)) {
$keywords_list = explode($separator, trim($keywords));
if (!empty($keywords_list)) {
foreach ($keywords_list as $kw) {
if ($this->my_is_int($kw)) {
$list[$this->IDNUM][] = (int)$kw;
}
$kw = trim($kw);
if ($kw) {
$list[$this->IDSTR][] = $this->escape($kw);
}
}
}
}
return $list;
}
// }}}
// {{{ getMultimediaList()
/** Liste des multimedias associés à l'objet, pour les boites ajax_relation
*
*
* @access public
* @param int $idobject identifiant de l'objet
* @param string $type type recherché
* @param boolean $only_published seulement les multimédias publiés (par défaut: false)
* @return array
*/
public function getMultimediaList($idobject, $type, $only_published = false)
{
$infos = array();
$query = 'SELECT m.idmultimedia, m.sujet_titre, m.publish FROM multimedias m, object_multimedia om
WHERE m.idmultimedia=om.idmultimedia';
switch ($type) {
case 'multimedia_content':
// on a deja l'id ?
if (empty($idobject)) {
$idobject = $this->idcontent;
}
$query .= ' AND om.object=\'contents\'';
break;
case 'spectacle_trailer':
// on a deja l'id ?
if (empty($idobject)) {
$idobject = $this->idspectacle;
}
$query .= ' AND om.object=\'spectacles\'
AND om.idrole=24';
break;
case 'text_trailer':
// on a deja l'id ?
if (empty($idobject)) {
$idobject = $this->idtext;
}
$query .= ' AND om.object=\'texts\'
AND om.idrole=24';
break;
default:
error_log(__FUNCTION__ . ': Type inconnu:' . $type);
return false;
}
$query .= ' AND om.idobject=' . ((int)$idobject);
if ($only_published) {
$query .= ' AND m.publish=1';
}
$p = $this->query($query);
foreach ($p as $r) {
$key = $r['idmultimedia'];
$infos[$key] = array('sujet_titre' => $r['sujet_titre']);
$infos[$key]['view_name'] = &$infos[$key]['sujet_titre'];
$infos[$key]['title'] = $infos[$key]['sujet_titre'] . ' (' . $key . ')';
if (empty($r['publish'])) {
$infos[$key]['class'] = 'unpublished';
$infos[$key]['title'] .= ' - non publié';
}
}
// $p->free();
// retourner les infos
return $infos;
}
// }}}
// {{{ getObjectsCarrerDetails()
/** Message permettant de récupérer tous les détails des spectacles etc.
*
* @access public
* @param int $idobject Identifiant de l'item
* @param string $object Type de contenu
* @return string
*/
public function getObjectsCarrerDetails($idobject = null, $object = 'spectacles', ?AdapterInterface $cache = null)
{
// 101 CRITIQUES
// 125 EDUC
$totalVideos = $this->getEntityManager()->getRepository(Multimedias::class)->getMultimediasBy($object, $idobject, null, 'count');
$totalAudios = $this->getEntityManager()->getRepository(Podcasts::class)->countPodcasts($object, $idobject, 'franceinter');
$telechargements = $this->getEntityManager()->getRepository(Files::class)->countObjectFiles(
$idobject, $object,
$this->getEntityManager()->getRepository(Classifications::class)->getClassificationList('files', $object, null, array(1), 'get_value'),
array(
'valid' => 1,
'publish' => 1,
'force_mode' => 'file',
)
);
// $infos['ensavoirplus'] = 0;
if ($object == 'persons') {
// les objets
$spectacles = $this->getEntityManager()->getRepository(Spectacles::class);
$texts = $this->getEntityManager()->getRepository(Texts::class);
$idpectacles = $texts->getTextsPersons($idobject);
$sql_all_spectacles = 'SELECT DISTINCT s.`idspectacle`
FROM spectacles s
LEFT JOIN spectacle_person sp ON sp.`idspectacle`=s.`idspectacle`
LEFT JOIN text_spectacle ts ON ts.`idspectacle`=s.`idspectacle`
WHERE s.`publish`=1 AND s.`valid`=1
AND (sp.`idperson`=' . $idobject;
// les textes de la personne
if (!empty($idpectacles)) {
$sql_all_spectacles .= ' OR ts.`idtext` IN (' . implode(',', $idpectacles) . ' ) ';
}
// spectacles publiés
$sql_all_spectacles .= ')';
if ($cache) {
$cacheItem = $cache->getItem("theatreTrait_getObjectsCarrerDetails_{$idobject}_" . implode('-', $idpectacles));
if (!$cacheItem->isHit()) {
$res = $texts->queryAll($sql_all_spectacles);
$cacheItem->set($res)
->expiresAt((new \DateTime('now'))->add(\DateInterval::createFromDateString('7 hours')));
$cache->save($cacheItem);
}
$ids_spectacles = $cacheItem->get();
} else {
$ids_spectacles = $texts->queryAll($sql_all_spectacles);
}
$ids_spectacles = array_map('current', $ids_spectacles);
$nb_educ = null;
$idtexts_person = $this->getEntityManager()->getRepository(Texts::class)->getTextsPersons($idobject, 'all', 'all', true);
// les textes de la personne avec un contenu éduc
if (!empty($idtexts_person)) {
$list_texts = $texts->getListTexts(array(
'special' => array(
'idclassification' => array(125), // classification educ
'idtext' => $idtexts_person, // textes de la personne
'join' => true, // texte pas forcément publié
),
'dbg' => array('list_texts', 'Liste des textes à contenus pédagogiques')
));
if (!empty($list_texts)) {
foreach ($list_texts as $k => $v) {
$list_texts[$k]['url_clean_more'] = 'contenus-pedagogiques/';
}
}
$nb_educ += count($list_texts);
}
// les spectacles de la personne avec un contenu éduc
if (!empty($ids_spectacle_all)) {
$list_spectacles = $spectacles->getListSpectacles(array(
'special' => array(
'idspectacles' => array('IN', $ids_spectacles), // les spectacles associés à la personne
'idclassification' => array(125), // avec un contenu pédagogique 125
'tri_plus_proches' => true,
),
'dbg' => array('list_spectacles', 'Liste des spectacles avec contenus pédagogiques')
)
);
$nb_educ += count($list_spectacles);
}
// les spectacles de la personne avec des pièces démontées
if (!empty($ids_spectacle_all)) {
$pieces_demontes = $spectacles->getListSpectacles(array(
'special' => array(
'idspectacles' => array('IN', $ids_spectacles), // les spectacles associés à la personne
'idclassification' => array(82), // avec un contenu pièce démontée (82)
'tri_plus_proches' => true,
),
'dbg' => array('list_spectacles', 'Liste des spectacles avec une pièce démontée')
));
$nb_educ += count($pieces_demontes);
}
// minutes pédagogiques => recherche directe sur la personne ou via les spectacles
if (!empty($this->ids_spectacle_all)) {
$multimedias = $this->getEntityManager()->getRepository(Multimedias::class);
// recherche de base
$params_query_minutes = array(
'affiche' => array(
'datestart' => '1999-01-01',
'dateend' => '2030-01-01',
),
'object' => array(array('spectacles', $ids_spectacles)),
'idclassification' => 145,
'limit' => array(0, 100),
'dbg' => array('minutes', 'Vidéos de minutes pédagogiques'),
);
$nb_educ += count($this->context['view']->list_minutes);
}
// texte par l'auteur => recherche des textes de l'auteur qui ont une playlist de ce type
// recherche des playlists qui ont la classification par l'auteur et qui ont le texte de l'auteur
if (!empty($ids_spectacles)) {
$playlists = $this->getEntityManager()->getRepository(Playlists::class);
$nb_educ += $playlists->countListPlaylists(array(
'special' => array(
'idclassifications' => 144, // class_texte_parauteur //
'idtext' => $ids_spectacles, // les texts de la personne
),
'dbg' => array('list_playlists', 'Playlist texte par l\'auteur'),
));
}
$news = $this->getEntityManager()->getRepository(News::class);
$params_prochains_evenements = [
'special' => array(
'publish_valid' => true,
'prochains' => true,
'by_object' => array('idperson' => $idobject),
),
];
$prochains_evenements = $news->countNews($params_prochains_evenements);
if (!empty($ids_spectacles)) {
$sql_count_critique = 'SELECT COUNT(DISTINCT(ct.`idcontent`))
FROM spectacles s
JOIN object_content oc ON s.`idspectacle`=oc.`idobject`
JOIN contents ct ON oc.`idcontent`=ct.`idcontent`
JOIN content_classification cc ON ct.`idcontent`=cc.`idcontent`
WHERE s.`publish`=1 AND s.`valid`=1
AND ct.`publish`=1 AND ct.`valid`=1
AND cc.`idclassification`=101
AND s.`idspectacle` IN (' . join(',', $ids_spectacles) . ') ';
$nb_critiques = $texts->queryOne($sql_count_critique);
} else {
$nb_critiques = 0;
}
//Prix et distinctions - Aides et soutiens - Sélections
$totalAides = 0;
$params_aides = array(
'special' => array(
'aides' => array(
'type_aides' => [2, 3, 1, 4],
),
),
'idtext' => explode(',', $idtexts_person),
'get_texts_with_aides' => true,
'group_by_aide_type_aide_text' => true,
);
$totalAides = $this->getEntityManager()->getRepository(TextAide::class)->countListTextAide($params_aides);
$arrays['biographies'] = ['idclassification' => 15];
$arrays['ensavoirplus'] = ['idclassification' => 6];
$arrays['textes'] = count($idpectacles);
$arrays['spectacles'] = count($ids_spectacles);
$arrays['videos'] = $totalVideos;
$arrays['audios'] = $totalAudios;
$arrays['critiques'] = $nb_critiques;
$arrays['educ'] = $nb_educ;
$arrays['evenements'] = $prochains_evenements;
} else {
$arrays = array(
'ensavoirplus' => ['idclassification' => 6],
'videos' => $totalVideos,
'audios' => $totalAudios,
'educ' => ['idclassification' => 125], //class_contenu_educ
'critiques' => ['idclassification' => 101],
'telechargements' => $telechargements
);
}
$sql = 'SELECT COUNT(oc.idcontent)
FROM object_content oc, contents c, content_classification cc
WHERE oc.idcontent=c.idcontent
AND cc.idcontent=c.idcontent
AND c.publish=1
AND oc.object=\'' . $object . '\'
AND oc.idobject=' . $idobject;
foreach ($arrays as $key => $value) {
if (is_array($value) && !empty($value['idclassification'])) {
$sql_copy = $sql;
$sql_copy .= ' AND cc.idclassification=' . $value['idclassification'] . ' LIMIT 1';
$infos[$key] = $this->queryOne($sql_copy);
} else {
$infos[$key] = $value;
}
}
if ($infos['ensavoirplus'] < 2) {
$infos['ensavoirplus'] = false;
}
if (isset($totalAides)) {
$infos['ensavoirplus'] += $totalAides;
}
return $infos;
}
// }}}
// {{{ getObjectTitleSimple()
/** Infos de l'un item recherché
*
* Affichage standard du titre de l'objet ou retourne des infos "simple"
*
* Deux grand type de cas :
* - on n'a les infos et on veux juste formater le titre = infos passée dans infos_object
* - on n'a pas les infos alors on exécute une requête pour les obtenir
*
* Au final on renvoi un titre formaté
*
* @access public
* @param int $idobject Identifiant de l'item
* @param array $infos_object Informations pour construire le titre
* @param array $params Paramétres supplémentaires
* @return string
*/
public function getObjectTitleSimple($idobject = null, $infos_object = array(), $params = array())
{
// les champs à sélectionner
if (empty($params['fields'])) {
$fields = array($this->__idtable);
} else {
$fields = $params['fields'];
}
// le champ "d'affichage" si rien = le premier de la liste fields
if (empty($params['required_field'])) {
$required_field = $fields[0];
} else {
$required_field = $params['required_field'];
}
// si on n'a pas les infos
if (empty($infos_object)) {
//charger les infos que si necessaire
if (empty($this->$required_field)) {
if (empty($params['sql'])) {
$sql = 'SELECT ' . implode(',', $fields) . '
FROM ' . $this->__table . '
WHERE ' . $this->__idtable . '=' . (int)$idobject;
} else {
$sql = $params['sql'];
}
$data = $this->queryRow($sql);
}
// mettre dans le tableau soir les données en cours (this) soir le résultat
foreach ($fields as $k => $v) {
if (empty($data[$v]) && empty($this->$v)) {
$infos_object[$v] = '';
} else {
if (!empty($data[$v])) {
$infos_object[$v] = trim($data[$v]);
}
if (!empty($this->$v)) {
if (!is_array($this->$v)) {
$infos_object[$v] = trim($this->$v);
} else {
$infos_object[$v] = $this->$v;
}
}
}
}
} else { // on a les infos, c'est plus simple
foreach ($fields as $k => $v) {
if (empty($infos_object[$v])) {
$infos_object[$v] = '';
} else {
$infos_object[$v] = trim($infos_object[$v]);
}
}
}
//retour
return $infos_object;
}
// }}}
// {{{ query()
/** Redéfinir query pour le debug
*
*
* @access public
* @param string $sql La requete SQL
* @param array $dbg Les infos pour le debugage
*/
// public function query($sql,$dbg=array())
// {
// $start_dbg_time = microtime(true);
// parent::query($sql);
// $exec_dbg_time = microtime(true) - $start_dbg_time;
//
// // afficher directement le debug
// if(!empty($_REQUEST['dbg_sql_object'])) {
// if(!empty($_REQUEST['sql']) && !empty($dbg)
// && ($dbg[0]==$_REQUEST['sql'] || $_REQUEST['sql']=='all')) {
// // infos dans la globale
// $GLOBALS['dbg_infos'][$dbg[0]] = array(
// 'execution_time_query' => $exec_dbg_time,
// 'sql_query' => $sql,
// 'dbg' => $dbg,
// );
// }
// }
// }
// }}}
// {{{ queryOne()
// /** Redéfinir queryOne pour le debug
// *
// *
// * @access public
// * @param string $sql La requete SQL
// * @param array $dbg Les infos pour le debugage
// */
// public function queryOne($sql,$dbg=array())
// {
// $start_dbg_time = microtime(true);
// $res = $this->queryOne($sql);
// $exec_dbg_time = microtime(true) - $start_dbg_time;
//
// // afficher directement le debug
// if(!empty($_REQUEST['dbg_sql_object'])) {
// if(!empty($_REQUEST['sql']) && !empty($dbg)
// && ($dbg[0]==$_REQUEST['sql'] || $_REQUEST['sql']=='all')) {
// // infos dans la globale
// $GLOBALS['dbg_infos'][$dbg[0]] = array(
// 'execution_time_query' => $exec_dbg_time,
// 'sql_query' => $sql,
// 'dbg' => $dbg,
// );
// }
// }
//
// return $res;
//
// }
//
// // }}}
// {{{ isTraceMode()
/** Tracer ou pas ?
*
*
* @access public
* @param string Faut-il tracer des executions ?
*/
public function isTraceMode($trace_mode)
{
if (!empty($_REQUEST[$trace_mode])) {
return true;
} else {
return false;
}
}
// }}}
// {{{ setTraceInfos()
/** Enregistrer les paramètres de trace
*
*
* @access public
* @param array $trace_infos Les paramètres
*/
public function setTraceInfos($trace_infos)
{
$GLOBALS['dbg_infos'][] = $trace_infos;
}
// }}}
// {{{ getSQLObject()
/** Construire une requete SQL
*
*
* @access public
* @param array $query Paramètres de la requête
* @return string
*/
public function getSQLObject($query)
{
// sans cache sql
if (!empty($_REQUEST['sql_no_cache'])) {
$sql_no_cache = 'SQL_NO_CACHE';
} else {
$sql_no_cache = null;
}
$empty_select = ', ';
// select
if (empty($query['count_only'])) {
if (!empty($query['distinct'])) {
if ($query['distinct'] == 'no') {
$sql['select'] = 'SELECT ' . $sql_no_cache . ' ' . $this->__table . '.' . $this->__idtable;
} elseif ($query['distinct'] == 'no_primary') {
$sql['select'] = 'SELECT ' . $sql_no_cache . ' ';
$empty_select = '';
}
} else {
$sql['select'] = 'SELECT ' . $sql_no_cache . ' DISTINCT(' . $this->__table . '.' . $this->__idtable . ')';
}
} else {
if (!empty($query['count_disctint_by'])) {
foreach ($query['count_disctint_by'] as $k => $v) {
$sql['select'] = 'SELECT ' . $sql_no_cache . ' COUNT(DISTINCT(`' . $k . '`.`' . $v . '`)) as total ';
}
} else {
if (property_exists($this, '__idtable')) {
$sql['select'] = 'SELECT ' . $sql_no_cache . ' COUNT(DISTINCT(' . $this->__table . '.' . $this->__idtable . ')) as total ';
} else {
$sql['select'] = 'SELECT ' . $sql_no_cache . ' COUNT(*) as total ';
}
}
}
// la partie select
if (!empty($query['select'])) {
foreach ($query['select'] as $s) {
// la valeur est un tableau array('test' => 'essai')
if (is_array($s)) {
foreach ($s as $t => $f) {
$fields = explode(',', $f);
if (count($fields) > 1) {
foreach ($fields as $fb) {
if ($fb == '*') {
$select[] = $t . '.' . $fb;
} else {
$select[] = $t . '.`' . $fb . '`';
}
}
} else {
if ($f == '*') {
$select[] = $t . '.' . $f;
} else {
$select[] = $t . '.`' . $f . '`';
}
}
// si la table n'est pas dans les 'from', on l'ajoute
if (!in_array($t, $query['from'])) {
$query['from'][$t] = $t;
}
}
} else {
$select[] = $s;
}
}
$sql['select'] .= $empty_select . join(',', $select);
}
if (!empty($query['select_more'])) {
$sql['select'] .= $query['select_more'];
}
if (!empty($query['sum'])) {
$sql['select'] = 'SELECT ' . $sql_no_cache . ' SUM(`' . $query['sum'][0] . '`.`' . $query['sum'][1] . '`) ';
}
if (!empty($query['left_join'])) {
foreach ($query['left_join'] as $k => $v) {
$join = ' `' . $k . '` ';
if (in_array($k, $query['from'])) {
unset($query['from'][$k]);
}
foreach ($v as $kb => $vb) {
$join .= ' LEFT JOIN `' . $kb . '` ON ' . key($vb) . '=' . $vb[key($vb)] . ' ';
foreach ($query['from'] as $kq => $vq) {
if ($vq == $kb) {
unset($query['from'][$kq]);
}
}
}
$joins[] = $join;
}
$froms[] = join("\n", $joins);
}
// la partie from
if (!empty($query['from'])) {
foreach ($query['from'] as $k => $v) {
$froms[] = ' `' . $v . '` ';
}
}
// les joins
$sql['from'] = 'FROM ' . join(",\n", $froms);
// where standard
if (!empty($query['where'])) {
foreach ($query['where'] as $w) {
// c'est un array
if (is_array($w)) {
// AND par défaut
if (empty($w[3])) {
$where_string = ' AND ';
} else {
$where_string = $w[3] . ' '; // précision sur la condition
}
$where_string .= $w[0] . '.`' . $w[1] . '`';
// c'est un tableau
if (is_array($w[2])) {
if (!empty($w[4])) { // précise si IN / NOT IN ou BETWEEN
$where_string .= ' ' . $w[4] . ' ';
} else {
$where_string .= ' IN ';
}
// si BETWEEN différent de IN
if (!empty($w[4]) && $w[4] == 'BETWEEN') {
$where_string .= '\'' . $this->escape($w[2][0]) . '\' AND \'' . $this->escape($w[2][1]) . '\'';
} else {
if (!empty($w[2]) && is_array($w[2])) {
$ww = array();
foreach ($w[2] as $s) {
if ($this->my_is_int($s)) {
$ww[] = $s;
} else {
if (is_array($s)) {
$ww[] = '\'' . implode(',', $this->escape($s)) . '\'';
} else {
$ww[] = '\'' . $this->escape($s) . '\'';
}
}
}
$where_string .= '(' . join(',', $ww) . ')';
}
}
} else {
if (!empty($w[4])) {
$condition = $w[4];
} else {
$condition = '=';
}
if ($this->my_is_int($w[2])) {
$where_string .= $condition . $w[2];
} else {
if ($w[2] == 'ISNULL') {
$where_string .= ' IS NULL';
} elseif ($w[2] == 'ISNOTNULL') {
$where_string .= ' IS NOT NULL';
} else {
$where_string .= $condition . '\'' . $w[2] . '\'';
}
}
}
$where_suite[] = $where_string;
} else {
$where_suite[] = $w;
}
}
$sql['where'] = ' WHERE 1 ' . join(' ', $where_suite);
if (!empty($query['where_more'])) {
$sql['where'] .= $query['where_more'];
}
// jointure
if (!empty($query['join'])) {
foreach ($query['join'] as $k => $v) {
$join[] = $v[0] . '=' . $v[1];
}
$sql['where'] .= ' AND ' . join(' AND ', $join);
}
}
if (empty($query['count_only']) && empty($query['sum'])) {
// la partie groupby
if (empty($query['group'])) {
$sql['group'] = 'GROUP BY ' . $this->__table . '.' . $this->__idtable;
} elseif ($query['group'] == 'no') {
$sql['group'] = ' ';
} else {
foreach ($query['group'] as $k => $v) {
if (is_array($v)) {
$group[] = $k . '.`' . $v . '`';
} else {
$group[] = $k . '.`' . $v . '`';
}
}
$sql['group'] = ' GROUP BY ' . join(',', $group);
}
}
if (!empty($query['having'])) {
foreach ($query['having'] as $w) {
// c'est un array
if (is_array($w)) {
// AND par défaut
if (empty($w[3])) {
$having_string = 'AND ';
} else {
$having_string = $w[3] . ' '; // précision sur la condition
}
$having_string .= $w[0] . '.`' . $w[1] . '`';
// c'est un tableau
if (is_array($w[2])) {
if (!empty($w[4])) { // précise si IN / NOT IN ou BETWEEN
$having_string .= ' ' . $w[4] . ' ';
} else {
$having_string .= ' IN ';
}
// si BETWEEN différent de IN
if (!empty($w[4]) && $w[4] == 'BETWEEN') {
$having_string .= '\'' . $this->escape($w[2][0]) . '\' AND \'' . $this->escape($w[2][1]) . '\'';
} else {
if (!empty($w[2]) && is_array($w[2])) {
$ww = array();
foreach ($w[2] as $s) {
if ($this->my_is_int($s)) {
$ww[] = $s;
} else {
$ww[] = '\'' . $this->escape($s) . '\'';
}
}
$having_string .= '(' . join(',', $ww) . ')';
}
}
} else {
if (!empty($w[4])) {
$condition = $w[4];
} else {
$condition = '=';
}
if ($this->my_is_int($w[2])) {
$having_string .= $condition . $w[2];
} else {
if ($w[2] == 'ISNULL') {
$having_string .= ' IS NULL';
} elseif ($w[2] == 'ISNOTNULL') {
$having_string .= ' IS NOT NULL';
} else {
$having_string .= $condition . '\'' . $this->escape($w[2]) . '\'';
}
}
}
$having_suite[] = $having_string;
} else {
$having_suite[] = $w;
}
}
$sql['having'] = ' HAVING 1 ' . join(' ', $having_suite);
}
if (empty($query['count_only']) && empty($query['sum'])) {
// classement par défaut
if (empty($query['order'])) {
//$sql['order'] = 'ORDER BY '.$this->__table'.'.$this->__idtable;
$default_order = 'dateinsert';
$sql['order'] = 'ORDER BY ' . $this->__table . '.' . $default_order;
} else {
foreach ($query['order'] as $k => $v) {
if (is_array($v)) {
// si le troisème élément de $v est un tableau => classement par FIELD
if (!empty($v[2]) && is_array($v[2])) {
$order[] = 'FIELD(' . $v[0] . '.`' . $v[1] . '`,' . join(',', $v[2]) . ')';
$is_field_order = true;
} else {
foreach ($v as $t => $f) {
$order[] = $t . '.`' . $f . '`';
}
}
} else {
$order[] = $v;
}
}
$sql['order'] = 'ORDER BY ' . join(',', $order);
}
// si anciens, direction DESC
if (!empty($query['anciens'])) {
$sql['direction'] = 'DESC';
} else {
// direction définie
if (!empty($query['direction'])) {
// pas de direction
if ($query['direction'] != 'no') {
$sql['direction'] = $query['direction'];
} else {
$sql['direction'] = ' ';
}
} else {
if (empty($is_field_order)) {
$sql['direction'] = 'DESC';
} else {
$sql['direction'] = ' ';
}
}
}
// classement aléatoire
if (!empty($query['random'])) {
$sql['order'] = 'ORDER BY RAND() ' . $query['random'];
}
// pas de classement
if (!empty($query['no_order'])) {
$sql['order'] = '';
}
}
// limite des résultats
if (empty($query['limit'])) {
$sql['limit'] = 'LIMIT 0,10';
} else {
if ($query['limit'][0] !== 'all') {
$sql['limit'] = 'LIMIT ' . join(',', $query['limit']);
} else {
$sql['limit'] = null;
}
}
// requête forcée sans le groupement, le tri et les limites
if (!empty($query['force_query'])) {
$sql = array();
$sql['query'] = $query['force_query'];
}
// afficher directement le debug
if ($this->isTraceMode('get_sql_object')) {
if (!empty($_REQUEST['sql']) && !empty($query['dbg'])
&& ($query['dbg'][0] == $_REQUEST['sql'] || $_REQUEST['sql'] == 'all')) {
// infos dans la globale
$GLOBALS['dbg_infos'][$query['dbg'][0]] = array(
'sql_query' => join(" \n", $sql),
'dbg' => $query['dbg'],
);
}
}
return join(" \n", $sql);
}
// }}}
// {{{ addSQLParams()
/** Ajouter des paramètres à la requete
*
*
* @param mixed $vignette_format format pour les vignettes (true pour défaut, tableau sinon)
* @param string $language langue des vidéos (par défaut fr)
* @param int|array $type limite au type spécifié (entier ou tableau d'entiers)
* @access public
* @return array
*/
public function addSQLParams($param, &$query, $query_more)
{
// juste une string
if (!is_array($query_more)) {
$query[$param] = $query_more;
} else {
$use_merge = false;
if ($use_merge) {
$query[$param] = array_merge($query[$param], $query_more);
} else {
foreach ($query_more as $k => $v) {
if ($param == 'from' && in_array($v, $query['from'])) {
continue;
}
if (!$this->my_is_int($k)) {
if ($param == 'join') {
$query[$param][] = array($k, $v);
} else {
$query[$param][$k] = $v;
}
} else {
$query[$param][] = $v;
}
}
}
}
}
// }}}
// {{{ mergeSQLParams()
/** Ajouter/supprimer des paramètres pour getListSpectacles
*
* @param array $params_sql tableau orginal
* @param array $params_sql tableau complété
* @return array
*/
public function mergeSQLParams($params_sql, $params_sql_more)
{
// ajouter des paramètres
unset($params_sql['params']['limit']);
unset($params_sql['special']['plus_proche']);
$params_sql = array_merge_recursive($params_sql, $params_sql_more);
return $params_sql;
}
// }}}
// {{{ transformFieldsData()
/** génére la version pour la diffusion API
*
* @access public
* @param array $fields tableau des champs
* @param array $data tableau de données
* @return array
*/
public function transformFieldsData($fields, $data, $url)
{
// si les champs sont un tableau et les données un tableau supérieur à 1
// alors on doit parcourir les données et mettre en relation les champs
//$m = array();
if (is_array($fields) && count($data) > 1) {
foreach ($data as $k => $v) {
// dans le cas ou $data n'est pas un tableau
foreach ($fields as $f => $w) {
// pour convertir les clés exemple alldirectors->directors
if (strpos($f, '->') !== false) {
$t = explode('->', $f);
$f = $t[0];
$kk = $t[1];
} else {
$kk = $f;
}
if (!empty($data[$f])) {
// si l'occurence de data est un tableau => plusieurs données (exemple : directors)
if (is_array($data[$f])) {
foreach ($data[$f] as $kb => $vb) {
$m[$kk][$kb] = $this->transformFieldsData($w, $vb, $url);
}
} else { // sinon, la valeur
// la valeur
$value = $data[$f];
$key = $w;
// si il y a un dièse dans la clé renommée (exemple permanent_url), on doit executer une regexp
$dieses = explode('#', $w);
if (is_array($dieses) && count($dieses) == 3) {
$pattern = '/' . $dieses[1] . '/i';
$remplacement = $dieses[2];
$key = $dieses[0];
$value = preg_replace($pattern, $remplacement, $value, 1);
}
// si c'est une URL, on doit ajouter l'URL
if (strpos($f, 'url_') !== false || strpos($w, '_url') !== false) {
$value = $url . $value;
}
$m[$key] = $value;
}
}
}
}
}
return $m;
}
// }}}
// {{{ getApiTab()
/** génére la version pour la diffusion API
*
* @access public
* @param array $data tableau de données
* @return array
*/
public function getApiTab($data, $url = 'URL_THNET', $params_options = array())
{
//return $this->transformFieldsData($this->getApiFields(),$data,$url);
//return $data;
// on parcours les champs
foreach ($this->getApiFields() as $field_key => $field_value) {
// on doit convertir field_key
if (strpos($field_key, '->') !== false) {
$t = explode('->', $field_key);
$field_key = $t[0];
$final_field_key = $t[1];
} else {
$final_field_key = $field_key;
}
if (array_key_exists($field_key, $data)) {
if (is_array($field_value)) {
// niveau alldirectors => on parcours alldirectors dans fields
foreach ($field_value as $field_key_b => $field_value_b) {
// on doit convertir field_key
if (strpos($field_key_b, '->') !== false) {
$t = explode('->', $field_key_b);
$field_key_b = $t[0];
$final_field_key_b = $t[1];
} else {
$final_field_key_b = $field_key_b;
}
// on parcours alldirectors dans data
if(is_array($data[$field_key])){
foreach ($data[$field_key] as $data_key => $data_value) {
// on doit convertir field_key
if (strpos($data_key, '->') !== false) {
$t = explode('->', $data_key);
$data_key = $t[0];
$final_data_key = $t[1];
} else {
$final_data_key = $data_key;
}
// on parcours chaque enregistremebt de alldirectors dans data
foreach ($data_value as $data_key_b => $data_value_b) {
// on doit convertir field_key
if (strpos($data_key_b, '->') !== false) {
$t = explode('->', $data_key_b);
$data_key_b = $t[0];
$final_data_key_b = $t[1];
} else {
$final_data_key_b = $data_key_b;
}
if ($data_key_b == $field_key_b) {
// niveau ecoles
if (is_array($data_value_b)) {
if ($field_key_b == 'roles') {
$data_api[$final_field_key][$final_data_key][$field_key_b] = $data_value_b;
} else {
// parcours du tableau ecoles de fields
foreach ($field_value_b as $field_key_c => $field_value_c) {
// on doit convertir field_key
if (strpos($field_key_c, '->') !== false) {
$t = explode('->', $field_key_c);
$field_key_c = $t[0];
$final_field_key_c = $t[1];
} else {
$final_field_key_c = $field_key_c;
}
// parcours du tableau ecoles de data
foreach ($data_value_b as $data_key_c => $data_value_c) {
// on doit convertir field_key
if (strpos($data_key_c, '->') !== false) {
$t = explode('->', $data_key_c);
$data_key_c = $t[0];
$final_data_key_c = $t[1];
} else {
$final_data_key_c = $data_key_c;
}
// parcours de chaque champ du tableau ecoles de data
foreach ($data_value_c as $data_key_d => $data_value_d) {
if ($data_key_d == $field_key_c) {
//echo $final_field_key." ".$final_data_key." ".$final_field_key_b." ".$final_data_key_c." ".$final_field_key_c."\n";
// la valeur
$value = $data_value_d;
$key = $field_value_c;
// si il y a un dièse dans la clé renommée (exemple permanent_url), on doit executer une regexp
$dieses = explode('#', $field_value_c);
if (is_array($dieses) && count($dieses) == 3) {
$pattern = '/' . $dieses[1] . '/i';
$remplacement = $dieses[2];
$key = $dieses[0];
$value = preg_replace($pattern, $remplacement, $value, 1);
}
// si c'est une URL, on doit ajouter l'URL
if (strpos($key, 'url') !== false) {
//$value = $url.$value;
// si permanent_url, ajouter aussi object
$data_api[$final_field_key][$final_data_key][$final_field_key_b][$final_data_key_c]['object'] = $data_value_d;
}
$data_api[$final_field_key][$final_data_key][$final_field_key_b][$final_data_key_c][$key] = $value;
}
}
}
} // fin test si roles
}
// fin du niveau ecole
// niveau personnes
} else {
// la valeur
$value = $data_value_b;
$key = $field_value_b;
// si il y a un dièse dans la clé renommée (exemple permanent_url), on doit executer une regexp
$dieses = explode('#', $field_value_b);
if (is_array($dieses) && count($dieses) == 3) {
$pattern = '/' . $dieses[1] . '/i';
$remplacement = $dieses[2];
$key = $dieses[0];
$value = preg_replace($pattern, $remplacement, $value, 1);
}
// si c'est une URL, on doit ajouter l'URL
if (strpos($key, 'url') !== false) {
//$value = $url.$value;
// si permanent_url, ajouter aussi object
$data_api[$final_field_key][$final_data_key]['object'] = $data_value_b;
}
$data_api[$final_field_key][$final_data_key][$key] = $value;
}
}
}
}
//if(array_key_exists($field_key_b,$data)) {
}
}
} else {
// la valeur
$value = $data[$final_field_key];
$key = $field_value;
if ($key == "published") {
if ($value == true) {
$value = "1";
} else if ($value == false) {
$value = "0";
}
}
if ($key == "insert_date") {
if ($value instanceof \DateTime) {
$value= $value->format('Y-m-d H:i:s');
}
}
// si il y a un dièse dans la clé renommée (exemple permanent_url), on doit executer une regexp
$dieses = explode('#', $field_value);
if (is_array($dieses) && count($dieses) == 3) {
$pattern = '/' . $dieses[1] . '/i';
$remplacement = $dieses[2];
$key = $dieses[0];
$value = preg_replace($pattern, $remplacement, $value, 1);
}
// si c'est une URL, on doit ajouter l'URL
if (strpos($key, 'url') !== false) {
//$value = $url.$value;
// si permanent_url, ajouter aussi object
$data_api['object'] = $data[$final_field_key];
}
// niveau premier
$data_api[$key] = $value;
}
}
}
return $data_api;
}
// }}}
// {{{ logDeletion()
/** Loguer les supressions
*
* @access public
* @param array $info Le log
* @return array
*/
public function logDeletion($info)
{
/**
* @TODO Ajouter un logger
*/
// utilisateur connu ?
// if($GLOBALS['sessionTheatre']->is_set('idextranetuser')) {
// $login = Theatre::factory('extranetusers')->getValue('login',$GLOBALS['sessionTheatre']->getValue('idextranetuser'));
// } else {
// $login = 'Unknown';
// }
//
// // on connait le contexte
// if(!empty($_SERVER['REQUEST_URI'])) {
// $request_uri = $_SERVER['REQUEST_URI'];
// } else {
// $request_uri = 'url inconnue';
// }
//
// // PEAR::Log
// require_once PATH_PEAR.'/Log.php';
// dans un fichier
// if(LOG_DELETE) {
// dump('log dans un fichier à revoir');
// @touch(LOG_DELETE);
// $loggerFile = &Log::singleton('file', LOG_DELETE, 'DELETE');
// $err = $login.'['.$request_uri.'] => '.$info;
// $loggerFile->log($err);
// }
}
// }}}
// {{{ arrayToIn()
/** Transformer les entrées en contenu pour IN sql
*
* @access public
* @param array $params L'entrée
* @return array
*/
public function arrayToIn($params)
{
if (!is_array($params)) {
$params = (array)$params;
}
foreach ($params as $k => $v) {
if (is_string($v)) {
$out[$k] = '\'' . $this->escape($v) . '\'';
} else {
$out[$k] = $v;
}
}
return join(',', $out);
}
// }}}
// generer un code aleatoire
function codeAlea($taille = 30, $uniqid = false)
{
if ($uniqid) {
return md5(uniqid(mt_rand(), true));
}
static $cars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPRQSTUVWXYZ0123456789';
$mdp = '';
for ($i = 0; $i < $taille; $i++) {
$mdp .= $cars[rand(0, 61)];
}
return $mdp;
}
// retourne la date courante au format timestamp
function now()
{
return date('Y-m-d H:i:s');
}
}