Autor Zpráva
MaxDJs
Profil *
Zdravím,

bylo by možno mi napsat, co mám špatně ve skriptu, protože se mi nevykresluje kalendář. Mám to řešený pomocí html tabulky.

Zde je skrpt:

$mesic = $_POST['mesic'];
$pocetdnu = array("Leden"=>31,"Únor"=>28,"Březen"=>31,"Duben"=>30,"Květen"=>31,"Červen"=>30,"Červenec"=>31,"Srpen"=>31,"Září"=>30,"Říjen"=>31,"Listopad"=>30,"Prosinec"=>31);
$pocettydnu = floor($pocetdnu[$mesic] / 7);
$dny = array(1=>"Po","Út","St","Čt","Pá","So","Ne");
$pocetdnuvmesici = $pocetdnu[$mesic];
$den=1;


echo "<h1>".$mesic." 2010</h1>";

echo "<table>";
while ($den <= $pocetdnuvmesici) {
for($i=0;$i<=$pocettydnu;$i++) {
	echo "<tr>";
    for($x=1;$x<=7;$x++) {
	if($i == 0) {
	echo "<th>".$dny[$x]."</th>";
	}
	else {
	echo "<td>".$den."</td>";	
	}
	}
	echo "</tr>";
}
$den++;
}
echo "</table>";
?>


Děkuji za odpověď
Radek Cvek
Profil
Určitě bych v url nepředával diakritiku.
Tori
Profil
Šlo by to takto:
echo "<table><tr>";
for($x=1;$x<=7;$x++) {
  echo "<th>".$dny[$x]."</th>";
}
for ($den=1; $den <= $pocetdnuvmesici; $den++) {
  if ($den%7 == 1)
    echo '</tr><tr>';
  echo "<td>$den</td>";  
}
echo "</table>";

Ale ani jedno neřeší, jestli první den měsíce je skutečně pondělí.
Prochy
Profil
Nevim jestli potřebuješ kalendář jen tenhle rok. Ale já bych to dělal radši přes date a mktime. Pokaždý nemá únor 28dní a taky se tam dá zjistit, jakým dnem začíná měsíc.
Tori
Profil
Prochy:
...date a mktime
anebo idate
Alphard
Profil
Třeba pomůže http://www.linuxsoft.cz/article.php?id_article=212
Radek Cvek
Profil
Zkusil jsem si:
echo Date ("D", MkTime (10, 0, 0, 24, 1, 2011)); 
echo Date ("w", MkTime (10, 0, 0, 24, 1, 2011)); 

a vypsalo mi to Sat6 - neděli
a přitom je pondělí
MaxDJs
Profil *
Tori:
Šlo by to takto:

echo "<table><tr>";
for($x=1;$x<=7;$x++) {
echo "<th>".$dny[$x]."</th>";
}
for ($den=1; $den <= $pocetdnuvmesici; $den++) {
if ($den%7 == 1)
echo '</tr><tr>';
echo "<td>$den</td>";
}
echo "</table>";

To mi vypíše pouze názvy dnů, ale ne čísla od 1 do 28/30/31
Tori
Profil
Radek Cvek:
Protože 0 = neděle.

MaxDJs:
A co máte v proměnné $mesic? Ja tam přímo dopsala název měsíce a fungovalo to.
Radek Cvek
Profil
Tori:
Dnes je 24.1.2011 a je pondělí a mě to vypsalo neděli.
MaxDJs
Profil *
Do proměnné $mesic načítám data z formuláře

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs"> 
<head>
<meta name="generator" content="PSPad editor, www.pspad.com"; />  
<meta http-equiv="content-type" content="text/html; charset=windows-1250" />   
<title></title>  
</head> 

<body>
<form action="zobrazenikalendare.php" method="post" name="vyber_mesice">
<select name="mesic">
<?php
$mesice = array("Leden","Únor","Březen","Duben","Květen","Červen","Červenec","Srpen","Září","Říjen","Listopad","Prosinec");
foreach ($mesice as $mesic) {
echo "<option value=".$mesic."/>".$mesic."</option>";
}
?>
</select>
<input type="submit" name="odeslat" value="Zobraz kalendář!" />
</form>
</body> 
</html> 
Tori
Profil
Radek Cvek:
Aha, nepochopila jsem, na co se ptáte. Máte prohozený měsíc a den.
Radek Cvek
Profil
Tori:
Díky - to bylo tím.

Return Values:
mktime() returns the Unix timestamp of the arguments given. If the arguments are invalid, the function returns FALSE (before PHP 5.1 it returned -1).


Že mi to zrovna na ten 24. měsíc vyhodilo 6.
Tori
Profil
Radek Cvek:
Hm, zajímavé. "Neplatný parametr" znamená, že není celočíselný. Pokud je celočíselný a přesahuje povolený rozsah, použije se modulo (hrála jsem si s tím).
Radek Cvek
Profil
Tori:
supr - mě by ani nenapadlo po tom tak bádat
MaxDJs
Profil *
Tori:
A co máte v proměnné $mesic? Ja tam přímo dopsala název měsíce a fungovalo to.

Už jsem naše chybu. Špatně jsem předával název měsíce z formuláře.

echo "<table><tr>";
for($x=1;$x<=7;$x++) {
  echo "<th>".$dny[$x]."</th>";
}
for ($den=1; $den <= $pocetdnuvmesici; $den++) {
  if ($den%7 == 1)
    echo '</tr><tr>';
  echo "<td>$den</td>";  
}
echo "</table>";


Dá se tenhle skript zapsat i jinak? S využitím jiných funkcí?
xmark
Profil
MaxDJs:
Dá se tenhle skript zapsat i jinak? S využitím jiných funkcí?
Proč?
Mimochodem .. kde máš začátek prvního<tr> a konec posledního?
MaxDJs
Profil *
Protože chci vědět, jestli existuje víc variant


Já jsem použil to co mi poradil Tori
Tori
Profil
MaxDJs:
Špatně jsem předával název měsíce z formuláře.
Tomu se dá vyhnout, když budete předávat číslo měsíce místo názvu.
// formular:

<select name="mesic">
<?php
$mesice = array(1=>"Leden",2=>"Únor",3=>"Březen",4=>"Duben",5=>"Květen",6=>"Červen",
7=>"Červenec",8=>"Srpen",9=>"Září",10=>"Říjen",11=>"Listopad",12=>"Prosinec");
foreach ($mesice as $cislo=>$mesic) {
echo '<option value="'.$cislo.'">'.$mesic."</option>";
}
?>
</select>


// zpracovani:
$mesic = $_POST['mesic'];
$pocetdnu = array(0,31,28,31,30,31,30,31,31,30,31,30,31);
$nazev = array(1=>"Leden",2=>"Únor",3=>"Březen",4=>"Duben",5=>"Květen",6=>"Červen",
7=>"Červenec",8=>"Srpen",9=>"Září",10=>"Říjen",11=>"Listopad",12=>"Prosinec");
$pocettydnu = floor($pocetdnu[$mesic] / 7);
$dny = array(1=>"Po","Út","St","Čt","Pá","So","Ne");
$pocetdnuvmesici = $pocetdnu[$mesic];
$den=1;

echo "<h1>".$nazev[$mesic]." 2010</h1>";



edit: ↑↑ xmark: Ty chybějící <tr> jsem zapomněla já, MaxDJs to jen zkopíroval.
MaxDJs
Profil *
A jak mohu obměnit to vykreslení formuláře? Jestli to vůbec lze?
MaxDJs
Profil *
*vykreslení tabulky
Alphard
Profil
MaxDJs:
Já jsem použil to co mi poradil Tori
Kdybyste důsledně četl její odpovědi, zjistil byste, že je to dívka.

Dá se tenhle skript zapsat i jinak?
Počet dní by bylo vhodné zjišťovat patřičnou funkcí, kvůli přestupnému roku.
Ne každý měsíc začíná pondělím, na začátku tabulky by se měly vypsat prázdné buňky.

Verze, kde jsou dny ve sloupcích (na linuxsoftu jsou v řádcích), by snad mohla vypadat takhle.
<?php
$mesic = 2;
$rok = 2011;

$mesice = array(1 => "Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec");
$dny = array(1=>"Po", "Ut", "St", "Ct", "Pa", "So", "Ne");


echo "<h1> $mesice[$mesic] $rok</h1>\n";
echo "<table>\n<tr><th>".implode("</th><th>", $dny)."</th></tr>\n";

$firstDay = (int) date("w", mktime(0, 0, 0, $mesic, 1, $rok));
echo "<tr>".str_repeat("<td></td>", ($firstDay==0 ? 7 : $firstDay)-1);

for($i = 1; $i <= cal_days_in_month(CAL_GREGORIAN, $mesic, $rok); $i++)
{
  if (($i+$firstDay)%7 == 2 && $i != 1)
  {
    echo "</tr>\n<tr>";
  }
  echo "<td>".$i."</td>";
}
echo "</tr>\n</table>\n";
?>
<style>
  td { width: 30px; text-align: center; border: 1px dotted gray; }
</style>

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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