Anzeigen von Inhalten für anonymous User...
am 27.12.2009 - 17:03 Uhr in
Hallo zusammen,
letzte Woche habe ich wieder etwas geschrieben, bin aber nicht so ganz zufrieden, bzw. möchte wenn möglich weniger PHP aber mehr Drupal Funktionen nutzen.
Sorry für das Englisch, wenn ich dieses Modul vielleicht mal der Community vorstelle, so wird der Text noch angepasst. Einige "titel-callbacks" für die t() Funktionen fehlen noch. Gerne hätte ich grundsätzlich gewusst, was hier möglich ist und wo ich Mist geschrieben habe (auch wenn es funktioniert).
Es geht um nicht angemeldete Benutzer, welche Inhalte trotz fehlender Rechte für einige Male ansehen können. Die Inhalte basieren auf allen möglichen Nodes, dabei kann man gewisse Inhaltstypen freigeben. Berechtigungen habe ich keine gesetzt, was auch schwer sein dürfte für nicht zugelassene Inhalte und nicht angemeldete User.
Funktionieren tut das ganze ja, aber mir wäre doch wohler, wenn ich eure Meinung dazu hören könnte.
Danke schon im Voraus und allen jetzt schon ein erfolgreiches 2010.
accesscounter.module:
<?php
/**
* Implementation of hook_menu()
*/
function accesscounter_menu() {
$items['admin/settings/accesscounter'] = array(
'title' => 'Accesscounter',
'description' => t('Configure counts for access of any Content, which is by default not allowed.'),
'page callback' => 'drupal_get_form',
'page arguments' => array('accesscounter_admin_settings'),
'access arguments' => array('administer site configuration'),
'type' => MENU_NORMAL_ITEM,
'file' => 'accesscounter.admin.inc',
);
$items['admin/settings/accesscounter/count'] = array(
'title' => 'Access count',
'description' => t('How often, a content type have allow access'),
'page callback' => 'drupal_get_form',
'page arguments' => array('accesscounter_count_admin_settings'),
'access arguments' => array('administer site configuration'),
'type' => MENU_NORMAL_ITEM,
'file' => 'accesscounter.admin.inc',
);
return $items;
}
/**
* Implementation of hook_nodeapi()
*/
function accesscounter_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
global $user;
$options = variable_get('accesscounter_node_types', array());
foreach($options as $opt => $value) {
if($op == 'view' && $value == $node->type && $value != FALSE) {
$countst = variable_get("accesscounter_node_count_$value", '');
$mytyp = 'an' . $value;
if ($user->uid == 0 && !isset($_COOKIE["$mytyp"]) && !isset($_COOKIE["full$mytyp"])) {
$values = $_SERVER['REMOTE_ADDR'] . ' ' . date("d.m.Y H-i") . ' ' . 1;
setcookie($mytyp, $values);
} else if($node->type == $value && isset($_COOKIE["$mytyp"]) && $user->uid == 0 && !isset($_COOKIE["full$mytyp"])) {
$val = $_SERVER['REMOTE_ADDR'];
$datetm = date("d.m.Y H-i");
$value = $_COOKIE["$mytyp"];
$cnt = trim(substr($value, -2));
// bei der IP möchte ich noch nachbessern und auch die momentane IP mit dem Cookie vergl.
$ip = strtok($value, ' ');
$values = $val . ' ' . $datetm . ' ' . ($cnt + 1);
setcookie($mytyp, $values);
}
if ($countst <= $cnt && $user->uid == 0) {
$full = 'full' . $mytyp;
setcookie($full);
}
if(isset($_COOKIE["full$mytyp"])) {
unset($_COOKIE["$mytyp"]);
accesscounter_gtoregister();
}
}
}
}
/**
* Call Function, if Cookie 'full...' is setting.
*/
function accesscounter_gtoregister() {
drupal_set_message(t("Please register! Access for this Type is expired!"));
drupal_goto('/user/register');
}
?>
accesscounter.admin.inc:
<?php
/**
* Callback of hook_menu()
* for content types allow
*/
function accesscounter_admin_settings() {
$options = node_get_types('names');
$form['accesscounter_node_types'] = array(
'#type' => 'checkboxes',
'#title' => t('Allow some content for anonymous user.'),
'#options' => $options,
'#default_value' => variable_get('accesscounter_node_types', array('')),
'#description' => t('Here, you can set which node types are allowed for anonymous user.'),
);
return system_settings_form($form);
}
function accesscounter_count_admin_settings() {
$options = variable_get('accesscounter_node_types', array());
foreach($options as $opt => $value) {
if($value != FALSE) {
$form["accesscounter_node_count_$opt"] = array(
'#type' => 'select',
'#title' => t('Node type = @opt', array('@opt' => $opt)),
'#options' => array(0 => 'not set', 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 8 => 8, 10 => 10,15 => 15, 20 => 20, 30 => 30, 50 =>50, 75 => 75, 100 => 100, 200 => 200),
'#default_value' => variable_get("accesscounter_node_count_$opt", '0'),
);
} else if($value == FALSE) {
drupal_set_message(t('Typ: @value is not active!', array('@value' => $opt)));
variable_del("accesscounter_node_count_$opt");
}
}
return system_settings_form($form);
}
?>
Das ist es schon, ich möchte auch die Userprofile noch einfügen. Dazu habe ich mir gedacht, dass ich mich einfach in den Menüpfad der Profilanzeige einklinke, in etwa profile/%, oder wie der Pfad dann genau lautet.
Wird nun ein Profil angesehen, so könnte ich auch da ein Cookie setzen. Angedacht ist auch noch eine Drupal Tabelle, damit auch die IP gespeichert werden kann, ev. sollten alle IP Adressen in den Cookies sein, damit Änderungen in der DB berücksichtigt werden...
Gruss und danke für die wertvollen Hinweise!
Fredi
- Anmelden oder Registrieren um Kommentare zu schreiben
Überschrift bitte anders wählen
am 27.12.2009 - 19:21 Uhr
Hallo ;D
Als erstes, Bitte ändere die Überschrift, weil mit "etwas spiziell" werden nicht soviele User hier antworten. Da keiner genau weiss, was dahintersteckt, ausserdem ist die Suche damit erschwerend.
Zu deinem Modul, wenn ich es richtig verstanden habe, kann man Inhalte freigeben für nicht angemeldetete user. Das heisst, diese Inhalte können nur User mit bestimmten Rechten ansehen. So richtig verstanden ?
Klingt sehr intressant. Werde ich mal die nächsten Tage mal ausprobieren.
Greetings
Bogus
www.LinuxSoftBoard.de
Greetings
Bogus
Hallo Bogus,das Modul ist
am 28.12.2009 - 09:49 Uhr
Hallo Bogus,
das Modul ist noch nicht ganz fertig, oben habe ich überhaupt eine falsche Aussage gemacht. Da das Modul ja nur für das Cookie mit der Zählung da ist, muss ein Inhalt grundsätzlich für einen User zugelassen sein.
Ob aber jetzt mein Modul diese Inhalte ausgibt, oder das zuständige Modul selber, ist wohl kein grosser Unterschied, erspart mir aber Aufwand.
In groben Zügen ist folgendes möglich, aber auch noch nicht alles ganz sauber getestet.
- Das Modul prüft alle vorhandenen Inhaltstypen (aktivierte).
- Nach der Installation erhält man für jeden Typen (Profile fehlen noch) eine Checkbox.
- Wird ein Typ aktiviert, so kann man eine gewisse Anzahl von Zugriffen zulassen. Wie gesagt, momentan muss ein Typ noch explizit zugelassen sein, weil die Ausgabe vom zuständigen Modul kommt.
- Wird die Anzahl überschritten, kommt einfach eine Message und es wird zur Registrierung umgeleitet.
Es fehlen noch:
Eine Möglichkeit der DB-Speicherung, um IP-s zu speichern, die keine Cookies zulassen. Und dass das Modul am besten selber die Inhalte ausgibt, dann müsste dieser nicht mal zugelassen sein für nicht angemeldete Benutzer. Die Idee kam eigentlich von einem Dritten, der Userprofile nur eine gewisse Anzahl anzeigen lassen wollte. Dies möchte ich noch nachschreiben, indem ich einfach den aufgerufenen Pfad prüfe und das auch als möglichen "Typen" auswählbar mache.
Zuerst wollte ich das mit Aktionen versuchen, empfinde ich aber als ungleich schwerer.
Teilweise bin ich noch unsicher und habe keine grosse Praxis, darum auch die Vorstellung.
Wenn du es ausprobieren möchtest, hier noch die Info Datei. Du kannst diese ja abändern, wie es dir gefällt...
Ich habe erst nach der Veröffentlichung des ersten Beitrages so richtig darüber nachgedacht; das Modul ist noch viel zu unsicher um auf die Welt los gelassen zu werden, Gründe habe ich ja ausgeführt.
Gruss
Fredi
Hier die kleine accesscounter.info
<?php
; $Id$
name = Access counter
description = An access limiter for content and more ...
core = 6.x
package = test
?>
___________________________________________________________________________
Wenn Frage beantwortet wurde, bitte [gelöst] in den Titeleintrag schreiben.
Morjen ;D Bin leider kein
am 28.12.2009 - 10:01 Uhr
Morjen ;D
Bin leider kein Programmierer, aber ich kann es mal in einem Testumgebung mal installieren. Wollte eh Xampp local installieren und dann einige Sachen da durchprobieren ;D
Greetings
Bogus
www.LinuxSoftBoard.de
Greetings
Bogus
froh um Feedback
am 29.12.2009 - 13:39 Uhr
Hallo Bogus,
danke ich bin immer froh um Feedback. Ich muss einiges noch verbessern, habe die Arbeit unterschätzt :-)
Gruss
Fredi
EDIT: Ich mache jetzt erstmal das Modul für alle Nodetypen sauber fertig. Es kommt eine DB-Tabelle hinzu, welche die IP-Adressen auch nochmals erfasst und ggf. ein Cookie erneuern kann. - bzw. ein Cookie den "Zustand" in der DB erneut "abspeichern" kann.
Das ist noch recht komplex ... aber interessant.
___________________________________________________________________________
Wenn Frage beantwortet wurde, bitte [gelöst] in den Titeleintrag schreiben.