Datensätze in con_properties & FEuser

Uwe
Beiträge: 258
Registriert: Mo 30. Jun 2003, 16:05
Wohnort: Konstanz
Kontaktdaten:

Datensätze in con_properties & FEuser

Beitrag von Uwe »

Hallo nochmal ;-)

die zusätzlichen Angaben für die FEuser werden ja in die Tabelle con_properties geschrieben. So wie ich das sehe, bleiben diese Einträge bestehen, auch nach dem Löschen der FEuser.

Ist es möglich, diese Datensätze beim Löschen des FEusers mit zu entfernen? Oder habt Ihr da Tricks auf Lager?

Das habe ich übrigens auch bei den Aufgaben (todo) gemerkt, so wird die Tabelle sicher bald riesig ...

Viele Grüsse, Uwe
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB »

Ist mir auch schon mal aufgefallen. Mein Vorschlag (komplett ungetestet, Backup...):

contenido/classes/class.properties.php unterhalb setValue einfügen:

Code: Alles auswählen

	/*
	 * Deletes a property item. Handles creation and updating.
	 *
	 * Example:
	 *
	 * $properties->delValue("idcat", 27, "visual", "image");
	 *
	 * @param itemtype 	mixed Type of the item (example: idcat)
 	 * @param itemid 	mixed ID of the item (example: 31)
 	 * @param type	 	mixed Type of the data to store (arbitary data)
 	 * @param name		mixed Entry name
	 */	
	function delValue ($itemtype, $itemid, $type, $name)
	{
		$this->select("idclient = '".$this->client."' AND itemtype = '$itemtype' AND itemid = '$itemid' AND type = '$type' AND name = '$name'");

		if ($item = $this->next())
		{
			$this->delete($item->get($this->primaryKey));
		}
	}
contenido/classes/class.genericdb.php unter getProperty:

Code: Alles auswählen

	/**
	 * delProperty ($type, $name)
	 * Deletes a custom property
	 * @param string $type  Specifies the type
	 * @param string $name  Specifies the name
	 */
	function delProperty($type, $name)
	{
		/* Runtime on-demand allocation of the properties object */
		if (!is_object($this->properties))
		{
			$this->properties = new PropertyCollection;
		}

		/* If this object wasn't loaded before, return false */
		if ($this->virgin == true)
		{
			$this->lasterror = "No item loaded";
			return false;
		}

		/* Delete the value */
		$this->properties->delValue($this->primaryKey, $this->get($this->primaryKey), $type, $name));
		return true;
	}
Jeweils in der contenido/plugins/frontendusers/<Unterverzeichnis>/<Element>.php unter <Element>_store (<Unterverzeichnis> und <Element> sind geeignet zu ersetzen):

Code: Alles auswählen

function frontendusers_<Element>_delete ()
{
	global $feuser;
	
	$feuser->delProperty("email", "address");
	return true;
}
In contenido/includes/include.frontend.user_edit.php vor $feuser->delete($idfrontenduser); einfügen:

Code: Alles auswählen

    	/* Check out if there are any plugins */
	/* Note, that Contenido only knows, which element it has to delete, as $feuser is loaded at the beginning of this page */
    	if (is_array($cfg['plugins']['frontendusers']))
    	{
    		foreach ($cfg['plugins']['frontendusers'] as $plugin)
    		{
    			if (function_exists("frontendusers_".$plugin."_delete"))
    			{
            			call_user_func("frontendusers_".$plugin."_delete");
    			}
    		}
    	}
Bitte zunächst mit einem Element testen. Viel Erfolg. Nach Bugs verschoben.

Gruß
HerrB
Zuletzt geändert von HerrB am Mi 1. Feb 2006, 21:35, insgesamt 1-mal geändert.
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
Uwe
Beiträge: 258
Registriert: Mo 30. Jun 2003, 16:05
Wohnort: Konstanz
Kontaktdaten:

Beitrag von Uwe »

Danke HerrB, ich werde das mal testen und das Ergebnis hier einstellen.

Viele Grüsse aus dem Süden, HerrU (Uwe) :roll:
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

@HerrB

nur ne kleine anmerkung da ich schon seit einiger zeit etwas ähnliches im einsatz habe...

bei contenido/classes/class.properties.php unterhalb setValue... nicht delValue sonder deleteValue verwenden...
so wie hier -> http://contenido.org/forum/viewtopic.php?p=28426#28426

bei contenido/classes/class.genericdb.php unter getProperty

