Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 02. März 2013 16:54

Patrick Rogalski
hat von CMS/ms gehört
Registriert: 25. Januar 2013
Beiträge: 8

[GELÖST] Smarty in UDT einbinden

Hallo zusammen,

ich versuche mich gerade in UDTs einzuarbeiten, habe aber noch ein paar Verständnisprobleme.

Wie könnte ich z.B. den Aufruf {$tbtools->selfUrl()} in ein UDT implementieren? Sind die Funktionen in irgendeiner Weise global verfügbar, oder muss ich erst darauf verweisen?

Offline

#2 02. März 2013 17:02

nockenfell
Moderator
Ort: Lenzburg, Schweiz
Registriert: 09. November 2010
Beiträge: 2.927
Webseite

Re: [GELÖST] Smarty in UDT einbinden

$tbtools = new tbTools();
echo $tbtools->selfUrl();

[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#3 03. März 2013 15:28

Patrick Rogalski
hat von CMS/ms gehört
Registriert: 25. Januar 2013
Beiträge: 8

Re: [GELÖST] Smarty in UDT einbinden

Danke schonmal, das klappt. Im Thread [GELÖST] Smarty in UDT ausführen? wurde für cmsms-Funktionen zu Beginn die folgende Zeile verwendet.

[== php ==]
$gcbops =& cmsms()->GetGlobalContentOperations();

Heißt das, dass für die Standardfunktionen ( cmsms() ) immer eine Instanz verfügbar ist, für installierte Module (wie z.B. die Toolbox) jeweils eine Instanz erzeugt werden muss?

Offline

#4 04. März 2013 06:11

nockenfell
Moderator
Ort: Lenzburg, Schweiz
Registriert: 09. November 2010
Beiträge: 2.927
Webseite

Re: [GELÖST] Smarty in UDT einbinden

Genau.

Im Beispiel von hier läuft das ganze jedoch ein klein wenig anders. tbtools ist eine Klasse die in der ToolBox verwendet wird. Klassen können direkt angesprochen werden. Deshalb $tbtools = new tbTools();

Wenn du Funktionen eines Modul nutzen willst, musst du das Modul entsprechend aufrufen. Z.B.:

$toolbox= cms_utils::get_module('ToolBox');
$toolbox->setLogFile('tbLog'); // Optional. Hier kann der Name des Logfiles festgelegt werden
$toolbox->lwrite("Schreiben wir was ins Log");

Damit rufst du die ToolBox auf und schreibst mit der Logfunktion irgendwas in ein definiertes Logfile.

Mit der cmsms() Funktion wird das CMS Objekt geladen. Es dient als Grundlage für alle weiteren Funktionen welche den Core betreffen, also z.B.:

$db = cmsms()->GetDb();
$config = cmsms()->GetConfig();

[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#5 04. März 2013 08:09

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.435

Re: [GELÖST] Smarty in UDT einbinden

@nockenfell:
Wenn ich das richtig sehe, ist die tbTools-Klasse doch nur ein Wrapper für verschiedene Funktionen, oder? D.h. man muss davon eigentlich keine Instanz erzeugen. Du könntest genausogut alle Funktionen als static deklarieren und dann anstelle von

$tbtools = new tbTools();
$myVar = $tbTools->Funktion();

mit

auf die ToolBox Funktionen zugreifen. (genauso wie z.B. bei cms_utils)


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#6 04. März 2013 08:23

nockenfell
Moderator
Ort: Lenzburg, Schweiz
Registriert: 09. November 2010
Beiträge: 2.927
Webseite

Re: [GELÖST] Smarty in UDT einbinden

Static funktioniert soweit ich bis jetzt weiss mit Smarty nicht. Die Klasse tbTools weise ich einer Smarty-Variable zu. Hier werden die Funktionen dann entsprechend aufgerufen: $tbtools->getPageContent();

Wenn das mit Static Funktionen gehen würde, auch recht. Kann man eigentlich die gleiche Funktion static und nicht static deklarieren. Ich nehme mal an das dies nicht geht.


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#7 04. März 2013 09:25

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.435

Re: [GELÖST] Smarty in UDT einbinden

Laut Smarty Doku sollen Statische Klassen inzwischen auch unterstützt werden:
http://www.smarty.net/docs/en/advanced. … lasses.tpl

Ansonsten würde ich eher eine Art Singleton draus machen und diese eine Instanz dann einer Smarty-Variablen zuweisen.

Bsp.:

class ToolBox extends CMSModule
{
	function __construct()
	{
		parent:__construct();
		cmsms()->GetSmarty()->assign_by_ref('tbtools', tbTools::get_instance());
	}
}

class tbTools
{
	private static $_instance;
	private __construct() {}

	public static function get_instance()
	{
		if(!self::$_instance)
			self::$_instance = new self;
		return self::$_instance;
	}
}

Bei umfangreichem ToolBox Gebrauch könnte es sonst evtl. zu unnötigem RAM Verbrauch kommen, weil bei jeder Verwendung ein neues Objekt erstellt wird.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#8 04. März 2013 12:03

nockenfell
Moderator
Ort: Lenzburg, Schweiz
Registriert: 09. November 2010
Beiträge: 2.927
Webseite

Re: [GELÖST] Smarty in UDT einbinden

Danke für die Ausführungen. Probiere ich heute abend aus.


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#9 04. März 2013 17:28

nockenfell
Moderator
Ort: Lenzburg, Schweiz
Registriert: 09. November 2010
Beiträge: 2.927
Webseite

Re: [GELÖST] Smarty in UDT einbinden

Der Ansatz ist wirklich interessant. Laufen würde es mit

$instance = tbTools::get_instance();
cmsms()->GetSmarty()->assign_by_ref('tbtools', $instance);

Allerdings breche ich damit auch gleichzeitig alle Brücken zum vorher dagewesenen. Die Schreibweise hätte gerade für den TinyMCE jedoch grosse Vorteile.

Gibt es einen Weg gleichzeitig

{$tbtools->getPageContent()}
{$tbtools::getPageContent()}

aufzurufen?


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#10 04. März 2013 19:52

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.435

Re: [GELÖST] Smarty in UDT einbinden

nockenfell schrieb:

Allerdings breche ich damit auch gleichzeitig alle Brücken zum vorher dagewesenen.

Nicht unbedingt.
Du musst allerdings die Klasse etwas umschreiben.
Den Konstruktor als private deklarieren.
Die statische Methode get_instance() hinzufügen.
Alle Methoden als static deklarieren.
Alle $this->... Aufrufe in self::... ändern.

Lediglich Deine Beispiele mit $tbtools = new tbTools(); würden dann mit einem fatalen Fehler enden.
Aber das könnte kann man mit einer Übergangslösung abfangen, in dem man den Konstruktor als public lässt und dort eine eigene Fehlermeldung ausgibt. Z.B. nur im Debug-Modus mit trigger_error() oder mit CMSms Exceptions ... aber bei Letzterem bin ich noch nicht ganz durchgestiegen.
So á la "Do not use new tbTools();! Use tbTools::... instead" oder so.

nockenfell schrieb:

[...]
Die Schreibweise hätte gerade für den TinyMCE jedoch grosse Vorteile.

Gibt es einen Weg gleichzeitig

{$tbtools->getPageContent()}
{$tbtools::getPageContent()}

aufzurufen?

Nein. Jedenfalls nicht so, wie in Deinem Beispiel.
Der grundlegende Unterschied ist der:
{$tbtools->getPageContent()} (als Variable mit Dollarzeichen) kannst Du nur dann verwenden, wenn die Variable $tbtools eine Instanz Deiner Klasse enthält - also wenn es ein instanziertes Objekt ist (was es ja ohnehin sein muss, damit Du es einer Smaty-Variablen zuweisen kannst.

Bei der Verwendung des Doppelpunktes kannst Du nicht mit der Variable arbeiten (also nicht mit einer Instanz), sondern musst mit einem String arbeiten - sprich: Klassennamen: {tbTools::getPageContent()}
(Achte auf das Dollarzeichen und die Groß-/Kleinschreibung)

Du kannst allerdings auch auf eine statische Methode mit dem -> Operator zugreifen.
D.h. das hier müsste dann klappen:

{$tbtools->getPageContent()}
{tbTools::getPageContent()}

Diese Mischung soll aber nicht unbedingt sauber sein.

Ich bin mir aber momentan selber nicht so sicher, ob es das alles am Ende jetzt wirklich bringt. Aufwand nutzen und so wink


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#11 04. März 2013 20:47

nockenfell
Moderator
Ort: Lenzburg, Schweiz
Registriert: 09. November 2010
Beiträge: 2.927
Webseite

Re: [GELÖST] Smarty in UDT einbinden

Hehe, der Lösung war ich schon sehr nahe. Ich hatte nur die Aufrufe z.T. falsch geschrieben.:

class tbTools
{
	private static $_instance;
	
	private function __construct() {}

	public static function get_instance()
	{
		if(!self::$_instance)
			self::$_instance = new self;
		return self::$_instance;
	}
	
	public function __call($method, $args)
    {
        //echo __METHOD__ . "\n";

        return call_user_func_array(__CLASS__ . '::' . $method, $args);
    }
    
	public static function __callStatic($method, $args)
    {
        //echo __METHOD__ . "\n";

        return call_user_func_array(__CLASS__ . '::' . $method, $args);
    }
    
	
	
	
	/**
	 *
	 * Prüft, ob der angegebene Alias eine PageID ist und gibt den Alias zurück
	 * @param $alias
	 * @return string $alias
	 * @author: Lukas Blatter, 20.12.2011
	 */
	private static final function getAlias($alias)
	{
		$gCms = cmsms();

		$manager = $gCms->GetHierarchyManager();
		$node = $manager->sureGetNodeByAlias($alias);
    	if (!isset($node)) {
			$node = $manager->sureGetNodeById($alias);
			if (isset($node))
				$alias = $node->get_tag($alias);
			else
				return false;
		}


		return $alias;
	}

	/**
	 * based on $cgsimple->self_url by Robert Campbell
	 * Gibt die aktuelle Seiten-URL zurück
	 * @param string $assign
	 * @return string / smarty assign
	 */
	private static final function selfUrl($assign='')
	{
		$s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : "";
		$p = strpos($_SERVER['SERVER_PROTOCOL'],'/');
		$protocol = strtolower(substr($_SERVER['SERVER_PROTOCOL'],0,$p)).$s;
		$port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]);
		$s = $protocol."://".$_SERVER['SERVER_NAME'].$port;

		$url = $s.$_SERVER['REQUEST_URI'];
		if(!empty($assign)) {
			$gCms = cmsms();
			$smarty = $gCms->GetSmarty();
			$smarty->assign($assign,$url);
			return;
		}
		return $url;
	}
}
{$tbtools->selfUrl()}
{tbtools::selfUrl()}

Damit funktioniert der Aufruf sowohl als auch

Mit der Verwendung der Magic __call Funktion kann ich jede Private Funktion aufrufen. Natürlich liesse sich darüber auch der Zugriff steuern:

	public function __call($method, $args)
    {
        $data = ' selfUrl getPageContent hasChildren ';
       if (strpos($data, ' '.$method.' ') !== false)
           return call_user_func_array(__CLASS__ . '::' . $method, $args);
       else 
           throw new CmsError404Exception('method tbtools::'.$method.' unknown');
    }

Details zu den __call Aufrufen:
http://stackoverflow.com/questions/1071 … hod-exists
http://stackoverflow.com/questions/1133 … -nonstatic


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#12 05. März 2013 06:06

nockenfell
Moderator
Ort: Lenzburg, Schweiz
Registriert: 09. November 2010
Beiträge: 2.927
Webseite

Re: [GELÖST] Smarty in UDT einbinden

NaN schrieb:

Ich bin mir aber momentan selber nicht so sicher, ob es das alles am Ende jetzt wirklich bringt. Aufwand nutzen und so wink

Ich finde das ganze bringt einiges. Mit dem Static Aufruf kannst du nun die Smarty-Tools problemlos in TinyMCE einbauen ohne dass jeweils das -> in HTML umgewandelt wird und zu einem Fehler führt.


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#13 05. März 2013 13:24

Patrick Rogalski
hat von CMS/ms gehört
Registriert: 25. Januar 2013
Beiträge: 8

Re: [GELÖST] Smarty in UDT einbinden

Danke für das intensive auseinandersetzen mit meiner Anfrage, ich werde das heute Abend mal in Ruhe nachvollziehen. Meine grundsätzliche Frage ist aber auf jeden Fall gelöst ;-)

Offline