custom-Tag -> listview-Variante

Fragen zum Erstellen von Templates für webEdition.
Benutzeravatar
haydi
Senior Member
Beiträge: 645
Registriert: Do 1. Jan 1970, 02:00
Wohnort: Hirschberg
Kontaktdaten:

custom-Tag -> listview-Variante

Beitragvon haydi » Mo 4. Mär 2019, 12:08

Huhuuu,

ich habe mich an ein Custom-Tag gewagt. Damit es nicht langweilig wird, direkt eine listview-Variante ... :)

Also, meinen Code habe ich soweit... Tag und Attribute... wird alles schön verarbeitet. Datenbank bringt Resultate und ich habe ein Resultset.

Eine listview besteht aber ja aus vielen Sub-Tags, die auf den listview-results zugreifen... we:ifFound, we:repeat, ...

Mein Tag "haydilistviewsql" (also we_tag_haydilistviewsql - mir ist kein besserer Name eingefallen) nutzt meine Klasse we_haydilistviewsql die auf we_listview_objectBase basiert.
Bis hierhin funktioniert alles...

Mein gesetztes $lv ....

Code: Alles auswählen

$lv = new we_haydilistviewsql(....); 
... enthält Ergebnisse.

Natürlich bringt aber mein we:ifFound bspw. kein Ergebnis, weil ich ja nicht we_tag_listview habe, sondern we_haydilistviewsql...

Ich schätze, ich muss mein $lv als we_tag_listview initialisieren... geht das?? Oder was muss ich machen, damit ich auf we:ifFound usw. zugreifen kann?

Liebe Grüße
Heidi
Heidi Wetzel
Internet-Applikationen & Webseiten-Erstellung
https://www.heidi-wetzel.de

WBTMagnum
webEdition Partner
webEdition Partner
Beiträge: 1825
Registriert: Di 7. Mär 2006, 16:50
Wohnort: Wien
Kontaktdaten:

Re: custom-Tag -> listview-Variante

Beitragvon WBTMagnum » Mo 4. Mär 2019, 13:18

Hallo Heidi,

Ich habe mir kurz den webEdition Core Code dazu angesehen. Meinem Verständnis nach, sollte <we:ifFound> eigentlich funktionieren (wenn alles richtig gemacht wurde :D ).

Fragen die mir dazu einfallen:
  • Welche webEdition Version verwendest du denn hier? Hinweis: Mit wE 8.0.4 hat sich nämlich die Art und Weise wie Tags zu erstellen sind geändert (sh. Wiki: Eigene Tags erstellen).
  • Rufst du in deinem Constructor den Constructor des Parents auf?
  • Kannst du deinen Code (zumindest auszugsweise) hier posten?
Liebe Grüße,
Sascha

Benutzeravatar
haydi
Senior Member
Beiträge: 645
Registriert: Do 1. Jan 1970, 02:00
Wohnort: Hirschberg
Kontaktdaten:

Re: custom-Tag -> listview-Variante

Beitragvon haydi » Mo 4. Mär 2019, 14:03

Huhuuu,

danke für deine schnelle Antwort...

Ja, es hat sich einiges getan! Was super-genial ist! Deshalb kapiere ich inzwischen auch, wie der Hase langläuft :)
Habe mir mit dem listview-Tag ja leider gleich was kompliziertes rausgesucht...

Wenn mein Tag listview heißen würde (also ein we_tag_listview initialisiert wäre), dann würde we:ifFound usw. alles funktionieren.
Doch mein Tag heißt we_tag_haydilistviewsql. Denn ich wollte nicht im Quellcode des listview-Tags herumpfuschen.

Mein Tag ist also ...

Code: Alles auswählen

abstract class we_tag_haydilistviewsql extends we_weTag_tag {

	public static function tag(array $attribs = [], $content = '', $internal = false){
	
	    [... ein paar self::getAttribute()aufrufe und zuweisungen ....]
	    
	    Dann kommt: 
	    $lv = new we_haydilistviewsql($name, $we_rows, $we_lv_order, $classid, $we_lv_catOr, $cond, $triggerid, $we_lv_se, $we_lv_categoryids, $we_lv_languages, $objectseourls, $condfirst);
	    
	    .... testhalber: 
	    t_e($GLOBALS['lv']); 
	    ---> liefert objekt mit resultset zurück
	    
		
	}
}
Dann die eigentliche Klasse ...

Code: Alles auswählen

class we_haydilistviewsql extends we_listview_objectBase {

