Jump to content
xt:Commerce Community Forum
Sign in to follow this  
mlueft

media search - nur eigene bilder anzeigen

Recommended Posts

Hi!

Ich habe folgendes dringendes Problem: Ich muss im media manager nur die Bilder anzeigen, die dem angemeldeten benutzer gehören. in der tabelle xt_media gibt es ja das feld owner mit der id des admin users, der das bild hochgeladen hat.

Kann ich den media manager irgendwie so konfigurieren?

Falls das nicht geht kann ich mir ein plugin schreiben das in die selektion der daten eingreift, dazu müsste ich jedoch wissen, welche hooks es für den media manager gibt.

Bin für jeden Hinweis dankebar

lg,

michael

Share this post


Link to post
Share on other sites

Oh je, ich denke, das wird schwierig. Meines Wissens sind die betreffenden files alle verschlüsselt, also fast unlösbar, da an die hooks ranzukommen oder in die classes einzugreifen.

Warum dürfen Bilder nur bestimmten Usern zugänglich sein?

Vielleicht gibt es einen anderen Ansatz, manchmal verrennt man sich ja auch in etwas...

Gruß

bitsy24

Share this post


Link to post
Share on other sites

hi,

in der class.mediaInageSearch.php sind keine Hooks, in der 14er ist das Teil aber offen.

Das Feld owner wird aber nirgends besetzt, sondern defaultmässig mit 1 besetzt.

Wenn das die Shop-ID enthalten würde, könnte man auch benutzer-mässig eingreifen.

Wann soll denn erst einmal die Zuordnung getroffen werden, "wem gehört das Bild" ?

Grüsse

Share this post


Link to post
Share on other sites

Der Webshop ist für eine Fahrrad-Geschäftskette. Die betreiben auch Sponsoring und auf der Homepage gibt es einen Bereich, wo sich Rennfahrer selbst vorstellen können. Dort können auch Bilder für eine Galerie hochgeladen werden. Als ich das System analysiert habe und gesehen habe, dass xt_media ein owner feld hat, war für mich klar, dass das system weiß wem welches Bild gehört, ergo, dies auch filtern kann.

Jetzt habe ich das Problem, dass wenn Fahrer A ein Bild in seine Galerie hinzufügen möchte, er

a) auch die Bilder von allen anderen Fahrern auswählen kann.

B) sein Bild kaum findet, weil ja alle Bilder angezeigt werden.

Vielleicht hat ja jemand von euch eine Idee.

lg,

michael

Share this post


Link to post
Share on other sites

Hi!

Ich habe ein Teilproblem gelöst. Ich kann beim Selektieren der Daten das owner feld berücksichtigen. Ich habe dazu die Datei "class.MediaImageSearch.php" in Ordner "/xtFramework/classes/" wie folgt verändert:

1. In der function "_getSearchIds" werden die Suchbegriffe or-Verknüpft.

Ich habe den gesamten Suchstring in runde Klammern gepackt und danach einen neuen Hook eingeführt. So kann ich mit einem Plugin die where-Klausel erweitern und das owner feld berücksichtigen. Ich hätte jetzt in der Boolschen Logik nachschlagen müssen, ob die runden Klammern notwendig sind, dazu war ich zu faul. Falsch sind sie nicht.

2. In der "_get" funktion habe ich ähnlich verfahren. Da dort aber ohne dies alle Suchbkriterien Und-Verknüpft sind brauchen wir keine Klammern, sondern nur den hook.

Der Code sieht nun folgendermaßen aus:

...
function _getSearchIds($search_data) {
...
$searchQry = '( ';
...
$searchQry = substr($searchQry, 0, -4);
$searchQry .=") ";
($plugin_code = $xtPlugin->PluginCode('class.MediaImageSearch:getSearchIdsWhere')) ? eval($plugin_code) : false;
...
}

function _get($ID = 0) {
...
$qry .= "and class = '".$this->url_data['currentType']."' ";

($plugin_code = $xtPlugin->PluginCode('class.MediaImageSearch:getWhere')) ? eval($plugin_code) : false;

$searchQry = '';
...
}
...[/PHP]

Der Code ist noch ungetestet, sollte aber funktionieren.

Warum mit hook und nicht direkt das ownerfeld mit der ID aus der session vergleichen?

1. In meiner Situation kommt erschwerend hinzu, dass nur die Fahrer nur die eigenen Bilder sehen dürfen. Der Admin soll schon alles sehen. Ich muss das owner feld also nur dann einschrenken, wenn der angemeldete Benutzer einer bestimmten Benutzergruppe angehört. Diese Logik passt besser in das Plugin, das den gesamten Fahrerbereich verwaltet.

2. Veyton bietet hooks.

Wenn ich euren Antworten Glauben schenken darf, schreibt veyton einfach eine 1 in das ownerfeld. Ich brauche die ID des adminbenutzers, der gerade angemeldet ist. Ich halte euch am Laufenden.

lg,

michael

Share this post


Link to post
Share on other sites

Hi!

Ich denke, ich habe es geschafft: Zwei Änderungen sind notwendig um das ownerfeld in der Datenbank richtig zu befüllen.

1. class.MediaData.php

In der funktion "setMediaData" wird geprüft, ob das hochgeladene File schon existiert, wenn nicht, wird eine neuer eintrag in der tabelle xt_media erstellt. Wird ein Eintrag gefunden, werden die Daten des neuen Eintrages auf den vorhandenen übernommen.

Es ergibt sich nun folgendes Problem:

B) Fahrer A lädt ein Bild mit dem Namen BildA.png hoch und fügt es zu seiner Galerie hinzu.

a) Fahrer B lädt zu einem späteren Zeitpunkt ein Bild mit dem selben Namen hoch und fügt es zu seiner Galerie hoch.

Fahrer B hat den Eintrag von Fahrer A übernommen und Fahrer A hat nun ein fremdes Bild in seiner Galerie.

Lösung: Wenn geprüft wird, ob das hochgeladene File schon existiert, wird nicht nur der Dateinamen abgefragt, sondern auch der owner.

Auswirkungen:

  • Es können nun zwei Einträge mit dem selben Namen und unterschiedlichen Besitzer in xt_media existieren.
  • In einer Redaktion muss jeder Benutzer seine Bilder selber hochladen.
  • Im Dateisystem kann es keine zwei Dateien mit dem selben Namen geben. Wenn also Fahrer B eine Datei mit dem selben Namen hochlädt wird zwar ein weiterer Eintrag in der xt_media erstellt. Beide Einträge verweisen jedoch auf die selbe Datei im Filesystem. Ergo, Fahrer A hat weiterhin ein falsches Bild in seiner Galerie. Lösung: Man könnte automatisch die BenutzerID dem Dateinamen beim Hochladen vorstellen. Somit ist das einzige was passieren kann, dass ein Fahrer ein eigenes Bild überschreibt. Ich werde mich später um den Dateinamen kümmern.

function setMediaData($data) {
global $db, $_SESSION;
...
$qry = "SELECT * FROM " . $this->_table_media . " WHERE file = '".$data['file']."' and owner = ".$_SESSION["admin_user"]["user_id"]." type = '".$data['type']."'";

$record = $db->Execute($qry);
if ($record->RecordCount() == 0) {
$oMD = new adminDB_DataSave($this->_table_media , $data);
$objMD = $oMD->saveDataSet();
$m_id = $objMD->new_id;
if ($data['language_code']) {
$oMDD = new adminDB_DataSave($this->_table_media_desc, $data, true);
$objMDD = $oMDD->saveDataSet();
}
$this->_setMediaGallery($data, $m_id);
}else{
$m_id = $record->fields['id'];
$record->fields['class'] = $data['class'];
$this->_setMediaGallery($record->fields, $m_id);
}
return $m_id;
}[/PHP]

2. class.MediaImages.php

In der Function "setAutoReadFolderData" wird ein Hash erzeugt, der die Daten enthält, die in xt_media landen. Hier wird die ID des admin users aus der session hinzugefügt.

[PHP] function setAutoReadFolderData($mgID='') {
global $db, $_SESSION;

$data = $this->readDir();
if (is_array($data['images'])) {
foreach ($data['images'] as $key => $imageData) {
$record = $db->Execute("SELECT id FROM ".$this->_table_media." where file='".$imageData['name']."'");
if ($record->RecordCount() == 0) {
$this->setMediaData(array('owner' => $_SESSION["admin_user"]["user_id"], 'file' => $imageData['name'], 'type' => $this->type, 'class' => $this->url_data['currentType'], 'mgID'=>$this->url_data['mgID']));
}
}
return true;
}
return false;
}[/PHP]

Das sollte es vorerst mal gewesen sein.

Der Code ist ungetestet. ich werde das alles heute Nacht ausprobieren.

Das Problem mit dem Dateinamen besteht weiterhin.

lg,

Michael

Share this post


Link to post
Share on other sites

Hi!

Das setzen des ownerfeldes hat im Echtsystem leider nicht so funktioniert, wie in der Entwicklungssystemes. Ich habe das Setzen der Eigenschaft auch in der Funktion MediaData::setMediaData verlegt. Diese vorgehensweise hat den Nachteil, dass das data array an zwei unterschiedlichen Stellen befüllt wird, jedoch auch den Vorteil, dass eine Datei weniger verändert werden muss.

if ($record->RecordCount() == 0) {
$data["owner"] = $_SESSION["admin_user"]["user_id"];
$oMD = new adminDB_DataSave($this->_table_media , $data);[/PHP]

Das befüllen des owner-Feldes funktioniert :-)

Share this post


Link to post
Share on other sites

Es funktioniert.

Für alle, die es interessiert, meine Hook-codes sehen wie folgt aus:

global $_SESSION;

if($_SESSION["admin_user"]["group_id"] == 4){
$searchQry .= " and owner = ". $_SESSION["admin_user"]["user_id"] ." ";
}
[/PHP]

[PHP]global $_SESSION;

if($_SESSION["admin_user"]["group_id"] == 4){
$qry .= " and owner = ". $_SESSION["admin_user"]["user_id"] ." ";
}
[/PHP]

Nun sehen alle Mitglieder der Admingruppe 4 nur ihre eigenen Bilder im Media manager.

Dieser Threat is inzwischen etwas für den Entwicklerbereich, vielleicht könnte ihn ein Admin dorthin verschieben.

lg,

michael

p.s.: Wir haben noch das Problem mit den Dateinamen. Hierfür gibt's noch nen Nachtrag.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...