die methode nicht delProperty sondern deleteProperty benennen..

und anstelle von

Code: Alles auswählen

$this->properties->delValue($this->primaryKey, $this->get($this->primaryKey), $type, $name));

Code: Alles auswählen

$this->properties->deleteValue($this->primaryKey, $this->get($this->primaryKey), $type, $name));
verwenden...

sonst gibts wiedermal nen haufen an methoden die an sich alle das selbe machen...

Code: Alles auswählen

$feuser->delProperty("email", "address");
müsste man halt auch noch auf

Code: Alles auswählen

$feuser->deleteProperty("email", "address");
ändern...

wären die anpassungen für dich okay ?
*** make your own tools (wishlist :: thx)
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB »

Wenn Du mich meinst: Klar, gerne.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

das mit den properties ist sowieso etwas seltsam über das system verteilt...
sollte man vielleicht mal alles bereinigen und zusammenfassen...

mittlerweile gibts da ja einige db tabellen, die an sich alle für das selbe da sind...

*_system_prop
*_user_prop (wofür ist eigentlich idcatlang in der tabelle da ?)
*_group_prop ( --"--)
und
*_properties (könnte eigentlich komplett den job übernehmen...)

client settings werden ja schon in der _properties tabelle eingetragen...

tja und das mit den sprach eigenschaften fehlt ja auch noch...

das einzige was jetzt noch fehlt ist ne menge zeit, das in angriff zu nehmen... ;-)
*** make your own tools (wishlist :: thx)
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB »

Ihr werdet es nicht glauben, wir sind mal wieder zu langsam. Gut, die Funktion, eine einzelne Eigenschaft zu löschen, hat tatsächlich gefehlt. Wird aber ein FrontendUser (oder ein anderes Objekt, welches über die genericdb verwaltet wird), gelöscht, werden die Eigenschaften gelöscht:

class.genericdb.php, V4.6.4...:

Code: Alles auswählen

function delete($id)
	{
		/* Local new db instance since we don't want to kill our
		   probably existing result set */
		//$db = new DB_Contenido;
		$db = new $this->db_class();

		$sql = "DELETE FROM ".$this->table." WHERE ";
		$sql .= $this->primaryKey." = '".$id."'";

		$db->query($sql);

		/* Runtime on-demand allocation of the properties object */
		if (!is_object($this->properties))
		{
			$this->properties = new PropertyCollection;
		}
		if (!is_object($this->propertiesDelete))
		{
			$this->propertiesDelete = new PropertyCollection;
		}

		/* If this object wasn't loaded before, return false */
		if ($this->virgin == true)
		{
			$this->lasterror = "No item loaded";
			return false;
		}

		/* delete the property values */
		$this->properties->select("itemtype='".$this->primaryKey."' AND itemid='$id'");
		$this->propertiesDelete = new PropertyCollection;
		while ($oPropertyItem = $this->properties->next())
		{
			$this->propertiesDelete->delete($oPropertyItem->get("idproperty"));
		}

		if ($db->affected_rows() == 0)
		{
			return false;
		} else
		{
			return true;
		}
	}
Man beachte das "delete the properties values"...

Ach ja. Aber schön, dass wird drüber gesprochen haben.

Zu den Properties hätte ich noch eine Idee (wenn mal Zeit ist ... der war gut): Und zwar ein getPropertiesChunk - die Funktion lädt alle Properties des Objekts in einen Array. Mit getProperty und einer neuen Option "$fromChunk" würde dann nicht mehr für jeden Wert die Datenbank belästigt werden, sondern der Wert wird aus dem Array zurückgeliefert.

Macht das Sinn und zum anderen: Hattest Du nicht schon mal was in Richtung eines Property-Caches gemacht?

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

die methode das beim löschen der user ebenfalls die properties mit gelöscht werden, ist mir schon mal aufgefallen...

das eine dezitierte lösch methode gefehlt hat, hab ich irgendwann mal bei nen bug report angemerkt...

die andere sache
das mit den properties cache hab ich ja mal ansatzweise umgesetzt...
ist bei obrigen link zu finden... ich hab aber in der zwischenzeit die beiden methoden
isStored in hasProperties
und
getStored in getProperties
umbenannt...

das mit einem gesamt cache aller elemente in einen array zu laden ist an sich ja keine schlechte idee, nur bin ich noch nicht dazugekommen das durchzuspielen...

ich hab mich jetzt noch damit herumgespielt
_group_prop und _user_prop in die _properties zu verlegen...
das funktioniert eigentlich auch ziemlich gut...

bis auf ein paar kleinere problemchen... na ja... hab dafür ca 500 zeilen aus dem core code eleminiert... und ob es zu bestehenden systemen kompatibel wäre ???
*** make your own tools (wishlist :: thx)
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

ach das hab ich ja noch vergessen...

beim löschen eines users oder einer gruppe bleiben die eigenschaften in _user_prop und _group_prop erhalten...

ist auch ein kleiner bug...
*** make your own tools (wishlist :: thx)
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB »

Zum Cache: Bei Dir klingt das nach "alle Properties" - ich meinte nur, wenn man es pro Objekt anfordert. E.g.

Code: Alles auswählen

while ($oFEUser = $oFEUsers->next()) {
   $oFEUser->getPropertyChunk();
   echo $oFEUser->getProperty("Typ","Name",true);
   ...
}
Wenn Du das auch so meintest, meinen wir das gleiche... :wink:

Deine Aktivität erinnert mich daran, dass ich mal "entferne style-Angaben aus dem Code" weiterverfolgen wollte. Na ja, April...

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

wir meinen eigentlich was ziemlich ähnliches...
*** make your own tools (wishlist :: thx)
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

ich hab hier ne geänderte version der class.properties.php

Code: Alles auswählen

<?php

/*****************************************
* File		:	$RCSfile: class.properties.php,v $
* Project	:	Contenido
* Descr 	:	Custom properties
*
* Author	:	$Author: martin.horwath $
*
* Created	:	21.12.2003
* Modified	:	$Date: 2006/02/05 02:52:18 $

* © four for business AG, www.4fb.de, dayside.net
*
* $Id: class.properties.php,v 1.20 2006/02/05 02:52:18 martin.horwath Exp $
******************************************/

cInclude("classes", "class.genericdb.php");

/* Custom properties
 * -----------------
 *
 * Custom properties are properties which can be assigned to virtually any element
 * in Contenido and underlaying websites.
 *
 *
 * Table structure
 * ---------------
 *
 * Field		Size			Description
 * -----		----			-----------
 * idproperty	int(10) 		idproperty (automatically handled by this class)
 * itemtype 	varchar(32) 	Custom item type (e.g. idcat, idart, idartlang, custom)
 * itemid		varchar(32) 	ID of the item
 * type 		varchar(32) 	Property type
 * name 		varchar(32) 	Property name
 * value		text			Property value
 * author		varchar(32) 	Author (md5-hash of the username)
 * created		datetime		Created date and time
 * modified 	datetime		Modified date and time
 * modifiedby	varchar(32) 	Modified by (md5-hash of the username)
 *
 *
 * Example:
 * --------
 * A module needs to store custom properties for categories. Modifying the database
 * would be a bad thing, since the changes might get lost during an upgrade or
 * reinstall.
 *
 * If the custom property for a category would be the path to a category image,
 * we would fill a row as follows:
 *
 * itemtype: idcat
 * itemid:	 <number of your category>
 * type:	 category
 * name:	 image
 * value:	 images/category01.gif
 *
 * idproperty, author, created, modified and modifiedby are automatically handled by
 * the class.
 */


class PropertyCollection extends ItemCollection
{
	var $client;

	/**
	 * Constructor Function
	 * @param none
	 */
	function PropertyCollection ()
	{
		global $cfg, $client;

		$this->client = $client;

		parent::ItemCollection($cfg["tab"]["properties"], "idproperty");

		$this->_setItemClass("PropertyItem"); // see genericDB function loadItem

	}

	/*
	 * Creates a new property item.
	 *
	 * Example:
	 *
	 *
	 * $properties->create("idcat", 27, "visual", "image", "images/tool.gif");
	 *
	 * @param itemtype	mixed Type of the item (example: idcat)
	 * @param itemid	mixed ID of the item (example: 31)
	 * @param type		mixed Type of the data to store (arbitary data)
	 * @param name		mixed Entry name
	 * @param value 	mixed Value
	 */
	function create ($itemtype, $itemid, $type, $name, $value)
	{
		global $cfg, $auth;

		$item = parent::create();

		$item->set("idclient", $this->client);
		$item->set("itemtype", $itemtype, false);
		$item->set("itemid", $itemid, false);
		$item->set("type", $type, false);
		$item->set("name", $name, false);
		$item->set("value", $value);

		$item->set("created", date("Y-m-d H:i:s"), false);
		$item->set("author", $auth->auth["uid"]);
		$item->store();

		return ($item);
	}

