Copyright - skrypt php i javascript

09.05.2010, 17:29 | programowanie/skrypty
W nawiązaniu do wpisu Efki o znaczku copyright (©) umieszczanym w stopce strony i ogólnie o prawach autorskich, postanowiłem napisać prosty skrypt PHP, który rozwiązuje wspomniany u niej problem - kiedy ktoś zapomina zaktualizować datę i w roku 2010 nadal widnieje u niego na stronie przedział lat 2006-2008.

Można oczywiście w ogóle zrezygnować z daty lub z informacji o prawach autorskich, ale jeśli już to robimy, to zróbmy to porządnie.

Najprostszym sposobem jest umieszczenie w stopce informacji o prawach jedynie w odniesieniu do aktualnego roku, ale zamiast wpisywać rok ręcznie i zmieniać go co rok (lub o tym zapominać), można podać rok 'aktualny', do którego mamy dostęp dzięki obiektowi Date:

<?php echo date('Y'); ?>

Co, jeśli chcemy bardziej rozbudować naszą stopkę, na przykład o zakres lat? Na przykład, rozpoczęliśmy pisanie na blogu w roku 2007, w chwili tworzenia tego wpisu mamy rok 2010, więc chcielibyśmy dostać © 2007-2010. Napiszmy więc funkcję, która nam w tym pomoże:

<?php
function copyright($fromYear) {
  return '&copy; '.$fromYear.'-'.date('Y');
}
echo copyright(2007);
?>

Dzięki tej funkcji bez problemu zdefiniujemy nasz zakres, a wpisując 2007 jako datę początkową dostaniemy w odpowiedzi © 2007-2010. Spróbujmy to urozmaicić i dodać od razu autora, by wpis o prawach autorskich był kompletny:

<?php
function copyright($fromYear,$author) {
  return '&copy; '.$fromYear.'-'.date('Y').' '.$author;
}
echo copyright(2007,'Ender');
?>

Tak zdefiniowana funkcja wyświetli nam © 2007-2010 Ender, czyli od lewej znaczek copyright, zakres dat oraz autora. Wygląda to dobrze, ale co się stanie, jeśli ktoś wpisze złe dane? Zakres od 2070 do 2010 nie wygląda za dobrze, jeśli ktoś popełni literówkę wpisując rok 2007. Spróbujmy zabezpieczyć nasz skrypt:

<?php
function copyright($fromYear,$author) {
  $currentYear = date('Y');
  $dateRange = '';
  if($fromYear >= $currentYear)
    $dateRange = $currentYear;
  else
    $dateRange = $fromYear.'-'.$currentYear;
  return '&copy; '.$dateRange.' '.$author;
}
echo copyright(2007,'Ender');
?>

Jeśli wpisany rok jest większy lub równy aktualnemu, to wyświetlamy jedynie aktualny rok (np. 2010). Jeśli wpisany rok jest mniejszy od aktualnego, wyświetlamy zakres (np. 2007-2010). Spróbujmy zmniejszyć liczbę linijek kodu - zastosujemy skróconą formę instrukcji warunkowej if...else, która wygląda tak:

// normalny warunek:
if(warunek)
  $zmienna = 'coś';
else
  $zmienna = 'coś innego';
// skrócony warunek:
$zmienna = warunek ? 'coś' : 'coś innego';

Tak więc zamiast czterech linijek możemy to zapisać w jednej:

$dateRange = ($fromYear >= $currentYear ? $currentYear : $fromYear.'-'.$currentYear);

Możemy to jeszcze bardziej uprościć przenosząc powtarzającą się zmienną poza instrukcję warunkową:

$dateRange = ($fromYear >= $currentYear ? '' : $fromYear.'-').$currentYear;

Dzięki tym zabiegom nasza funkcja wygląda następująco:

<?php
function copyright($fromYear,$author) {
  $currentYear = date('Y');
  $dateRange = ($fromYear >= $currentYear ? '' : $fromYear.'-').$currentYear;
  return '&copy; '.$dateRange.' '.$author;
}
echo copyright(2007,'Ender');
?>

Wygląda nieźle. Chcielibyśmy, by autor był podlinkowany do strony głównej. Nie ma problemu, całość będzie wyglądać tak:

<?php
function copyright($fromYear,$author,$link) {
  $currentYear = date('Y');
  $dateRange = ($fromYear >= $currentYear ? '' : $fromYear.'-').$currentYear;
  $authorInfo = $link ? '<a href="'.$link.'">'.$author.'</a>' : $author;
  return '&copy; '.$dateRange.' '.$authorInfo;
}
echo copyright(2007,'Andrzej','');
echo copyright(2006,'Ender','http://end3r.com/');
?>

Pierwsze użycie naszej funkcji wyświetli © 2007-2010 Andrzej, natomiast drugie © 2006-2010 Ender.
Gotowe, skończyliśmy tworzyć skrypt, który za nas bedzie martwił się odpowiednim wyświetleniem zakresu dat dla praw autorskich. Oczywiście zwracany wygląd można sobie dowolnie zmodyfikować, na przykład wyświetlić najpierw autora, a później znaczek © i daty. Na przykład zmiana ostatniej linijki funkcji na return 'Copyright &copy; '.$dateRange.' by '.$authorInfo; wyświetli nam Copyright © 2007-2010 by Andrzej. Każdy może zmodyfikować powyższy skrypt dla własnych potrzeb i uzyskać zadowalający go efekt.

