• Dizaino ir programavimo pamokos

  •  
    Thread Rating:
    • 0 Votes - 0 Average
    • 1
    • 2
    • 3
    • 4
    • 5
    [PHP] Kuriame kalendorių.

    print ('Python coder')


    ***
    127

    0
    Post: #1
    RE: [PHP] Kuriame kalendorių.
    Prisireikė man suprogramuoti kalendorių, ilgai negalvodamas nusprendžiau pasidalinti savo patirtimi. Šiame straipsnyje taip pat naudosime Smarty.
    Pirmiausiai išsiaiškinime savokas, kad suprastume vienodai ką darome. Mano supratimu kalendorius turi pateikti tam tikro mėnesio visas dienas. Ant kai kurių dienų turi būti nuorodos vendančios į neaiškius tinklalapius.
    Išsiaiškinome pagrindines sąlygas galim imtis darbų.

    Pirmiausiai, tradiciškai apsibrėšime duomenų bazės lenteles, šiuo atveju vieną lentelę:
     
     
    Code:
    CREATE TABLE /*!32312 IF NOT EXISTS*/ `cal` (
      `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      `link` varchar(250) DEFAULT NULL,
      `title` varchar(50) DEFAULT NULL,
      `linkdate` date DEFAULT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM\;
     
    Dabar jau galime rašyti kodą, kadangi kodą aš jau pasirašiau, tai pasakosiu iš eilės kaip parašyta, o ne ekperimentuosiu kartu su jumis.
    Taigi, aš nusprendžiau, jog GET parametrų pagalba bus galima užsikrauti bet kurį norimą mėnesį, bet kurių metų.
     

     
    Code:
    if(isset($_GET['y']))
      $year=(int)$_GET['y'];
    else $year=date('Y');

    if(isset($_GET['m']))
      $month=(int)$_GET['m'];
    else $month=date('m');
     
     
     
    Pirmasis GET paima metus, antrasis mėnesį. Tiesa šitą vietą būtų galima… t.y. reikėtų dar patobulinti, kad lankytojai nesugalvotų įvesti nulinių ar neigiamų metų bei mėnesių, taip pat, kad nesusidomėtų kas vysktą 13 ar 45 mėnesį, bet manau šią smulkmeną išspręsite ir be mano pagalbos.
    Sekantis etapas paimti mus dominančio mėnesio informaciją
     
     
     
    Code:
    $nextmonth=$month+1;
    $nextyear=$year+1;

    $startdate=$year.'-'.$month.'-01';
    if($month!=12)
        $enddate=$year.'-'.$nextmonth.'-01';
    else $enddate=$nextyear.'-'.$month.'-01';

    $query = "SELECT * FROM ".$pref."cal where linkdate>='$startdate' and linkdate<'$enddate'";
    $result = mysql_query($query);
    $countrows=mysql_num_rows($result);
    while($row = mysql_fetch_array($result))
    {
        $temp=explode('-',$row['linkdate']);
        $row['targetday']=$temp[2];
        $mylinks[]=$row;
    }
     
    Pirmiausiai apsibrėžiame dvi datas pirmą norimo mėnesio ir pirmą sekančio mėnesio, kad galėtume ištraukti visus duomenis. Kaip galinę datą imame pirmą kito mėnesio, nes spėlioti kiek šitame mėnesyje dienų 28? 29? 30? 31? nematau tikslo. Nors kaip tik sekančiame žingsnyje būtent ir nustatinėsime, kiek dienų yra šiame mėnesyje, tačiau tokiu veiksmu noriu parodyti, jog kartais neverta ieškoti kiek dienų turi mėnuo, galima išsisukti ir paprastai.
    “Parsindamas” duomenis, aš atskiriu dieną, nuo visos datos, todėl, kad vėliau būtų man lengva priskirti išrinktus duomenis mėnesio konkrečiai mėnesio dienai.
     

     
    Code:
    $startday= date('w',strtotime($startdate));
    if($startday==0)
    $startday=6;
    else $startday-=1;
     
     
    Šis kodas nustato kokia savaitės diena buvo pirma mėnesio diena. Čia tenka naudoti w, o ne N, nes nevisi serveriai suspėja su šiuolaikinėmis technologijomis. O minus vienas, todėl kad masyvai PHP kalboje paprastai sukami nuo nulio, nors, aišku, kiekvienas gali daryti pagal skonį.
     
    Code:
    $totaldays=cal_days_in_month(CAL_GREGORIAN,$month,$year);
     
    [font=Tahoma, Arial, sans-serif]Šita magiška komanda nustato dienų skaičių konkrečiame mėnesyje.[/font]
     
    Code:
    if($finish>35)
    $calendarcount=42;
    else $calendarcount=35;
     
    Čia nustatome kokio dyžio bus mūsų mėnesio kalendoriaus masyvas. Kodėl 35 ir 42? Todėl, kad dalinasi iš 7. Paprastai paaiškinti nesugebėsiu, todėl geriau pažiūrėkit į paveiksliukus
    Pirmas:
    [Image: npcal1.png]

    Antras:
    [Image: npcal2.png]

    Pirmame paveiksliukyje yra 42 langeliai antrame - 35, aišku, aš visuomet galėčiau daryti 42, bet tuomet kai kuriuose mėnesiuose apačioj atsirastų papildoma tuščia eilutė. Žodžiu, čia skonio reikalas, darykit kaip norit.
     
    Code:
    for($ii=0;$ii<$calendarcount;$ii++)
    {
        $days[$ii]['day']=' ';
        if(($ii+1)%7==0&&$ii!=$calendarcount-1)
            $days[$ii]['break']=1;
        else $days[$ii]['break']=0;
    }

    for($iii=$startday;$iii<$finish;$iii++)
    {
        $days[$iii]['day']=$iii-$startday+1;
    }    

    $iiii=0;    
    while($iiii<$countrows)
    {
    $days[$mylinks[$iiii]['targetday']+$startday-1]['info']=$mylinks[$iiii];
    $iiii++;
        }
     
     
    Daug kodo, bet manyčiau viskas labai aišku. Pirmiausiai užpildome masyvą tuščiais simboliais, sekančiame cikle surašome dienas, o trečiame priskiriame dienos informaciją, kurią ištraukėme iš duomenų bazės.

    Dar liko tik priskirti kintamuosius smarty, bet tikiuosi jūs tą galite puikiai padaryti be mano pagalbos, o jeigu ne, taipasiskaitykite čia.
    Ir paskutinis punktas iki laimės - pasirašyti šiek tiek smarty kodo:
     
    Code:
    {foreach from=$days item=day}
       <td>{if !empty($day.info)}<a href='{$day.info.link}'>{$day.day}</a>
           {else}{$day.day}
           {/if}
       </td>
       {if $day.break==1} </tr><tr> {/if}
    {/foreach}
     
    Dizainą aš pasiskolinau iš CSSPLAY. Jeigu naudosite, dizaino autorius prašo jam pervesti šiek tiek pinigų, dydis priklauso nuo jūsų sąžinės.

    Kalendorius parsisiuntimui
     
    [small]pixel.lt[/small]
    2013-05-24 08:43
    Find Quote



    About DESCO

    Mes esame ne komercinis projektas, norime, jog Lietuvos jaunimas vis sparčiau brautųsi į technologijų amžių. Negalima sėdėti vietoje, reikia kažką veikt, todėl mūsų projektas tam puikiai tinka. Galima pas mus išmokt kažko naujo, taip pat nepamirškite, kad ir jūs galite mokyti kitus! Žinių dalinimasis geriną lietuvių mentalitetą, todėl nesmerk kito, o pamokyk!