	public function __construct($name, $rows, $order, $classID, $catOr, $cond, $triggerid, $searchable, $categoryids, $languages, $objectseourls, $condfirst){
		parent::__construct($name, $rows, 0, $order, false, '', $catOr, [], 0, '', '', '', '', $categoryids, 'all', 0, $triggerid, false, $searchable, 0, $languages, $objectseourls); 
		
		... hier setze ich meinen sql-string zusammen ... dieser funktioniert auch (über phpmyadmin getestet) ...
		
		$this->DB_WE->query($sql, true); // der zweite parameter "true" sorgt dafür, dass UNION-Querys erlaubt sind
		$this->anz = $this->DB_WE->num_rows();
		
		t_e($this->anz); // enthält korrekte anzahl

   }
}
Dann habe ich noch ...

Code: Alles auswählen

function we_tag_haydilistviewsql(array $attribs){
	return we_tag_haydilistviewsql::tag($attribs);
}
... weiß zwar nicht genau wofür, aber okay ;-)

Wenn ich den Code von we:ifFound usw. richtig lese, dann erwarten sie einfach eine Instanz vom Klassennamen we_tag_listview...
Daran wird es liegen, oder??
Und ich kann ja nicht so tun, als würde meine Klasse anders lauten als sie es tut, oder??

Liebe Grüße
Heidi
Heidi Wetzel
Internet-Applikationen & Webseiten-Erstellung
https://www.heidi-wetzel.de

Benutzeravatar
haydi
Senior Member
Beiträge: 645
Registriert: Do 1. Jan 1970, 02:00
Wohnort: Hirschberg
Kontaktdaten:

Re: custom-Tag -> listview-Variante

Beitragvon haydi » Mo 4. Mär 2019, 14:11

Hier nochmal der ganze Code auf einmal der relevant ist....

Code: Alles auswählen


class we_haydilistviewsql extends we_listview_objectBase {

	public function __construct($name, $rows, $order, $classID, $catOr, $cond, $triggerid, $searchable, $categoryids, $languages, $objectseourls, $condfirst){
		parent::__construct($name, $rows, 0, $order, false, '', $catOr, [], 0, '', '', '', '', $categoryids, 'all', 0, $triggerid, false, $searchable, 0, $languages, $objectseourls); 

			/*
			* ich baue hier meinen sql-string zusammen ...
			* $sql = 'SELECT .... UNION ...'; 
			* --- der auch funktioiert.
			*/ 

			$this->DB_WE->query($sql, true); // der zweite parameter "true" sorgt dafür, dass UNION-Querys erlaubt sind! .... siehe "public function query($Query_String, $allowUnion = false, $unbuffered = false){" -> /httpdocs/webEdition/we/include/we_classes/database/we_database_base.class.php --- zeile 409
			$this->anz = $this->DB_WE->num_rows();
			//$result = $this->DB_WE->query($sql, true); // der zweite parameter "true" sorgt dafür, dass UNION-Querys erlaubt sind! .... siehe "public function query($Query_String, $allowUnion = false, $unbuffered = false){" -> /httpdocs/webEdition/we/include/we_classes/database/we_database_base.class.php --- zeile 409
			//t_e($result);
			//t_e($this->anz);

		} else {
			$this->anz_all = 0;
			$this->anz = 0;
		}
				
	}

}


abstract class we_tag_haydilistviewsql extends we_weTag_tag{
	
	public static $lvArray = [];
	public static $current = null;

	public static function tag(array $attribs = [], $content = '', $internal = false){
		
		/* 
		 * verarbeite hier die ganzen attribute
		 *
		 */
		
		$lv = new we_haydilistviewsql($name, $we_rows, $we_lv_order, $classid, $we_lv_catOr, $cond, $triggerid, $we_lv_se, $we_lv_categoryids, $we_lv_languages, $objectseourls, $condfirst);
		
		self::pre_listview(isset($lv) ? $lv : new stdClass());
		return '';
		
	}
	
	public static function pre_listview($newLV){
		//add current lv to the stack
		if(we_tag_haydilistviewsql::$current){
			we_tag_haydilistviewsql::$lvArray[] = we_tag_haydilistviewsql::$current;
		}
		//set new lv
		$GLOBALS['lv'] = we_tag_haydilistviewsql::$current = $newLV;
	}
	public static function post_listview(){
		if(empty(we_tag_haydilistviewsql::$lvArray)){
			we_tag_haydilistviewsql::$current = null;
			unset($GLOBALS['lv']);
			return;
		}
		//get the last lv
		$GLOBALS['lv'] = we_tag_haydilistviewsql::$current = array_pop(we_tag_haydilistviewsql::$lvArray);
	}

}


