CEC im Upload-Root probleme

Gesperrt
OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

CEC im Upload-Root probleme

Beitrag von OliverL » Do 4. Sep 2008, 21:04

Hallo Leute,

Vorab ich habe heute uber 8 Stunden an dem Problem gearbeitet bevor ich mir jetzt diese schmacht antue.

in der 4.8.8 wurde jetzt von mir für die Datei-Details div. CECs ergänzt.
Jetzt wollte ich heute ein kleines Paket machen das div. neue Funktionen anhand von Beispielen erklärt.

Dabei ist mir heute aufgefallen das ich (Asche über mein Haupt) das Upload-Root-Dir-Files (die Files die in keinem Unterordner liegen) nicht mit der con...upl...save-CEC kombiniert mit der Properti-Collection nicht funktioniert.

Zur Erklärung:
Breche ich den Code mit exit; nach der CEC ab steht der geseicherte Wert in der properti-Tabelle.
Daher gehe ich davon aus das in der File-Liste (in der die SpeicherungsCEC steht) irgendwo später die Propertie Table aufgeraümt wird.

Bei mir wird genauso wie bei der Option Protect für DBFS gespeichert.
Nur anstelle des Pfad+filename wird die FileID eingesetzt.

Hat irgend jemand von euch einen TIPP?

thx OliverL

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 12. Sep 2008, 10:56

ähm das ist so leider nicht nachvollziehbar ohne das man jetzt selbst stundenlang den code durchwühlt... logisch oder ?

gib ein beispiel..
*** make your own tools (wishlist :: thx)

OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

Beitrag von OliverL » Fr 12. Sep 2008, 11:48

Ein Beispiel Datensatz:

Code: Alles auswählen

INSERT INTO con_properties (idproperty, idclient, itemtype, itemid, type, name, value, author, created, modified, modifiedby) VALUES 
(186, 1, 'upload', '51', 'file', 'cec_bdbid', 'asd4sdfdf', '48a365b4ce1e322a55ae9017f3daf0c0', '2008-09-12 12:13:44', '2008-09-12 12:13:44', '48a365b4ce1e322a55ae9017f3daf0c0');
Workflow:
  1. Contenido48: Mandant ID-1 wählen
  2. Contenido48: In Dateiverwaltung eine Unterordner auswählen
  3. Contenido48: Ausloggen
  4. phpMyAdmin: Datensatz von oben einspielen
  5. Contenido48: in Contenido einloggen
  6. Contenido48: Dateiverwaltung öffnen (es öffnet sich das Unterverzeichnis von Punkt 2)
  7. phpMyAdmin: In DB gucken (eingepflegter Datensatz ist noch drin)
  8. Contenido48: Upload-Verzeichnis auswählen (upload/)
  9. phpMyAdmin: In DB gucken (eingepflegter Datensatz ist nicht mehr drin)
Füge ich denn datensatz von oben zweimal ein.
einmal mit ClientID 1 und einmal mit ClientID 2 wird nur der mit ID 1 gelöscht.

Bei weiteren Test kam für mich folgendes Resultat raus:
  • Das ganze passiert nur im Upload-Root (root:/cms/upload/)
  • Nur Daten des gerade aktiven Client
  • itemtype = 'upload' und/oder type='file' sein
Und jetzt suche ich die Funktion die das macht.
Ich würde ja in den Files versuchen zu suche aber ich hab keine Ahnung wonach ('properties', 'upload' und 'file' versuche ich erst gar nicht)

Ich denke das diese Funktion irgendwie in die 4.8 rein gekommen ist um die Daten für medianame, description, keywords, internal_notice in die DB upl_meta zu portieren.
Die Properties fürs DBFS (protected & timemgmt) bleiben erhalten, egal was ich mache.


Hier mal die CEC für Contenido ab 4.8.8
(../contenido/plugins/cec_upl_edit_bdb/includes/config.plugin.php)

Code: Alles auswählen

