| Autor | Zpráva | ||
|---|---|---|---|
| lionel messi Profil |
#1 · Zasláno: 8. 10. 2013, 18:39:38
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 * |
#2 · Zasláno: 8. 10. 2013, 18:52:20
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 " "; 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]." ".$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 ();
?> |
||
| Tori Profil |
#4 · Zasláno: 9. 10. 2013, 07:41:39
Řádek 15 je tam asi navíc.
A jak jste to upravoval, aby se zvýraznily některé buňky? |
||
| lionel messi Profil |
#5 · Zasláno: 9. 10. 2013, 11:48:10 · Upravil/a: lionel messi
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; 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 |
#6 · Zasláno: 9. 10. 2013, 12:04:51
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> </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> </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 |
#8 · Zasláno: 9. 10. 2013, 12:11:41
To už je věc kodování :-)
|
||
| lionel messi Profil |
#9 · Zasláno: 9. 10. 2013, 14:50:51
Chatík:
Ďakujem za pomoc, riešenie [#6] je vynikajúce a flexibilné. |
||
|
Časová prodleva: 12 let
|
|||
0