SSI, base commune sur le site et sur le forum

Started by kenoh, February 06, 2012, 01:27:57 PM

Previous topic - Next topic

kenoh

Bonjour à tous,

Je reviens vers vous car je sais que la base SSI permet de lier pas mal de choses du forum au site, cependant je viens vers vous car je rencontre quelques problèmes d'optimisation je dirais.

Quand je fais une news sur le forum, cette news est repris à l'état brut sur le site, et une news qui fait 300 lignes ça rend très moche, j'aimerai donc savoir si il y a possibilité de couper la news du site avec un lire la suite qui redirige sur le site à un article entier.

Je ne sais pas si c'est clair mais si un admin est disponible pour m'aider je pourrais exposer en problème vocalement ce serait peut-être plus simple.

Merci d'avance de votre aide.

Garédo

si c'est vien les news que tu parles, nouvelles et infolettres

c'est ce bout de code dasn SSI.php
// Show what would be the forum news.
function ssi_news($output_method = 'echo')
{
global $context;

if ($output_method != 'echo')
return $context['random_news_line'];

echo $context['random_news_line'];
}


comme tu vois il n'y a pas de possibilité de couper directement dans la fonction avec un paramètre

mais tu peut modifier

echo $context['random_news_line'];

en

echo substr($context['random_news_line'],0,150);

pour couper le texte entre le premier et le 150 ieme caractère
ça doit le faire

Support de mes Mods et Themes graphique en français pour smf. C'est par ici ! 
Un gitan ça sent bon, ça se lave sans savon....

kenoh

#2
J'ai testé ça ne change rien

function ssi_boardNews, ce n'est pas plutôt dans cette partie qu'il faut modifier quelque chose pour que la news apparaisse sur le site en résumé ?

Je pense que ça se joue ici :
// Show the latest news, with a template... by board.
function ssi_boardNews($board = null, $limit = null, $start = null, $length = null, $output_method = 'echo')
{
global $scripturl, $db_prefix, $txt, $settings, $modSettings, $context;
global $smcFunc;

loadLanguage('Stats');

// Must be integers....
if ($limit === null)
$limit = isset($_GET['limit']) ? (int) $_GET['limit'] : 5;
else
$limit = (int) $limit;

if ($start === null)
$start = isset($_GET['start']) ? (int) $_GET['start'] : 0;
else
$start = (int) $start;

if ($board !== null)
$board = (int) $board;
elseif (isset($_GET['board']))
$board = (int) $_GET['board'];

if ($length === null)
$length = isset($_GET['length']) ? (int) $_GET['length'] : 0;
else
$length = (int) $length;

$limit = max(0, $limit);
$start = max(0, $start);

// Make sure guests can see this board.
$request = $smcFunc['db_query']('', '
SELECT id_board
FROM {db_prefix}boards
WHERE ' . ($board === null ? '' : 'id_board = {int:current_board}
AND ') . 'FIND_IN_SET(-1, member_groups)
LIMIT 1',
array(
'current_board' => $board,
)
);
if ($smcFunc['db_num_rows']($request) == 0)
{
if ($output_method == 'echo')
die($txt['ssi_no_guests']);
else
return array();
}
list ($board) = $smcFunc['db_fetch_row']($request);
$smcFunc['db_free_result']($request);

// Load the message icons - the usual suspects.
$stable_icons = array('xx', 'thumbup', 'thumbdown', 'exclamation', 'question', 'lamp', 'smiley', 'angry', 'cheesy', 'grin', 'sad', 'wink', 'moved', 'recycled', 'wireless');
$icon_sources = array();
foreach ($stable_icons as $icon)
$icon_sources[$icon] = 'images_url';

// Find the post ids.
$request = $smcFunc['db_query']('', '
SELECT id_first_msg
FROM {db_prefix}topics
WHERE id_board = {int:current_board}' . ($modSettings['postmod_active'] ? '
AND approved = {int:is_approved}' : '') . '
ORDER BY id_first_msg DESC
LIMIT ' . $start . ', ' . $limit,
array(
'current_board' => $board,
'is_approved' => 1,
)
);
$posts = array();
while ($row = $smcFunc['db_fetch_assoc']($request))
$posts[] = $row['id_first_msg'];
$smcFunc['db_free_result']($request);

if (empty($posts))
return array();

// Find the posts.
$request = $smcFunc['db_query']('', '
SELECT
m.icon, m.subject, m.body, IFNULL(mem.real_name, m.poster_name) AS poster_name, m.poster_time,
t.num_replies, t.id_topic, m.id_member, m.smileys_enabled, m.id_msg, t.locked, t.id_last_msg
FROM {db_prefix}topics AS t
INNER JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_first_msg)
LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member)
WHERE t.id_first_msg IN ({array_int:post_list})
ORDER BY t.id_first_msg DESC
LIMIT ' . count($posts),
array(
'post_list' => $posts,
)
);
$return = array();
while ($row = $smcFunc['db_fetch_assoc']($request))
{
// If we want to limit the length of the post.
if (!empty($length) && $smcFunc['strlen']($row['body']) > $length)
{
$row['body'] = $smcFunc['substr']($row['body'], 0, $length);

// The first space or line break. (<br />, etc.)
$cutoff = max(strrpos($row['body'], ' '), strrpos($row['body'], '<'));

if ($cutoff !== false)
$row['body'] = $smcFunc['substr']($row['body'], 0, $cutoff);
$row['body'] .= '...';
}

DeathSign

Oui c'est plutôt ssi_boardNews (l'autre ça doit être pour les "nouvelles") et dans les arguments que cette fonction prend, tu as $length pour limiter le nombre de caractères qu'il te renvoie. Il mettra des points de suspensions à l'endroit où ce sera éventuellement coupé.

