Seite 1 von 2

Annual Stars Schaltjahre

Verfasst: 26.07.2012 19:07
von Malte
Hallo ihr Guten,

ich habe vor langem den Annual Stars MOD installiert und nun fällt mir eine Sache auf:
Ein Mitglied, welches morgen, genau ein Jahr registriert ist, hat bereits heute seinen Stern erhalten...
Das bösartige Wort: Schaltjahre!

Der Befehl zur Berechnung eines Jahres-Sternes ist folgender:

Code: Alles auswählen

// annual stars
	$reg_stars = '';
	if ($reg_years = (int) ((time() - (int) $data['user_regdate']) / 31536000))
	{
		$reg_stars = str_repeat($user->img('icon_annual_star', 'YEARS_OF_MEMBERSHIP'), $reg_years);
	}
31536000 Sekunden sind leider 365 Tage und damit werden Schaltjahre missachtet.

Kann mir jemand eine logische Lösung sagen, die Schaltjahre mit berücksichtigt? Etwa in der Art, dass er nicht 31536000 Sekunden, sondern 1 Jahre berechnet oder der gleichen.

Ich freue mich auf eure Antworten, vielleicht gibts ja jemanden, der das Problem beheben kann. Ich habe dazu bereits gegooglet, es gab viele Anfragen mit dem Anliegen, aber die Sparte der Entwickler hat bisher keine Lösung offenbart. :roll:

Gruß
Malte :D

Re: Annual Stars Schaltjahre

Verfasst: 26.07.2012 20:02
von Miriam
Probiere es so:

Code: Alles auswählen

// annual stars
    $reg_stars = '';
    if (date("n", time()) < 3)
    {
        if ($reg_years = (int) ((time() - (int) $data['user_regdate']) / 31536000))
        {
            $reg_stars = str_repeat($user->img('icon_annual_star', 'YEARS_OF_MEMBERSHIP'), $reg_years);
        }
    }
    else
    {
        if ($reg_years = (int) (((time() - date("L") * 86400 -(int) $data['user_regdate']))/ 31536000))
        {
            $reg_stars = str_repeat($user->img('icon_annual_star', 'YEARS_OF_MEMBERSHIP'), $reg_years);
        }
    } 
// habe es nicht getestet, aber sollte so passen. Check das mal.

Re: Annual Stars Schaltjahre

Verfasst: 26.07.2012 20:06
von Malte
Danke für deine Schnelle Antwort Miriam. :D Leider bin ich (noch) nur html und CSS mächtig und bin noch am lernen von php.

Deshalb kann ich
Miriam hat geschrieben:Da mußt Du dann nur noch die Besonderheiten für Januar und Februar einbauen. :)
nicht selbst umsetzen. Ich wüsste jetzt auch nicht direkt, was ich mit dem Januar anfangen soll? Die Besonderheit ist doch nur der Februar?

Gruß
Malte :D

Re: Annual Stars Schaltjahre

Verfasst: 26.07.2012 20:12
von Miriam
Schau mal oben.. habe es noch etwas angepasst..

Besonderheit Januar und Februar des Schaltjahres: Es gibt keinen zusätzlichen Tag, der wirkt erst ab März des Schaltjahres und für Januar / Februar des darauf folgenden Jahres.
Happy programming. :wink:

Re: Annual Stars Schaltjahre

Verfasst: 26.07.2012 20:20
von Malte
Ok, das mit dem Januar war mir nicht ganz klar. Vielen Dank für deine Hilfe, ich werde das ganze gleich mal testen, mal wieder besten Dank für deinen zuverlässigen Support. :D

Re: Annual Stars Schaltjahre

Verfasst: 26.07.2012 20:45
von darkonia
top lösung miriam!

Re: Annual Stars Schaltjahre

Verfasst: 27.07.2012 06:32
von Miriam
Noch nicht ganz. 8)
Es fehlt ja noch die Anpassung für Jan / Feb des darauffolgenden Jahres.

Code: Alles auswählen

//annual stars
    $reg_stars = '';
    $lastyear = date("L", time() - 7776000);
    if (date("n", time()) < 3)
    {
        if ($reg_years = (int) ((time() - $lastyear * 86400 - (int) $data['user_regdate']) / 31536000))
        {
            $reg_stars = str_repeat($user->img('icon_annual_star', 'YEARS_OF_MEMBERSHIP'), $reg_years);
        }
    }
    else
    {
        if ($reg_years = (int) ((time() - date("L") * 86400 -(int) $data['user_regdate'])/ 31536000))
        {
            $reg_stars = str_repeat($user->img('icon_annual_star', 'YEARS_OF_MEMBERSHIP'), $reg_years);
        }
    }

Re: Annual Stars Schaltjahre

Verfasst: 27.07.2012 11:14
von Malte
Die Anpassung habe ich vorgenommen. :D
3 Dinge hätte ich aber noch:
1. Die Lösung funktioniert perfekt, der Stern wird nun erst brav nach einem Jahr angezeigt. :D
2. Wenn man über den Stern herüber fährt, wird nun aber statt "1 Jahr Mitgliedschaft", "%d Jahre Mitgliedschaft" angezeigt.
3. Die MOD verlangt 2 Anpassungen, fiel mir gerade auf. Die, die nun funktioniert, ist die für die memberlist. Viewtopic verlangt leider auch noch eine Anpassung. Der Text bei beiden Dateien ist sehr verschieden, weswegen man die erste nicht auch für Viewtopic nutzen kann.

