cApiLayoutCollection - wie erweitern??? [für Profis]

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

cApiLayoutCollection - wie erweitern??? [für Profis]

Beitrag von rethus »

Hallo Leute,
ich schlage mir gerade das Verzeichnis /contenido/classes/contenido um die Ohren.
Dort gibt es die Datei class.layout.php mit folgendem Inhalt:

Code: Alles auswählen

<?php
 * Project: 

if(!defined('CON_FRAMEWORK')) {
	die('Illegal call');
}

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

class cApiLayoutCollection extends ItemCollection
{
	function cApiLayoutCollection ()
	{
		global $cfg;
		parent::ItemCollection($cfg["tab"]["lay"], "idlay");
		$this->_setItemClass("cApiLayout");
	}
	
	function create ($title)
	{
		global $client;
		$item = parent::create();
		$item->set("name", $title);
		$item->set("idclient", $client);
		$item->store();
		return ($item);	
	}
}

class cApiLayout extends Item
{
	function cApiLayout ()
	{
		global $cfg;
		parent::Item($cfg["tab"]["lay"], "idlay");
		$this->setFilters(array(), array());
	}
}
 
?>
Nun bastel ich im Corecode rum, um das Mandantenübergreifende Sharing von Layouts und Modulen zu realisieren.
Dazu benötige ich aber an einer Stelle eine DB-Abfrage, welche über 2 Tabellen geht. Über die bestehende con_lay und über meine neue Lookup-Tabelle con_lay_share (welche die Zuordnung der Layouts zu den Clients enthält.

Im Quellcode für die Generierung der Layout-Übersichtsliste werden die Daten für con_lay direkt über die Klasse cApiLayoutCollection in dieser Form gemacht:

Code: Alles auswählen

$layouts = new cApiLayoutCollection;
$layouts->select("","","name ASC");
Diese Klasse setzt in Ihrer Unterklasse cApiLayout den Tabellennamen für die Abfrage.

Code: Alles auswählen

parent::Item($cfg["tab"]["lay"], "idlay");
meine Frage nun, wie bekomme ich es hin, dass ich einen Select nach folgendem Schema über zwei tabellen abfragen kann

Code: Alles auswählen

$sql = "SELECT
        idlay, name, idclient
        FROM
        ".$cfg["tab"]["lay"]." l,
        ".$cfg["tab"]["lay_share"]." ls 
		
        WHERE ls.id_idlay = l.idlay
		AND ls.id_idclient='$client'                
        ORDER BY name ASC";
Wäre für einen anschaulichen Tipp sehr dankbar.
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType
rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Re: cApiLayoutCollection - wie erweitern??? [für Profis]

Beitrag von rethus »

Keiner der hier Erfahrung hat?
Bild
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Re: cApiLayoutCollection - wie erweitern??? [für Profis]

Beitrag von Oldperl »

Hallo,

die von dir benannten Klassen setzen auf die Klasse genericdb auf. Bei dieser gibt es 2 Möglichkeiten um mit anderen DB-Tabellen zu arbeiten.
  1. Du schreibst in deiner abgeleiteten Klasse/Funktion dein eigenes Select und mergst es mit dem Ergebnisarray der Klasse.
  2. Du nutzt die eingebauten Objekt-Join-Funktionen der gernericdb um dein Klassenobjekt mit anderen Objekten zu verbinden.
Für die genericdb gibt es aber, auser der InFile-Doku, bisher, soweit mir bekannt ist, keine weitere bzw. detaillierte Doku. Sobald klar ist ob Contenido auch zukünftig auf das Konzept der genericdb fußen wird, werde ich mich bemühen dazu eine kleine Doku suksessive zusammenzustellen.

Gruß aus Franken

Ortwin
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: cApiLayoutCollection - wie erweitern??? [für Profis]

Beitrag von xmurrix »

Hallo rethus,

habe wenig mit der GenericDB in Bezug auf tabellenübergreifende Verknüpfungen gearbeitet. Für die Meisten sind die Details der GenericDB Klassen ein Buch mit sieben Siegeln, da geht es mir nicht anders.

Vermute die Lösung in folgendem Ansatz:

Vorerst musst du zuerst eine cApiLayoutShareCollection und eine cApiLayoutShare für die Tabelle $cfg["tab"]["lay_share"] erstellen.
Im Konstruktor von cApiLayoutCollection() musst du den JoinPartner angeben, also

Code: Alles auswählen

   function cApiLayoutCollection ()
   {
      global $cfg;
      parent::ItemCollection($cfg["tab"]["lay"], "idlay");
      $this->_setItemClass("cApiLayout");
      $this->_setJoinPartner("cApiLayoutShareCollection");
   }
Dann sollte das mit folgendem Code möglich sein:

Code: Alles auswählen

$sWhere   = 'idlay = ' . $cfg['tab']['lay_share'] . '.id_idlay AND ' . $cfg['tab']['lay_share'] . '.id_idclient = ' . (int) $client;
$oLayouts = new cApiLayoutCollection();
$oLayouts->select($sWhere, '', 'name ASC');
Bedenke aber, dass die GenericDB Architektur mehreren SQL-Abfragen an die DB absetzt. Eines für die eigentliche Query und 2 pro Objekt!

Gruß
Murat
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Re: cApiLayoutCollection - wie erweitern??? [für Profis]

Beitrag von rethus »

Ich habe nun folgendes ohne funktionierendes Resultat gemacht:

Dass ist meine class.layout.php, welche ich um die cApiLayoutShareCollection und cApiLayoutShare erweitert habe.

Code: Alles auswählen

<?php

/**

 * Project: 

 * Contenido Content Management System

 * 

 * Description: 

 * Layout class

 * 

 * Requirements: 

 * @con_php_req 5.0

 * 

 *

 * @package    Contenido Backend classes

 * @version    1.0

 * @author     Timo Hummel

 * @copyright  four for business AG <www.4fb.de>

 * @license    http://www.contenido.org/license/LIZENZ.txt

 * @link       http://www.4fb.de

 * @link       http://www.contenido.org

 * 

 * {@internal 

 *   created 2004-08-07

 *

 *   $Id: class.layout.php 1199 2010-08-24 14:31:44Z timo.trautmann $:

 * }}

 * 

 */



if(!defined('CON_FRAMEWORK')) {

	die('Illegal call');

}



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



class cApiLayoutCollection extends ItemCollection

{

	function cApiLayoutCollection ()

	{

		global $cfg;

		parent::ItemCollection($cfg["tab"]["lay"], "idlay");

		$this->_setItemClass("cApiLayout");

        $this->_setJoinPartner("cApiLayoutShareCollection");

	}

	

	function create ($title)

	{

		global $client;

		$item = parent::create();

		$item->set("name", $title);

		$item->set("idclient", $client);

		$item->store();

		return ($item);	

	}

}



class cApiLayout extends Item

{

	function cApiLayout ()

	{

		global $cfg;

		parent::Item($cfg["tab"]["lay"], "idlay");

		$this->setFilters(array(), array());

	}

}







class cApiLayoutShareCollection extends ItemCollection

{

	function cApiLayoutShareCollection ()

	{

		global $cfg;

		parent::ItemCollection($cfg["tab"]["lay_share"], "id_idlay");

		$this->_setItemClass("cApiLayoutShare");

	}

}



class cApiLayoutShare extends Item

{

	function cApiLayoutShare ()

	{

		global $cfg;

		parent::Item($cfg["tab"]["lay_share"], "id_idlay");

		$this->setFilters(array(), array());

	}

}

?>
Meine include.lay_overview.php habe ich folgendermaßen angepasst:

Code: Alles auswählen

$sWhere   = 'idlay = ' . $cfg['tab']['lay_share'] . '.id_idlay AND ' .
			 $cfg['tab']['lay_share'] .'.id_idclient = ' .Contenido_Security::toInteger($client).' AND '.
			 'idclient = ' .Contenido_Security::toInteger($client).
			 ' GROUP BY idlay';

$layouts = new cApiLayoutCollection;
#$layouts->select("idclient = '$client'","","name ASC");
$layouts->select("$sWhere","","name ASC");
Rufe ich nun meine Layout-Seite auf, erhalte ich bei einem var_dump auf $layouts unter anderem folgende Infos:

Code: Alles auswählen

object(cApiLayoutCollection)[36]
  public 'table' => string 'con_lay' (length=7)
  public 'primaryKey' => string 'idlay' (length=5)
  public 'db' => 
    object(DB_Contenido)[37]
       public 'Halt_On_Error' => string 'report' (length=6)
      public 'Auto_Free' => int 0
      public 'Debug' => int 0
      public 'Seq_Table' => string '' (length=0)
      public 'Record' => 
        array
          empty
      public 'Row' => int 0
      public 'Errno' => int 1054
      public 'Error' => string 'Unknown column 'con_lay_share.id_idlay' in 'where clause'' (length=57)
      public 'type' => string 'mysql' (length=5)
      public 'revision' => string '1.2' (length=3)
      public 'Link_ID' => resource(61, mysql link)
      public 'Query_ID' => boolean false
  public 'lasterror' => null
  public 'cache' => null
  public 'lifetime' => int 10
  public '_itemClass' => string 'cApiLayout' (length=10)
  public '_iteratorItem' => null
  public '_JoinPartners' => 
    array
      0 => string 'capilayoutsharecollection' (length=25)
  public '_forwardJoinPartners' => 
    array
      empty
  public '_whereRestriction' => null
  public '_innerGroupConditions' => 
    array
      empty
  public '_groupConditions' => 
    array
      'share0' => 
        array
          'share1' => string 'OR' (length=2)
  public '_resultFields' => 
    array
      empty
  public 'properties' => null
  public 'virgin' => boolean true
  public '_encoding' => null
  public '_aOperators' => 
    array
      0 => string '=' (length=1)
      1 => string '!=' (length=2)
      2 => string '<>' (length=2)
      3 => string '<' (length=1)
      4 => string '>' (length=1)
      5 => string '<=' (length=2)
      6 => string '>=' (length=2)
      7 => string 'LIKE' (length=4)
      8 => string 'DIACRITICS' (length=10)
  public '_limitStart' => int 0
  public '_limitCount' => int 0
  public '_links' => 
    array
      empty
  public '_where' => 
    array
      'global' => 
        array
          empty
      'groups' => 
        array
          'share0' => 
            array
              ...
          'share1' => 
            array
              ...
  public '_driver' => 
    object(gdbMySQL)[38]
      public '_sEncoding' => null
      public '_oItemClassInstance' => 
        object(cApiLayout)[39]
          public 'table' => string 'con_lay' (length=7)
          public 'db' => 
            object(DB_Contenido)[40]
              ...
          public 'primaryKey' => string 'idlay' (length=5)
          public 'values' => null
          public 'modifiedValues' => null
          public 'lasterror' => null
          public 'virgin' => boolean true
          public 'cache' => null
          public 'lifetime' => int 10
          public 'properties' => null
          public 'oldPrimaryKey' => null
          public '_arrInFilters' => 
            array
              ...
          public '_arrOutFilters' => 
            array
              ...
          public '_metaObject' => null
  public '_itemClassInstance' => 
    object(cApiLayout)[39]
      public 'table' => string 'con_lay' (length=7)
      public 'db' => 
        object(DB_Contenido)[40]
          public 'Halt_On_Error' => string 'report' (length=6)
          public 'Auto_Free' => int 0
          public 'Debug' => int 0
          public 'Seq_Table' => string '' (length=0)
          public 'Record' => 
            array
              ...
          public 'Row' => null
          public 'Errno' => int 0
          public 'Error' => string '' (length=0)
          public 'type' => string 'mysql' (length=5)
          public 'revision' => string '1.2' (length=3)
          public 'Link_ID' => int 0
          public 'Query_ID' => int 0
      public 'primaryKey' => string 'idlay' (length=5)
      public 'values' => null
      public 'modifiedValues' => null
      public 'lasterror' => null
      public 'virgin' => boolean true
      public 'cache' => null
      public 'lifetime' => int 10
      public 'properties' => null
      public 'oldPrimaryKey' => null
      public '_arrInFilters' => 
        array
          empty
      public '_arrOutFilters' => 
        array
          empty
      public '_metaObject' => null
  public '_lastSQL' => string 'SELECT idlay FROM con_lay WHERE idlay = con_lay_share.id_idlay AND con_lay_share.id_idclient = 10 AND idclient = 10 GROUP BY idlay ORDER BY name ASC' (length=148)
  public '_mode' => string 'manual' (length=6)

Hier besonders seltsam:
public '_lastSQL' => string 'SELECT idlay FROM con_lay WHERE idlay = con_lay_share.id_idlay AND con_lay_share.id_idclient = 10 AND idclient = 10 GROUP BY idlay ORDER BY name ASC' (length=148)... weil kein Join drin is, und die Zeile

public 'Error' => string 'Unknown column 'con_lay_share.id_idlay' in 'where clause'' (length=57), weil die DB und die zeile in jedem Fall existiert (resultiert aber wahrscheinlich aus dem fehlenden Join.

Also für weitere Tipps wäre ich sehr dankbar.
Vielleicht findet sich ja ein 4fb-Entwickler der helfen kann.
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType
rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Re: cApiLayoutCollection - wie erweitern??? [für Profis]

Beitrag von rethus »

Also, ich habe folgende verstreute Beiträge gefunden, die etwas Licht in die Sache bringen:

http://forum.contenido.org/viewtopic.php?f=32&t=13571

http://forum.contenido.org/viewtopic.ph ... 69&start=0

Zudem hab ich eine eigene Gangart entdeckt. Denn der ganze Kram ist mir auf diese Art und weise zu Zeitraubend, und ich sehe nicht so ganz die Vorteile, die Sache so zu verkomplizieren.

Meine Persönliche Meinung ist, dass es Ziel jedes Entwicklers ist mit geringstem Aufwand das größtmögliche zu erreichen, und das GenericDB-Konzept gehört für mich momentan nicht dazu. Für Skalierbarkeit, die "scheinbar" keiner Braucht wurden hier die Sachen zu sehr verkompliziert.

So, nochmal zu meiner Lösung.

Ich nutze jetzt einfach den flexSelect-Befehl aus genericDB:

Ein Join ist nun einfach auf diese Art und Wiese realisierbar:

Code: Alles auswählen

$sFrom 	= 	"con_lay as l, con_lay_share as ls";
$sWhere = 	'l.idlay = ls.id_idlay AND ' .
			'ls.id_idclient = ' .Contenido_Security::toInteger($client).' OR '.
			 'l.idclient = ' .Contenido_Security::toInteger($client);
$sGroup = 	'l.idlay';

$layouts = new cApiLayoutCollection;
$layouts->flexSelect('',$sFrom,$sWhere, $sGroup);
Mit dem FlexSelect ist sogar als Erster Parameter die Nutzung von DISTINCT möglich, was scheinbar aus dem Hilferuf von HerrB resultiert, den er oben im geposteten Link abgesetzt hat.
Schaut man sich die Funktion flexSelect an, findet man dort auch HerrB als autor.

Danke HerrB, 1000 Punkte für dich! :!:
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType
Antworten