product scroller virtue mart

Status
Niet open voor verdere reacties.

jeel2008

Gebruiker
Lid geworden
30 okt 2008
Berichten
839
hallo, heb al gegoogled maar geen anwtoord kunnen vinden op de vraag:

zijn die images in de product scroller van virtuemart aan te passen wat hoogte en breedte betreft?

heb ook als de bestanden (1 php en 1 xml) gedownload en de sizes aangepast en teruggeftp-ed maar er veranderde niets aan de afmetingen.
 
bovendien zit de titel in de scroller veel te ver van de image af en doet ie in Firefox raar (bv niet alle plaatjes tonen, maar er op een gegeven moment mee kappen en opnieuw beginne). ook staat bv de prijs soms IN en niet ONDER de image (zowel in ie als in firefox trouwens).
 
Mmm, die plug-in scroller van Virtuemart gebruikt een marquee als scroller, en allemaal losse div'jes voor de verschillende onderdelen die omhoog moeten.

Het eerste dat me opviel aan de "Nieuwste producten" kolom van de finefleurbrocante.nl, was dat er helemaal niets in te zien was. Ik zit op 1024*768px resolutie, en dan komt pas na een tijdje het eerste artikel naar boven drijven. Maar ook bij andere resolties komt er eerst een gat, en dan pas komen de artikelen van onder af opzetten.
En als het rijtje voorbij is, flits, begint de scroller weer met een leegte en dan weer vanaf onderaan. Het is geen volcontinu-bedrijf! :confused:
Maar dat ligt aan de marquee-techniek, die zit nu eenmaal zo in elkaar.
Herstel: het rijtje komt niet voorbij; het emaille zeepbakje komt er niet helemaal op, en de knop "Toevoegen" komt niet tevoorschijn. Br, nu kan ik die scroller niet de oren wassen!
Edit: Hola, van het wandrek en de houten lepels die nu ik in de broncode zie staan, is in Firefox helemáál niets te bekennen in de scroller...
  • Ik zou zelf kiezen voor een home-made of elders gevonden javascript-scroller (met een fall-back voor als javascript uit staat, via een <noscript> scrollbar zo ongeveer als deze),
  • of heel anders: een vaste positie met fadende artikelen (helemaal zoals genoemde deze).
  • Maar of zoiets makkelijk het Virtuemart-systeem in te bouwen is: geen idee.
Dan de losse <div>'jes:
HTML:
<!-- The product name DIV. -->
<div style="height:77px; float:left; width: 100%;line-height:14px;">
    <a title="Emaille sodabakje" 
    href="/vm?page=shop.product_details&amp;category_id=7&amp;flypage=flypage.tpl&amp;product_id=55">
    Emaille sodabakje</a>
    <br />
</div>
<!-- The product image DIV. -->
<div style="height:90px;width: 100%;float:left;margin-top:-15px;">
    <a title="Emaille sodabakje" 
    href="/vm?page=shop.product_details&amp;category_id=7&amp;flypage=flypage.tpl&amp;product_id=55">
    <img src="http://www.finefleurbrocante.nl/components/com_virtuemart/show_image_in_imgtag.php?filename=resized%2FEmaille_sodabakj_4e82c458ab775_120x120.jpg&amp;newxsize=120&amp;newysize=120&amp;fileout=" height="90" width="120" alt="Emaille sodabakje" border="0" /></a>
</div>
<!-- The product price DIV. -->
<div style="width: 100%;float:left;text-align:center;">
    <span class="productPrice">&euro; 3.00</span>
</div>
<!-- The add to cart DIV. -->
<div style="float:left;text-align:center;width: 100%;">
    <br />
    <form action="http://www.finefleurbrocante.nl/index.php" method="post" 
    name="addtocart" id="addtocart">
        <input type="hidden" name="option" value="com_virtuemart" />
        <input type="hidden" name="page" value="shop.cart" />
        <input type="hidden" name="Itemid" value="53" />
        <input type="hidden" name="func" value="cartAdd" />
        <input type="hidden" name="prod_id" value="55" />
        <input type="hidden" name="product_id" value="55" />
        <input type="hidden" name="quantity" value="1" />
        <input type="hidden" name="set_price[]" value="" />
        <input type="hidden" name="adjust_price[]" value="" />
        <input type="hidden" name="master_product[]" value="" />
        <input type="submit" class="addtocart_button_module" 
        value="Toevoegen" title="Toevoegen" />
    </form>
    <br />
</div>
Allemaal om simpel dit op het scherm te krijgen:

sodabakje.png

En dat dan per artikel van de scroller... wat een tomeloos geweld! :d
Als ik het voor het zeggen had: één <div>'je per artikel, en met css allemaal dezelfde stijl. Klaar.
HTML:
<div class="nieuwProduct">
    <a title="Emaille sodabakje" 
    href="/vm?page=shop.product_details&amp;category_id=7&amp;flypage=flypage.tpl&amp;product_id=55">
    Emaille sodabakje</a>
    <br />
    <img src="http://www.finefleurbrocante.nl/components/com_virtuemart/show_image_in_imgtag.php?filename=resized%2FEmaille_sodabakj_4e82c458ab775_120x120.jpg&amp;newxsize=120&amp;newysize=120&amp;fileout=" 
    width="120" height="90" alt="Emaille sodabakje" border="0" /></a>
    <br />
    <span>&euro; 3.00</span>
    <br />
    <form action="http://www.finefleurbrocante.nl/index.php" method="post" 
    name="addtocart" id="addtocart">
        <input type="hidden" name="option" value="com_virtuemart" />
        ... enz.
        <input type="submit" class="addtocart_button_module" 
        value="Toevoegen" title="Toevoegen" />
    </form>
</div>
Dat is al erg genoeg. ;)

Maar wederom: of dit in het Virtuemart-system haalbaar is, geen idee.
Het zou kunnen dat deze dingen (inclusief alle inline styles) er dynamisch in gezet zijn met php, dat kan ik van buitenaf niet zien. Dan kan het nog best gecompliceerd worden om dat aan te passen.

Maar misschien valt er iets op te maken uit het php-bestand en de xml van deze module. Hoe zien die er uit?

Met vriendelijke groet,
CSShunter
___________
PS: De "product name div" is 77px hoog, daar gaat 15px van af via de negatieve margin-top van de "product image div", en dan is het niet verwonderlijk dat er een gapend gat komt na de ene regel tekst met de productnaam.
 
vm scroller

hallo csshunter,
bedankt voor je antwoord.

ten eerste even de link naar het xmlbestand van de mod_productscroller:
http://www.jeelsites.nl/mod_productscroller/mod_productscroller.xml

het phpbestand ziet er zo uit: (zie helemaal onder):
ik heb er al mee zitten klooien, niet met deze, in de code. je ziet allerlei variabelen. die zijn vooringesteld en zou je dan moeten kunnen veranderen. maar dat gaf weinig resultaat wat de margin van de titel tot het plaatje betreft.
bovendien heeft ie nog wat minder leuke kanten:
1. in firefox (3. nog wat) dus maar 3 vd 10 plaatjes
2. geen breuklijnen tussen de producten zoals in IE (1-0 voor IE, het mag ook wel eens gezegd worden!)
3. zodra er een verticaal plaatje (thumbnail) getoond moet worden is ie helemaal van de waps (prijs IN het plaatje) maar daar heeft IE dacht ik ook een probleem mee).

het mooiste zou zijn: Titel <br /> plaatje <br /> info
als je begrijpt wat ik bedoel.

ik heb trouwens enkele nieuwe scrollers gegoogled, je kunt ze zien op www.jeelsites.nl/joomla, aan de rechterzijde. ze werken in andere browsers prima. ze 'scrollen' dan wel niet, kun je ook niet instellen, wel hoe de overgang plaatsvindt, fade etc, maar werken tenminste naar behoren. inderdaad met vaste positie, zoals je noemt.

n javascript-scroller zeg je...hmm, daar weet ik niet veel van, van javascript. is php niet veel eenvoudiger?
over zo'n javascript scroller: kan ik die dan wijsmaken dat ik de plaatjes wil vertonen uit de productenlijst van virtuemart? die je dus uit de database haalt. dat moet je toch doen met php (aangezien er steeds nieuwe plaatjes bijkomen die getoond moeten worden)? of sla ik de plank volledig mis?
hier haak ik een beetje af, want dat wordt dan programmeren.

dan als laatste:
Maar wederom: of dit in het Virtuemart-system haalbaar is, geen idee.
Het zou kunnen dat deze dingen (inclusief alle inline styles) er dynamisch in gezet zijn met php, dat kan ik van buitenaf niet zien. Dan kan het nog best gecompliceerd worden om dat aan te passen.

Maar misschien valt er iets op te maken uit het php-bestand en de xml van deze module. Hoe zien die er uit?

Met vriendelijke groet,
CSShunter
___________
PS: De "product name div" is 77px hoog, daar gaat 15px van af via de negatieve margin-top van de "product image div", en dan is het niet verwonderlijk dat er een gapend gat komt na de ene regel tekst met de productnaam.

bedoel je of er een cssbestand te zien is ergens? ik heb het niet kunnen ontdekken, weet ook niet waar ie die margens vandaan tovert.
heb nog wel een bestand bijgevoegd, de backend.


ps:
ik wist trouwens helemaal niet dat die marquee-techniek nog gebruikt werd. dat is toch not done en helemaal uit de tijd?
zou met html5 zoiets niet veel makkelijker worden? dat je invoert:

Introductie van het element Scroll.

<scroll><div1 margeonder=4>je inhoud><div2>danplaatje</div2><div3 margeonder=4>je inhoud</div3></scroll>.
hmm, ik zal dit even opsturen naar de werkgroep html5, die zullen daar vast blij mee zijn.

Code:
<?php
/**
* VirtueMart Product Scroller Module
* NOTE: THIS MODULE REQUIRES AN INSTALLED VirtueMart COMPONENT!
*
* @version $Id: mod_productscroller.php 1948 2009-09-30 14:32:48Z soeren_nb $
* @package VirtueMart
* @subpackage modules
* 
* @copyright (C) 2005-2007 Soeren Eberhardt
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
*
* VirtueMart is Free Software.
* VirtueMart comes with absolute no warranty.
*/
if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' );

global $my, $mosConfig_absolute_path;

// Load the virtuemart main parse code
if( file_exists(dirname(__FILE__).'/../../components/com_virtuemart/virtuemart_parser.php' )) {
	require_once( dirname(__FILE__).'/../../components/com_virtuemart/virtuemart_parser.php' );
} else {
	require_once( dirname(__FILE__).'/../components/com_virtuemart/virtuemart_parser.php' );
}

