web-dev-qa-db-fra.com

Module de balises similaires avec image et introtext

Pour le module natif de Joomla "Tags similaires", nous n'avons que le titre de l'article. Comment avoir aussi l'introtexte et l'image d'intro?

Voici le code natif avec mes tests de code:

defined('_JEXEC') or die;

JLoader::register('TagsHelperRoute', JPATH_BASE . '/components/com_tags/helpers/route.php');

if ($list) : ?>
    <ul class="tagssimilar">
    <?php foreach ($list as $i => $item) : ?>
        <?php if (empty($item->core_title)) continue; ?>
        <li>
        <?php if (($item->type_alias == 'com_users.category') || ($item->type_alias == 'com_banners.category')) : ?>
            <?= htmlspecialchars($item->core_title, ENT_COMPAT, 'UTF-8') ?>
        <?php else: $item->route = new JHelperRoute; ?>
            <a href="<?= JRoute::_(TagsHelperRoute::getItemRoute($item->content_item_id, $item->core_alias, $item->core_catid, $item->core_language, $item->type_alias, $item->router)) ?>">
                <?= htmlspecialchars($item->core_title, ENT_COMPAT, 'UTF-8') ?>
            </a>
        <?php endif

Ma première tentative (partie 1): Modification de la page de résultats des balises Joomla

    //image
    $images  = json_decode($item->core_images);
    echo '<p><img class="intro-image" src="'.$images->image_intro.'"></p>';                  
    //introtext
    $limit =300;
    if (strlen($item->text) > $limit) {
        echo (substr($item->text, 0, $limit)) ?> <a href="<?php echo JRoute::_(TagsHelperRoute::getItemRoute($item->content_item_id, $item->core_alias, $item->core_catid, $item->core_language, $item->type_alias, $item->router)); ?>">...</a>
        <?php
    }
    else {
        echo $item->text;
    }

Ma première tentative (partie 2): Modification de la page de résultats des balises Joomla

//introtext
echo $item->text;
//image
$images  = json_decode($item->core_images);
echo '<img src="'.$images->image_intro.'">';
//get category name by id
$db = JFactory::getDbo();
$id = $item->core_catid;
$db->setQuery("SELECT cat.title FROM #__categories cat WHERE cat.id='$id'");
$category = $db->loadResult();
echo '<p>'.$category.'</p>';

Ma deuxième tentative: module Ajout d'images aux derniers articles ?>

    // This gets the image data associated with the article and processes it so PHP can use it properly.
    $images = json_decode($item->images);

    // This checks the Intro Image exists and isn't empty.
    if (isset($images->image_intro) && !empty($images->image_intro)) :
        // This displays it.
        ?>
        <div class="thumbnail item-image">
            <img src="<?php echo htmlspecialchars($images->image_intro); ?>" alt="<?php echo htmlspecialchars($images->image_intro_alt); ?>" itemprop="image"/>
        </div>
    <?php endif; ?>

Ma troisième tentative: https://www.joomlashack.com/blog/joomla/most-read-intro-images/

$images = json_decode($item->images);
?>  
<div class="span4">
    <?php if( $images->image_intro ) : ?>
        <img src="/<?php echo $images->image_intro; ?>" alt="<?php echo htmlspecialchars($item->title); ?>" />
    <?php endif; ?>

    <a href="/<?php echo $item->link; ?>">
        <?php echo $item->title; ?></a>
</div>

... et la fin du premier bloc de code ...

    </li>
<?php endforeach ?>
</ul>
<?php else : ?>
<span><?= JText::_('MOD_TAGS_SIMILAR_NO_MATCHING_TAGS') ?></span>
<?php endif ?>
2
user10465385

Dans le remplacement de modèle, avant que la boucle d’éléments ne demande, interrogez la base de données pour obtenir les données dont vous avez besoin. Cela retournera un tableau d'objets indexés sur core_content_id.

$db = JFactory::getDbo();
$query = $db->getQuery(true)
    ->select($db->quoteName(array('core_content_id', 'core_images', 'core_body')))
    ->from($db->quoteName('#__ucm_content'))
    ->where($db->quoteName('core_content_id') . ' IN (' . implode(',', array_column($list, 'core_content_id')) . ')');
$extraData = $db->setQuery($query)->loadObjectList('core_content_id');

Ensuite, à l'intérieur de la boucle d'éléments, vous pouvez utiliser les données de différentes manières. Vous pouvez fusionner l'article avec les données:

$item = (object) array_merge((array) $item, (array) $extraData[$item->core_content_id]);

Ou vous pouvez affecter les propriétés séparément:

$item->images    = $extraData[$item->core_content_id]->core_images;
$item->introtext = $extraData[$item->core_content_id]->core_body;

Ou vous pouvez utiliser les données directement:

<?php // Display introtext ?>
<?php echo $extraData[$item->core_content_id]->core_body; ?>

<?php // Display intro image ?>
<?php $images = json_decode($extraData[$item->core_content_id]->core_images); ?>
<?php if (!empty($images->image_intro)) : ?>
    <img src="<?php echo htmlspecialchars($images->image_intro, ENT_QUOTES, 'UTF-8'); ?>" alt="<?php echo htmlspecialchars($images->image_intro_alt, ENT_QUOTES, 'UTF-8'); ?>">
<?php endif; ?>

En passant, je peux voir que cette fonctionnalité est implémentée dans le noyau. Si vous êtes d'accord, vous pouvez essayer de soumettre une demande de fonctionnalité au système de suivi des problèmes.

0
Sharky