Jump to content
xt:Commerce Community Forum

mlueft

Members
  • Content Count

    16
  • Joined

  • Last visited

About mlueft

  • Rank
    Neuer Benutzer

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Ich kann natürlich nicht ausschließen, dass mein Kunde eine veraltete Version des Shops hat und sich inzwischen vielleicht das System rtwas geändert hat. Aber es sollte eine ausreichende Basis bilden um eigene Adaptionen zu erlauben. lg, mlueft
  2. Hi! Ich hatte heute das selbe Problem, wie ihr und ich habe die Funktion ausprogrammiert. class.manunfacturer.php function getManufacturerSortDropdown($default) { global $_GET, $PHP_SELF, $xtPlugin, $language, $db, $current_category_id; $sql_manufacturers = new getManufacturerSQL_query(); $sql_manufacturers->setSQL_COLS(' m.manufacturers_id as id, m.manufacturers_name as text', true); $sql_manufacturers->setSQL_TABLE(" left join xt_products p on m.manufacturers_id = p.manufacturers_id left join xt_products_to_categories cc on cc.products_id = p.products_id "); $sql_manufacturers->setSQL_WHERE("and m.manufacturers_status = 1 and cc.categories_id = ".$current_category_id ); $sql = $sql_manufacturers->getSQL_query("distinct"); $record = $db->Execute($sql); $options[] = array("id"=>"", "text" => "Hersteller:"); $options[] = array("id"=>"", "text" => "alle"); if($record->RecordCount() > 0){ while(!$record->EOF){ $options[] = $record->fields; $record->MoveNext(); } $record->Close(); }else{ return false; } $data['options'] = $options; return $data; }[/PHP] Die Templates habe ich so umgeändert, dass die selektierten Werte vorausgewählt sind. Das erlaubt die Kombination der Sortierung und der Herstellerfilter. Template: [HTML] {if $sort_dropdown.options} <div class="products_sort" style="float:left;margin:0px;"><div class="floatbox" > {form type=form name=sort_dropdown action='dynamic' method=get} {form type=hidden name=page value='categorie'} {form type=hidden name=cat value=$current_category_id} {form type=hidden name=filter_id value=$smarty.get.filter_id} {form type=select name=sorting value=$sort_dropdown.options default=$smarty.get.sorting onchange='this.form.submit();'} {form type=formend} </div> </div> {/if} {if $MANUFACTURER_DROPDOWN.options} <div class="products_sort" style="float:left;margin:0px;"><div class="floatbox" > {form type=form name=MANUFACTURER_DROPDOWN action='dynamic' method=get} {form type=hidden name=page value='categorie'} {form type=hidden name=cat value=$current_category_id} {form type=hidden name=sorting value=$smarty.get.sorting} {form type=select name=filter_id value=$MANUFACTURER_DROPDOWN.options default=$smarty.get.filter_id onchange='this.form.submit();'} {form type=formend} </div> </div> {/if} [/HTML] Die Joins sind notwendig, damit nur die Hersteller auswählbar sind, deren Produkte auch wirklich vorkommen. Man kann den Quellcode bestimmt noch etwas cleanen; ich habe zum Beispiel die Tabellennamen fix codiert und nicht die Kontanten verwendet. michael
  3. 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.
  4. 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 :-)
  5. 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: 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
  6. 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
  7. 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. sein Bild kaum findet, weil ja alle Bilder angezeigt werden. Vielleicht hat ja jemand von euch eine Idee. lg, michael
  8. 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
  9. so funktioniert's ohne die veyton-dateien ändern zu müssen. es heißt jedoch _srv_ und nicht _svr_
  10. Hi! Ich glaube, ich habe die Antwort selber gefunden: <code> <hook>page_registry.php:bottom</hook> <order>1</order> <active>1</active> <phpcode><![CDATA[ require _SVR_WEBROOT.'plugins/mlr_racers/classes/class.mlr_frames.php'; ]]></phpcode> </code>[/HTML] Leider konnte ich es noch nicht testen, sollte aber trotzdem eine Hilfestellung für andere Neulinge sein. lg, michael
  11. Hi! Ich arbeite gerade an einem Plugin, dass eine eigene Listen- und Detailansicht besitzen soll. Deren Einträge Besitzen auch jeweile ein Bild. Ich habe in der Tabelle eine Spalte frames_image hinzugefügt und sofort war in der Detailansicht das Element um Bilder hinzuzufügen vorhanden. Super praktisch!! Leider funktionierte dieses Element nicht und es hat mich einen ganzen Tag gekostet um es zum laufen zu bringen. 1. Im Veyton-Buch ist nur die Rede davon dass das Plugin funktionen wie _get, _set, _getParams usw. besitzen muss. Es gehört jedoch nicht zu meinem Programmierstil Klassenmember mit einem Unterstrich zu benennen, deshalb habe ich das auch nicht gemacht. Die MediaImages-Klasse(funktion:setMainFile) erstellt jedoch eine Instanz meiner Klasse und greift auf die Member _table, _master_key und _image_key zu. Es sollte unbedingt kommuniziert werden, dass diese Member Teil einer Interfacedefinition sind und nicht umbenannt werden dürfen bzw. vorhanden sein müssen. 2. Trotzdem hat mein Plugin noch nicht funktioniert. In der Zeile, in der die Instanz erzeugt erstellt wird, wurde die ausführung des PHP-Codes einfach beendet. Try-Catch hatte nicht gebracht. Keine Fehlermeldung, nichts. Nach zwei Stunden hatte ich die Idee, dass ich meine Klasse mit require_once in der Klasse MediaImages einbinde. Nun hat alles funktioniert. Ich halte es für keine gute Vorgehensweise, eine Veytonklasse ändern zu müssen, damit ein Plugin funktioniert. Nach dem nächsten Veytonupdate wird das Plugin nicht mehr funktionieren. Gibt es eine Möglichkeit auf require_once verzichten zu können? lg, michael
  12. Habe die Antwort gefunden: $content wird im template file /pages/content.html zusammengebaut. lg, michael
  13. Hi! Ich habe das Problem, dass ich im template den Inhalt nur mit $content ausgeben kann, aber keine Möglichkeit besteht in die Art wie diese Variable zusammengestellt wird einzugreifen. Ich will bei Contentseiten nur nur den content_body ausgeben, ohne Title oder sonstigen Gram. Mit einem Plugin für den hook "module_content.php:tpl_data" habe ich es geschafft den inhalt für title und "diese Seite Drucken" zu löschen, jedoch wird nun ein leerer H1 erzeugt. Ich konnte den Ort wo der eigentliche Content geparst wird nicht ausmachen, daher vermute ich, dass das irgendwo im verschlüsselten Teil passiert. Hat von euch jemand eine Idee wie ich mein Ziel erreichen kann, wäre echt super. lg, michael
  14. Hi! Ich habe mir selber eine Box geschrieben, die den gesamten Baum ausgibt. xtCore/boxes/gategoryTree.php <?php defined('_VALID_CALL') or die('Direct Access is not allowed.'); $id = $params["id"]; if( !$params["recursive"] ) $tpl_data["recursive"] = 0; $tpl_data = array( '_categories' => $category->getCategoryBox($id, true, 0), '_deepest_level_display' => $category->deepest_level_display ); if( $params["class"] ) $tpl_data["class"] = $params["class"]; if( $params["recursive"] ) $tpl_data["recursive"] = $params["recursive"]; ?> [/PHP] /templates/[templateName]/xtCore/boxes/categoryTree.php [PHP] {if $_categories|count > 0 } <ul {if $class != null }class="{$class}{$recursive}"{/if}> {section name=i loop=$_categories} <li > {$_categories[i].categories_name}({$_categories[i].categories_id}) {box name=categoryTree id=$_categories[i].categories_id class=$class recursive=$recursive+1 } </li> {/section} </ul> {/if} [/PHP] Vielleicht hilt's jemanden. lg, :michael
  15. Hallo! Ich bin neu hier und lerne gerade XTCommerce um für einen Kunden die Templates anzupassen. Heute habe ich mir Wissen über den content manager und die Ausgabe von Content angeeignet. Was ich da sehen musste hat mich echt entsetzt. Da ist es wirklich so, dass der Wert einer Autoinc-Spalte festlegt, wie Variablen im Template heissen - $_content_1,$_content_2,... $_content_n. Ich persönlich finde das echt - nö, da fällt mir nix mehr ein. Sorry Leute. Das heißt für mich, dass ich jetzt die Templates programmiere, sie dem Kunden ausliefere und nachdem er die Inhalte erstellt hat(Die er momentan nicht testen kann) ich die Templates überarbeiten muss. So weit so gut. Mein Kunde hat auch folgenden Wunsch: Auf jeder Seite gibt es neben dem normalen Content drei Banner, die er pro Contentseite extra festlegen können will. Mein Ansatz ist folgender: 1. Er legt alle Banner einzeln als content an. 2. Er bildet mit contentblöcken die gewünschte dreiergruppen. 3. In den Metatags(oder ein anderes Feld, dass wir nicht verwenden) schreibt er die ID der Banner-Gruppe, die angezeigt werden soll. Technisch lässt sich dies momentan nicht umsetzen. Warum? Ich kann zwar an {content} die ID als variable übergeben. Leider habe ich es aber nicht geschafft, die variable $_content_[iD] dynamisch anzusprechen. Um die Abhängigkeit von der ID aus der Datenbank aufzulösen und um mit {content} arbeiten zu können wenn ich die ID nicht kenne, habe ich meine content-Funktion so erweitert, dass ich ihr mitteilen kann wie die erzeugt variable heißen soll. Wenn man outvar nicht angibt arbeitet content wie gewohnt. Anwendung: {content block_id=10 levles=true outvar="myVar"} {if $myVar|count > 0} {foreach name=aussen item=box_data from=$myVar} {$box_data.title} {/foreach} {/if} [/PHP] Source: [PHP]function smarty_function_content($params, & $smarty) { global $_content, $xtPlugin; $block = (int) $params['block_id']; $cont = (int) $params['cont_id']; $nested = false; if ($params['levels'] =='nested') { $nested = true; } if (!isset($block) && !isset($cont)) return; if($block!=''){ if (isset($params['levels'])) { $content_array = $_content->getContentBox($block, $nested); } else { $content_array = $_content->get_Content_Links($block); } ($plugin_code = $xtPlugin->PluginCode('smarty_function_content:content_array')) ? eval($plugin_code) : false; $outvar = '_content_'.$block; if ($params['outvar']){ $outvar = $params['outvar']; } $smarty->assign($outvar,$content_array); } if($cont!=''){ if ($params['is_id']=='false') { $content = $_content->getHookContent($cont); } else { $content = $_content->getHookContent($cont, 'true'); } ($plugin_code = $xtPlugin->PluginCode('smarty_function_content:content')) ? eval($plugin_code) : false; $outvar = '_content_'.$cont; if ($params['outvar']){ $outvar = $params['outvar']; } $smarty->assign( $outvar, $content ); } return; }[/PHP] Dieser Code ist ungetestet, aber die Idee kommt rüber, denke ich. lg, Michael
×
×
  • Create New...