/**
* This class sets all Parameters.
* Must first call the MOS function, something like: 
* $params = mosParseParams( $module->params );
* and send the $params variable to this class (productScroller)
* @param $params the results from mosParseParams( $module->params );
* @example $scroller = new productScroller($params);
*/
if( !class_exists('productScroller')) { // Prevent double class declaration

	class productScroller {
		/**
		* @var $NumberOfProducts
		*/
		var $NumberOfProducts = 5;
		/**
		* @var $featuredProducts
		*/
		var $featuredProducts = false;
		/**
	  	* // scroll, alternate, slide
	  	* @var $ScrollBehavior
	  	*/
		var $ScrollBehavior = 'scroll';
		/**
  		* @var $PS_DIRECTION
  		*/
		var $ScrollDirection = 'up';
		/**
  		* @var $ScrollHeight
  		*/
		var $ScrollHeight = '150';
		/**
  		* @var $ScrollWidth
  		*/
		var $ScrollWidth = '180';
		/**
	 	 * @var $ScrollAmount
	 	 */
		var $ScrollAmount = '2';
		/**
  		* @var $ScrollDelay
 		 */
		var $ScrollDelay = '80';
		/**
 		 * @var $ScrollAlign
  		*/
		var $ScrollAlign = 'center';
		/**
  		* // newest [asc], oldest [desc], random [rand]
 		* @var $SortMethod
  		*/
		var $ScrollSortMethod = 'random';
		/**
  		* @var $ScrollTitles
  		*/
		var $ScrollTitles = 'yes';
		/**
  		* @var $ScrollSpaceChar
  		*/
		var $ScrollSpaceChar = '&nbsp;';
		/**
  		* @var $ScrollSpaceCharTimes
  		*/
		var $ScrollSpaceCharTimes = 5;
		/**
  		* @var $ScrollLineChar
  		*/
		var $ScrollLineChar = '<br />';
		/**
  		* @var $ScrollLineCharTimes
  		*/
		var $ScrollLineCharTimes = 2;
		/**
  		* @var $ScrollSection
  		*/
		var $ScrollSection = 0;

		// CSS override -----------------------
		/**
  		* @var $ScrollCSSOverride
  		*/
		var $ScrollCSSOverride = 'no';
		/**
  		* @var $ScrollTextAlign
  		*/
		var $ScrollTextAlign = 'left';
		/**
  		* @var $ScrollTextWeight
  		*/
		var $ScrollTextWeight = 'normal';
		/**
  		* @var $ScrollTextSize
  		*/
		var $ScrollTextSize = '10';
		/**
  		* @var $ScrollTextColor
  		*/
		var $ScrollTextColor = '#000000';
		/**
  		* @var $ScrollBGColor
  		*/
		var $ScrollBGColor = 'transparent';
		/**
  		* @var $ScrollMargin
  		*/
		var $ScrollMargin = '2';

		var $params = null;
		/**
        * set mammeters
        */ 
		function productScroller (&$params) {

			$this->params = $params;
			// standard mammeters
			$this->show_product_name                =  $params->get('show_product_name', "yes");
			$this->show_addtocart                   =  $params->get('show_addtocart', "yes");
			$this->show_price                               =  $params->get('show_price', "yes");
			$this->category_id                              =  intval( $params->get('category_id', 0 ) );
			// Limit by NoP
			$this->NumberOfProducts                 =  $params->get('NumberOfProducts', $this->NumberOfProducts);
			$this->featuredProducts					= $params->get('featuredProducts', $this->featuredProducts);

			$this->ScrollSection                    =  $params->get('ScrollSection', $this->ScrollSection);
			$this->ScrollBehavior           =  $params->get('ScrollBehavior', $this->ScrollBehavior);
			$this->ScrollDirection          =  $params->get('ScrollDirection', $this->ScrollDirection);
			$this->ScrollHeight             =  $params->get('ScrollHeight', $this->ScrollHeight);
			$this->ScrollWidth              =  $params->get('ScrollWidth', $this->ScrollWidth);
			$this->ScrollAmount             =  $params->get('ScrollAmount', $this->ScrollAmount);
			$this->ScrollDelay              =  $params->get('ScrollDelay', $this->ScrollDelay);
			$this->ScrollAlign              =  $params->get('ScrollAlign', $this->ScrollAlign);
			$this->ScrollSortMethod			=  $params->get('ScrollSortMethod', $this->ScrollSortMethod);
			$this->ScrollTitles             =  $params->get('ScrollTitles', $this->ScrollTitles);
			$this->ScrollSpaceChar         =  $params->get('ScrollSpaceChar', $this->ScrollSpaceChar);
			$this->ScrollSpaceCharTimes   =  $params->get('ScrollSpaceCharTimes', $this->ScrollSpaceCharTimes);
			$this->ScrollLineChar          =  $params->get('ScrollLineChar', $this->ScrollLineChar);
			$this->ScrollLineCharTimes    =  $params->get('ScrollLineCharTimes', $this->ScrollLineCharTimes);
			// customization mammeters
			$this->ScrollCSSOverride       =  $params->get('ScrollCSSOverride', $this->ScrollCSSOverride);
			$this->ScrollTextAlign          =  $params->get('ScrollTextAlign', $this->ScrollTextAlign);
			$this->ScrollTextWeight         =  $params->get('ScrollTextWeight', $this->ScrollTextWeight);
			$this->ScrollTextSize           =  $params->get('ScrollTextSize', $this->ScrollTextSize);
			$this->ScrollTextColor          =  $params->get('ScrollTextColor', $this->ScrollTextColor);
			$this->ScrollBGColor           =  $params->get('ScrollBGColor', $this->ScrollBGColor);
			$this->ScrollMargin             =  $params->get('ScrollMargin', $this->ScrollMargin);
		}

		/**
		* Display Product Data
		*/ 
		function displayScroller (&$rows) {
			global $mosConfig_absolute_path;

			$database = new ps_DB();
			require_once( CLASSPATH."ps_product.php" );
			$ps_product = new ps_product;

			$cnt=0;
			if($this->ScrollCSSOverride=='yes') {
				$txt_size = $this->ScrollTextSize . 'px';
				$margin = $this->ScrollMargin . 'px';
				//$height=($height-intval($margin+0));
				//$width=($width-intval($margin+30));
				echo $this->params->get( 'pretext', "");
				echo " <div style=\"text-align:".$this->ScrollAlign.";background-color: ".$this->ScrollBGColor."; width:".$this->ScrollWidth."px;
                       margin-top: $margin; margin-right: $margin; margin-bottom: $margin; margin-left: $margin;\" >
               <marquee behavior=\"".$this->ScrollBehavior."\" 
                        direction=\"".$this->ScrollDirection."\"  
                        height=\"".$this->ScrollHeight."\"
                        width=\"".$this->ScrollWidth."\"
                        scrollamount=\"".$this->ScrollAmount."\"
                        scrolldelay=\"".$this->ScrollDelay."\"
                        truespeed=\"true\" onmouseover=\"this.stop()\" onmouseout=\"this.start()\"
                        style=\"text-align: ".$this->ScrollTextAlign."; color: ".$this->ScrollTextColor."; font-weight: ".$this->ScrollTextWeight."; font-size: $txt_size;\" >"; 
			}
			else {

				echo " <div style=\"width:".$this->ScrollWidth."px;text-align:".$this->ScrollAlign.";\">
               <marquee behavior=\"".$this->ScrollBehavior."\" 
                        direction=\"".$this->ScrollDirection."\"  
                        height=\"".$this->ScrollHeight."\"
                        width=\"".$this->ScrollWidth."\"
                        scrollamount=\"".$this->ScrollAmount."\"
                        scrolldelay=\"".$this->ScrollDelay."\"
                        truespeed=\"true\" onmouseover=\"this.stop()\" onmouseout=\"this.start()\">"; 
			}
			$show_product_name = ( $this->show_product_name == "yes" ) ? true : false;
			$show_addtocart = ( $this->show_addtocart == "yes" ) ? true : false;
			$show_price = ( $this->show_price == "yes" ) ? true : false;
			if (($this->ScrollDirection=='left') || ($this->ScrollDirection=='right')) {
				echo '<table border="0"><tr>';
			}
			foreach($rows as $row) {
				if (($this->ScrollDirection=='left') || ($this->ScrollDirection=='right')) {
					echo '<td style="vertical-align:top;padding: 2px 5px 2px 5px;">';
				}
				$ps_product->show_snapshot( $row->product_sku, $show_price, $show_addtocart, $show_product_name );
				if (($this->ScrollDirection=='left') || ($this->ScrollDirection=='right')) {
					echo '</td>';

				} else {
					for($i=0;$i<$this->ScrollLineCharTimes;$i++) {
						echo $this->ScrollLineChar;
					}
				}
			}
			if (($this->ScrollDirection=='left') || ($this->ScrollDirection=='right')) {
				echo '</tr></table>';
			}
			echo "    </marquee>
            </div>";
		} // end displayScroller

	} // end class productScroller

	/**
	* Helper DB function
	*/
	function getProductSKU( $limit=0, $how=null, $category_id=0, $featuredProducts='no' ) {
		global $my, $mosConfig_offset;

		$database = new ps_DB();

		if($limit>0) {
			$limit = "LIMIT $limit";
		} else {
			$limit = "";
		}

		$query = "SELECT p.product_sku FROM #__{vm}_product AS p";

		$query .= "\nJOIN #__{vm}_product_category_xref as pc ON p.product_id=pc.product_id";
		if( $category_id != 0 ) {
			$query .= " AND pc.category_id=$category_id";
		}
		$query .= "\nJOIN #__{vm}_category as c ON pc.category_id=c.category_id";
		
		$query .= "\n WHERE p.product_publish = 'Y' AND c.category_publish = 'Y' AND product_parent_id=0 ";
		if( CHECK_STOCK && PSHOP_SHOW_OUT_OF_STOCK_PRODUCTS != "1") {
			$query .= " AND product_in_stock > 0 ";
		}
		
		if( $featuredProducts=='yes' ) {
			$query .= "\n AND product_special = 'Y' ";
		}
		
		switch( $how ) {
			case 'random':
				$query .= "\n ORDER BY RAND() $limit";
				break;
			case 'newest':
				$query .= "\n ORDER BY p.cdate DESC $limit";
				break;
			case 'oldest':
				$query .= "\n ORDER BY p.cdate ASC $limit";
				break;
			default:
				$query .= "\n ORDER BY p.cdate DESC $limit";
				break;
		}
		$database->query( $query );

		$rows = $database->record;
		return $rows;
	}
}