Diese hier ist die für die Beitragsansicht:

Code: Alles auswählen

// annual stars
			$user_cache[$poster_id]['reg_stars'] = '';
			if ($reg_years = (int) ((time() - (int) $row['user_regdate']) / 31536000))
			{
				$reg_output = sprintf($user->lang['YEAR_OF_MEMBERSHIP'], $reg_years);
				if($reg_years > 1)
				{
					$reg_output = sprintf($user->lang['YEARS_OF_MEMBERSHIP'], $reg_years);
				}
				$user_cache[$poster_id]['reg_stars'] = str_repeat($user->img('icon_annual_star', $reg_output), $reg_years);
			}
Gruß
Malte :D

Re: Annual Stars Schaltjahre

Verfasst: 28.07.2012 09:42
von Miriam
1. Die Lösung funktioniert perfekt, der Stern wird nun erst brav nach einem Jahr angezeigt. :D
Das ist schön
2. Wenn man über den Stern herüber fährt, wird nun aber statt "1 Jahr Mitgliedschaft", "%d Jahre Mitgliedschaft" angezeigt.
Was soll ich sagen? Der Code, den Du gepostet hast und der, der in der memberlist.php benutzt wird haben nur bedingt etwas miteinander zu tun.
Dein Code (von oben):
  • Code: Alles auswählen

        // annual stars
        $reg_stars = '';
        if ($reg_years = (int) ((time() - (int) $data['user_regdate']) / 31536000))
        {
          $reg_stars = str_repeat($user->img('icon_annual_star', 'YEARS_OF_MEMBERSHIP'), $reg_years);
        }
Memberlist.php Code:
  • Code: Alles auswählen

        // annual stars
        $reg_stars = '';
        if ($reg_years = (int) ((time() - (int) $data['user_regdate']) / 31536000))
        {
            $reg_output = sprintf($user->lang['YEAR_OF_MEMBERSHIP'], $reg_years);
            if($reg_years > 1)
            {
                $reg_output = sprintf($user->lang['YEARS_OF_MEMBERSHIP'], $reg_years);
            }
            $reg_stars = str_repeat($user->img('icon_annual_star', $reg_output), $reg_years);
        }
Die Sprachvariablenzuordnung für den Platzhalter %d passiert hier:
  • Code: Alles auswählen

    $reg_output = sprintf($user->lang['YEARS_OF_MEMBERSHIP'], $reg_years);
Und nun nochmal für die memberlist.php (diesmal mit Sprachvariablenanpassung):
  • Code: Alles auswählen

    //annual stars
        $reg_stars = '';
        $leapyear = (date("n", time()) < 3) ? date("L", time() - 7776000) : date("L", time());
        $reg_years = (int) ((time() - $leapyear * 86400 - (int) $data['user_regdate']) / 31536000);
        $reg_output = ($reg_years > 1) ? sprintf($user->lang['YEARS_OF_MEMBERSHIP'], $reg_years) : sprintf($user->lang['YEAR_OF_MEMBERSHIP'], $reg_years);
        $reg_stars = str_repeat($user->img('icon_annual_star', $reg_output), $reg_years);
3. Die MOD verlangt 2 Anpassungen, fiel mir gerade auf. Die, die nun funktioniert, ist die für die memberlist. Viewtopic verlangt leider auch noch eine Anpassung. Der Text bei beiden Dateien ist sehr verschieden, weswegen man die erste nicht auch für Viewtopic nutzen kann.
Ist doch nicht so schlimm: Die prinizipielle Vorgehensweise hast Du ja nun. Passe das ein bißchen an und fertig ist die Laube... wie man so sagt.

Re: Annual Stars Schaltjahre

Verfasst: 30.07.2012 12:19
von Malte
Hallo Miriam,

nach kurzer Abstinenz melde ich mal wieder zurück.
1. Ich darf erfreulich berichten, dass der neue Code für die Memberlist ein Erfolg ist und seinen soll erfüllt haben müsste. :D
Einen großen Dank an dich, für diese tolle Arbeit.

2.
Ist doch nicht so schlimm: Die prinizipielle Vorgehensweise hast Du ja nun. Passe das ein bißchen an und fertig ist die Laube... wie man so sagt.
Entschuldige, dass ich nochmal nach Hilfe schreien muss. In den Jahren meiner Webentwicklung habe ich mich komplett auf HTML und CSS spezialisiert und habe keinen blassen Schimmer von php, abgesehen von den üblichen Grundkenntnissen, die man für ein phpBB-Forum braucht natürlich.
Deshalb frage ich hier ab und zu mal nach und meine Fragen, die sich leider ein wenig gehäuft haben, wurden bisher meist freundlichst beantwortet. :D
Ich habe mich nun schon ein wenig mit der Anpassung des Codes beschäftigt, aber bei jeder Anpassung kamen minimal 5 Debug Error bei raus. :lol:
Währst du so freundlich, mir bei diesem Schritt auch nochmal unter die Arme greifen zu können? Ich bin nun dabei, php zu erlernen, aber aktuell reichen meine Kenntnisse nicht dafür aus. :oops:

Danke im Voraus.

Gruß
Malte :D