Dynamický snippet v includované šabloně (data v dumpu se změní ale výpis se nepřekreslí)

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

Ahoj, mám one page, který jsem si poskládal do default.latte pomocí include více šablon. V jedné znich mám slider, kde jsou profily a u profilů hodnocení. Po kliknutí na tlačítko se mi zobrazí form, kterým můžu ohodnotit profil na který se právě dívám. Submit řeší ajax který zavolá addRating! rating se přidá a pak by se měl původní rating překreslit na ten nový a formulář zase zavřít.

Hodnocení se spracuje správně a v šabloně mám {dump $profile->getRatingValue()} tam se mi to změní ale pořád se vypysuje původní hodnota. Mohl by mi prosím někdo poradit? + form zůstane zobrazený a já bych ho raději zase skryl, ale to je maličkost

{snippetArea rezervaceWrapper}
	{include 'rezervace.latte'}
{/snippetArea}
{snippetArea profiles}
	<div class="content-block">
		<h2 class="block-header">Rezervace</h2>
		{if $profiles}
			<div id="profiles-carousel" class="owl-carousel owl-theme">
				{foreach $profiles as $profile}
					{var $id = $profile->getId()}
					{snippet profile-$id}
						{var $ratingNumber = $profile->getRatingValue()}
						{var $ratingWidth = $profile->getRatingBarValue()}
					{dump $profile->getRatingValue()}
					{dump $ratingWidth}
					{dump $profile->getRatingsCount()}
						<div>
							<div class="row">
								<div class="col-sm-4">
									<img class="owl-lazy img-responsive"
										 data-src="{$baseUrl}/upload/profiles/{$profile->getPicture()}"
										 alt="{$profile->getName()}">
									<h4 class="alignC mt20 text-primary">{$profile->getRatingValue()|number:1:',':''}</h4>
									<h6 class="alignC">( hodnotilo {$profile->getRatingsCount()} )</h6>
									<div class="star-rating">
										<span style="width:{$profile->getRatingBarValue()|noescape}%"></span>
									</div>
									<div class="row mt20 buttons">
										<div class="col-md-6 alignC">
											<a href="#" class="btn btn-primary">Rezervovat</a>
										</div>
										<div class="col-md-6 alignC">
											<button class="btn btn-primary open-review-box">Hodnotit</button>

											<div class="row post-review-box displayNone">
												<div class="col-md-12">
													<form class="rating-form ajax">
														<input type="hidden" name="profileid"
															   value="{$profile->getId()}">
														<div class="raty-rate"></div>
														<div>
															<button class="btn btn-danger btn-sm close-review-box">
																<span class="glyphicon glyphicon-remove"></span>
															</button>
															<button class="btn btn-success btn-sm ajax" type="submit">
																<span class="glyphicon glyphicon-ok"></span>
															</button>
														</div>
													</form>
												</div>
											</div>
										</div>
									</div>
								</div>
								<div class="col-sm-8">
									<h3><span class="text-primary">Jméno:</span> {$profile->getName()}</h3>
									<p><span class="text-primary">Věk:</span> {$profile->getAge()}</p>
									<p><span class="text-primary">Praxe:</span> {$profile->getExperience()}</p>
									<p><span
											class="text-primary">U nás od: </span>{$profile->getWithUsFrom()|date:'%d.%m.%Y'}
									</p>
									<p><span class="text-primary">Intro: </span>{$profile->getIntro()}</p>
								</div>
							</div>
						</div>
					{/snippet}
				{/foreach}
			</div>
		{else}
			Žádné profily k dispozici :(
		{/if}
	</div>
{/snippetArea}
	/**
	 * @var Profiles
	 * @inject
	 */
	public $profiles;

	public function renderDefault()
	{
		if (!isset($this->template->profiles)) {
			$this->template->profiles = $this->profiles->findAllVisible();
		}
	}

	public function handleAddRating($profileid, $score)
	{
		if ($score > 0) {
			$this->profiles->addRating($profileid, $score);
			if ($this->isAjax()) {
				$this->template->profiles = $this->profiles->findAllVisible();
				$this->redrawControl('rezervaceWrapper');
				$this->redrawControl('profiles');
			} else {
				$this->redirect('this', '#rezervace');
			}
		}
	}
Zuben45
Člen | 268
+
0
-

U dynamických snippetů, když potřebuješ překrestlit pouze daný řádek / záznam, tak do proměnné která obsahuje všechny záznamy, které vypisuješ, dosadíš jenom ten upravovaný. Více v dokumentaci

public function handleAddRating($profileid, $score)
{
    if ($score > 0) {
        $this->profiles->addRating($profileid, $score);
        if ($this->isAjax()) {
            $this->template->profiles = $this->profiles->findOneVisible($profileid);
            $this->redrawControl('rezervaceWrapper');
            $this->redrawControl('profiles');
        } else {
            $this->redirect('this', '#rezervace');
        }
    }
}

Mimochodem, snippetAreu (profiles) použij jen při include, v include pokud v ní také není include bych asi nepoužil, zkusil bych tam spíše statický snippet

{snippetArea rezervaceWrapper}
    {include 'rezervace.latte'}
{/snippetArea}
{* rezervace.latte *}
{snippet profiles}
	...
{/snippet}

Editoval Zuben45 (29. 6. 2017 9:05)

jarda256
Člen | 130
+
0
-

@Zuben45 ahoj, diky za radu, ale ani tak se to neprekresli…je to pole doctrine entit…respektive tedy objektu…nevim jak urcit v jakem indexu se zmena provedla…nicmene ani kdyz si stanovim ze zmenim na indexu 0 a tam to i nactu tak se to neprekresli :/

Zuben45
Člen | 268
+
0
-

jarda256 napsal(a):

@Zuben45 ahoj, diky za radu, ale ani tak se to neprekresli…je to pole doctrine entit…respektive tedy objektu…nevim jak urcit v jakem indexu se zmena provedla…nicmene ani kdyz si stanovim ze zmenim na indexu 0 a tam to i nactu tak se to neprekresli :/

u Doctrine jsem si nějakou dobu hrál s tím, že jsem upravil položku v datagridu a ona se pak měla překreslit, řešení bylo jednoduché, stačilo použít

$entityManager->refresh($entity);

po uložení změn

jarda256
Člen | 130
+
0
-

Ani refresh nepomáhá…ale řekl bych že problém bude zabalení do slideru