function we_tag_haydilistviewsql(array $attribs){
	return we_tag_haydilistviewsql::tag($attribs);
}

... hab hier auch schon mit den Methoden pre_listview() und post_listview() was gemacht... Aber das hilft ja auch nicht ...

Sehe ich es richtig, dass ich den Tag we_tag_listview modifizieren muss um einen weiteren type="haydi" der dann im switch der listview-Klasse meine eigene Klasse aufruft? Somit würde mein code unter we_tag_listview laufen und die ganzen weiteren we-tags we:ifFound usw. würden funktionieren. Richtig?
Oder gibt es doch eine Möglichkeit, dass meine Klasse auch unter einem anderen Namen laufen kann?
Hatte was von class_alias() gelesen... aber das scheint es nicht zu sein...
class_alias('we_tag_haydilistviewsql', 'we_tag_listview');

liebe grüße
heidi
Heidi Wetzel
Internet-Applikationen & Webseiten-Erstellung
https://www.heidi-wetzel.de

mokraemer
Senior Member
Beiträge: 3619
Registriert: So 8. Aug 2010, 01:23
Wohnort: Mainz

Re: custom-Tag -> listview-Variante

Beitragvon mokraemer » Mo 4. Mär 2019, 18:06

Hi Haydi,
nein, kein class-alias. Und nein, du kannst keinen we-tag erweitern. Du kannst hier nur einen neuen Tag erzeugen.
Also wie gesagt, ich denke du spielst hier gerade mehr, denn das was du suchst gibt es ja schon.

Du hast hier etwas viel zusammenkopiert. Das ganze müßte in etwa so funktionieren:

Code: Alles auswählen

class we_haydilistviewsql extends we_listview_base {

	public function __construct($name, $rows, $order, $classID, $catOr, $cond, $triggerid, $searchable, $categoryids, $languages, $objectseourls, $condfirst){
		parent::__construct($name, $rows, 0, $order, false, '', $catOr, [], 0, '', '', '', '', $categoryids, 'all', 0, $triggerid, false, $searchable, 0, $languages, $objectseourls); 

			/*
			* ich baue hier meinen sql-string zusammen ...
			* $sql = 'SELECT .... UNION ...'; 
			* --- der auch funktioiert.
			*/ 

			$this->DB_WE->query($sql, true); // der zweite parameter "true" sorgt dafür, dass UNION-Querys erlaubt sind! .... siehe "public function query($Query_String, $allowUnion = false, $unbuffered = false){" -> /httpdocs/webEdition/we/include/we_classes/database/we_database_base.class.php --- zeile 409
			$this->anz = $this->DB_WE->num_rows();
			//$result = $this->DB_WE->query($sql, true); // der zweite parameter "true" sorgt dafür, dass UNION-Querys erlaubt sind! .... siehe "public function query($Query_String, $allowUnion = false, $unbuffered = false){" -> /httpdocs/webEdition/we/include/we_classes/database/we_database_base.class.php --- zeile 409
			//t_e($result);
			//t_e($this->anz);

		} else {
			$this->anz_all = 0;
			$this->anz = 0;
		}
				
	}

}


abstract class we_tag_haydilistviewsql extends we_weTag_tag{
	/*Nein - nicht überschreiben!
	public static $lvArray = [];
	public static $current = null;
*/

	public static function tag(array $attribs = [], $content = '', $internal = false){
		
		/* 
		 * verarbeite hier die ganzen attribute
		 *
		 */
		
		$lv = new we_haydilistviewsql($name, $we_rows, $we_lv_order, $classid, $we_lv_catOr, $cond, $triggerid, $we_lv_se, $we_lv_categoryids, $we_lv_languages, $objectseourls, $condfirst);
		
		//self::pre_listview(isset($lv) ? $lv : new stdClass());
		self::pre_listview($lv);
		return '';
		
	}
	
