Zielstellung / Problembeschreibung

Virtuemart 3 arbeitet zwar mit dem Konzept der Joomla-Template-Overrides, speziell was die Shop-Scripte angebetrifft, jedoch tut es das nicht konsequent. Eben z.B. nicht für die Verfügbarkeitsgrafiken (availability-images). Wenn man sich das verantwortliche Script components/com_virtuemart/sublayouts/stockhandle.php dazu mal anschaut, wird klar, dass hierin beim Suchen der Grafiken fest auf das Verzeichnis components/com_virtuemart/assets/images/availability/ zugegriffen wird. Gleiches trifft hier am Rand bemerkt auch zu für die Rating-Grafiken. D.h. Wenn einem die Standardgrafiken nicht gefallen (diese sind ja auch wirklich uralt-unschick), dann ist es nicht sehr sinnvoll, diese im o.g.Originalverzeichnis zu überschreiben. Beim nächsten VM-Update sind dann nämlich die Orgiginaldateien wieder da. Wir müssen diese Grafiken also unbebingt an einen Ort ablegen, wo diese nicht überschrieben werden. Damit VM aber in diesem Verzeichnis sucht, müssen wir dem verantwortlichen Script diesen Ort mitteilen.

 

Lösung im Detail

Nachfolgend beschreibe ich, wie das zu lösen ist:


  1. Zunächst erstellen wir uns ein Zielpfad in dem wir dann unsere eigenen Grafiken kopieren - verwenden Sie dazu diesen Pfad: templates/IHR_TEMPLATE/images/vm/availability/.
  2. Dann legen wir hierein die unsere eigenen Grafiken. Beim Ablegen der Grafiken bitte aufpassen, dass diese genau gleich benannt sind wie ihre Originale, denn nur so können wir die Zuordnung über die VM-Konfiguration (Produktdetails) korrekt vornehmen.
  3. Nun müssen wir das Script modifizieren, welches für das Suchen und die Ausgabe der Grafiken verantwortlich ist. Auch hierbei müssen wir vermeiden das Script im VM-Originalordner zu verändern. Statt dessen kopieren wir das Script in einen Override-Ordner, wo es dann sicher gegen zukünftige VM-Updaten modifiziert werden kann. Wir kopieren also konkret das Script components/com_virtuemart/sublayouts/stockhandle.php in das Verzeichnis templates/rt_photon/html/com_virtuemart/sublayouts/.
  4. Als letzten Schritt müssen Sie nun nur noch dieses Script so anpassen, dass es sich aus den korrekten Pfaden die Grafiken holt. Der Einfachheit halber poste ich hier nur eine vollständige Kopie meines modifizierten Scriptes, ohne genau aufzuzeigen, welche Zeilen ich modifiziert habe (wenn das im Detail interessiert, kann über einen Dateivergleicher die Unterschiede ermitteln):



<?php
$product = $viewData['product'];
// Availability
$stockhandle = VmConfig::get('stockhandle', 'none');
$product_available_date = substr($product->product_available_date,0,10);
$current_date = date("Y-m-d");

# Begin: Mod. mediaDESIGN.SK 2016-05-03
# Suche nach Template-Override-Path für Availability-Grafiken und verwende diese statt VM-Standards
$app    = JFactory::getApplication();
$path   = JURI::base(true).DS.'templates'.DS.$app->getTemplate().DS;
if (is_dir(JPATH_BASE . $path)) # Template-Override-Path
{
	$path = $path . DS."images".DS."vm".DS."availability".DS;
}
else # VM-Standard-Path
{
	$path = VmConfig::get('assets_general_path') . 'images/availability/';
}
# End: Mod. mediaDESIGN.SK

if (($product->product_in_stock - $product->product_ordered) < 1) {
	if ($product_available_date != '0000-00-00' and $current_date < $product_available_date) {
	?>
		<div class="availability">
			<?php echo vmText::_('COM_VIRTUEMART_PRODUCT_AVAILABLE_DATE') .': '. JHtml::_('date', $product->product_available_date, vmText::_('DATE_FORMAT_LC4')); ?>
		</div>
	<?php
	} else if ($stockhandle == 'risetime' and VmConfig::get('rised_availability') and empty($product->product_availability)) {
	?>
		<div class="availability">
			<?php echo (file_exists(JPATH_BASE . DS . $path . VmConfig::get('rised_availability')))
				? JHtml::image(JURI::root() . $path . VmConfig::get('rised_availability', '7d.gif'), VmConfig::get('rised_availability', '7d.gif'), array('class' => 'availability'))
				: vmText::_(VmConfig::get('rised_availability')); ?>
		</div>
	<?php
	} else if (!empty($product->product_availability)) {
	?>
		<div class="availability">
			<?php echo (file_exists(JPATH_BASE . DS . $path . $product->product_availability))
				? JHtml::image(JURI::root() . $path . $product->product_availability, $product->product_availability, array('class' => 'availability'))
				: vmText::_($product->product_availability); ?>
		</div>
	<?php
	}
}
else if ($product_available_date != '0000-00-00' and $current_date < $product_available_date) {
	?>	<div class="availability">
		<?php echo vmText::_('COM_VIRTUEMART_PRODUCT_AVAILABLE_DATE') .': '. JHtml::_('date', $product->product_available_date, vmText::_('DATE_FORMAT_LC4')); ?>
	</div>
<?php
}
?>

 

Wenn Ihnen dieser Beitrag geholfen und viel Zeit gespart hat, zeigen Sie sich erkenntlich: Über einen Klick auf Google+1 oder Rückmeldungen freue ich mich. Zeigen Sie mir, dass sich die Mühe für die Beitragerstellung gelohnt hat. Schenken Sie auch den Produktwerbungen Ihre Beachtung, denn damit wird mein Aufwand für diese Beiträge refinanziert.