Nette infinite scroll ajax offset sa nemeni stale je 1

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
erikbalog
Člen | 27
+
0
-

zdravim, zacinam s nette a potrebujem skript pre infinite scroll
v presenteri mam

<?php
    public function renderDefault() {
        if(!isset($this->template->posts)) {
            $this->template->posts = $this->database->table('posts')->limit(1, 0)->fetchAll();
            $this->template->offset = 0;
        }
    }

    public function handleAdd($offset) {
        $offset++;
        $this->template->posts = $this->database->table('posts')->limit(1, $offset)->fetchAll();
        $this->template->offset = $offset;
        $this->redrawControl('postContainer');
    }
?>

a v latte

<?php
<div n:snippet="postContainer" data-ajax-append="true">
    {foreach $posts as $post}
        <p>{$post->title}</p>
    {/foreach}
</div>
<a class="ajax" n:href="add! $offset">PRidat</a>
?>

ale nefunguje mi offset, zobrazi za prvy post
Article One
po kliknuti na odkaz sa prida Article Two ale po dalsom kliknuti za prida zase Article Two a takto vzdy, neprejde to na offset = 2.. neviem preco
Dakujem

Michal Vyšinský
Člen | 608
+
+1
-

Ahoj,

v renderDefault si to přepisuješ. První se v presenteru vykonává handle a pak render (https://doc.nette.org/…n/presenters#…)

Přidej si metodu actionDefault a v ní nastavuj to co nastavuješ teď v renderDefault – obecně je lepší proměnné pro template nastavovat v ‚action‘ metodě a ne v ‚render‘.

Edit: lepší řešení je dole

Editoval Michal Vyšinský (19. 5. 2016 14:25)

erikbalog
Člen | 27
+
0
-

tak mam to takto

<?php
    public function actionDefault() {
        $this->template->posts = $this->database->table('posts')->fetchAll();
        $this->template->offset = 0;
    }
    public function renderDefault() {

    }
    public function handleAdd($offset) {
        $offset++;
        $this->template->posts = $this->database->table('posts')->limit(1, $offset)->fetchAll();
        $this->template->offset = $offset;
        $this->redrawControl('postContainer');
    }
?>

ale web vypisuje stale
Article One

Article Two

Article Two

Article Two

Article Two

PRidat

Michal Vyšinský
Člen | 608
+
+1
-

Napsal jsem nahoře asi blbost, pardon. Nejlepší bude v handleAdd nastavit $this->offset a v renderDefault pak načítat data a použít ten offset.

<?php
	private $offset = 0;

    public function renderDefault() {
		$this->template->posts = $this->database->table('posts')->limit(1, $this->offset)->fetchAll();
        $this->template->offset = $this->offset;
    }
    public function handleAdd($offset) {
        $this->offset = $offset + 1;
        $this->redrawControl('postContainer');
    }
?>

Edit: fixnul jsem nastavování $this->template->offset. (Došlo nám v práci kafe, takže mi to tolik nemyslí :D)

Editoval Michal Vyšinský (19. 5. 2016 14:24)

erikbalog
Člen | 27
+
0
-
<?php
class HomepagePresenter extends BasePresenter
{
    /** @var Nette\Database\Context */
    private $database;

    private $offset = 0;

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

    public function renderDefault() {
        $this->template->posts = $this->database->table('posts')->limit(1, $this->offset)->fetchAll();
        $this->template->offset = $this->offset;
    }
    public function handleAdd($offset) {
        $this->offset = $offset + 1;
        $this->redrawControl('postContainer');
    }
}
?>

`Article One

Article Two

Article Two

PRidat`

nechapem.. stale to iste pritom ten offset by sa mal menit, link je v html stale ?offset = 0, ale vrati to z db offset 1

teraz som skusal pokial ten link pridam do snippetu

<?php
<div n:snippet="postContainer" data-ajax-append="true">
    {foreach $posts as $post}
        <p>{$post->title}</p>
    {/foreach}
    <a class="ajax" n:href="add! $offset">PRidat</a>
</div>
?>

tak to funguje ale to nie je ta moznost kedze mi to vzdy pridava novy link

Editoval erikbalog (19. 5. 2016 14:32)

erikbalog
Člen | 27
+
0
-

tak nasiel som nejaky mozny fix ale nepaci sa mi
v sablone

<?php
<div n:snippet="postContainer" data-ajax-append="true">
    {foreach $posts as $post}
        <p>{$post->title}</p>
    {/foreach}
</div>
{snippet link}
    <a class="ajax" n:href="add! $offset">PRidat</a>
{/snippet}
?>

a presenter

<?php
class HomepagePresenter extends BasePresenter
{
    /** @var Nette\Database\Context */
    private $database;

    private $offset = 0;

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

    public function renderDefault() {
        $this->template->posts = $this->database->table('posts')->limit(1, $this->offset)->fetchAll();
        $this->template->offset = $this->offset;
    }
    public function handleAdd($offset) {
        $this->offset = $offset + 1;
        $this->redrawControl('postContainer');
        $this->redrawControl('link');
    }
}
?>
Michal Vyšinský
Člen | 608
+
+1
-

tak to funguje ale to nie je ta moznost kedze mi to vzdy pridava novy link

ha, toho jsem si nevšiml, tak ten link wrapni do jiného snippetu bez data-ajax-append a invaliduj i te snippet. Pak by to snad už mělo fungovat.

<div n:snippet="nextPostLink">
	<a class="ajax" n:href="add! $offset">PRidat</a>
</div>

Edit: vidím, že jsi přišel na to samé, proč se ti to nelíbí?

Editoval Michal Vyšinský (19. 5. 2016 15:05)

erikbalog
Člen | 27
+
0
-

tak vyriesene, dakujem Michal

Edit: no myslel som ze to pojde aj bez dvoch snippetov ale uz to je v pohode

Editoval erikbalog (19. 5. 2016 15:07)