entrypaging in entries.tpl

Hier können Probleme und alles andere in Deutscher Sprache gelöst werden.
Post Reply
mitch
Regular
Posts: 22
Joined: Tue Mar 15, 2016 8:57 pm
Contact:

entrypaging in entries.tpl

Post by mitch »

Mahlzeit!

Ich möchte das Entrypaging-Plugin nutzen, um zwischen den Artikeln wechseln zu können. Da ich die Navigation dafür zwischen dem eigentlichen Artikel und dem Bereich mit den Trackbacks und Kommentaren haben will, habe ich die Position auf „Smarty“ gestellt und angefangen, an meiner entries.tpl zu schrauben.

Nachdem ich vier Stunden gebastelt und geflucht habe, bin ich auf diesen Thread gestoßen und habe kapiert, dass mein Problem mit Scoping in Smarty 3 zu tun hat.
Mit diesem Wissen gewappnet habe ich weitere zwei Stunden gebastelt und geflucht und es trotzdem nicht per Templating zum Laufen bekommen :-)

Mit einer selbstgebauten PHP-Funktion in der „config.inc.php“ geht es, die rufe ich dann einfach per „{my_pagination}“ auf und gut ist:

Code: Select all

# work around weird scoping issues in Smarty 3
# see http://board.s9y.org/viewtopic.php?f=10&t=19641&hilit=entrypaging+smarty
function my_pagination($params, &$smarty)
{
    $vars = $smarty->{'smarty'}->{'tpl_vars'};
    $P = $vars['pagination_prev_link'];
    $N = $vars['pagination_next_link'];
    if ($P || $N) {
            echo '<div class="serendipity_entrypaging">';
        if ($P) {
            echo "<a href='$P\' id='pagination_left'>◀</a>";
        }
        if ($N) {
            echo "<a href='$N' id='pagination_right'>▶</a>";
        }
            echo '</div>';
    }
}
So weit, so gut, aber ich würde gerne verstehen, ob man das gewünschte nicht vielleicht doch irgendwie ausschließlich mit Templating hinbekommt?

Und wenn nicht, würde ich gerne wissen, *warum* das ganze nicht funktioniert. Fazit des oben verlinkten Threads war „das liegt am Scoping; in der content.tpl hast Du die Variablen, in der entries.tpl aber nicht”.
Wenn ich in der entries.tpl ein „{debug}“ einfüge, dann werden mir in der Variablenübersicht die vom entrypaging-Plugin generierten Variablen angezeigt (unter genau dem Pfad, den ich oben zum Auslesen benutze). 'tpl_vars' müssten doch genau die Variablen sein, die ich auch an den anderen Stellen erfolgreich in entries.tpl benutze (z.B. $entry oder $entries), warum klappt das nicht?

Ich kann nachts nicht mehr schlafen, wenn ich das nicht verstehe ;-)

Danke und Gruß
Christian

Code: Select all

READY.
█
Timbalu
Regular
Posts: 4598
Joined: Sun May 02, 2004 3:04 pm

Re: entrypaging in entries.tpl

Post by Timbalu »

mitch wrote:Ich kann nachts nicht mehr schlafen, wenn ich das nicht verstehe ;-)
Das Problem kenne ich gut! :)
mitch wrote:...habe ich die Position auf „Smarty“ gestellt und angefangen...
Das Plugin hat doch gar keine solche Einstellung!? Wo hast du das eingestellt?
Edit: OK habs gefunden ... :)
mitch wrote:So weit, so gut, aber ich würde gerne verstehen, ob man das gewünschte nicht vielleicht doch irgendwie ausschließlich mit Templating hinbekommt?
Hast du die (im erw. Thread) vorgeschlagene Verschiebung in die content.tpl mal probiert?
Oder sogar die capture Geschichte (dort) genutzt, so dass es (dann) in der entries.tpl genutzt werden kann!?
Edit: Wie ich eben selber sehen konnte, sind die entsprechenden Variablen im {debug} (Edit: enthalten, können aber nicht genutzt werden). Ich sehe momentan auch keine andere Möglichkeit, als die von dir vorgeschlagene, um den content aus dem Smarty Object direkt in die entries.tpl zu por-/montieren. Verflixt!

Übrigens könnte man sogar, wenn ich mir dein gewünschtes Ergebnis so ansehe, das alles vielleicht auch ganz ohne Smarty und nur mit der natürlichen Plugin Nutzung, rein über CSS { content: ... } oder gar ein weng Javascript replacing hinbekommen...
Regards,
Ian

Serendipity Styx Edition and additional_plugins @ https://ophian.github.io/ @ https://github.com/ophian
Timbalu
Regular
Posts: 4598
Joined: Sun May 02, 2004 3:04 pm

Re: entrypaging in entries.tpl

Post by Timbalu »

Das mit dem scoping der $entries ist etwas speziell und nicht ganz so einfach zu erklären. (und ich hoffe ich erzähle hier keinen Quatsch!)

Bevor Smarty 3.1 mit template blocks daherkam, hatte Serendipity bereits sein eigenes template block (System) erfunden. Dies ist die $ENTRIES Variable. Sie kann zb entries.tpl sein, wie zB auch comments_by_author.tpl, u.a.. Da die Zuweisung in einem bestimmten Zusammenhang des Kerns geschieht, haben wir das Problem des Scopings mit den neueren Smarties, gegenüber Smarty 2, die sehr viel strenger darauf achten, scopes, also Bereiche unter-und voneinander zu trennen. Dies tritt nun besonders gerne bei Plugins auf.

So kann man sagen, dass die eigentliche entries.tpl so gesehen also die content.tpl ist. Dort ist alles im richtigen Rahmen erhältlich. Für das smartyentrypaging ist also die $ENTRIES (template block) Variable nur eine (bereits vorcompilierte) Variable und kein Sub-Template im General Kontext. Deshalb muss man die content.tpl anweisen, sich selbst als "eigenes kleines scope Universum" zu verstehen... indem man dort für Folgendes, was sonst nicht erhältlich ist, extra zuweist. Edit: Was aber in diesem Fall nicht geht, weil {$ENTRIES}{* pre parsed/fetched *} ist, also als VORHER kein Zugriff auf NACHHER bekommt, womit sich dann auch der letzte Punkt erübrigt.

Die Zuweisung lebt natürlich im generellen Smarty Object, also $smarty, wie du es richtig gefunden hast. (In Smarty 3.1 ist dies übrigens das $template Object und nicht das $smarty Object, so dass es eigentlich richtigerweise function my_pagination($params, $template)... heißen müsste. (Wobei ich mir gerade aber in diesem Fall so ohne eigene Tests nicht sicher bin. Edit: und genauso ist es auch in diesem speziellen Fall!)

Man könnte also außerdem noch versuchen, ob man es in der (block) entries.tpl nicht doch noch hinbekommt, in dem man analog zum verwendeten

Code: Select all

{assign var="entry" value=$entry scope="parent"}
etwas für die entrypaging links kreiert. In diesem Fall dann:

Code: Select all

{assign var="pagination_prev_link" value=$pagination_prev_link scope="parent"}
und

Code: Select all

{assign var="pagination_next_link" value=$pagination_next_link scope="parent"}
, so dass man folgend darauf zugreifen kann. (Vielleicht mit einem {if ...}{/if} check umkleidet. Vielleicht ist auch ein anderer scope nötig, besser aber immer, mit dem direkt Verwandten anzufangen.)
Regards,
Ian

Serendipity Styx Edition and additional_plugins @ https://ophian.github.io/ @ https://github.com/ophian
Timbalu
Regular
Posts: 4598
Joined: Sun May 02, 2004 3:04 pm

Re: entrypaging in entries.tpl

Post by Timbalu »

Ok - I got it! It took a little longer... :D

Scoping und hooks sind tatsächlich ein Problem, also lasse ich das bisher Gesagte trotz einiger Unklarheiten einfach mal so stehen.

Im 'entries_header' hook ist dies auch tatsächlich der Fall. Im 'entry_display' hook, der im Plugin aber auch genutzt wird, wird die ganze Sache auch tatsächlich durchgereicht, wenn dieser nicht vorher abgewürgt wird. Das habe ich nun im Plugin für die Smarty Option korrigiert, welches morgen auf Spartacus erhältlich ist.

Ich zeige hier einmal ein Beispiel.
Nun ist es möglich, just unterhalb(wichtig) des hooks:

Code: Select all

{if $smarty_entrypaging and $is_single_entry and not $is_preview}
<svg display="none" width="0" height="0" version="1.1" fill-opacity="1" xmlns:xlink="http://www.w3.org/1999/xlink" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" xmlns="http://www.w3.org/2000/svg">
<defs>
<symbol id="icon-left-pointer" viewBox="0 0 340 340">
	<title>left</title>
	<path class="path1" d="M133.5938 338.625 L18.4219 277.875 L133.5938 217.125 L133.5938 338.625 Z" stroke="none"></path>
</symbol>
<symbol id="icon-right-pointer" viewBox="0 0 340 340">
	<title>right</title>
	<path d="M154.4062 277.875 L39.2344 338.625 L39.2344 217.125 L154.4062 277.875 Z" stroke="none"></path>
</symbol>
</defs>
</svg>
{/if}
und beliebig später (zb just unterhalb von {if $is_single_entry and not $is_preview})

Code: Select all

            {if $smarty_entrypaging}

            <div id="entrypaging" class="serendipity_entrypaging">
            {if $pagination_prev_link}
                <a href="{$pagination_prev_link}" title="{$pagination_prev_title}" class="entrypagination_left"><svg class="icon icon-left-pointer"><use xlink:href="#icon-left-pointer"></use></svg></a>
            {/if}
            {if $pagination_next_link}
                <a href="{$pagination_next_link}" title="{$pagination_next_title}" class="entrypagination_right"><svg class="icon icon-right-pointer"><use xlink:href="#icon-right-pointer"></use></svg></a>
            {/if}
            </div>
            {/if}

zu setzen.
Mit ein wenig CSS (zb in der user.css):

Code: Select all

/* entrypaging plugin with smarty option */
#entrypaging .serendipity_entrypaging {
    display: block;
}
#entrypaging .icon {
    margin-left: 2em;
    display: inline-block;
    height: 6rem;
    width: 6rem;
    -webkit-background-size: auto 6rem;
    -moz-background-size: auto 6rem;
    -o-background-size: auto 6rem;
    background-size: auto 6rem;
  }
#entrypaging a:hover, #entrypaging svg:hover {
    background: transparent;
}
#entrypaging .icon.icon-left-pointer {
    float: left;
}
#entrypaging .icon.icon-right-pointer {
    float: right;
}
#entrypaging .serendipity_entrypaging:after {
    clear: both;
}
Regards,
Ian

Serendipity Styx Edition and additional_plugins @ https://ophian.github.io/ @ https://github.com/ophian
mitch
Regular
Posts: 22
Joined: Tue Mar 15, 2016 8:57 pm
Contact:

Re: entrypaging in entries.tpl

Post by mitch »

Oh, cool, danke!

Ich hatte schon angefangen, das mit dem Einbinden per Parent-Scope nochmal auszuprobieren (das hatte ich schon mal versucht, aber andersherum: in der content.tpl auf global setzen und dann in der entries.pl hoffen...), aber da hat keine Variante funktioniert. Keine Ahnung, was ich da gebastelt habe, ich habe nicht mal ein {$pagination_prev_link} in der index.tpl gesehen :-)

„Da war tatsächlich ein Fehler drin“ ist aber eine passende Antwort zu „ich versteh‘ einfach nicht, warum das nicht klappt“, da kann ich wieder ruhig schlafen :-)

Entweder klone ich mir jetzt fix das github-Repo oder ich warte bis morgen auf das neue ZIP… Ich melde mich hiermit auf jeden Fall schon mal als Tester!

Gruß
Christian

Code: Select all

READY.
█
mitch
Regular
Posts: 22
Joined: Tue Mar 15, 2016 8:57 pm
Contact:

Re: entrypaging in entries.tpl

Post by mitch »

Test erfolgreich: Bei mir läuft das Paging jetzt über {$pagination_prev_link} & Co direkt in der entries.pl

Super!

Vielen Dank,
Christian

PS: Die additional Plugins leben ja jetzt allesamt auf github. Warum sind in dem ZIP, das man über Spartacus runterladen kann, weiterhin CVS-Ordner enthalten?
Werden die Änderungen aus github nochmal in ein CVS-Repository übertragen, um damit dann Spartacus zu füttern?

Code: Select all

READY.
█
Timbalu
Regular
Posts: 4598
Joined: Sun May 02, 2004 3:04 pm

Re: entrypaging in entries.tpl

Post by Timbalu »

mitch wrote:Warum sind in dem ZIP, das man über Spartacus runterladen kann, weiterhin CVS-Ordner enthalten?
Vielleicht fehlt eine .gitignore (bzw cvs ignore) Regel...?!
Wo genau ist das?
Ansonsten müsste Garvin einmal die näheren Umstände seine (alten) cvs repositories erläutern. (Und ob man da nicht irgendein zauberhaftes Script schreiben könnte, um einzelne Plugins als zip von GitHub zu ziehen...)
Regards,
Ian

Serendipity Styx Edition and additional_plugins @ https://ophian.github.io/ @ https://github.com/ophian
onli
Regular
Posts: 2825
Joined: Tue Sep 09, 2008 10:04 pm
Contact:

Re: entrypaging in entries.tpl

Post by onli »

Post Reply