<?php
if(!defined('CON_FRAMEWORK')) {
	die('Illegal call');
}
global $_cecRegistry, $cfg;
function cecUplEdit_AddRowsBdbId($aRows) {
	$aNewRows = array();
	if( array_key_exists( "description", $aRows ) ) {
		$aNewRows = array();
		foreach( $aRows as $key => $value ) {
			$aNewRows[$key] =  $value;
			if( $key == "description" ) {
					$aNewRows['bdbid'] =  'Image-DB-ID';
	} } }
	else {
			$aNewRows = array();
			$aNewRows = $aRows;
			$aNewRows['bdbid'] =  'Image-DB-ID';
	}
	return $aNewRows;
}
function cecUplEdit_DisplayBdbId( $iIdupl, $sPath, $sFile, $sListRow) {
	global $properties;
	if( $sListRow == "bdbid") {
		$sBdbId = $properties->getValue("upload", $iIdupl, "file", "cec_bdbid", FALSE);
		$oBdbId = new cHTMLTextbox("cec_bdbid", $sBdbId, 60 );
    $sBdbId = $oBdbId->render();
		return $sBdbId;
	}
}
function cecUplEdit_SaveBdbId( $iIdupl, $sPath, $sFile ) {
	global $properties;
	$properties->setValue("upload", $iIdupl, "file", "cec_bdbid", stripslashes($_POST['cec_bdbid']) );
}
function cecUplEdit_DeleteBdbId( $iIdupl, $sPath, $sFile ) {
	global $properties;
	$properties->deleteValue("upload", $iIdupl, "file", "cec_bdbid" );
}
$_cecRegistry->addChainFunction("Contenido.Upl_edit.Rows",       "cecUplEdit_AddRowsBdbId");
$_cecRegistry->addChainFunction("Contenido.Upl_edit.RenderRows", "cecUplEdit_DisplayBdbId");
$_cecRegistry->addChainFunction("Contenido.Upl_edit.SaveRows",   "cecUplEdit_SaveBdbId");
$_cecRegistry->addChainFunction("Contenido.Upl_edit.Delete",     "cecUplEdit_DeleteBdbId");
?>

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 12. Sep 2008, 12:10

vielleicht passiert das in der functions.upl.php -> function uplSyncDirectory
*** make your own tools (wishlist :: thx)

OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

Beitrag von OliverL » Fr 12. Sep 2008, 13:20

Irgendwie nicht ganz meine Woche.
Das hääte ich auch finden können
THX emergence

Code: Alles auswählen

// A click on "Upload" (root) would result in path = "" and this will result in LIKE '%' = everything
// So, we have to exclude dbfs-files, as they "don't exist" (-> file_exists)
$properties->selfunction:uplSyncDirectoryect("idclient = '$client' AND itemtype='upload' AND type='file' AND itemid LIKE '".$path."%' AND itemid NOT LIKE 'dbfs%'");
while ($property = $properties->next()) {
  if (!file_exists($cfgClient[$client]["upl"]["path"].$property->get("itemid"))) {
    $properties->delete($property->get("idproperty"));
} }
Lösung ist dann das ich aus type=file einfach file_cec mache.
Andernfalls müsste ich
- das Select auf bestimmte Typen beschränken was in Zukunft die Core-Erweiterung einschränkt.
oder
- als itemid den Pfad übergeben. das wiederum bei einem verschieben (was momentan noch nicht möglich ist) nicht mehr konsistent ist und eine weitere CEC erfordern würde.

PLUS:
habe jetzt die neue CEC:Contenido.Upl_edit.Delete etwas oberhalb eingepflegt. Da ich für das ausführen die "idupl"... benötige und ich bei löschen der überflüssigen Propertys nur den Path noch habe.


Irgendwelche Kommentare? Um 17:30 Uhr check ich die neue function.upl.php ein und ergänze das Ticket.

mfg OliverL

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 12. Sep 2008, 14:18

kommentare ?

ähm, ich hab wieder mal keine ahnung wovon du jetzt schon wieder redest... du läßt einfach sachen aus die dein gegenüber erraten müsste um dich zu verstehen...

was checkst du jetzt in die function.upl.php ein ?
und welches ticket ?
*** make your own tools (wishlist :: thx)

OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

Beitrag von OliverL » Fr 12. Sep 2008, 14:30

Lösung ist dann das ich in meinem Plugin aus type=file einfach type=file_cec mache.

PLUS:
habe jetzt die neue CEC:Contenido.Upl_edit.Delete eingepflegt.

Code: Alles auswählen

/**
 * uplSyncDirectory ($path)
 * Sync database contents with directory
 *
 * @param string $path Specifies the path to scan 
 */
function uplSyncDirectory ($path)
{
	global $cfgClient, $client, $cfg, $db;

	if (substr($path,0,5) == "dbfs:")
	{
		return uplSyncDirectoryDBFS($path);	
	}
	
	$uploads = new UploadCollection;
    $properties = new PropertyCollection;
    	
	/* Read all files in a specific directory */
	$dir = $cfgClient[$client]['upl']['path'].$path;
	
	$olddir = getcwd();
	
	@chdir($dir);
	$dirhandle = @opendir($dir);
	
	/* Whoops, probably failed to open. Return to the caller, but clean up stuff first. */
	if (!$dirhandle)
	{
		$uploads->select("dirname = '$path' AND idclient = '$client'");

        while ($upload = $uploads->next())
        {
        	if (!file_exists($cfgClient[$client]["upl"]["path"].$upload->get("dirname").$upload->get("filename")))
        	{
       			/*
       			* Call chain
       			*/
       			$_cecIterator = $_cecRegistry->getIterator("Contenido.Upl_edit.Delete");
       			if ($_cecIterator->count() > 0) {
       				while ($chainEntry = $_cecIterator->next()) {
								$chainEntry->execute( $upload->get('idupl'), $upload->get("dirname"), $upload->get("filename") );
       			} }
						
        		$uploads->delete($upload->get("idupl"));
        	}	
        }
        
        // A click on "Upload" (root) would result in path = "" and this will result in LIKE '%' = everything
        // So, we have to exclude dbfs-files, as they "don't exist" (-> file_exists)
        $properties->select("idclient = '$client' AND itemtype='upload' AND type='file' AND itemid LIKE '".$path."%' AND itemid NOT LIKE 'dbfs%'");
        
       	while ($property = $properties->next())
       	{
       		if (!file_exists($cfgClient[$client]["upl"]["path"].$property->get("itemid")))
       		{
       			$properties->delete($property->get("idproperty"));
       		}
       	}        
        
		chdir($olddir);
		return;
	}
	
	/* Put all the files into the $files array */
	while ($file = readdir ($dirhandle))
    {
    	if ($file != "." && $file != "..")
    	{
    		if (is_file($file))
    		{
    			$uploads->sync($path, $file);
    		}
    	}
    }
    
    $uploads->select("dirname = '$path' AND idclient = '$client'");
    
    while ($upload = $uploads->next())
    {
    	if (!file_exists($cfgClient[$client]["upl"]["path"].$upload->get("dirname").$upload->get("filename")))
    	{
    		$uploads->delete($upload->get("idupl"));
    	}	
    }

    // A click on "Upload" (root) would result in path = "" and this will result in LIKE '%' = everything
    // So, we have to exclude dbfs-files, as they "don't exist" (-> file_exists)
    $properties->select("idclient = '$client' AND itemtype='upload' AND type='file' AND itemid LIKE '".$path."%' AND itemid NOT LIKE 'dbfs%'");
        
   	while ($property = $properties->next())
   	{
   		if (!file_exists($cfgClient[$client]["upl"]["path"].$property->get("itemid")))
		{
			$properties->delete($property->get("idproperty"));	
		}
   	}
    
    chdir($olddir);
}
ticket <- kenne nur ein Ticket was man bei Contenido machen kann und hab leider keien Ahnung wie ich das erklären soll.

OliverL
Beiträge: 870
Registriert: Do 28. Jun 2007, 09:28
Kontaktdaten:

Beitrag von OliverL » Fr 12. Sep 2008, 17:09

Das eigentliche Problem tritt nur dann auf wenn man Properties ergänzt mit dem folgenden Muster:

itemtype == 'upload'
type == 'file'
itemid != pfad + Dateiname

d.h. wird in 'itemid' etwas anderes als der Pfad gespeichert wird es von der Funktion "uplSyncDirectory()" gelöscht.

mfg OliverL

Gesperrt