web-dev-qa-db-fra.com

Obtenir une réponse à bump post dans JComments, prendre en compte une autre requête

J'écris ceci dans l'espoir que quelqu'un connaisse les variables, les objets et tout cela dans différentes sections de JComments.

J'utilise une requête dans tpl_tree.php pour obtenir la date de la dernière réponse faite dans le fil et qui s'affiche au niveau supérieur. Il y a peut-être une meilleure façon de l'écrire, mais je suis très nouveau sur php et les bases de données, et il affiche ce dont j'ai besoin pour correctement.

if ($comment->children == 0) {
echo JCommentsText::formatDate($comment->date, JText::_('D M j Y g:ia')); 
} else { 

   $db = JFactory::getDbo();
   $db->setQuery('SELECT thread_id, date 
                  FROM #__jcomments
                  WHERE thread_id = ' . $comment->id . '
                  ORDER BY date DESC LIMIT 1');
   $db->loadAssocList();

   $row = $db->loadAssocList(); 

   foreach ($row as $item) { 
      echo JHtml::_('date', $item[date], JText::_('D M j Y g:ia')); 
   } 
} ?>

Maintenant, le problème semble être comment obtenir cette date pour remplacer la date du commentaire parent = 0 dans la commande. Je n'arrive pas à comprendre la syntaxe à utiliser pour exécuter cette requête car les -> enfants ne fonctionnent pas lorsque le code orderby est défini, puis ils utilisent cette date à la place de la date parente lorsque des cas de réponse se présentent.

L'ordre dans est défini dans les paramètres de jcomments dans l'administration, mais la prise en compte des réponses n'est pas une option dans les paramètres. Le code à modifier est donc composants/com_jcomments/models/jcomments.php Il y a 3 références à l'ordre dans lequel les commentaires sont listés, le premier en haut

if (!isset($options['orderBy'])) {
            $options['orderBy'] = self::_getDefaultOrder();
        }

le second est le cas dans la requête où il définit parent = 0 comments as threaddate:

. "\n,
     case 
       when c.parent = 0 
       then unix_timestamp(c.date)
       else 0 
     end as threaddate"

et la troisième est la fonction qui alimente le résultat du paramètre admin vers le code du haut:

if ($config->get('template_view') == 'tree') {
            switch($config->getInt('comments_tree_order')) {
                case 2:
                    $result = 'threadDate DESC, c.date ASC';
                    break;
                case 1:
                    $result = 'c.parent, c.date DESC';
                    break;
                default:
                    $result = 'c.parent, c.date ASC';
                    break;
            }

Le cas 2 étant l’ordre des commentaires est actuellement défini sur. J'ai essayé d'ajouter des cas à la requête, mais je n'arrive pas à trouver le libellé ou la syntaxe appropriés pour qu'il examine thread_id. S'il correspond à l'identifiant de parent = 0, obtenez la date la plus récente de toutes ces correspondances sous la forme threaddate. mettre dans l'ordre. Ou peut-être que quelqu'un voit une meilleure façon de faire cette vérification supplémentaire dans l'un des autres domaines? J'ai essayé à peu près tout ce à quoi je peux penser et je n'ai pas encore été capable d'y travailler. Toute aide serait appréciée.

Exemple de base de données, les noms de base de données ont été modifiés et les emails sont tous mes emails de compte de test. https://www.db-fiddle.com/f/4pqz9MFGGaQ1ucB3nmw1De/

Ceci est la requête entière de components/com_jcomments/models/jcomments.php

$query = "SELECT c.id, c.parent, c.object_id, c.object_group, c.userid, c.name, c.username, c.title, c.comment"
        . "\n, c.email, c.homepage, c.date, c.date as datetime, c.ip, c.published, c.deleted, c.checked_out, c.checked_out_time"
        . "\n, c.isgood, c.ispoor"
        . ($votes ? "\n, v.value as voted" : "\n, 1 as voted")
        . "\n, case when c.parent = 0 then unix_timestamp(c.date) else 0 end as threaddate"
        . ($objectinfo ? "\n, jo.title AS object_title, jo.link AS object_link, jo.access AS object_access" : ", '' AS object_title, '' AS object_link, 0 AS object_access, 0 AS object_owner")
        . "\nFROM #__jcomments AS c"
        . ($votes ? "\nLEFT JOIN #__jcomments_votes AS v ON c.id = v.commentid " . ($acl->getUserId() ? " AND  v.userid = " . $acl->getUserId() : " AND v.userid = 0 AND v.ip = '" . $acl->getUserIP() . "'") : "")
        . ($objectinfo ? "\n LEFT JOIN #__jcomments_objects AS jo ON jo.object_id = c.object_id AND jo.object_group = c.object_group AND jo.lang=c.lang" : "")
        . (count($where) ? ("\nWHERE " . implode(' AND ', $where)) : "")
        . "\nORDER BY " . $orderBy
        . (($limit > 0) ? "\nLIMIT $limitStart, $limit" : "");

    return $query;
3
Mythic

* Notez que tout piratage dans les fichiers d'extension risque d'être écrasé lors de la mise à niveau d'une extension.

En tant que solution mysql pure, il vous suffit d'écrire une sous-requête dans le composant $query @ /com_jcomments/models/jcomments.php de function _getCommentsQuery().

La sous-requête assignera effectivement un parent avec la date maximale (dernière) de lui-même et tous ses enfants en fonction des données thread_id.

Comme le résultat conditionnel de cette condition dans la clause SELECT est binaire, une expression IF convient mieux qu'une expression verbeuse CASE.

. "\n, IF(c.thread_id = 0, (SELECT MAX(date) FROM tsp_jcomments WHERE thread_id = c.id OR id = c.id), c.date) AS threaddate"

UPDATE: Après les commentaires de @Mythic, l'ordre souhaité dicte que la valeur else soit 0, Comme ceci:

"\n, IF(c.parent = 0, (SELECT MAX(date) FROM tsp_jcomments WHERE thread_id = c.id OR id = c.id), 0) AS threaddate

La logique dit:

  • si thread_id est 0 (ce qui signifie que la ligne est un parent)
    • puis recherchez la dernière valeur de date dans la même table (en tant que nouvel ensemble de données) tant que la valeur thread_id de la nouvelle ligne correspond à la valeur id de la ligne d'origine ou si id valeur correspond à id de la ligne d'origine.
  • sinon, (signifiant que la ligne n'est pas un parent)
    • utilisez la valeur de colonne date de la ligne.

Voici une démonstration de la solution sur vos exemples de données: https://www.db-fiddle.com/f/4pqz9MFGGaQ1ucB3nmw1De/4

Voici une représentation visuelle du fonctionnement de la tâche:

||    [logic]             threaddate      | id  | thread_id |       date                
|| ---------------- | ------------------- | --- | --------- | ------------------- 
|| MAX() from 70 -> | 2018-10-18 18:21:58 | 1   | 0         | 2018-07-21 08:04:04 
|| self ->          | 2018-07-24 22:00:26 | 3   | 1         | 2018-07-24 22:00:26 
|| self ->          | 2018-07-24 22:07:59 | 4   | 1         | 2018-07-24 22:07:59 
|| self ->          | 2018-07-29 02:25:02 | 5   | 0         | 2018-07-29 02:25:02 
|| MAX() from 80 -> | 2018-10-20 15:42:41 | 9   | 0         | 2018-07-29 11:43:00 
|| self ->          | 2018-08-07 11:29:05 | 11  | 1         | 2018-08-07 11:29:05 
|| self ->          | 2018-08-19 01:59:46 | 13  | 0         | 2018-08-19 01:59:46 
|| self ->          | 2018-08-20 05:10:22 | 14  | 0         | 2018-08-20 05:10:22 
|| MAX() from 96 -> | 2018-10-28 23:05:59 | 15  | 0         | 2018-09-10 09:16:31 
|| self ->          | 2018-09-10 11:03:08 | 16  | 15        | 2018-09-10 11:03:08 
|| self ->          | 2018-09-10 13:01:59 | 17  | 1         | 2018-09-10 13:01:59 
|| self ->          | 2018-09-12 05:14:56 | 18  | 15        | 2018-09-12 05:14:56 
|| MAX() from 62 -> | 2018-10-10 20:19:25 | 19  | 0         | 2018-09-13 21:43:02 
|| self ->          | 2018-09-13 21:45:25 | 20  | 19        | 2018-09-13 21:45:25 
|| self ->          | 2018-09-13 21:50:27 | 21  | 19        | 2018-09-13 21:50:27 
|| self ->          | 2018-09-13 21:55:03 | 22  | 19        | 2018-09-13 21:55:03 
|| self ->          | 2018-09-13 22:32:04 | 23  | 1         | 2018-09-13 22:32:04 
|| self ->          | 2018-09-14 01:50:59 | 24  | 1         | 2018-09-14 01:50:59 
|| self ->          | 2018-09-14 01:51:53 | 25  | 1         | 2018-09-14 01:51:53 
|| self ->          | 2018-09-14 01:52:42 | 26  | 1         | 2018-09-14 01:52:42 
|| self ->          | 2018-09-14 01:54:22 | 27  | 1         | 2018-09-14 01:54:22 
|| self ->          | 2018-09-14 01:55:36 | 28  | 1         | 2018-09-14 01:55:36 
|| self ->          | 2018-09-14 01:57:33 | 29  | 1         | 2018-09-14 01:57:33 
|| self ->          | 2018-09-14 01:59:30 | 30  | 1         | 2018-09-14 01:59:30 
|| self ->          | 2018-09-16 22:50:29 | 31  | 1         | 2018-09-16 22:50:29 
|| self ->          | 2018-10-07 05:14:01 | 33  | 1         | 2018-10-07 05:14:01 
|| self ->          | 2018-10-07 11:31:46 | 34  | 0         | 2018-10-07 11:31:46 
|| self ->          | 2018-10-07 11:32:44 | 35  | 0         | 2018-10-07 11:32:44 
|| self ->          | 2018-10-07 11:33:17 | 36  | 0         | 2018-10-07 11:33:17 
|| self ->          | 2018-10-07 11:34:06 | 37  | 0         | 2018-10-07 11:34:06 
|| self ->          | 2018-10-07 11:34:41 | 38  | 0         | 2018-10-07 11:34:41 
|| self ->          | 2018-10-07 11:35:21 | 39  | 0         | 2018-10-07 11:35:21 
|| self ->          | 2018-10-07 11:35:59 | 40  | 0         | 2018-10-07 11:35:59 
|| self ->          | 2018-10-07 11:36:44 | 41  | 0         | 2018-10-07 11:36:44 
|| self ->          | 2018-10-09 11:24:22 | 42  | 0         | 2018-10-09 11:24:22 
|| self ->          | 2018-10-09 11:25:03 | 43  | 0         | 2018-10-09 11:25:03 
|| self ->          | 2018-10-09 11:25:41 | 44  | 0         | 2018-10-09 11:25:41 
|| self ->          | 2018-10-09 11:26:42 | 45  | 0         | 2018-10-09 11:26:42 
|| self ->          | 2018-10-09 11:27:29 | 46  | 0         | 2018-10-09 11:27:29 
|| self ->          | 2018-10-09 11:28:07 | 47  | 0         | 2018-10-09 11:28:07 
|| self ->          | 2018-10-09 11:28:58 | 48  | 0         | 2018-10-09 11:28:58 
|| self ->          | 2018-10-09 11:29:44 | 49  | 0         | 2018-10-09 11:29:44 
|| self ->          | 2018-10-09 11:32:02 | 50  | 0         | 2018-10-09 11:32:02 
|| self ->          | 2018-10-09 11:33:34 | 51  | 0         | 2018-10-09 11:33:34 
|| self ->          | 2018-10-09 11:34:10 | 52  | 0         | 2018-10-09 11:34:10 
|| self ->          | 2018-10-09 11:34:58 | 53  | 0         | 2018-10-09 11:34:58 
|| self ->          | 2018-10-09 11:35:57 | 54  | 0         | 2018-10-09 11:35:57 
|| self ->          | 2018-10-09 11:36:28 | 55  | 0         | 2018-10-09 11:36:28 
|| self ->          | 2018-10-09 11:37:30 | 56  | 0         | 2018-10-09 11:37:30 
|| self ->          | 2018-10-09 11:38:01 | 57  | 0         | 2018-10-09 11:38:01 
|| self ->          | 2018-10-09 11:38:43 | 58  | 0         | 2018-10-09 11:38:43 
|| self ->          | 2018-10-09 11:39:17 | 59  | 0         | 2018-10-09 11:39:17 
|| self ->          | 2018-10-10 19:23:52 | 60  | 19        | 2018-10-10 19:23:52 
|| self ->          | 2018-10-10 19:56:09 | 61  | 19        | 2018-10-10 19:56:09 
|| MAX() for 19 ->  | 2018-10-10 20:19:25 | 62  | 19        | 2018-10-10 20:19:25 
|| self ->          | 2018-10-13 21:53:45 | 63  | 0         | 2018-10-13 21:53:45 
|| self ->          | 2018-10-13 21:58:35 | 64  | 0         | 2018-10-13 21:58:35 
|| self ->          | 2018-10-13 22:16:41 | 65  | 0         | 2018-10-13 22:16:41 
|| self ->          | 2018-10-15 05:37:36 | 66  | 1         | 2018-10-15 05:37:36 
|| self ->          | 2018-10-15 06:51:10 | 67  | 1         | 2018-10-15 06:51:10 
|| self ->          | 2018-10-18 18:02:31 | 68  | 1         | 2018-10-18 18:02:31 
|| self ->          | 2018-10-18 18:03:26 | 69  | 1         | 2018-10-18 18:03:26 
|| MAX() for 1 ->   | 2018-10-18 18:21:58 | 70  | 1         | 2018-10-18 18:21:58 
|| self ->          | 2018-10-20 07:46:00 | 71  | 15        | 2018-10-20 07:46:00 
|| self ->          | 2018-10-20 08:16:58 | 72  | 15        | 2018-10-20 08:16:58 
|| self ->          | 2018-10-20 15:01:07 | 73  | 9         | 2018-10-20 15:01:07 
|| self ->          | 2018-10-20 15:04:49 | 74  | 9         | 2018-10-20 15:04:49 
|| self ->          | 2018-10-20 15:05:58 | 75  | 9         | 2018-10-20 15:05:58 
|| self ->          | 2018-10-20 15:40:11 | 76  | 9         | 2018-10-20 15:40:11 
|| self ->          | 2018-10-20 15:40:49 | 77  | 9         | 2018-10-20 15:40:49 
|| self ->          | 2018-10-20 15:41:22 | 78  | 9         | 2018-10-20 15:41:22 
|| self ->          | 2018-10-20 15:42:11 | 79  | 9         | 2018-10-20 15:42:11 
|| MAX() for 9 ->   | 2018-10-20 15:42:41 | 80  | 9         | 2018-10-20 15:42:41 
|| self ->          | 2018-10-21 01:37:22 | 81  | 15        | 2018-10-21 01:37:22 
|| self ->          | 2018-10-22 15:19:45 | 82  | 0         | 2018-10-22 15:19:45 
|| self ->          | 2018-10-23 21:30:41 | 83  | 0         | 2018-10-23 21:30:41 
|| self ->          | 2018-10-25 13:46:26 | 84  | 0         | 2018-10-25 13:46:26 
|| self ->          | 2018-10-25 13:47:13 | 85  | 0         | 2018-10-25 13:47:13 
|| self ->          | 2018-10-25 13:48:03 | 86  | 0         | 2018-10-25 13:48:03 
|| self ->          | 2018-10-25 13:48:37 | 87  | 0         | 2018-10-25 13:48:37 
|| self ->          | 2018-10-25 13:50:01 | 88  | 0         | 2018-10-25 13:50:01 
|| self ->          | 2018-10-25 13:50:31 | 89  | 0         | 2018-10-25 13:50:31 
|| self ->          | 2018-10-25 13:51:18 | 90  | 0         | 2018-10-25 13:51:18 
|| self ->          | 2018-10-25 13:51:50 | 91  | 0         | 2018-10-25 13:51:50 
|| self ->          | 2018-10-25 13:52:23 | 92  | 0         | 2018-10-25 13:52:23 
|| MAX() for 15 ->  | 2018-10-28 23:05:59 | 96  | 15        | 2018-10-28 23:05:59 

Ce n'est qu'un moyen de résoudre le problème. Je suis convaincu qu'il pourrait y avoir plusieurs façons de résoudre ce problème.

p.s. Après avoir jeté un coup d'œil sous le capot, je n'aime pas certaines des pratiques de codage/style de l'extension. Il n'utilise pas les méthodes de construction de requêtes de Joomla, mais le @ ( opérateur de contrôle d'erreur/stf ) qui est généralement mal vu, et les requêtes elles-mêmes pourraient être écrites de manière plus éloquente.

2
mickmackusa