Es centīšos pavisam vienkārši paskaidrot savu iepriekšējo pukstu ar elementāru un praktisku piemēru par klašu mantošanu un dažādajiem skatiem. Kods būs no mana slāņa, tāpēc ir skaidrs, ka tas darbojas. :)
Vienmēr jāatceras, ka, ja Tu vēlies savā slānī definēt klases metodi, tad
tās nosaukumam jāsākas ar lay_
. Šeit – lay_print_skipsaites()
.
Tas tā ir tamdēļ, lai nerastos problēmas ar vienādiem funkciju nosaukumiem,
ja nu gadījumā core slānim
tiek pievienotas jaunas klašu funkcijas.
Manā piemērā tiek izvadītas saites, kas ļauj pārvietoties pa žūrnāla ierakstiem.
Piemēram, žūrnāla un draugu lapā tās norāda uz senākiem vai jaunākiem ierakstiem
(skip=20, piemēram), bet dienas skata lapā – uz nākošo un iepriekšējo
dienu. Tieši tāpat ir iepējams izveidot jaunu metodi, kas darbotos katra ieraksta
lapā. Vai arī, piemēram, mēneša lapā. Man tas nelikās vajadzīgs, bet tas ir
iespējams (EntryPage
un MonthPage
).
######################################## #####
## šīs funkcijas izvada saites uz senākiem un jaunākiem ierakstiem (žūrnāla
## un draugu lapā) vai uz iepriekšējo un nākošo dienu (dienas lapā)
function Page::lay_print_skipsaites(){} ## definēju metodi
#########
## žūrnāla un draugu lapa
## rezultāts - «Senākie / Jaunākie», jebkurā gadījumā izvada vienādu tekstu,
taču,
## ja ir pieejami senāki vai jaunāki ieraksti, tad attiecīgais vārds ir saite
function RecentPage::lay_print_skipsaites(){
"""<div id="skipsaites">\n""";
if ($.nav.backward_count > 0){
"""«<a href="$.nav.backward_url" title="Apskatīt $.nav.backward_count senākus ierakstus">$*text_skiplinks_back</a>""";
} else {
"""«$*text_skiplinks_back""";
}
""" / """;
if ($.nav.forward_count > 0){
"""<a href="$.nav.forward_url" title="Apskatīt $.nav.forward_count jaunākus ierakstus">$*text_skiplinks_forward</a>»""";
} else {
"""$*text_skiplinks_forward»\n""";
}
if ($.view == "recent"){ ## lai saite uz kalendāru nebūtu redzama draugu lapā
"""<br />\n<a href="$.base_url/calendar/" title="Kalendāra skats" class="mazais_teksts">Rakstu
krājums</a>""";
}
"""</div>\n"""; ## aizverošais skipsaišu div
}
#########
## dienas skata lapa
## rezultāts - «Iepriekšējā diena / Nākošā diena», tāpat kā iepriekšējā funkcija
function DayPage::lay_print_skipsaites(){
"""<div id="skipsaites">\n""";
if ($.prev_url != ""){
"""«<a
href="$.prev_url" title="Apskatīt iepriekšējo dienu">$*text_day_prev</a>""";
} else {
"""«$*text_day_prev""";
}
""" / """;
if ($.next_url != ""){
"""<a
href="$.next_url" title="Apskatīt nākošo dienu">$*text_day_next</a>»""";
} else {
"""$*text_day_next»\n""";
}
"""</div>""";
}
Pēc tam, lai izsauktu šo funkciju, vajadzīgajā vietā savā S2 slānī vienkārši
jāieraksta $this->lay_print_skipsaites()
.
Manā stilā tā tiek izsaukta no šādām vietām – RecentPage::print_body,
DayPage::print_body(), RecentPage::lay_print_minicalendar()
. (Tikpat
labi es to būtu varējis izsaukt tikai no Page::lay_print_skipsaites()
,
taču man bija vajadzīgs, lai saites atrastos dažādās vietās. Tāpēc tā.) Tā
tiks iedarbināta jebkurā skatā, pat "reply", bet, tā kā klasē "Page" šī
funkcija ir tukša (neko nedara) un atsevišķi priekš ReplyPage tā nav definēta,
tad, lai gan tā izpildīsies, tā reāli nemaz nenostrādās. Skaidrs?
Protams, es būtu varējis arī definēt atsevišķi to draugu lapai (FriendsPage::lay_print_skipsaites()
),
taču tas īsti nav nepieciešams, jo FriendsPage
klase tiek atvasināta
no RecentPage
.
Piezīme Klašu funkcijām ir jāatrodas kodā pirms to
izsaukšanas (augstāk), citādi kompilators ziņos, ka nav atrodama tāda funkcija.
Vispirms definē, pēc tam izsauc. Šķiet, ka ar globālajām funkcijām tā nav. Un
vispār – galvenais, lai Page::lay_..
būtu pirms izsaukšanas. DayPage::lay_..
un
citi var droši būt arī zemāk.
Ceru, ka kādam tas viesa skaidrību un noderēs. wasted? :)
Labots Izlaboju dažas koda kļūdas un neprecizitātes paskaidrojumos. Atvainojos par sagādātajām neērtībām. :)