// start of Product Scroller Script
$params = new vmParameters( $module->params );
$scroller = new productScroller($params);

/**
* Load Products
**/ 
$rows = getProductSKU( $scroller->NumberOfProducts, $scroller->ScrollSortMethod, $scroller->category_id, $scroller->featuredProducts );

/**
* Display Product Scroller
**/ 
$scroller->displayScroller($rows);

?>
 

Bijlagen

  • scroller.jpg
    scroller.jpg
    93,5 KB · Weergaven: 60
Hoi Jeel,
FF3: geen breuklijnen tussen de producten zoals in IE (1-0 voor IE, het mag ook wel eens gezegd worden!)
Eh, ahum. :rolleyes:
ffb-ie7.png

het mooiste zou zijn: Titel <br /> plaatje <br /> info
als je begrijpt wat ik bedoel.
Ja, als je begrijpt wat ik bedoel in m'n vorige reactie, begrijpen we dat we precies hetzelfde bedoelen. ;)

n javascript-scroller zeg je...hmm, daar weet ik niet veel van, van javascript. is php niet veel eenvoudiger?
over zo'n javascript scroller: kan ik die dan wijsmaken dat ik de plaatjes wil vertonen uit de productenlijst van virtuemart? die je dus uit de database haalt. dat moet je toch doen met php (aangezien er steeds nieuwe plaatjes bijkomen die getoond moeten worden)? of sla ik de plank volledig mis?
Ik denk dat je ook met php wel een scroller zou kunnen maken, maar de meeste worden met javascript gedaan. Ook de scrollers/faders van je testpagina doen het met javascript!
Het slaan van de plank:
  • het javascript zorgt voor het scroll- of fade-mechaniek,
  • de php zorgt voor het aanvullend ophalen van de ingrediënten uit de database,
  • zo doen de plug-ins van de testpagina het ook (hoop ik).

(...) bedoel je of er een cssbestand te zien is ergens? ik heb het niet kunnen ontdekken, weet ook niet waar ie die margins vandaan tovert.
Als die margin's en left-floats die in het rijtjes <div>'s binnen de marquee zitten, worden er als inline-styles in gepompt via het php-script. Waarom is me ook een raadsel. Misschien heb je dat aangegeven in het backend-formulier, maar dat ziet er nogal onbegrijpelijk uit.

Workaround!
Met wat knutselen aan het php-bestand zouden de problemen op te lossen moeten zijn. Ik zou wel eens een poging willen wagen, maar het is waarschijnlijk veel makkelijker om van het php-gedoe af te blijven en het van buiten af te doen.

Daarvoor is de hamvraag:
  • Kan je in de <head> van de pagina komen?
Zo ja, dan kan de css die er via de php-weg in is gezet, lekker overruled worden. Er blijft over: de container-<div> die net om de <marquee> heen zit (en er ook door de php is ingezet), want die heeft geen id ofzo waarmee je 'm kan vastpakken. Maar dat kan met wat javascript opgelost worden (je pakt de marquee, gaat één trapje omhoog in de DOM-tree, en daar forceer je de breedte; die nu op 125px staat ingesteld, waarmee de marquee uit het lood staat: niet in het midden van de kolom).

Aldus:
HTML:
...
<head>
...
<style type="text/css">
marquee {
	width: 100% !important;
	text-align: center !important;
	}
marquee div {
	width: auto !important;
	height: auto !important;
	text-align: center !important;
	float: none !important;
	}
marquee div a {
	float: none !important;
	height: auto !important;
	display: block !important;
	margin: 3px 0 !important;
	}
marquee div form {
	margin-top: -.5em !important;
	padding-bottom: 30px !important;
	border-bottom: 2px solid #BBBBBB !important;
	margin-bottom: 10px !important;
	}
marquee hr {
	display: none !important;
	}
</style>
 
<script type="text/javascript">
function correctMarqueeWidth(){
	var marq = document.getElementsByTagName('marquee')[0]; // pak eerste marquee van de pagina
	marq.parentNode.style.width = "100%"; // en geef div eromheen 100% breedte
}
window.onload = function(){
	correctMarqueeWidth(); // pas uitvoeren na laden pagina, anders bestaat de marquee nog niet :-)
}
</script>

</head>
Door de id- en class-loze div's kan je de afstanden voor en na de <hr> scheidingslijntjes niet goed regelen; die heb ik vervangen door een bordertje.
De output aan html (na alle php-bewerkingen, waar ik niet bij kan) wordt dan dit:
  • Test: www.bliksekaters.nl/tests/ffb-output.htm.

  • Doet het bij mij in FF, Chrome, IE7, Opera en Safari.
  • Prettige bijkomstigheid: FF laat nu ook de complete marquee zien! *)
  • Voor de staande plaatjes weet ik zo gauw geen oplossing: die worden met een php-resize uit de database opgehaald, en die resize is voor alle plaatjes hetzelfde.
=====
ik wist trouwens helemaal niet dat die marquee-techniek nog gebruikt werd. dat is toch not done en helemaal uit de tijd?
zou met html5 zoiets niet veel makkelijker worden? (...)
De marquee is zelfs nooit in de tijd geweest! Was/is een door IE ingevoerde niet-standaard html-tag, die (in de tijd van de eerste browseroorlogen) min of meer noodgedwongen door andere browsers ook ondersteund ging worden. Oftewel: hij doet 't wel, maar het mag niet mogen. Een check met de html-validator deelt er dan ook keurig een onvoldoende voor uit: staat in geen enkele html-specificatie.
Snap ook niet dat die Virtuemart-plugin 'm gebruikt.

Maar ... het hoort ook niet in html5 te komen: een scrollend ding heeft niets met de structuur van de pagina te maken, maar is een stijl-aangelegenheid die te maken heeft met het box-model en wat er in die box gebeurt. CSS dus!
En daar zijn ze al aan het knutselen :).
In css3 willen ze de marquee weer gaan invoeren als eigenschap voor overflow: www.w3.org/TR/css3-box/#marquee.
Even wachten tot ze daar klaar zijn met hun aanbevelingen, en tot de browsers het goed hebben ingevoerd. ;)

=====
O, ook nog een mogelijkheid: het scrollvak inkorten waardoor er maar 1 artikel in past, en de scroller de eerste keer niet zo lang hoeft te wachten tot er van onder af wat in komt (sc)rollen (op 1024*768px zit het scroll-begin "onder het scherm", en moet je helemaal lang wachten tot je wat ziet).
Groetjes,
CSShunter
___________
*) De FF-vertoning werd waarschijnlijk verrinnuweerd door de rare 77px hoogtes met negatieve margin-tops die de php had bedacht.
 
Laatst bewerkt:
scroller

hallo csshunter
het ziet er weer strak uit wat je daar uit de hoge hoed hebt getoverd.
voor nu: ja, kan in de head van de pagina komen.
via joomla - templates - template kiezen - html
tot later, moet er nu vandoor maar kom hier zeker nog op terug
groeten jeel2008
 
ja, kan in de head van de pagina komen.
Dat is heel mooi voor de mensen!
  • Als je bij de generaal kan, kan je de css tuurlijk nog beter in de general.css zetten; scheelt weer iets in paginasnelheid.
  • Als het in de head lukt, zou het javascriptje ook nog een apart .js bestandje kunnen worden (in een andere plakken zou ik niet doen, dat zijn vaste gebruiksartikelen). Maar voor die paar regeltjes lijkt 't me niet de moeite waard.
 
hallo css hunter
hoewel op jeelsites.nl/joomla de virtuemartscroller niet pakte*, deed ie dat op finefleurbrocante wel.

* dit was van de week al zo, dus ligt niet aan jou. ik had de hele tijd problemen met F5, er werd helemaal niks ververst, moest de hele pc aan en uitzetten om een verandering te zien. heb de cache geleegd, maar hielp ook niet. de scroller vertoonde ook eerst helemaal geen plaatjes. en een paar dagen later ineens wel! geloof me of niet. (heb er ook over gebeld, maar probleem lag bij mij zeiden ze, terwijl het op mn andere pc precies zo was!)

toen ik net je code had geplakt en ging uittesten, kwam er weer niets in beeld bij jeelsites. wel de titel 'virtuemartscroller' maar blanco eronder.
als ik dan een verandering toepaste , bv show random products ipv nieuw en ik drukte op F5 zag ik een nanoseconde één product in beeld wat toen voor eeuwig weer leek te verdwijnen.