	function delete ($id)
	{
		return parent::delete($id);
	}

	/*
	 * Returns the value for a given item.
	 *
	 * Example:
	 *
	 * $file = $properties->getValue("idcat", 27, "visual", "image");
	 *
	 * @param itemtype	mixed Type of the item (example: idcat)
	 * @param itemid	mixed ID of the item (example: 31)
	 * @param type		mixed Type of the data to store (arbitary data)
	 * @param name		mixed Entry name
	 * @return			mixed Value
	 */
	function getValue ($itemtype, $itemid, $type, $name, $default = false)
	{

		if (isset($this->client))
		{
			$this->select("idclient = '".$this->client."' AND itemtype = '$itemtype' AND itemid = '$itemid' AND type = '$type' AND name = '$name'");
		} else {
			$this->select("itemtype = '$itemtype' AND itemid = '$itemid' AND type = '$type' AND name = '$name'");
		}

		if ($item = $this->next())
		{
			return ($item->get("value"));
		}

		return $default;
	}

	/*
	 * Sets a property item. Handles creation and updating.
	 *
	 * Example:
	 *
	 * $properties->setValue("idcat", 27, "visual", "image", "images/tool.gif");
	 *
	 * @param itemtype	 mixed Type of the item (example: idcat)
	 * @param itemid	 mixed ID of the item (example: 31)
	 * @param type		 mixed Type of the data to store (arbitary data)
	 * @param name		 mixed Entry name
	 * @param value 	 mixed Value
	 * @param idproperty int   primary key of property (if false only value will be updated)
	 */
	function setValue ($itemtype, $itemid, $type, $name, $value, $idproperty = false)
	{
		if(is_numeric($idproperty)) {
			if (!$this->exists($idproperty)) {
				$idproperty = false;
			}
		} else {
			$idproperty = false;
		}

		if ($idproperty) {

			$this->select("idproperty = '$idproperty'");

			if ($item = $this->next())
			{

				$item->set("itemtype", $itemtype);
				$item->set("itemid", $itemid);
				$item->set("type", $type);
				$item->set("name", $name);
				$item->set("value", $value);
				$item->store();

				return;

			}
		}

		$this->select("idclient = '".$this->client."' AND itemtype = '$itemtype' AND itemid = '$itemid' AND type = '$type' AND name = '$name'");

		if ($item = $this->next())
		{

			$item->set("value", $value);
			$item->store();

		} else {
			$this->create($itemtype, $itemid, $type, $name, $value);
		}

	}


	/*
	 * Delete a property item.
	 *
	 * Example:
	 *
	 * $properties->deleteValue("idcat", 27, "visual", "image");
	 *
	 * @param itemtype	mixed Type of the item (example: idcat)
	 * @param itemid	mixed ID of the item (example: 31)
	 * @param type		mixed Type of the data to store (arbitary data)
	 * @param name		mixed Entry name
	 */
	function deleteValue ($itemtype, $itemid, $type, $name)
	{
		if (isset($this->client))
		{
			$this->select("idclient = '".$this->client."' AND itemtype = '$itemtype' AND itemid = '$itemid' AND type = '$type' AND name = '$name'");
		} else {
			$this->select("itemtype = '$itemtype' AND itemid = '$itemid' AND type = '$type' AND name = '$name'");
		}

		if ($item = $this->next())
		{
			$this->delete($item->get("idproperty"));
		}
	}


	/*
	 * Checks if values for a given item are available.
	 *
	 * @param itemtype	mixed Type of the item (example: idcat)
	 * @param itemid	mixed ID of the item (example: 31)
	 *
	 * @return			array for each given item
	 */
	function getProperties ($itemtype, $itemid)
	{
		if (isset($this->client))
		{
			$this->select("idclient = '".$this->client."' AND itemtype = '$itemtype' AND itemid = '$itemid'");
		} else {
			$this->select("itemtype = '$itemtype' AND itemid = '$itemid'");
		}

		$result[$itemid] = false;

		while ($item = $this->next())
		{
			// enable accessing property values per number and field name
			$result[$item->get("itemid")][$item->get("idproperty")] = Array (0=>$item->get("type"),  "type"=>$item->get("type"),
													                         1=>$item->get("name"),  "name"=>$item->get("name"),
													                         2=>$item->get("value"), "value"=>$item->get("value"));

		}

		return $result;

	}

