web-dev-qa-db-fra.com

Comment inclure des images dans les résultats de recherche de Joomla?

J'essaie d'afficher des images dans les résultats de recherche pour la recherche par défaut de Joomla. J'ai joué avec du code provenant du Web et j'ai réussi à afficher des images avec les éléments suivants:

dans le modèle/html/com_search/com_search/search/default_results.php:

à la ligne 9, j'ai ajouté:

$db = JFactory::getDbo();
$article = JTable::getInstance('Content', 'JTable');

puis au dessus:

<dd class="result-text">  <?php echo $result->text;?></dd>

J'ai ajouté:

<?php   
// Joomla content
if( strstr($result->href, 'com_content') ) 
{
    preg_match_all('#\d+#', $result->href, $val);
    $id = (int)$val[0][0];
    $article->load($id);            
}
?>

<?php
$dom = new DOMDOcument;
$dom->loadHTML($article->introtext);
$images = $dom->getElementsByTagName('img');
if (isset($images[0])) {
    ?>
    <img src="<?php echo $images[0]->getAttribute('src'); ?>" class="search-results-img">
    <?php 
}
?>

Le résultat est des images dans les résultats de recherche avec une classe d'images pour le style en CSS, MAIS cela ne fonctionne que pour la recherche d'article. Si la recherche comprend également des catégories, j'obtiens:

Avertissement: DOMDocument :: loadHTML (): chaîne vide fournie en entrée.

Je pense que l'avertissement est dû à $dom->loadHTML($article->introtext);

Je veux que quelqu'un vérifie le code car je pense que l'utilisation de preg_match_all() n'est pas la meilleure pratique et je dois inclure l'image des catégories.

1
johnl

Quelques conseils à proposer:

Lors de la vérification de l'existence d'une sous-chaîne dans une chaîne, la documentation PHP conseille:

Remarque:

Si vous voulez seulement déterminer si une aiguille particulière se produit dans une botte de foin, utilisez plutôt la fonction strpos () plus rapide et moins gourmande en mémoire.

Il est donc préférable d'utiliser if (strpos($result->href, 'com_content') !== false) {

Quant à l'extraction de la sous-chaîne numérique, vous pourriez recevoir un appel de filter_var():

$id = (int)filter_var($result->href, FILTER_SANITIZE_NUMBER_INT);

Cependant, votre cas est une excellente occasion d'effectuer la validation et l'extraction en même temps avec un appel de fonction preg_.

Parce que vous ne souhaitez faire qu'une seule correspondance, utilisez simplement preg_match() au lieu de preg_match_all(). Je peux vous aider avec ce modèle à double usage, en utilisant votre valeur fournie de:

index.php?option=com_content&view=article&id=14623:vw-tiguan-allspace-geneva-2017&catid=136

J'ai un penchant pour utiliser \K Pour redémarrer la correspondance de chaîne complète au lieu d'utiliser des groupes de capture. Il s'agit d'une micro-optimisation qui réduit le nombre de "pas" du moteur regex et cela élimine également les ballonnements inutiles du tableau de sortie (dans $match ... voir mon extrait ci-dessous).

Pour éviter l'avertissement de la ligne DOMDocument, vous devez également encapsuler cette partie de votre script dans votre bloc de condition. Si vous devez fournir une valeur de secours pour les catégories, cela ira dans votre bloc de condition else. Alternativement, vous pouvez simplement envelopper votre code d'analyse DOM dans une condition qui vérifie si $article->introtext Isset (). if (isset($article->introtext)) { ... }

Voici ma recommandation générale (non testée):

$imageSrc = '';
if (preg_match('~index\.php\?option=com_content&view=article&id=\K\d+~', $result->href, $match)) {
    //validation ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^      ^^^--- extraction
    $db = JFactory::getDbo();
    $article = JTable::getInstance('Content', 'JTable');
    $article->load((int)$match[0]);

    if (isset($article->introtext)) {
        $dom = new DOMDOcument;
        $dom->loadHTML($article->introtext);
        $images = $dom->getElementsByTagName('img');
        if (isset($images[0])) {
            $imageSrc = $images[0]->getAttribute('src');
        }
    }
}

Lorsque vous souhaitez utiliser $imageSrc ...

if ($imageSrc) {
    echo "<img src=\"{$imageSrc}\" class=\"search-results-img\" alt=\"\">";
}

Encore une fois, cela n'est pas testé, mais basé sur n autre extrait que j'ai trouvé , cela pourrait être une meilleure façon de tirer l'image de l'article:

if (isset($article->images)) {
    $images = json_decode($article->images);
    if (isset($images->image_intro, $images->image_intro_alt)) {
        echo "<img class=\"image_intro\" src=\"{$images->image_intro}\" alt=\"{$images->image_intro_alt}\">";
    }
}
1
mickmackusa