	public static function parse(array $attribs, $content){
	//wir brauchen das hier, damit der Stack abgeräumt wird.
		return '<?php ' . 
			we_weTag_parser::printTag(get_called_class(), $attribs) . ';?>' . $content . '<?php we_weTag_tag::post_listview();?>';
	}

	
	/* Nein - die funktionen sollten nicht neu implementiert werden!
	
	public static function pre_listview($newLV){
		//add current lv to the stack
		if(we_tag_haydilistviewsql::$current){
			we_tag_haydilistviewsql::$lvArray[] = we_tag_haydilistviewsql::$current;
		}
		//set new lv
		$GLOBALS['lv'] = we_tag_haydilistviewsql::$current = $newLV;
	}
	public static function post_listview(){
		if(empty(we_tag_haydilistviewsql::$lvArray)){
			we_tag_haydilistviewsql::$current = null;
			unset($GLOBALS['lv']);
			return;
		}
		//get the last lv
		$GLOBALS['lv'] = we_tag_haydilistviewsql::$current = array_pop(we_tag_haydilistviewsql::$lvArray);
	}*/

}


/*Das wird nur in 8.0.x bis zum 1. Rebuild gebraucht - von daher einfach weglassen!
function we_tag_haydilistviewsql(array $attribs){
	return we_tag_haydilistviewsql::tag($attribs);
}*/
Was sich mir nicht erschließt: Warum baust du auf we_listview_objectBase auf??? Ich hab das oben mal korrigiert. Im Prinzip baust du (scheinbar) we_listview_sql nach :)

Wenn du eh nur eine SQL-Abfrage brauchst, kannst du ja alternativ ein eigenes Tag bauen, das dann die Klasse we_listview_sql parametriert und zurückgibt.
webEdition-Kern-Entwickler

Benutzeravatar
haydi
Senior Member
Beiträge: 645
Registriert: Do 1. Jan 1970, 02:00
Wohnort: Hirschberg
Kontaktdaten:

Re: custom-Tag -> listview-Variante

Beitragvon haydi » Do 14. Mär 2019, 10:22

Huhuuu,

vielen lieben Dank für deine Antwort und Mühe!
Und tut mir leid, dass ich so lange nicht reagiert hatte... Hatte Server- und danach Internetzugangsprobleme und musste dann an anderen Projekten arbeiten... Nenenee...

Tatsächlich spiele ich gar nicht, sondern brauche es für ein Kunden-Projekt. Und ich möchte nicht im Template selbst komplett eigenes PHP und SQL einsetzen. Aber der Hauptgrund ist, dass eben innerhalb einer listview ja weitere webEdition Tags greifen - we:ifFound, we:repeat, .... Deshalb möchte ich eine Listview-Variante.

we_listview_sql kann ich leider nicht verwenden, da ich zwei SELECTs mit UNION verbunden realisieren möchte.
Auf we_listview_objectBase habe ich aufgebaut, da ich hiervon bspw. makeSQLParts() und fillMatrix() nutze beim Zusammenstellen der beiden SELECTS.
Muss ja auch beim query als zweiten Parameter "true" setzen, damit der UNION funktioniert -> $this->DB_WE->query($sql, true);

Jedenfalls kapiere nun auch ich, wie man custom-Tags bastelt! :-)

Aber ich schätze, dass ich die we_tag_listview.class.php anfassen und umbauen muss, wenn ich we:ifFound, we:repeat, usw. nutze möchte... Denn diese Tags erwarten alle, dass das listview Tag benutzt wurde.
Alternativ müsste ich auf we:ifFound usw verzichten und wieder auf eigenen PHP-Code zurückgreifen... Auch nicht schön.
Vielleicht modifiziere ich dann der Einfachheit halber tatsächlich die we_listview_sql Klasse...

Liebe Grüße
Heidi
Heidi Wetzel
Internet-Applikationen & Webseiten-Erstellung
https://www.heidi-wetzel.de

Benutzeravatar
haydi
Senior Member
Beiträge: 645
Registriert: Do 1. Jan 1970, 02:00
Wohnort: Hirschberg
Kontaktdaten:

Re: custom-Tag -> listview-Variante

Beitragvon haydi » Do 14. Mär 2019, 10:29

Okay, hab eben nachvollzogen, dass listview_sql auch auf den Parameter $predefinedSQL lauscht. Dieser ist hier anscheinend nicht als deprecated eingestuft... also am besten wirklich listview_sql modifizieren... wohl besser als die eigentliche listview-klasse ;-)

danke nochmal für eure antworten und hilfe!!

Liebe Grüße
Heidi
Heidi Wetzel
Internet-Applikationen & Webseiten-Erstellung
https://www.heidi-wetzel.de


Zurück zu „webEdition Templates erstellen (we:Tags)“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 Gäste