	/*
	 * Delete all properties which match itemtype and itemid
	 *
	 * @param itemtype	mixed Type of the item (example: idcat)
	 * @param itemid	mixed ID of the item (example: 31)
	 */
	function deleteProperties ($itemtype, $itemid)
	{
		if (isset($this->client))
		{
			$this->select("idclient = '".$this->client."' AND itemtype = '$itemtype' AND itemid = '$itemid'");
		} else {
			$this->select("itemtype = '$itemtype' AND itemid = '$itemid'");
		}

		$deleteProperties = Array();

		while ($item = $this->next())
		{
			$deleteProperties[] = $item->get("idproperty");
		}

		foreach($deleteProperties as $idproperty) {
			$this->delete($idproperty);
		}

	}

	function changeClient($idclient)
	{
		$this->client = $idclient;
	}

}

class PropertyItem extends Item
{
	/**
	 * maximumLength: Array which stores the maximum string length of each field
	 */
	var $maximumLength;

	/**
	 * Constructor Function
	 * @param $id int Specifies the ID to load
	 */
	function PropertyItem ()
	{
		global $cfg;
		parent::Item($cfg["tab"]["properties"], "idproperty");

		/* Initialize maximum lengths for each column */
		$this->maximumLength = array();
		$this->maximumLength["itemtype"] = 64;
		$this->maximumLength["itemid"] = 255;
		$this->maximumLength["type"] = 64;
		$this->maximumLength["name"] = 64;
	}

	function store ()
	{
		global $auth;

		$this->set("modified", date("Y-m-d H:i:s"), false);
		$this->set("modifiedby", $auth->auth["uid"]);

		parent::store();
	}

	function setField ($field, $value, $safe = true)
	{
		if (array_key_exists($field, $this->maximumLength))
		{
			if (strlen($value) > $this->maximumLength[$field])
			{
				cWarning(__FILE__, __LINE__, "Tried to set field $field to value $value, but the field is too small. Truncated.");
			}
		}

		parent::setField($field, $value, $safe);
	}

}



?>
mit ein paar leichten modifikationen...

neue methoden

deleteValue (löschen einer eigenschaft)
getProperties (liefert alle eigenschaften mit $itemtype, $itemid retour)
deleteProperties (löscht alle eigenschaften mit $itemtype, $itemid)

geänderte/erweiterte methoden

setValue (angabe eines idproperty möglich)
*** make your own tools (wishlist :: thx)
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

änderungen für die class.genericdb.php

neue methode hinzufügen bei class item

Code: Alles auswählen

	/**
	 * deleteProperty ($type, $name)
	 * Deletes a custom property
	 * @param string $type	Specifies the type
	 * @param string $name	Specifies the name
	 */
	function deleteProperty($type, $name)
	{
		/* Runtime on-demand allocation of the properties object */
		if (!is_object($this->properties))
		{
			$this->properties = new PropertyCollection;
		}

		/* If this object wasn't loaded before, return false */
		if ($this->virgin == true)
		{
			$this->lasterror = "No item loaded";
			return false;
		}

		/* Delete the value */
		return ($this->properties->deleteValue($this->primaryKey, $this->get($this->primaryKey), $type, $name));
	}
class ItemCollection

geänderte methode

Code: Alles auswählen

	/**
	 * delete()
	 * Deletes an item in the table.
	 */
	function delete($id)
	{
		/* Runtime on-demand allocation of the properties object */
		if (!is_object($this->propertiesDelete))
		{
			$this->propertiesDelete = new PropertyCollection;
		}

		/* Local new db instance since we don't want to kill our
		   probably existing result set */
		$db = new DB_Contenido;

		$sql  = "DELETE FROM " .$this->table ." WHERE ";
		$sql .= $this->primaryKey . " = '". $id ."'";

		$db->query($sql);

		/* If this object wasn't loaded before, return false */
		if ($this->virgin == true)
		{
			$this->lasterror = "No item loaded";
			return false;
		}

		/* delete the property values */
		$this->propertiesDelete->deleteProperties($this->primaryKey, $id);

		if ($db->affected_rows() == 0)
		{
			return false;
		} else {
			return true;
		}
	}
bei mir seit monaten in dieser art und weise im einsatz...
wer das selbst ausprobiert und sich was zerschießt -> selbst schuld, kein mitleid und sicher nicht mein problem...
*** make your own tools (wishlist :: thx)
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB »

Alles drin, bis auf die Änderung der setValue-Methode, die wird nicht kommen.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

na zumindestens ist das andere drinnen...
*** make your own tools (wishlist :: thx)
Gesperrt