kenoh

#4
Voilà c'est fait et ça fonctionne maintenant j'aurai voulu savoir si un lire la suite pouvait se mettre automatiquement et si on pouvait passer la limite au caractères à une limite en ligne car c'est pratiquement impossible d'utiliser toujours le même nombre de caractères pour que la news coupe au bon endroit.

Garédo

oups désolé
j'ai lu news et je suis partis sur nouvelle :D

Support de mes Mods et Themes graphique en français pour smf. C'est par ici ! 
Un gitan ça sent bon, ça se lave sans savon....

kenoh

Quelqu'un a une idée pour mon problème sinon ?

Je peux montrer un site qui utilise ce système si vous le souhaitez pour plus d'aisance

DeathSign

Et bien soit tu laisses la fonction ssi_boardNews d'origine en utilisant l'argument $output_method avec une valeur autre que 'echo' par exemple 'return' pour récupérer le résultat dans une variable. Dans ce cas, c'est un tableau qui est retourné donc tu tronques la valeur de 'body' de chaque sujet suivant le nombre de ligne (la fonction substr_count() pourrait être utile) et pour afficher le lien [Lire la suite] tu utiliseras la clé 'href' de chaque sujet. Cf. la boucle foreach à fin de la fonction ssi_boardNews

Soit tu modifies la fonction ssi_boardNews, les lignes intéressantes se trouvent vers la fin de la fonction (J'évite bien que ce soit plus facile).

kenoh

Malheureusement mon niveau est médiocre donc là pour moi c'est parler chinois, à part la première partie que j'ai compris.

DeathSign

Dommage ! Tu avais l'air pressé alors je t'ai décrit ce que tu pouvais faire dès que j'ai pu :)

Je verrais plus tard je suis sur la traduction du forum :)

kenoh

Ok fait ce que tu as à faire, on verra quand t'auras finis et merci beaucoup ;)

DeathSign

Ah ça me revient, j'avais tenté de faire ça aussi un jour mais je n'ai pas trouvé de moyen propre et simple de le faire.

Compter les sauts à la ligne ça va mais faut aussi prendre en compte les retours à la ligne automatique quand le texte est trop long. En PHP c'est pas top car selon ton thème le nombre de caractère qui peut tenir sur une ligne change. Côté Javascript ça pourrait être plus efficace. Finalement j'avais préféré faire attention moi-même pour éviter de couper n'importe où mais si tu as des exemples ailleurs et le code source qui va avec, ça m'intéresserait de voir.