hoe dan ook op finefleurbrocante kwam ie gelijk helemaal puntgaaf in beeld en ik kan je alleen maar weer hartelijk bedanken. ik heb het vast al eerder gezegd in het verleden, maar dan nogmaals: ik zou er eens over peinzen meer met dit talent te doen. :)

de js truc vat ik niet helemaal, maar ik vermoed dit:
ga 1 stap naar boven in de DOMtree

het was iets van:
document.getElementsByIDName (in dit geval een product)
en het wordt:
document.getElementsByTagName
gaat dat zo ongeveer in javascript?
dat dan dus het Element belangrijker is dan de id.

dus.

of moet ik de plank er weer bijhalen om vervolgens mis te slaan?
 
Laatst bewerkt:
DOM-tree en Javascript (1)

Hoi Jeel,
Balanceren op de plank:

Een html-document heeft een DOM-tree = stamboom van alle elementen die er in zitten (DOM = Document Object Model).
De stamboom staat op z'n kop, het is eigenlijk meer het wortelstelsel van de boom, met vertakkingen die steeds kleiner worden. ;)
Werking in het kort:
  • Elke vertakking begint op een "node" (knooppunt).
  • Elke pagina begint met de schepping: Adam/Eva, dat is de <html>. Die node heeft twee kinderen: de <head> en de <body>. In de DOM-taal ook: "child elements".
    HTML:
    <html>
       <head>
       ...
       </head>
    
       <body>
       ...
       </body>
    </html>
  • De <head> heeft ook kinderen: de <title>, de <meta>'s, de links naar stylesheets en javascripten, enz.
  • Die kinderen zijn dus broers/zussen van elkaar: ze staan op gelijke hoogte.
  • Vanuit de <title> gezien, is de <head> de ouder ("parent element"), en de <html> de grootouder ("grandparent").
  • De node <body> is het meest vertakt.
  • In het geval van onze finefleur heeft de <body> maar één kind: de <div id="art-main">, waar alles in zit.
  • Die heeft op diens beurt 3 kindjes: <div class="art-sheet">, <div class="cleared">, en de losse <p class="art-page-footer">.
  • Maar dan begint het pas goed! De <div class="art-sheet"> heeft 10 kinderen, waarvan 9 geen kinderen hebben. Dat wordt ruimschoots goedgemaakt door het laatste kind, de <div class="art-sheet-body">, met 6 kinderen, en 7 kleinkinderen van verschillende kinderen.
  • Van de kleinkinderen van de <div class="art-sheet-body"> heeft de <div class="art-content-layout-row"> de meeste nalatenschap, en pas vele generaties later komt eindelijk de <h3>Welkom bij finefleurbrocantewinkel</h3> en de broertjes/zusjes <p>Een eigenwijze webwinkel ...</p> en <strong>Lidy en Jan</strong>.
  • (Bent u daar nog?)
  • Iets dergelijks gebeurt er bij de andere lijn van de stamboom: vanaf de <div class="art-layout-cell art-sidebar2"> (die broertje/zusje is van de <div class="art-layout-cell art-content-sidebar1">) weer een aantal generaties naar beneden tot je bv. bij de <marquee> uitkomt (met ook weer kinderen natuurlijk).
  • Behalve de directe lijnen ouder / kinderen / kleinkinderen (vanaf elke node kan je omhoog of omlaag) kunnen er dus ook broers/zussen, ooms/tantes, neefjes/nichtjes, achter-achterneven, betovergrootmoeders, enz. zijn. Een complete familie! (Nou ja, halve familie, want merkwaardig genoeg is er in de DOM-tree maar 1 ouder nodig om kinderen te kunnen krijgen.)
Kortom, de html-stamboom heeft zich ijverig voortgeplant.
Vooral de templates van CMS'sen laten zich niet onbetuigd om onder de grond de wortels vrolijk te laten doorwoekeren. Dit kan je zien door bv. in Firebug (zeer handige add-on voor Firefox) de verschillende elementen open te klappen:

dom-tree.png

De DOM-boom is dus te vergelijken met een directory in de Verkenner: openklappen om de sub(sub)(sub)(sub)(enz.) directory's te kunnen zien.
  • Hierom is ook het inspringen in html-code zo handig: dan zie je precies op welke stamboom-hoogte een bepaald element zit.
  • Had iemand het bij dit template over divitis?
    Hetzelfde kan je bereiken met aanzienlijk minder <div's> als je zelf een pagina bouwt! :p
=====
Alle kinderen zitten steeds in een verzameling (een "array") met volgnummers, en zo kan je bv. het 4e kind van het 3e kind van oma aanwijzen, want daar is er maar één van: oma.childNodes[2].childNodes[3].
  • Op deze simpele manier heeft elk element van de html-stamboom een unieke plaats, en kan dat element makkelijk geduid worden.
  • NB: de DOM-telling van de elementen begint altijd met volgnummer 0 (daar kunnen computers makkelijker mee rekenen dan wanneer met 1 was begonnen).
Wordt vervolgd! (Edit) vervolg in reactie nr. 12 (/edit)
Voor als je niet kunt wachten: zie ook de uitgebreide HTML DOM Tutorial van w3schools.com. :)

Met vriendelijke groet,
CSShunter
 
Laatst bewerkt:
picture

aha, i get the picture.
had er ooit wel eens over gelezen, maar nooit echt ingedoken.
ff snel een vraag:
1. dat inspringen van code, om de parent bv te onderscheiden van child, doe je dat handmatig tijdens het coderen?
2.
Maar dan begint het pas goed! De <div class="art-sheet"> heeft 10 kinderen, waarvan 9 geen kinderen hebben. Dat wordt ruimschoots goedgemaakt door het laatste kind, de <div class="art-sheet-body">, met 6 kinderen, en 7 kleinkinderen van verschillende kinderen.

en je ziet dat, dat dat een kind is, doordat de child-div IN de parent div staat? hoe moet je anders weten dat art-sheet de parent is van art-sheet-body?

------------

even later
nu ik toch bezig ben. waar ik vaak over struikel is dit, misschien weet jij dat:
zie image code.jpg
ik heb bv wel gevonden waar dat plaatje zich bevindt, en het veranderd in een bloem
maar, is het eenvoudig om uit te zoeken welke bestand.php ik moet zoeken om de <a href> eruit te halen die er aan vast zit? hoe zie ik dat zo snel?

ik heb het wel gevonden in de code, zie image nr2.jpg, maar dat zegt me niks over welk in phpbestand ik het zoeken moet.

--------------

en weer even later.....
ok , heb het gevonden, je kon het gewoon in de backend doen
maar dat verandert toch mn vraag niet eigenlijk
want stel dat dat niet had gekund, hoe kan ik dan zien wat ik waar ik de code moet veranderen? (mag ik me daarna dan ook een hacker noemen?)
 

Bijlagen

  • code.jpg
    code.jpg
    97,9 KB · Weergaven: 46
  • nr2.jpg
    nr2.jpg
    95,4 KB · Weergaven: 53
  • toonvoettekst.jpg
    toonvoettekst.jpg
    91,3 KB · Weergaven: 52
Laatst bewerkt:
Ad 1: inspringen.
Ja, doe ik met de hand: want ik ben geen Dreamweaveraar of CMS'er maar Kladblokker, en doe alles met de hand. :P

Ad 2: kinderen.
Ja, die zitten altijd in de ouder, elke keer als er een nieuwe tag verschijnt:
HTML:
<div id="parent">
     <div class="child">
          <p class="kleinkind">Ik ben een kleinkind van de id="parent"</p>
          <p class="kleinkind">Ik ook! <strong>En ik ben achterkleinkind!</strong></p>
          <p class="kleinkind"><a href=#parent>Als achterkleinkind link ik naar de stamoudste</a></p>
     </div>
     <div class="child">Ik ben het tweede kind
          <p class="kleinkind">Ik ben een volle neef van de andere p's, en de link is een achterneef van mij.</p>
     </div>
</div>

Ad 3: struikelpunt.
Tja, dat is denk ik inderdaad niet zo gauw van buitenaf te zien, als je geen admin-venster hebt waarin het aangepast kan worden. Het specifieke .php bestand dat dit er in zet, zit "ergens" in het inwendige van het CMS. Om er achter te komen, zou je in het CMS zelf moeten duiken: alle php-bestanden stuk voor stuk bekijken, analyseren wat ze doen (want ze zijn onderling met elkaar verbonden), en dan zou je op het goede bestand moeten uitkomen... :rolleyes:
  • Als je de php daarvan naar wens kan aanpassen, er er ook nog voor kan zorgen dat het backend het niet verstiert (het overrule-risico is niet ondenkbaar!) als je iets anders gaat aanpassen via het backend ("klik! en alles is weg"), dan mag je je van mij gerust een CMS-hacker noemen. :)
(Het vervolg van het javascript-verhaal hou je nog tegoed)

Met vriendelijke groet,
CSShunter
 
Laatst bewerkt:
DOM-tree en Javascript (2)

Javascript is opgebouwd rond de DOM-stamboom. Met javascript kan je door ijverig knopen tellen dus altijd in de juiste node komen om iets te veranderen.
[JS]childNodes[1].childNodes[3].childNodes[0].childNodes[2] ... enz. enz.![/JS]
Maar met zo'n uitgebreide familie in dit CMS is een vergissing gauw gemaakt. En naderhand mag je ook niet ergens een <div> weghalen of bijplaatsen, want dan klopt de nummering niet meer. :confused:

Gelukkig zijn er nog wat andere methoden waarmee javascript iets kan oppakken:
  • Met de id van een element heb je rechtstreeks toegang tot dat element en de eigenschappen daarvan: document.getElementById('id-naam').
  • Van daaraf kan je ook makkelijk afdalen, bv. in een ul-menu (met id) naar een li (zonder id). Daarvoor gebruik je de verzameling getElementsByTagName('li') - let op de s die er nu in hoort: er zijn er méér van!
    [JS]var menu = document.getElementById('menu');
    var derdeLi = menu.getElementsByTagName('li')[2]; // weer 1 volgnr. lager
    derdeLi.style.color = "red";[/JS]
  • Zo zijn er meer grijpertjes: firstChild, lastChild, innerHTML (alles wat binnen een vastgepakte tag staat) enz.
Tot zover de theorie.

===========
Meer? Onmisbaar in je favorieten-lijst: Quirksmode.org ! Niet alleen de ingrediënten, maar ook wat de verschillende browsers ervan bakken.
- En de al genoemde HTML DOM Tutorial van w3schools.com.
===========

Nu de praktijk!
Wat moet gebeuren: de via het CMS ingestelde breedte van de <div> waarin de <marquee> bivakkeert, moet aangepast worden.
  • Deze <div> heeft van het CMS geen id gekregen, en valt niet rechtstreeks te grijpen.
  • Zelfs de <div> van de hele rechterkolom heeft geen id: geen enkele <div> heeft in dit CMS een id, dus even een hogere <div> met wel een id vastpakken (om dan af te dalen) is er niet bij. Alles draait op classes!
  • Maar er zit wel een herkenbaar element onder deze naamloze <div> die het CMS er via de php-constructie in zet: de <marquee> zelf, en daar is er gelukkig maar één van.
  • De <marquee> heeft ook al geen id, dus is niet met document.getElementById('id-naam') vast te pakken.
  • Maar de <marquee> valt wel vast te pakken op zijn TagName en zijn volgnummer:
    [JS]var marq = document.getElementsByTagName('marquee')[0];[/JS]
  • Vanuit de <marquee> moeten we één ouder omhoog om onze gewetenloze <div> aan zijn jasje te trekken, en dat kan:
    [JS]marq.parentNode[/JS]
  • Daarmee zitten we op de knoop van de <div>, en kunnen nu daarmee doen en laten wat we willen:
    [JS]marq.parentNode.style.width = "100%";[/JS]
  • Het enige dat nog resteert, is dat we dit niet zomaar kunnen doen voordat de pagina geladen is, want dan staat er nog geen <marquee> in, en de <div> ook nog niet.
  • Daarom is van het hele verhaal een functie gemaakt, die pas getriggerd wordt als de pagina-html klaar is met downloaden:
    [JS]function correctMarqueeWidth(){
    ...
    }
    window.onload = function(){
    correctMarqueeWidth();
    }[/JS]
  • Al met al wordt het dan:
    [JS]function correctMarqueeWidth(){
    var marq = document.getElementsByTagName('marquee')[0]; // pak eerste marquee van de pagina
    marq.parentNode.style.width = "100%"; // en geef div eromheen 100% breedte
    }
    window.onload = function(){
    correctMarqueeWidth(); // pas uitvoeren na laden pagina, anders bestaat de marquee nog niet :-)
    }
    [/JS]
  • En zo zijn we zonder het CMS aan te raken toch waar we wezen moeten. :)
