Autor Zpráva
seky728
Profil
Zdravím všechny,
potřeboval bych pomoct. Už se nějaký ten týden trápím s jednou věcí a nemohu na to přijít a ani ji nikde najít. Mám úplně obyčejný kalendář generovaný pomocí php a vypisuji ho pomocí cyklu for, počet dní, první den měsíce atd. mám pomocí date. V databázi mám id a datum závodu. Databázové datum jsem rozdělil pomocí textových funkcí (strpos, substr..) na databazový den, měsíc a rok. Jinak ve škole nás učili načítat záznami v databazi pomocí while. A já potřebuji když se mi vygenerují ty dny v kalendáři tak, aby ty co budou v databázi, aby se na ně dalo kliknout. Pokusil jsem se to popsat co nejpřesněji a co nejstručněji, po případě samozřejmě další info dopíšu. Předem děkuji
Taps
Profil
Mrkni na rjwebdesign.cz/blog/PHP/20080112-Jak-Vytvorit-PHP-Kalendar . Tam je ukazka jak zvyraznit dny..v tvem pripade pak das do while podminku..pokud je dany den ulozen v databazi tak se prida odkaz
Keeehi
Profil
seky728:
Z databáze si vytáhneš dny pro daný měsíc.
SELECT DAY(datum) FROM tabulka WHERE YEAR(datum)=2016 AND MONTH(datum)=9
Výsledky si whilem, tak jak vás to učili, uložíš do pole.
A potom, když budeš vypisovat ten kalendář, tak si jen zkontroluje, zda je ten aktuální den v poli.
if(in_array($aktualni_den, $pole_se_dny)) {
    echo "<a href=\"?datum=2016-09-$aktualni_den\">$aktualni_den</a>";
} else {
    echo $aktualni_den;
}
seky728
Profil
Ahojte, díky za rady, až odpoledne dorazime že školy tak se na to vrhnu a dám vědět ��
seky728
Profil
Ahoj,
bohužel mi to nepomohlo. Programovat složitější věci tak nějak teprve začínám a zatím je to u mě takový ten styl pokus omyl...
Moje teorie je že když "forem" vypisuji jednotlivá čísla tak ifem zkontroluji zda se $i == $den (jakoby dnešní den) a pokud ano provede se while ve kterým se databazové datum rozseká na den, měsíc, rok a po něm by se mělo porovnat zda datum ještě odpovídá roku a měsíci a pokud ano tak se obarví červeně a bude se na něj dat kliknout a po kliknutí se vyvolá další stranka. Pokud datum neodpovídá a je to jen že je dnešek tak to políčku v kalendáři bude jen červené a pokud $i neodpovídá dnešku provede while a vlastně to samé jen bez obarvení a pokud tam neodpovídá žádné datum tak se vypíše jen číslo.
Doufám že to někdo pochopí. Nejsem v tom moc zručný a můj cíl je se v tom zlepšit. Za každou normální radu děkuji.


 <?php
              include 'server.php';

                        $dotaz="select id as id_zavodu, datum from zavody";
                        $data=mysqli_query($spojeni,$dotaz);
                    
          
                 


                            
                             
                                
                    
                        //začátek kalendáře
           $dnes = date("j. n. Y");
        $den = date("j");
        $mes  = date("n");
        $rok = date("Y");
        $pocetDniVMesici = date("t");
       
        
        $prvniDen = date(mktime(0,0,0,$mes,1,$rok));
        $pocetDnu = 0;
        
        $zacatek = date("w", $prvniDen);
        $dnyVTydnu = array(1=>"PO","ÚT","ST","ČT","PÁ","SO","NE");
        $mesice = array(1=>"leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec");
        
        if($zacatek == 0) $zacatek=7; //nedele
        if ($zacatek == 0) {
            $zacatek = 7;
            
        }
            echo "<table id='kalendar'><tr>";
        echo "<th id='mesic' colspan='7'>$mesice[$mes]</th></tr><tr>";
        for ($i = 1; $i < 8; $i++) {
            echo "<th id='nazev_dne'>$dnyVTydnu[$i]</th>";
        }
        echo "</tr><tr>";
        
                       if (strlen($den)==1) {
                                $den="0".$den;
}
        
               if (strlen($mes)==1) {
                                $mes="0".$mes;
}
            
           //dopočítání začátku kalendáře 
            
        for ($i = 1; $i < $zacatek; $i++) {
            echo "<td id='kalendar'></td>";
            $pocetDnu ++;
        }
        
        //vypis čísel dnů  
               for ($i = 1; $i < $pocetDniVMesici +1; $i++) {  
                                                
                                 
                     if ($i == $den) {
                      while ($zaznam=mysqli_fetch_array($data)) {
                                               
                        $datum_zav= "{$zaznam["datum"]}";
                        $prvni_pomlcka  =  strpos($datum_zav,"-");
                        $druha_pomlcka  = strrpos($datum_zav, "-");
                        
                        $rok_databaze= substr($datum_zav,0,$prvni_pomlcka); 
                        $mesic_databaze= substr($datum_zav,$prvni_pomlcka+1,$druha_pomlcka-$prvni_pomlcka-1);
                        $den_databaze = substr($datum_zav,$druha_pomlcka+1,2)  ;
                                           }
                             if ($i==$den_databaze && $mes == $mesic_databaze && $rok == $rok_databaze) {
                         echo "<td id='dnesek'><a href='vypis_zavodu.php?id={$zaznam["id_zavodu"]}'>$i</a></td>";
           } else {
                 echo "<td id='dnesek'><a href=''>$i</a></td>";
             }
                        
         }else {    
                     
                      
                  
            while ($zaznam=mysqli_fetch_array($data)) {
                                               
                        $datum_zav= "{$zaznam["datum"]}";
                        $prvni_pomlcka  =  strpos($datum_zav,"-");
                        $druha_pomlcka  = strrpos($datum_zav, "-");
                        
                        $rok_databaze2= substr($datum_zav,0,$prvni_pomlcka); 
                        $mesic_databaze2= substr($datum_zav,$prvni_pomlcka+1,$druha_pomlcka-$prvni_pomlcka-1);
                        $den_databaze2 = substr($datum_zav,$druha_pomlcka+1,2)  ;
                                     }    
                             if ($i==$den_databaze2 && $mes == $mesic_databaze2 && $rok == $rok_databaze2) {
                         echo "<td id='kalendar'><a href='vypis_zavodu.php?id={$zaznam["id_zavodu"]}'>$i</a></td>";
           }  else {
                   echo "<td id='kalendar'>$i</td>";
              }
                         
                         
              
               }
                               
            $pocetDnu ++;
            if($pocetDnu == 7 ){
                echo "</tr><tr>";
                $pocetDnu =0;
              
            }
        } 
           
           //dopočítání konce kalendáře
        for ($i = $pocetDniVMesici; $pocetDnu < 7; $i++) {
         echo "<td id='kalendar'></td>";
         $pocetDnu ++;
        } 
        
        
        
        echo "</tr></table>";
          //konec kalendáře
          
         
         ?>
seky728
Profil
Keeehi:
Bohužel nevím jak to přesně myslíš :( mohl by jsi mi to prosím nějak rozvést? A Mohl by jsi mi prosím pro jistotu uvést i nějaký ten krátký příklad na načtení z databaze do pole?
Předem děkuji.
Keeehi
Profil
<?php
$time = time();
$rok = (int)date('Y', $time);
$mesic = (int)date('m', $time);
$den = (int)date('d', $time);
$mesicBezNul = date('n', $time);

$mesice = array(1=>"leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec");
$akce = array();

$dotaz = "SELECT id, DAY(datum) AS den FROM zavody WHERE YEAR(datum)=$rok AND MONTH(datum)=$mesicBezNul";
$result = mysqli_query($spojeni, $query);

while ($radek = mysql_fetch_assoc($result)) {
    $akce[$radek['den']] = $radek['id'];
}
?>
<table class='kalendar'>
    <tr>
        <th class='mesic' colspan='7'><?php echo $mesice[$mesicBezNul]; ?></th>
    </tr>
    <tr>
        <th class='nazev_dne'>PO</th>
        <th class='nazev_dne'>ÚT</th>
        <th class='nazev_dne'>ST</th>
        <th class='nazev_dne'>ČT</th>
        <th class='nazev_dne'>PÁ</th>
        <th class='nazev_dne'>SO</th>
        <th class='nazev_dne'>NE</th>
    </tr>
<?php
$prvniDen = 2-date("N", strtotime("$rok-$mesic-01"));
$posledniDen = $mesic === 2 && date("t", strtotime("$rok-$mesic-01")) === '28' ? 28 : 36-date("N", strtotime("$rok-$mesic-01"));

for ($i = $prvniDen ; $i <= $posledniDen ; $i++ ) {
    if ( ( $i - $prvniDen ) % 7 == 0) {
        echo "    <tr>\n";
    }

    echo "        <td".($i === $den ? ' class="dnesek"' : '').">";

    if (isset($akce[$i])) {
        echo "\n            <a href=\"vypis_zavodu.php?id=$akce[$i]\">$i</a>\n        ";
    } elseif($i >= 1 && $i <= (int)date("t", strtotime("$rok-$mesic-01"))) {
        echo $i;
    }

    echo "</td>\n";

    if ( ( $i - $prvniDen ) % 7 == 6) {
        echo "    </tr>\n";
    }
}
?>
</table>
Nechtělo se mi to zkoumat, tak jsem to přepsal. Má to samozřejmě jednu nevýhodu, když to generuje ty odkazy, tak to zvládá jen jednu událost za den (což ale předpokládal i tvůj návrh). HTML by mělo být dostatečné pro správné zaměření CSS. Neměl bys mít potřebu ho měnit. Pokud by jsi potřeboval pomoct se stylováním, klidně znovu napiš.
seky728
Profil
Keeehi:
Ahoj,
prosimtě mě to nefunguje... a stále nevím co s tím... Když tam naincluduju server a spustím vypíše to: Parse error: syntax error, unexpected '(int)' (int) (T_INT_CAST) in C:\wamp\www\web\kalendar2.php on line 8. Pokud by jsi mi mohl ještě dále poradit byl bych nesmírně vděčný :) a v databázi mám to datum formou datetime jestli to v tom hraje nějakou roli.
Keeehi
Profil
No evidentně tam máš nějakou syntaktickou chybu. Svůj kód jsem testoval (kromě práce s databází). Takže jsi to evidentně nějak rozbil. No a bez toho aby jsi nám ukázal kód po úpravě toho moc nezvládneme. Chybová hláska mluví o řádku 8, takže prvních 10 řádků ze souboru kalendar2.php by mělo být dostatečné.
seky728
Profil
Keeehi:
Ten kod jsem nemohl rozbít protože jsem dal prostě ctrl+c a ctrl+v a okamžiě prohlížeč vypisoval to co jsem poslal. A ani jsem vlatně neupravoval protože jsem ani za boha nemohl přijít na to co tam tomu vadí .. :)
seky728
Profil
Keeehi:
omlouvám se už jsem to opravil :) asi tam bylo něco zaseknutého a když jsem to celé ručně přepsal tak to už funguje... děkuji moc za pomoc :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: