2017-06-13 1 views
0

Description succincte de la situation:Sulu CMS: comment rechercher/filtrer le contenu d'un type spécifique avec des valeurs spécifiques pour les attributs spécifiques?

  • Nous courons une version fourchue de Sulu 1.5.2, PHP 7.1, environnement de serveur Windows, connexion db avec PostgreSQL
  • Nous avons une structure de site/arbre où nous avoir house modèles au plus haut niveau; chaque maison a un house_rooms et un modèle house_occupants; chaque modèle house_rooms a des modèles N house_rooms_room, et chaque modèle house_occupants a des modèles N house_occupants_occupant. Cela représente une maison réelle qui a N chambres et N occupants.

Maintenant, je voudrais savoir s'il y a un moyen d'obtenir plus précisément, par exemple, tous le contenu house_occupants_occupant qui suit un certain modèle d'attributs (par exemple: leur valeur ayant attribut gender « femme » et leur paramètre date_of_birth étant> = 1990/01/01), sans avoir à charger chaque house, puis trouver sa page house_occupants parmi les enfants, puis faire une boucle sur les house_occupants_occupant enfants de ce modèle et filtrer le contenu ainsi engendré en fonction de leur sexe et de leur date des attributs de naissance.

je l'ai déjà trouvé qu'il ya une classe ContentRepository qui peut ::findAll() et ::findByUuids(), mais il ne semble pas être un moyen de filtrer sur des attributs spécifiques (comme le type de modèle, les attributs modèle, ...). J'ai donc pris une façon détournée de créer mon propre « référentiel » qui fait des requêtes PDO directes sur la table phpcr_nodes dans la base de données, pour analyser spécifiquement l'attribut props pour l'apparition d'un certain nom du modèle:

$this->pdo->query("SELECT identifier, props FROM phpcr_nodes WHERE props LIKE '%>house_occupants_occupant<%'"); 

je peux voir que le props contient une valeur de chaîne représentant un document XML qui se traduit en quelque sorte dans le modèle entier avec des paires attribut-valeur, mais il est obscurci concernant les niveaux de tag et comment certains attributs se rapportent à certaines valeurs. Alors en théorie je pourrais utiliser un analyseur XML spécifique pour la transformer en quelque chose de lisible par l'homme, de sorte que pour mes données house_occupants_occupant je pourrais obtenir quelque chose comme:

// what I would get after putting the props through a certain XML parser: 
$xmlHumanReadableData = [ 
    '<the_uuid_of_occupant_1>' => [ 
     ... 
     'gender' => 'female', 
     'date_of_birth' => '1992-05-18T00:00:00.000+00:00', 
     ... 
    ], 
    ... //etcetera etcetera 
]; 

Quand j'aurais, je pourrais filtrer la des données lisibles pour déterminer le contenu que je souhaite conserver, ajoutez le nœud uuid à une variable $theUuids, puis récupérez le contenu réel à l'aide de la méthode ContentRepository::findByUuids($theUuids) de Sulu. Cela ne nécessiterait "que" 2 requêtes et un certain filtrage PHP, ce qui est bien mieux que de boucler tout le contenu des enfants à partir d'un parent et de le faire jusqu'à ce que vous ayez traversé tous les parents et tous leurs enfants. .. (Certainement, la surcharge augmenterait si vous vouliez rechercher, par exemple, tous les noeuds house où au moins un de ses noeuds house_occupants_occupant représente un enfant de moins de 10 ans, car vous auriez besoin de requêtes supplémentaires pour " mettre en place » le filterData utilisé dans la requête finale, mais encore. beaucoup mieux que tout en boucle ... ;-))

donc ma question est tri de deux ordres:

  • Quelle est la Sulu-spécifique Analyseur XML Je peux utiliser pour transformer la valeur de chaîne XML dans cette colonne props en quelque chose de lisible par l'homme, avec des paires attribut-valeur correctes?
  • Et/ou, nous l'espérons: est-il un moyen que je peux éviter tout ce non-sens et il suffit d'utiliser un moyen moins faible niveau de la récupération du contenu d'un modèle de type spécifique avec valeurs spécifiques pour attributs spécifiques?

Répondre

0

Le ContentRepository que vous avez trouvé est déjà une abstraction de certaines de nos exigences pour les pages. Vos besoins sont déjà spécifiques, vous devez donc écrire votre propre requête en utilisant SQL-2, le query language for PHPCR.

Cela devrait vous permettre d'écrire une requête qui correspond à vos besoins.

+0

Merci pour votre réponse. Je vais lire à ce sujet et revenir à ce poste une fois que j'ai donné un coup de feu :) –