Prepis obyčajnej php funkcie s výstupom do nette

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

Ahojte!

Som v nette nový, učím sa ešte len 2 týždne, už som sa veľa vecí naučil a veľa aj vecí rozbehal, ale teraz prišiel čas niečo vytvoriť a tu som sa zasekol :( . Chcem na stránke zobraziť HTML kód, ktorý mi vráti funkcia. Nette a architektúra MVP však takéto niečo zmietajú zo stola.

Preto prosím každého, kto by ma vedel naviesť, čo a ako napísať, poraďte. Bol by som strašne veľmi rád. Chcem prepísať kód na tejto stránke do nette:

http://davidwalsh.name/php-calendar

Uvažoval som tak, že si vytvorím komponentu podľa tohto: https://doc.nette.org/…n/components návodu, ale problém je v 2 veciach. Nejak sa neorientujem v metódach control, nie je mi zrejmý ich popis a ďalej vôbec neviem, čo mám napísať do šablóny.

Ďakujem za každý konštruktívny návrh.
Ďakujem

Jan Tvrdík
Nette guru | 2595
+
0
-

@xxxmisko: Viděl jsi už pla.nette.org/cs/posobota-36-jan-tvrdik-komponenty? Místo toho, aby funkce vracela HTMLko, tak může vracet nějaké strukturované pole, které pak v šabloně vypíšeš.

xxxmisko
Člen | 140
+
0
-

Ahoj, video som, samozrejme nevidel.
Idem si ho pozrieť, dúfam, že budem múdrejší. Zatiaľ ďakujem, keby som niečo nevedel, ozvem sa sem, resp. nahodím sem aj tú komponentu, keď bude hotová, keby to malo niekomu pomôcť

Karel Chramosil
Člen | 114
+
0
-

Podíval bych se na EventCalendar v nette Doplňky.

xxxmisko
Člen | 140
+
0
-

Ahoj Karle!

Ten doplnok som pozeral, ale nevyhovuje mojej aplikácii.

xxxmisko
Člen | 140
+
0
-

No chlapci, doplnok som prerobil podľa prednášky Honzu Tvrdíka.
Trošku ma serú iterácie v šablóne, ale už nemám chuť niečo riešiť.

Môj počin je zatiaľ takýto nepekný, prosím o pripomienky, resp. ako zrušiť tie iterácie v latte šablóne:

Komponenta

<?php

use Nette\Application\UI;

class CalendarControl extends UI\Control{

    private $day;
    private $month;
    private $year;

    public function setDay($day){
        $this->day = $day;
    }

    public function setMonth($month){
        $this->month = $month;
    }

    public function setYear($year){
        $this->year = $year;
    }


    public function render() {

	$running_day = date('w',mktime(0,0,0,$this->month,0,$this->year));
	$days_in_month = date('t',mktime(0,0,0,$this->month,1,$this->year));
	$days_in_this_week = 1;
	$day_counter = 0;
	$dates_array = array();

	$head = array('Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota','Nedeľa');

        $this->template->year = $this->year;
        $this->template->month = $this->month;
        $this->template->day = $this->day;
        $this->template->head = $head;
        $this->template->running_day = $running_day;
        $this->template->days_in_month = $days_in_month;
        $this->template->days_in_this_week = $days_in_this_week;
        $this->template->day_counter = $day_counter;

        $this->template->setFile(__DIR__.'/CalendarControl.latte');
        $this->template->render();
    }
}
?>

SABLONA

<?php
<table cellpadding="0" cellspacing="0" class="calendar">
    <tr class="calendar-row">
        {foreach $head as $days}
            <td class="calendar-day-head">{$days}</td>
        {/foreach}
    </tr>
    <tr class="calendar-row">
        {for $x = 0; $x < $running_day; $x++}
            <td class="calendar-day-np"></td>
            {$days_in_this_week++}
        {/for}
            Beziaci den {$running_day}
        {for $list_day = 1; $list_day <= $days_in_month; $list_day++}
            <td class="calendar-day">
                <div class="day-number">{$list_day}</div>
                <p>nejaka udalost</p><p>udalost 2</p>
            </td>
            {if $running_day == 6}
    </tr>
                {if ($day_counter+1) != $days_in_month}
    <tr class="calendar-row">
                {/if}
                {$running_day = -1}
                {$days_in_this_week = 0}
            {/if}
            {$days_in_this_week++}
            {$running_day++}
            {$day_counter++}
        {/for}
    </tr>
</table>
{$day}:{$month}:{$year}

<style>
/* calendar */
table.calendar		{ border-left:1px solid #999; }
tr.calendar-row	{  }
td.calendar-day	{ min-height:80px; font-size:11px; position:relative; } * html div.calendar-day { height:80px; }
td.calendar-day:hover	{ background:#eceff5; }
td.calendar-day-np	{ background:#eee; min-height:80px; } * html div.calendar-day-np { height:80px; }
td.calendar-day-head { background:#ccc; font-weight:bold; text-align:center; width:120px; padding:5px; border-bottom:1px solid #999; border-top:1px solid #999; border-right:1px solid #999; }
div.day-number		{ background:#999; padding:5px; color:#fff; font-weight:bold; float:right; margin:-5px -5px 0 0; width:20px; text-align:center; }
/* shared */
td.calendar-day, td.calendar-day-np { width:120px; padding:5px; border-bottom:1px solid #999; border-right:1px solid #999; }
</style>
?>

TOVARNICKA

<?php
    protected function createComponentCalendar() {
        $calendar = new CalendarControl();
        $calendar->setYear('2015');
        $calendar->setMonth('8');
        $calendar->setDay('19');

        return $calendar;
    }
?>

Vypis tovarnicky {control calendar}

Naozaj, ak niekto nájde odvahu pozrieť to, dajte mi vedieť, čo je zlé a ako by som to mal upraviť.

Ďakujem

craz
Člen | 34
+
0
-

A čo tak zadávať dátum už v konštruktore? A v prípade prázdnych hodnôt nastaviť defaultne napríklad aktuálny dátum.

xxxmisko
Člen | 140
+
0
-

craz – to áno, to nahodím
Ide mi o tú logiku zobrazovania v šablóne, aby som tam nemusel inkrementovať. Resp. môžem takéto činnosti vykonávať aj v šablóne?

Editoval xxxmisko (21. 3. 2013 9:49)

craz
Člen | 34
+
0
-

Podľa mňa je to v poriadku, ale asi by sa k tomu mal vyjadriť aj niekto skúsenejší.

xxxmisko
Člen | 140
+
0
-

Super.
Teraz ďalšia vec, robím listovanie toho kalendára po mesiacoch. Problém je, že neviem, či mám použiť persistent parameter, alebo niečo iné (napr. session). Nechcem vidieť parametre v url.
Vedeli by ste helfnúť, ako na to?

kód som trošičku vylepšil, večer sem nahodím