kenoh

#12
http://www.fureur.org/
http://tera.luna-atra.fr/

Voici 2 exemples, j'espère que ça t'aidera.

Celui là semble être le plus adapté puisque le forum est en smf
http://www.remake-online.com/

DeathSign

Tiens... Je crois connaître celui qui s'appelle Monsieur Putois et qui a posté certaines news sur le deuxième site x)

Ils ne me disent pas grand chose, mais ce que j'ai déjà vu ce sont des sites qui proposent une version courte de leur news, donc la version qui sera affiché sur l'accueil, et une version longue qu'on pourra lire avec un lien tel que [Lire la suite]. L'avantage c'est qu'on contrôle ce qui est affiché, ça implique par contre de modifier la base de données et tout et tout...

J'ai installé quelques portails d'ici pour voir et ceux qui proposent une limite ne permet que de couper après un certain nombre de mot.

Bref pour le lien [Lire la suite] quand la news est tronqué, je disais ça :

Quote$board_news = ssi_boardNews(1, 1, null, null, 'return');

foreach ($board_news as $news)
{
   echo '
      <div class="news_item">
         <h3 class="news_header">
            ', $news['icon'], '
            <a href="', $news['href'], '">', $news['subject'], '</a>
         </h3>
         <div class="news_timestamp">', $news['time'], ' ', $txt['by'], ' ', $news['poster']['link'], '</div>
         <div class="news_body" style="padding: 2ex 0;">', $news['body'], substr($news['body'], -3) == '...' ? ' <a href="' . $news['href'] . '">[Lire la suite]</a>' : '', '</div>
         ', $news['link'], $news['locked'] ? '' : ' | ' . $news['comment_link'], '
      </div>';

   if (!$news['is_last'])
      echo '
      <hr />';
}

Change le premier null en rouge par la longueur max et fais attention à ce que la variable $txt de SMF soit accessible pour $txt['by']

kenoh

Le "Lire la suite" ne va pas rediriger sur le forum plutôt que sur le site ou il y a moyen d'entrer manuellement l'adresse ?

DeathSign


kenoh

Oui mais moi je cherche à faire comme sur le site en question, c'est à dire de rediriger sur la news entière du site.

Bon je sais qu'on est sur le forum smf mais est-ce que vous savez si VBulletin permet cela facilement ? Je demande car sur Luna-atra et Fureur c'est justement VBulletin qui est utilisé pour leur forum.

DeathSign

#17
En fait si je me calque sur l'exemple, ta "news entière du site" n'est ni plus ni moins qu'une autre interface du sujet sur le forum. Dans ce que je t'ai proposé, libre à toi de modifier les liens pour faire pointer la news vers une autre page que sur le forum. Je n'impose rien, je ne fais que des propositions qui peuvent être améliorées et les critiques sont les bienvenues :)

kenoh

Oui mais ce que je veux dire, c'est est-ce que tu penses que ça peut créer une page web automatiquement avec les données de la news ou pas ?

DeathSign

Bah en fait je suis perdu car je ne comprends pas pourquoi tu me poses cette question.

Tu es arrivé en disant que SSI permettait de faire le lien entre le forum et le site, ce qui est vrai. Par site moi je comprends une structure plus ou moins indépendante de SMF et qui ne fonctionne pas sur SMF, ça va d'une simple page dynamique à un script plus conséquent (framework, CMS...).

Partant de là, SSI offre bien quelques fonctions qui permettent d'intégrer du contenu et des fonctionnalités venant du forum à ton site comme afficher les membres connectés au forum. Donc non il ne te fera pas ta page, ce sera toujours à toi de coder mais grâce à SSI tu es automatiquement connecté à la base, ce qui te permet de faire directement tes requêtes et de traiter les résultats comme tu le sens et où tu le veux (comme il n'y a pas à ma connaissance de fonction déjà faite dedans pour retourner tout le contenu d'un sujet de discussion et les réponses associées).


C'est peut-être moi qui ne comprend pas, si quelqu'un voit plus clair x)

Advertisement: