Autor Zpráva
BunnyBugs6
Profil *
Ahoj, pořeboval bych pomoct s následujícím:
Mám vytvořený kalendář v php spojený s databází mysql.
Jak v tomto kalendáři zvýrazním den, pro který platí nějaká událost? Zřejmě nějakou podmínkou echo, ale vůbec nevím, jak by měla podmínka vypadat.
Děkuji za pomoc.
jenikkozak
Profil
Z databáze si uložíš údaje asi do nějakého pole. Pak budeš nějakým cyklem vypisovat jednotlivé dny (třeba do mřížky tvořící týdny) a u každého dne porovnáš pomocí funkce isset, zda existuje v poli hodnota vztahující se k danému dni. Pokud ano, přidáš odkaz. V čem konkrétně máš problém?
abc
Profil
Jak vypisuješ kalendář?
Nějak v cyklu?

Pokud ano, tak prostě vytáhneš (asi všechny) údalosti v daném období a při výpisu porovnáš, zda se vypisované datum shoduje s některým z datumů v databázi a pokračuješ v cyklu. Pokud ne, tak prostě jen pokračuješ v cyklu...
BunnyBugs6
Profil *
Nevím, jestli jsem to dobře pochopil, ale takhle se vypisuje kalendář:

for ($i = $weekDay; $i > 1; $i--)
            echo('<td>&nbsp;</td>');

        for ($day = 1; $day <= $daysInMonth; $day++)
        {
            echo('<td');
            if (($day == $today) && ($month == idate('m')) && ($year == idate('Y')))
                echo(' id="calendar-today" ');
            echo('>');
            echo('<a href="?show=' . $year . '-' . $month . '-' . $day . '">' . $day . '</a>');

A já bych potřeboval, jak na řádku 10 změnit to "echo" na podmínku, aby byl odkaz jen v případě události na ten den. Takhle mi to píše odkazy na všechny dny :(


abc:
Jinak problém mám s tím, jak porovnávat datum z databáze z datem v kalendáři :(
abc
Profil
<?php
//tady někde si vytáhneš data z databáze, nacpeš si je do pole ve tvaru datum => název:
$events = array(
  "2014-01-05" => "akce 1",
);
        for ($day = 1; $day <= $daysInMonth; $day++)
        {
        //vyhledání data v poli
          if (isset($events["$year-$month-$day"])
            {//akce existuje
            }
        
?>
BunnyBugs6
Profil *
abc:
Tak jsem opravdu tupej, z toho jsem vůbec nic nepochopil a i když jsem zkoušel různé varianty, nic mi nefungovalo :(
Co vůbec má být ten název?, ten si vytvořím sám nebo ho také vytáhnu z databáze?
A ten Tvůj řádek 9 napíšu přesně kam? a následně ve složených závorkách by mělo být co?
Sorry za tolik dotazů, ale jsem teprve v učení a nějak tu podmínku prostě nechápu, šlo by to kdyžtak nějak podrobněji?
Díky moc.
abc
Profil
Co vůbec má být ten název?
Já myslel název události...

ten si vytvořím sám nebo ho také vytáhnu z databáze?
Záleží na tom, jestli něco takového je nebo ne. Pokud máš v databázi jen datumy, tak samozřejmě vytáhneš jen datumy :-)

A ten Tvůj řádek 9 napíšu přesně kam? a následně ve složených závorkách by mělo být co?
Tam, kde se má něco stát/změnit. Já nevím, jak chceš označovat datum, kde je událost...

podmínku prostě nechápu
Ta podmínka porovnává 2 datumy: 1) ten, který je vytažený z databáze (nevím, v jakém formátu) a 2) "průběžné datum", které se mění s výpisem jednotlivých dnů
BunnyBugs6
Profil *
abc:
Označovat datum bych chtěl jen změnou podbarvení buňky v tabulce (jako je třeba zvýraznění aktuálního dne).

Formát data je vypisován v zobrazení jen jako číslo dne v měsíci (d), jinak v databázi standardně (Y-m-d H:i:s)
abc
Profil
V tom případě to bude nějak takto:
<?php
//vytažení dat z databáze a jejich nasypání do pole, to zvládneš?
$events = array(
"2014-01-05",
"2014-01-16",
//atd...
}
for ($i = $weekDay; $i > 1; $i--)
            echo('<td>&nbsp;</td>');
 
        for ($day = 1; $day <= $daysInMonth; $day++)
        {
            echo('<td');
            if (($day == $today) && ($month == idate('m')) && ($year == idate('Y')))
                echo(' id="calendar-today" ');
            if(isset($events["$year-$month-$day"])){
              echo " class='udalost' "; // a do css doplni class udalost a potrebne obarveni   
            }
            echo('>');
            echo('<a href="?show=' . $year . '-' . $month . '-' . $day . '">' . $day . '</a>');
BunnyBugs6
Profil *
abc:
Takhle vypadá celý vykreslení kalendáře:

// hlavička kalendáře
                $previousMonth = ($month - 1) > 0 ? $month - 1 : 12;
        $nextMonth = ($month % 12) + 1;

        $previousYear = $previousMonth > $month ? $year - 1 : $year;
        $nextYear = $nextMonth < $month ? $year + 1 : $year;

        // navigace
        echo('
            <div><table>
                <tr><th><a href="?date=' . $previousYear . '-' . $previousMonth . '"> << </a></th>
                                    <th colspan="5">' .
                                        // měsíc slovně -> první písmeno velké - bere i s diakritikou
                    mb_convert_case($this->monthNames[$month], MB_CASE_TITLE, 'UTF-8') . ' ' . $year . '</th>
                                    <th><a href="?date=' . $nextYear . '-' . $nextMonth . '"> >> </a></th>
                                </tr>
                <tr id="calendar-dayrow">
                    <td>Po</td><td>Út</td><td>St</td><td>Čt</td><td>Pá</td><td>So</td><td>Ne</td>
                </tr>
                <tr>');

        // počet dnů pro daný měsíc v roce
        $daysInMonth = cal_days_in_month(CAL_GREGORIAN, $month, $year);

        // zjištění začátku týdne
        $weekDay = idate("w", mktime(0, 0, 0, $month, 1, $year));
        if ($weekDay == 0) // začíná nedělí, ta je u nás však 7., 0. pozici vynecháme
            $weekDay = 7;

        // vynecháme místo
        for ($i = $weekDay; $i > 1; $i--)
            echo('<td>&nbsp;</td>');

        // vypsání jednotlivých dnů
                $events = array("2014-01-05");    
                
            for ($day = 1; $day <= $daysInMonth; $day++)
        {
                
                echo('<td');
            // pokud je aktuální měsíc a rok, označí se den -> lze pak zvýraznit pomocí css
            if (($day == $today) && ($month == idate('m')) && ($year == idate('Y')))
                echo(' id="calendar-today" ');
                        echo('>');
                  
                        echo ($day);
                      
                    
            // řádkování podle týdnů
            if (($weekDay % 7) == 0)
                echo('</tr><tr>');

            $weekDay++;
            if ($weekDay > 7)
                $weekDay = 1;
        }

        echo('</tr>
                        </table></div>');



abc:
Vytažení dat z databáze atd., to není problém.
Pro zkoušení toho, co potřebuji, jsem zatím "array" vyplnil ručně, ale po vyzkoušení toho Tvého naposled psaného, tam mám odkazy zase na každém dni a ne jen na tom s událostí :(
abc
Profil
Pardon, ta podmínka musí být potom trošku jinak, když máme jiné pole:
$events = array("2014-01-05");
for ($day = 1; $day <= $daysInMonth; $day++) {

    echo('<td');
    // pokud je aktuální měsíc a rok, označí se den -> lze pak zvýraznit pomocí css
    if (($day == $today) && ($month == idate('m')) && ($year == idate('Y'))) {
        echo(' id="calendar-today" ');
    }
    //doplni class akce k datum, ktera se nachazeji v poli $events
    $date = $year . "-" . str_pad($month, 2, 0, STR_PAD_LEFT) . "-" . str_pad($day, 2, 0, STR_PAD_LEFT);
    if (in_array($date, $events)) {
        echo " class='akce' ";
    }
    echo('>');

    echo ($day);

    // řádkování podle týdnů
    if (($weekDay % 7) == 0)
        echo('</tr><tr>');

    $weekDay++;
    if ($weekDay > 7)
        $weekDay = 1;
}
BunnyBugs6
Profil *
abc:
Super, díky moc, tohle už funguje, ale má to pořád jeden háček.
Pomocí stylu css mi to sice změní barvu buňky, ale nevytvoří mi to odkaz. Pokud do toho "echo" vložím odkaz, tak mi to nesmyslně spojí dvě buňky s datem dohromady a odkaz mi to stále nevytvoří, proč?


Tak už to buňky nespojuje, ale pořád to nedělá odkaz. Když tam napíšu toto:

echo " <a class='akce' href='neco'></a> ";

Tak výsledek v buňce vypadá takto: >5
Jak tam tedy ten odkaz mám přidat? :(
BunnyBugs6
Profil *
abc:
... je ale zajímavé, že pokud u toho zadám i title, tak ten se tam po najetí zobrazí.
BunnyBugs6
Profil *
abc:
Já se z toho fakt zvencnu :( narazil jsem na další problém :(
Když na začátku php napíšu toto:

$bunka = mysql_query("SELECT `datum_kon` FROM `$table` WHERE `datum_kon` > 0 ORDER BY `datum_kon` ASC");

while ($col = mysql_fetch_array($bunka)) {
        $col5 = ("\"" . DATE("Y-m-d", strtotime($col['datum_kon'])) . "\"" . ", ");
        }

a pak před ten "if" vložím toto:

$events = array($col5);

tak mi to píše chybu a hodnoty do $events se mi nedosadí :(
Jsem fakt tupej, ale nevím si s tím rady, ať už jsem do dával kamkoliv.
Když ale k tomu "while" dám echo, tak se mi to v pořádku vypíše :(
abc
Profil
while ($col = mysql_fetch_array($bunka)) {
        $events[] = DATE("Y-m-d", strtotime($col['datum_kon']));
        }

tak mi to píše chybu a hodnoty do $events se mi nedosadí :(
příště prosíme i tu chybu :-)
BunnyBugs6
Profil *
Tady je ta chyba:
Notice: Undefined variable: col5 in C:...\right-col.php on line 73
Tedy na řádku:
$events = array($col5);
abc
Profil
Bezva, a odstraníš jí tak, že tenhle řádek úplně smažeš a to while napíšeš, jak jsem psal v předchozím příspěvku :-)
Ještě doporučuju před while přidat inicializaci prázdného pole:
$events = array();
BunnyBugs6
Profil *
Teď jsem to zkusil a vyhodilo mi to tuhle chybu:
Notice: Undefined variable: events in ... on line 86

a pak ještě tuto, kterou to opsalo 31x a znehodnotilo mi to kalendář, zůstaly tam jen názvy dnů:
Warning: in_array() expects parameter 2 to be array, null given in ... on line 86
>1 Notice: Undefined variable: events in C:\xampp\htdocs\marek\right-col.php on line 86

řádek 86 vypadá takto: if (in_array($dateodk, $events)) {

Asi už se mnou musíš ztrácet trpělivost :(


Pro jistotu vkládám celou stránku, jsem v tom už nějak zamotanej :(

<?php
header('Content-type: text/html; charset=utf8');
mb_internal_encoding("UTF-8");

$dbserver="localhost"; // adresa MySQL
        $dblogin="root";       // jméno uživatele MySQL
        $dbheslo="";           // heslo MySQL
        $dbnazev="vyjezdy";    // název databáze MySQL
    
        mysql_connect($dbserver, $dblogin, $dbheslo); // připojení k db
        mysql_select_db($dbnazev); // výběr db 
        mysql_query("SET NAMES 'utf8'"); // nastavení kódování

$table = "sezona_2013-14";
$bunka = mysql_query("SELECT `datum_kon` FROM `$table` WHERE `datum_kon` > 0 ORDER BY `datum_kon` ASC");

$events = array();
    while ($col = mysql_fetch_array($bunka)) {
        $events[] = DATE("Y-m-d", strtotime($col['datum_kon']));
        }



?>


<?php
class Calendar
{
    
    
    private $monthNames = array(1 => 'leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec',
                                    'srpen', 'září', 'říjen', 'listopad', 'prosinec');

        /**
     * Vypíše kalendářní měsíc
     * @param null $month - kalendářní měsíc, který se má vypsat
     * @param null $year
     */
    public function renderCalendar($month = null, $year = null)
    {
        // hlavička kalendáře
                $previousMonth = ($month - 1) > 0 ? $month - 1 : 12;
        $nextMonth = ($month % 12) + 1;

        $previousYear = $previousMonth > $month ? $year - 1 : $year;
        $nextYear = $nextMonth < $month ? $year + 1 : $year;

        // navigace
        echo('
            <div><table>
                <tr><th><a href="?date=' . $previousYear . '-' . $previousMonth . '"> << </a></th>
                                    <th colspan="5">' .
                                        // měsíc slovně -> první písmeno velké - bere i s diakritikou
                    mb_convert_case($this->monthNames[$month], MB_CASE_TITLE, 'UTF-8') . ' ' . $year . '</th>
                                    <th><a href="?date=' . $nextYear . '-' . $nextMonth . '"> >> </a></th>
                                </tr>
                <tr>
                    <td>Po</td><td>Út</td><td>St</td><td>Čt</td><td>Pá</td><td>So</td><td>Ne</td>
                </tr>
                <tr>');

        // počet dnů pro daný měsíc v roce
        $daysInMonth = cal_days_in_month(CAL_GREGORIAN, $month, $year);

        // zjištění začátku týdne
        $weekDay = idate("w", mktime(0, 0, 0, $month, 1, $year));
        if ($weekDay == 0) // začíná nedělí, ta je u nás však 7., 0. pozici vynecháme
            $weekDay = 7;

        // vynecháme místo
        for ($i = $weekDay; $i > 1; $i--)
            echo('<td>&nbsp;</td>');

        // vypsání jednotlivých dnů
                
                
            for ($day = 1; $day <= $daysInMonth; $day++)
        {
                
                 echo('<td');
            // pokud je aktuální měsíc a rok, označí se den -> lze pak zvýraznit pomocí css
            // if (($day == $today) && ($month == idate('m')) && ($year == idate('Y')))
            //    echo(' id="calendar-today" ');
                    
                 
                 
                    $dateodk = $year . "-" . str_pad($month, 2, 0, STR_PAD_LEFT) . "-" . str_pad($day, 2, 0, STR_PAD_LEFT);
                            if (in_array($dateodk, $events)) {
                                echo " class='calendar-akce' ";
                                }
                        
                        echo('>');
                        echo ($day);
                      
                    
            // řádkování podle týdnů
            if (($weekDay % 7) == 0)
                echo('</tr><tr>');

            $weekDay++;
            if ($weekDay > 7)
                $weekDay = 1;
                        
                        echo ('</td>');
        }

        echo('</tr>
                        </table></div>');
    }

    
}


$c = new Calendar();

// přidání + vypsání událostí pro dané datum
if ((isset($_GET['show'])) && ($_GET['show']))
{
    list($year, $month, $day) = explode('-', $_GET['show']);
}
// vypsání kalendáře pro daný měsíc
else
{
    $month = idate('m');
    $year = idate('Y');

    if ((isset($_GET['date'])) && ($_GET['date']))
        list($year, $month) = explode('-', $_GET['date']);

    $c->renderCalendar($month, $year);
}

?>
BunnyBugs6
Profil *
abc:
Poradíš mi s tím ještě?, prosím?
Jak s tím dosazováním do proměnné $events, proč to nefunguje a ještě s tím přiřazením odkazu k danému dni?
Děkuji moc :P
abc
Profil
Poradíš mi s tím ještě?, prosím?
Jistě, nemusíš přemýšlet, ani si překládat chybové hlášení...

Té tříde Calendar ty eventy musíš nějak předat...
<?php
class Calendar {
    private $events;
    public function __construct($events) {
        $this->events = $events;
    }
    //a potom nahraď $events za $this->events
    
a posléze:
$c = new Calendar($events);
BunnyBugs6
Profil *
Některým věcem ještě pořádně nerozumím, jako jsou například třídy, ale určitě přemýšlím a snažím se, však už ten kalendář tvořím skoro 14 dní :( pro někoho sranda ne pár hodin.
Ale určitě díky, jdu to dál zkoušet.

Ten odkaz už jsem třeba zjistil, šlo jen o jednu blbou závorku.
Teď jen nevím, jak tu stejnou proměnou do toho odkazu dostat, ale stále to koumám :)))
abc
Profil
Teď jen nevím, jak tu stejnou proměnou do toho odkazu dostat
Jakou proměnnou do jakého odkazu?
BunnyBugs6
Profil *
abc:
Mám $events = array($neco)
a to nevím, jak dostat do odkazu k tomu podbarvení dne s událostí
viz. řádek 90 toho celého skriptu echo " class='calendar-akce' ";

Nicméně je to asi jedno, protože už jsem naprosto bezradnej, protože nefunguje ani ten Tvůj poslední příspěvek, nebo nevím, kam a jak to mám přesně napsat.
Prostě do proměnné $events mi nejdou nasypat data automaticky. Když je tam vypíšu ručně, tak to funguje, ale jinak ne. Samozřejmě ještě bez toho odkazu na příslušnou událost, tam nevím jak právě dosadit tu proměnnou :(

Kdyby jsi měl ještě chuť, jukni na to, protože já už jsem zoufalej.
Jinak určitě moc díky, něco jsem se z toho naučil :P
abc
Profil
Jak jsem psal, je třeba provést změny, které píšu v [#20] abc

Tzn takto, pokud to nefunguje, tak si za ten while na řádcích 19-21 dej var_dump($events); a napiš, co ti to vrátilo
<?php

header('Content-type: text/html; charset=utf8');
mb_internal_encoding("UTF-8");

$dbserver = "localhost"; // adresa MySQL
$dblogin = "root";       // jméno uživatele MySQL
$dbheslo = "";           // heslo MySQL
$dbnazev = "vyjezdy";    // název databáze MySQL

mysql_connect($dbserver, $dblogin, $dbheslo); // připojení k db
mysql_select_db($dbnazev); // výběr db 
mysql_query("SET NAMES 'utf8'"); // nastavení kódování

$table = "sezona_2013-14";
$bunka = mysql_query("SELECT `datum_kon` FROM `$table` WHERE `datum_kon` > 0 ORDER BY `datum_kon` ASC");

$events = array();
while ($col = mysql_fetch_array($bunka)) {
    $events[] = date("Y-m-d", strtotime($col['datum_kon']));
}

class Calendar {

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

    public function __construct($events) {
        $this->events = $events;
    }

    /**
     * Vypíše kalendářní měsíc
     * @param null $month - kalendářní měsíc, který se má vypsat
     * @param null $year
     */
    public function renderCalendar($month = null, $year = null) {
        // hlavička kalendáře
        $previousMonth = ($month - 1) > 0 ? $month - 1 : 12;
        $nextMonth = ($month % 12) + 1;

        $previousYear = $previousMonth > $month ? $year - 1 : $year;
        $nextYear = $nextMonth < $month ? $year + 1 : $year;

        // navigace
        echo('
            <div><table>
                <tr><th><a href="?date=' . $previousYear . '-' . $previousMonth . '"> << </a></th>
                                    <th colspan="5">' .
        // měsíc slovně -> první písmeno velké - bere i s diakritikou
        mb_convert_case($this->monthNames[$month], MB_CASE_TITLE, 'UTF-8') . ' ' . $year . '</th>
                                    <th><a href="?date=' . $nextYear . '-' . $nextMonth . '"> >> </a></th>
                                </tr>
                <tr>
                    <td>Po</td><td>Út</td><td>St</td><td>Čt</td><td>Pá</td><td>So</td><td>Ne</td>
                </tr>
                <tr>');

        // počet dnů pro daný měsíc v roce
        $daysInMonth = cal_days_in_month(CAL_GREGORIAN, $month, $year);

        // zjištění začátku týdne
        $weekDay = idate("w", mktime(0, 0, 0, $month, 1, $year));
        if ($weekDay == 0) // začíná nedělí, ta je u nás však 7., 0. pozici vynecháme
            $weekDay = 7;

        // vynecháme místo
        for ($i = $weekDay; $i > 1; $i--)
            echo('<td>&nbsp;</td>');

        // vypsání jednotlivých dnů


        for ($day = 1; $day <= $daysInMonth; $day++) {

            echo('<td');
            // pokud je aktuální měsíc a rok, označí se den -> lze pak zvýraznit pomocí css
            // if (($day == $today) && ($month == idate('m')) && ($year == idate('Y')))
            //    echo(' id="calendar-today" ');



            $dateodk = $year . "-" . str_pad($month, 2, 0, STR_PAD_LEFT) . "-" . str_pad($day, 2, 0, STR_PAD_LEFT);
            if (in_array($dateodk, $this->events)) {
                echo " class='calendar-akce' ";
            }

            echo('>');
            echo ($day);


            // řádkování podle týdnů
            if (($weekDay % 7) == 0)
                echo('</tr><tr>');

            $weekDay++;
            if ($weekDay > 7)
                $weekDay = 1;

            echo ('</td>');
        }

        echo('</tr>
                        </table></div>');
    }

}

$c = new Calendar($events);

// přidání + vypsání událostí pro dané datum
if ((isset($_GET['show'])) && ($_GET['show'])) {
    list($year, $month, $day) = explode('-', $_GET['show']);
}
// vypsání kalendáře pro daný měsíc
else {
    $month = idate('m');
    $year = idate('Y');

    if ((isset($_GET['date'])) && ($_GET['date']))
        list($year, $month) = explode('-', $_GET['date']);

    $c->renderCalendar($month, $year);
}
?>
BunnyBugs6
Profil *
Aha, tak jsem fakt pako, pořád jsem tam cpal před "for" (v Tvém posledním na řádek 73) to $this->events = array()
Tohle už funguje, děkuji mockrát.
A mohu tedy ještě poprosit, jak k tomu přiřadit i odkaz?
Mám to asi nějak takhle

<a href="?show=cont-col&right-col=" . $NECO . " title=" . $NECO-2 . "">

Na místo toho $NECO by měla být stejná proměnná jako je v $events dle toho přiřazeného data
a v tom $NECO-2 by měla být shodná proměnná jako $NECO, jen s tím, že by byl vybrán jiný sloupec tabulky.
Když tam zadám jen $this->events, tak to nefunguje.
abc
Profil
Drobná poznámka: to, co vypisuješ přes echo, tak nemusí být v závorkách, tedy

echo ($day);
-> echo $day;
echo '>';

Snad něco jako toto:
1)
<?php
$bunka = mysql_query("SELECT `datum_kon`, `jiny_sloupec` FROM `$table` WHERE `datum_kon` > 0 ORDER BY `datum_kon` ASC");

$events = array();
while ($col = mysql_fetch_array($bunka)) {
    $events[date("Y-m-d", strtotime($col['datum_kon']))] = $col['jiny_sloupec'];
}

2)
<?php
for ($day = 1; $day <= $daysInMonth; $day++) {

            echo'<td';

            $dateodk = $year . "-" . str_pad($month, 2, 0, STR_PAD_LEFT) . "-" . str_pad($day, 2, 0, STR_PAD_LEFT);
            if (isset($this->events[$dateodk])) {
                echo " class='calendar-akce' >";
                echo "<a href='?show=cont-col&right-col='$dateodk' title = '" . $this->events[$dateodk] . "'>";
            } else {
                echo ">";
            }

            echo $day;
            
            if (isset($this->events[$dateodk])) {
                echo "</a>";
            }
BunnyBugs6
Profil *
abc:
Supeeeer, vítězství ... koukám, že se mám sakra co učit, ale na druhou stranu, to šrotim teprve asi měsíc :P
Musel jsem trochu něco poupravit, měl jsi tam jeden apostrof navíc, ale to už je pro mě chyba, kterou jde najít :P

Děkuji Ti fakt moc :)

P.S.: neměl by jsi nějaký doporučený odkaz na to, kde se naučím dělat stránky s přístupem přes heslo? Díky :)
abc
Profil
P.S.: neměl by jsi nějaký doporučený odkaz na to, kde se naučím dělat stránky s přístupem přes heslo?
Máš na mysli jako normální přihlašování uživatelů?
Můžeš začít ve zdejším Nejčastější potíže s PHP, konkrétně Přihlašování a registraceí

A taky tu vzniká učebnice PHP

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: