Bonjour,
Je fais un petit retour sur ce que j’ai fait, en regard des réponses données:
Le code suivant est une fonction permettant de retourner les ressources IDs, avec comme critère de recherche le parent conteneur et les valeurs des TVs (opérateur ’=’).
function _testing($conteneur, $tvs, $json) {
global $modx;
$modResource = $modx->getTableName('modResource');
$modTemplateVarResource = $modx->getTableName('modTemplateVarResource');
$modTemplateVar = $modx->getTableName('modTemplateVar');
$fields = array('modResource.id id','modResource.pagetitle pagetitle');
$query = $modx->newQuery('modResource');
$tv_id = 0;
foreach($tvs as $tv_name => $tv_value) {
if ($tv_value) {
$tv_id++;
$query->leftJoin('modTemplateVarResource','mtvr' . $tv_id, 'mtvr' . $tv_id . '.contentid = modResource.id');
$query->leftJoin('modTemplateVar','mtv' . $tv_id, 'mtv' . $tv_id . '.id = mtvr' . $tv_id . '.tmplvarid');
$query->andCondition(array(
'mtv' . $tv_id . '.name:=' => $tv_name,
'mtvr' . $tv_id . '.value:=' => $tv_value
));
$fields[] = 'mtvr' . $tv_id . '.value ' . $tv_name;
}
}
$query->andCondition(array('modResource.parent:='=>$conteneur));
$query->select($fields);
$query->prepare();
$results = $modx->getCollection('modResource', $query);
if ($results) {
$code=1;
foreach($results as $res) {$id[] = $res->get('id');}
$debug=array('resourceIds'=>print_r($id,true);
}else{
$code=0;
$message='Pas de résultat';
}
$data = array('code'=>$code,'html'=>$html, 'debug'=>$debug, 'message'=>$message);
if ($json) return json_encode($data);
return $data;
}
$tvs = array(
'nom_template_variable' => 'valeur recherché',
'nom_autre_template_variable' => 'valeur recherché'
);
echo _testing('4', $tvs, true);
C’est un prototype, qui fonctionne (sauf erreur de copié/collé/modification). Le résultat est retournée au format JSON, car cette fonction est appelé dans ce contexte en AJAX, pour un moteur multi-critère. Je me suis servit, dans une version plus complète de cette fonction, de getResources pour récupérer et mettre en page le résultat (valeur $html), en utilisant les paramètres parents=$conteneur, resources=implode(’,’,$id), includeTVs=1, et un tpl pour le rendu, et accessoirement un sortby...
Néanmoins, pour parfaire le résultat, j’ai dut modifié le getResources (version 1.3.0) à la ligne 150, en définissant une condition AND au lieu de OR, sinon, il me ressortait toutes les ressources sans faire cas du filtre.
Cette fonction n’est pas en l’état parfaite, et je suppose qu’il y a des éléments qui manquent (condition des recherches des TVs) ou en trop.
Merci encore pour la contribution initiale, qui m’a permit de réaliser cette fonction, et aussi à l’aide de la documentation, qui somme toute, est assez complète pour peu que l’on se prenne la peine de la lire, RTFM, CQFD.
Low