JavaScript
Jeśli ktoś woli użyć JavaScript zamiast PHP, to logika jest identyczna, a kod różni się jedynie szczegółami (zmienne, łączenie łańcuchów znakowych). Tak wygląda kod po zmianie języka:

<script type="text/javascript">
function copyright(fromYear,author,link) {
  var currentYear = new Date().getFullYear();
  var dateRange = (fromYear >= currentYear ? '' : fromYear +'-') + currentYear;
  var authorInfo = link ? '<a href="' + link + '">' + author + '</a>' : author;
  return '&copy; ' + dateRange + ' ' + authorInfo;
}
document.write(copyright(2006,'Ender','http://end3r.com/'));
</script>

Można go umieścić w footerze tam, gdzie mamy zamiar wyświetlić informację o prawach autorskich. Oczywiście najlepiej byłoby umieścić ten kod (bez tagów <script>) i użyć funkcję w zewnętrznym pliku .js zawierającym cały nasz kod użyty na stronie, zamiast wklejać go bezpośrednio.

komentujKomentarze:

taaa ;* web co? kto? ;p
No właśnie Efka tak uczy(ła) klientów, ale z pomocą webenergoterapeuty stara się z tym walczyć ;P
@efka - ja wiem, że to jest dziwne, ale jak nauczysz klienta, że taka zmiana to pikuś, to potem takich zmian będzie chciał więcej i więcej. Jeszcze będzie mówił, że "przecież to chwilka" ;]
Shpyo - ja wiem, czy zabawa w zmianę roku z 2009 na 2010 to coś, za co wziąłbym kasę od klienta? Jeśli tak, to ile, 5 zł? :D
Można na przykład doliczyć to do większego rachunku. Można też wykorzystać ten skrypt jedynie na własnych stronach, a na stronach klientów pozostawić stare daty do aktualizacji - nie musisz się bawić z aktualkami na własnych serwisach, a za zmiany u klienta pobierasz opłatę. Rozwiązanie idealne ;]
jak ktoś jest profesjonalistą to taki skrypt w cms'ie powinien zaproponować... wiem... widzę świat inaczej, jakbym spaliła worek dobrego stuff'u - cóż poradzić...
z punktu widzenia marketingowego, taki skrypt to złe rozwiazanie. każda aktualizacja na stronie klienta, to łatwa kasa ;)))
ludzie zapominają ;) a poza tym ten rok to jak się okazuje nie taki wielki problem - kwestia tylko taka, że "jak już się coś robi, to porządnie" (cytując Endera)... na moją prośbę Ender napisał soczysty kawałek kodu, który od tej chwili będziemy wykorzystywać na naszych stronach, żeby nikt już nie musiał tak przeżywać problemu zmiany daty ;P
A co ludzie dodawać nie potrafią czy nie wiedzą, który mamy rok? :D
kit kat - starałem się to jak najprościej wyjaśnić, chociaż i tak musiałem założyć przynajmniej podstawową znajomość php i/lub programowania :)

northerr, a u siebie na metalnews to który niby masz rok w footerze, że się tak tutaj z mojego nabijasz? ;)
Kamila kocha PyHyPy ; X
otwierając ten wpis bałam się, że wymyślisz coś egzotycznego, a tu widzę, że nawet wszystko rozumiem ; )
Cóż za ironia :p
Dzięki Jojo za zwrócenie uwagi - fakt, byłem zajęty tworzeniem wpisu, przez co zapomniałem i nie zaaplikowałem stworzonego skryptu u siebie na stronie ;]
nom Ender - też właśnie spostrzegłam - zrobiłeś update na portfolio, ale już na blog.end3r.com niet! ;P instaluj skrypt ;P
Jak to mówią szewc bez butów chodzi :) No chyba że w Twojej strefie czasowej jest nadal 2009 :)
Mały i skromny, ale może komuś jeszcze się przyda ;]
jak pisałam u siebie - poprawna kolejność to: © DATA AUTOR - to tak w kwestii dowolnego modyfikowania kodu ;)
Ender - dzięki Tobie nie będę musiała sobie głowy zaprzątać aktualizacją copyright'a :*
miły tutek :)
Edit: Dodałem kod JavaScript, gdyby ktoś preferował ten język. Sprawdzone, także działa.
Poprawione - chciałeś mi tu skrypt w tagach SCRIPT zaaplikować, który by się wykonał ;P

To, co podałeś jest praktycznie tym samym, co pierwszy fragment kodu podanego przeze mnie we wpisie tyle, że zamiast PHP jest w JavaScript. Co kto lubi, może być i js ;]

No i nie Java, tylko JavaScript ;]
Ahh no tak te Twoje cenzury :p
Ja zawsze używałem czegoś takiego:

var data = new Date();
var rok = (data.getFullYear ? data.getFullYear() : data.getYear());
if (data != 0) document.write(rok);

Ale chyba JAVA wychodzi z mody widać ;)