Einde tweede en laatste deel!

Met vriendelijke groet,
CSShunter
 
Laatst bewerkt:
marquee

hallo csshunter, het duurde even want ik zat alweer vast in een andere knoop, maar die is inmiddels opgelost. (zie helpmij_forum).

maar over onderstaande: man, man, man
spoor jij wel, zou ik haast zeggen.
goed man!

ik had het zelf kunnen bedenken, maar niet heus.
hoe dan ook, het principe snap ik nog wel, maar de invulling ervan...hmmm, dat vereist toch wel wat ervaring ben ik bang.

even een detail eruit lichten:

Code:
1var marq = document.getElementsByTagName('marquee')[0];

hier maak je zelf de variabele aan? en die noem je var marq?
en dan snapt dat programma wel dat dat een child is, zodra jij even later een parent benoemt?

Code:
marq.parentNode

zit het zo?

de plank staat hier naast me, dus het is een kleine moeite om mis te slaan, je zegt het maar.
 
Hoi Jeel,
Voorzichtig met de plank hoor, want je gaat raak slaan. ;)

Inderdaad, met var maak je een variabele aan ("declareren van een variabele" heet dat deftig).
Je zegt hier dat je de variabele de naam "marq " geeft. Kan ook "mark" zijn, of wie je ook maar graag als variabele wilt zien. Mogen hoofd- en kleine letters zijn, of door elkaar, als je maar steeds dezelfde roepnaam hanteert. Dus "Mark" mag ook, dat is dan een andere dan "mark".
Alleen mag je ze niet door elkaar halen, want anders zeg je iets tegen mark-1 wat eigenlijk voor mark-2 bedoeld was. Omdat je zelf de naam voor het kiezen hebt, kan je er alle woorden of afkortingen in gebruiken die je nodig hebt om het jezelf makkelijk te maken.
  • Er zijn ook wat verboden tekens in een var-naam: de belangrijkste voorschriften staan hier (een koppelteken - mag trouwens ook niet, dat wordt aangezien voor een minnetje).
  • En er zijn ook verboden woorden voor variabele-namen, omdat die woorden gereserveerd zijn voor andere handelingen die javascript moet uitvoeren (staan hier).
Een variabele mag je declareren (alvast een naam geven) zonder inhoud.
Je mag ook meteen vertellen waar de variabele uit bestaat.
Hier krijgt onze variabele var marq meteen z'n inhoud: dat is een knoop in het document (document = de html-pagina) met een tag-naam "marquee", en daar dan het eerste exemplaar van op de pagina, aangegeven met de [0]:
Code:
var marq = document.getElementsByTagName('marquee')[0];

Inderdaad, onze var marq kan nu zowel de rol van ouder als van kind krijgen: hangt ervan of je omlaag of omhoog langs het knopenrijtje wilt gaan.
Als je vanuit een element/knoop de ouder aanroept, was het kennelijk een kind van die ouder. Dat snapt zelfs javascript! :)
Dus "neem vanaf de var marq het ouder-element" wordt:
Code:
marq.parentNode
En daar kan je dan iets mee doen.
Ja, zo zit dat! :D

(Dacht ik even kort "ja" te antwoorden, is het toch weer een heel verhaal geworden)

O ja, ook niet onbelangrijk voor javascript: het = teken heeft een bijzondere betekenis, anders dan bij rekenen.
In javascript betekent het = teken: het toekennen ("assign") van een waarde aan iets.
Daarmee kan je in javascript zeggen, op de verjaardag van var piet, die 11 jaar was:
Code:
piet [COLOR="darkred"]=[/COLOR] piet + 1;
Nu heeft var piet de waarde 12 gekregen (dus eigenlijk: var piet is de oude var piet plus 1). Raar maar waar!

  • Voor andere "operators" dan het = teken: zie hier.
  • Door dit speciale gebruik van de = kan de = nu niet meer gebruikt worden in een vergelijking; daarom wordt daarvoor het dubbele == teken gebruikt (zie hier).
  • Bv. om iets alleen te doen als var jip en var janneke even oud zijn, zeg je
    if (jip == janneke){...doe iets...}.
    Gelukkig heeft bv. de javascript-foutconsole van de Developer Toolbar het gauw in de gaten als je een keer zo'n tweede = vergeet en het script niks doet.
Zo zit dat!

Met vriendelijke groet,
CSShunter

PS: Waar komt trouwens de uitdrukking "de plank misslaan" vandaan? Ik sla nooit planken, hoogstens spijkers; wel of niet op hun kop.
"Het omgekeerde van de plank misslaan is ... niet de plank raak slaan, maar de spijker op zijn kop slaan."
"Als ik de plank raak sla, sla ik de spijker mis." :shocked:

(edit)
Met dank aan Google: gevonden!
(/edit)
 
Laatst bewerkt:
marquee

hallo csshunter
wederom bedankt voor deze tutorial.
dat wordt dus tellen en logisch denken. en een heleboel syntax...
zeker als dit er aan te pas komt: {...doe iets...}.
maar ik ga toch eens kijken op w3schools, want kan niet zeggen dat ik het oninteressant vind.
groeten jeel2008
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan