Autor Zpráva
lionel messi
Profil
Zdravím,

mám v PHP vytvorený kalendár podľa tutoriálu na Linuxsoft.cz a všetko funguje bez problémov. Teraz by som však chcel, aby bol jeden deň zvýraznený (prípadne aj viac dní v mesiaci, ale nezávisle od seba). Môj pokus bol takmer úspešný, malo to len jeden háčik. Inkriminovaný deň mi vypísalo 2x - raz normálne a raz zvýraznený. Skúšal som si do premennej uložiť číslo dňa a napísať podmienku, ale nepodarilo sa mi nič iné docieliť (iba ak rozbitie kalendára a ešte k tomu bez zvýraznenia až na ten jeden zmienený pokus). Ďakujem veľmi pekne za radu.
okolojsoucí
Profil *
Prosím vložte zdrojový kód.
lionel messi
Profil
<?php
function JePrechodnyRok ($rok)
{
  return (boolean) date("L", mktime(0,0,0,1,1,$rok));
}
function PocetDnu ($mesic, $rok)
{
  return cal_days_in_month(CAL_GREGORIAN, $mesic, $rok);
}
function PrvniDen ($mesic, $rok)
{
  $anglickeporadi = date("w", mktime(0, 0, 0, $mesic, 1, $rok));
  return ($anglickeporadi==0) ? 7 : $anglickeporadi;
}
$sloupcu = date("W", mktime(0, 0, 0, $mesic, $PocetDnu-7, $rok)) - date("W", mktime(0, 0, 0, $mesic, 1+7, $rok))+4;
function Bunka ($radek, $sloupec, $PrvniDen, $PocetDnu)
{
  $dny=Array(1=>"Po", "Út", "St", "Čt", "Pá", "So", "Ne");
  if ($sloupec==1) return $dny[$radek];
  $chcivratit = ($sloupec-2)*7 + $radek - $PrvniDen+1;
  if ($chcivratit<1 || $chcivratit>$PocetDnu) return "&nbsp;"; else return $chcivratit;
}
function Kalendar ($mesic, $rok)
{
  $mesice=Array(1=>"leden", "únor", "březen", "duben", "květen", "červen", "červenec", "srpen", "září", "říjen", "listopad", "prosinec");
  //kontroly
  if (!is_numeric($mesic)) return "Měsíc musí být číslo!";
  if (!is_numeric($rok)) return "Rok musí být číslo!";
  if ($mesic<1 || $mesic>12) return "Měsíc musí být číslo od 1 do 12";
  if ($rok<1980 || $rok>2050) return "Rok musí být číslo od 1980 do 2050";
  // zjištění počtu sloupců
  $PocetDnu = PocetDnu ($mesic, $rok); $PrvniDen = PrvniDen($mesic,$rok);
  $sloupcu = date("W", mktime(0, 0, 0, $mesic, $PocetDnu-7, $rok)) - date("W", mktime(0, 0, 0, $mesic, 1+7, $rok))+4;
  // vlastní kód
  echo "<TABLE border=\"1\" style=\"border-collapse: collapse\" width=\"",$sloupcu*30,"\">";
  echo "<TR><TD colspan=$sloupcu width=\"",$sloupcu*30,"\" align=\"center\">".$mesice[$mesic]."&nbsp;".$rok."</TD></TR>\n";
  for ($radek=1;$radek<=7;$radek++)
  {
    echo "<TR align=\"center\">";
    for ($sloupec=1; $sloupec<=$sloupcu; $sloupec++) echo "<TD width=\"30\">".Bunka($radek, $sloupec, $PrvniDen, $PocetDnu)."</TD>";
    echo "</TR>\n";
  }
  echo "</TABLE>";
}
Kalendar ();
?>
Takýto je pôvodný kód, ešte som prepísal v poliach SK názvy.
Tori
Profil
Řádek 15 je tam asi navíc.
A jak jste to upravoval, aby se zvýraznily některé buňky?
lionel messi
Profil
Tori:
A jak jste to upravoval, aby se zvýraznily některé buňky?

Zhruba takto (presný postup si nepamätám a kód je teraz v pôvodnej verzii [#3]):
Na začiatku funkcie Kalendar som definoval:
$zvyrazni = 15;
A potom r. 40 som "rozbil" echo:
echo "<TD width=\"30\"". if (Bunka(($radek, $sloupec, $PrvniDen, $PocetDnu) == $zvyrazni) echo " style='font-weight:bod'"; .">".Bunka($radek, $sloupec, $PrvniDen, $PocetDnu)."</TD>";
    echo "</TR>\n";

a toto ku každej bunke pridalo style=...

Ten takmer úspešný pokus, kde inkriminovaný dátum vypísalo 1x obyčajne a 1x so zvýraznením som urobil podobne, ale:
r. 40:
echo "<TD width=\"30\">".Bunka($radek, $sloupec, $PrvniDen, $PocetDnu)."</TD>";
if (Bunka($radek, $sloupec, $PrvniDen, $PocetDnu) == $zvyrazni)
echo "<TD width=\"30\" style='font-weight:bold'>$zvyrazni</TD>";



Ešte ma včera napadlo trochu iné riešenie: dať čísla dní do poľa pomocou range (1,31) - samozrejme predtým si podmienkou overiť, koľko dní má mesiac a vypisovať ich cez foreach, podmienkou if-else určiť čo má byť zvýraznené. Toto ale začne tabuľku vždy od ľavého horného rohu číslom 1 a to je problém - napr. 1. októbra 2013 bol utorok (Ale zase zvýrazňovalo perfektne).
Chatík
Profil
Ukázka: http://erasttest.comehere.cz/kalendar.php
Třeba ti pomůže tento script:
 <?php 
    $den_dnes = date("j"); 
    $mesiac_dnes = date("n"); 
    $rok_dnes = date("Y"); 
     
    // prevzatie udajov z POST 
    $mesiac = $mesiac_dnes; 
    if (!empty($_POST["mesiac"])) $mesiac = abs(intval($_POST["mesiac"])); 
    if ($mesiac < 1 || $mesiac > 12) $mesiac = $mesiac_dnes; 
     
    $rok = $rok_dnes; 
    if (!empty($_POST["rok"])) $rok = abs(intval($_POST["rok"])); 
    if ($rok < 2013 || $rok > 2020) $rok = $rok_dnes; 
?> 
    <form action="./kalendar.php" method="post"> 
        <label>Měsíc: <select name="mesiac" onchange="this.form.submit();"> 
<?php 
    for ($i = 1; $i < 13; $i++) { 
        echo "            <option value=\"".$i."\""; 
        if ($mesiac == $i) echo " selected=\"selected\""; 
        echo ">".$i."</option>"."\r\n"; 
    } 
?> 
            </select> 
        </label> 
        <label>rok: <select name="rok" onchange="this.form.submit();"> 
<?php 
    for ($i = 2013; $i < 2020; $i++) { 
        echo "            <option value=\"".$i."\""; 
        if ($rok == $i) echo " selected=\"selected\""; 
        echo ">".$i."</option>"."\r\n"; 
    } 
?> 
            </select> 
        </label> 
    </form> 

<style> 
.kalendar {float: left; width: 10%; margin-top: 15px; line-height: 25px; border-collapse: collapse; text-align: center;} 
</style> 

<?php 
    $datum = mktime(0, 0, 0, $mesiac, 1, $rok);    // timestamp pre aktualne nastaveny datum 
    $prvy_den = date("N", $datum) - 1;    // v ktorom dni zacina prvy den v mesiaci 0-6 
    $pocet_dni = date("t", $datum);    // pocet dni v danom mesiaci 

    $mesiace=Array(1=>"Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", 
                      "Listopad", "Prosinec"); 

?> 
    <table class="kalendar" width="237" border="1"> 
     <th colspan="7"> <?php echo $mesiace["$mesiac"];?> </th> 
      <tr> 
        <td> Po </td>  <td> Út </td>  <td> St </td>  <td> Čt </td>  <td> Pá </td>  <td> So </td>  <td> Ne </td> 
      </tr> 

<?php 
    $a = 1; 
    for ($i = 0; $i < $pocet_dni + $prvy_den; $i++) { 
        if ($a == 1) echo "       <tr>\n"; 
        if ($i < $prvy_den) { 
            echo "        <td> &nbsp; </td>\n";    // pociatocne prazdne bunky v tabulke 
        } else { 
            $b = $i - $prvy_den + 1; 
            if ($b == $den_dnes && $mesiac_dnes == $mesiac) { 
                echo "        <td style='background-color:blue'> ".$b." </td>\n";    // zvyraznenie dna dnesneho datumu 
            } else { 
                echo "        <td> ".$b." </td>\n"; 
                
            } 
        }  
    // ukoncenie riadka tabulky 
        if ($a == 7 ) echo "       </tr>"."\r\n";
 
        $a++; 
        if ($a > 7) $a = 1; 
    }
    if ($a != 1) {
        echo str_repeat('<td> &nbsp; </td>', 7 - $a) . '</tr>';
    } 
?> 
     </table> 
lionel messi
Profil
Chatík:
Určite vyskúšam, len ten link s príkladom mi vypísal takýto rozsypaný čaj: eklamu na tomto hostingu zajiĹĄĹĽuje Business Factory - internetovĂĄ reklama a pokročilĂ˝ internetovĂ˝ marketing.
Prepáč, už to ide, kalendár som pozrel, ale kódovanie je stále rovnako rozbité :) .
Chatík
Profil
To už je věc kodování :-)
lionel messi
Profil
Chatík:
Ďakujem za pomoc, riešenie [#6] je vynikajúce a flexibilné.

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: