Javascript functie starten vanuit Php
Momenteel wordt het veld en button dat al dan niet verbergt gaat worden bij het laden van de pagina automatisch getoond. Ook hier zou ik bij het laden het veld en button willen verbergen afhankelijk van de waarde die bij het laden reeds getoond wordt in het selectie veld.
Hiervoor heb ik een functie verberg gemaakt, maar krijg het niet voor elkaar om deze aan te roepen.
De vraagstelling om deze functie aan te roepen op basis van de waarde Gekleurd die al dan niet voorkomt is ook reeds gemaakt.
Kan iemand mij hiervoor informeren hoe ik dit verder dien aan te pakken.
Alvast bedankt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
defined('_JEXEC') or die();
$product = $viewData[0];
$params = $viewData[1];
$options = explode(',', $params->custom_qvariant);
$class='';
$selects= array();
$form = JRequest::getVar("jform", "", "post");
$product_id = JRequest::getInt ('virtuemart_product_id', 0);
$db = JFactory::getDbo();
$db->setQuery("Select * From #__virtuemart_products_nl_nl Where virtuemart_product_id = $product_id");
$rows = $db->loadObjectList();
foreach( $rows As $row ){
$product_naam = $row->product_name."\n";
}
echo '<input id="product_naam" value="'.$product_id.'-'.$product_naam.'"></input>';
if (!class_exists('CurrencyDisplay')) require(VMPATH_ADMIN . DS . 'helpers' . DS . 'currencydisplay.php');
$currency = CurrencyDisplay::getInstance();
foreach ($options as $valuesWithPrice) {
$valueWithPrice = explode('@', $valuesWithPrice);
if ( isset ($valueWithPrice[1]) ) {
$text = $valueWithPrice[0].' - [ '.$valueWithPrice[1].' € ]';
}
$text = str_replace(',', '@@@', $text); //temp replace the commas
$selects[] = array('value' =>$valueWithPrice[0], 'text' => $text );
}
$verpakking_id = 'customProductData['.$product->virtuemart_product_id.']['.$params->virtuemart_custom_id.']['.$params->virtuemart_customfield_id .'][custom_qvariant]';
$verpakking_par = '"'.$verpakking_id.'"';
$html = JHTML::_('select.genericlist', $selects, $verpakking_id,'class=customqvariant onchange=myFunction('.$verpakking_par.')','value','text',$selects[0],false,true);
$html = str_replace('@@@', ',', $html); //reinsert the commas
echo $html;
echo '<button id="kleuren" style="border: 1px solid #ccc; border-radius: 5px; background-color: #fff; width: 220px;" onclick="ToonKleurenWaaier('.$product_id.');return false;"><img src="/images/Algemeen/ncs.png" /></button>';
$keuze = substr($selects[0]['value'], 0, 8);
if ($keuze=="Gekleurd") {
// in dit geval mag het kleurveld en de button getoond worden
} else {
// indien de keuze niet begint met Gekleurd dan dient de functie myFunction aangeroepen te worden.
// zodat het veld kleur_veld en button_kleur status hidden moet worden, idem zoals gebeurt in de functie myFunction
// die aangeroepen wordt als de keuze gewijzigd wordt in onchange
// Hier dient de code aangevuld te worden om de functie aan te roepen
}
?>
defined('_JEXEC') or die();
$product = $viewData[0];
$params = $viewData[1];
$options = explode(',', $params->custom_qvariant);
$class='';
$selects= array();
$form = JRequest::getVar("jform", "", "post");
$product_id = JRequest::getInt ('virtuemart_product_id', 0);
$db = JFactory::getDbo();
$db->setQuery("Select * From #__virtuemart_products_nl_nl Where virtuemart_product_id = $product_id");
$rows = $db->loadObjectList();
foreach( $rows As $row ){
$product_naam = $row->product_name."\n";
}
echo '<input id="product_naam" value="'.$product_id.'-'.$product_naam.'"></input>';
if (!class_exists('CurrencyDisplay')) require(VMPATH_ADMIN . DS . 'helpers' . DS . 'currencydisplay.php');
$currency = CurrencyDisplay::getInstance();
foreach ($options as $valuesWithPrice) {
$valueWithPrice = explode('@', $valuesWithPrice);
if ( isset ($valueWithPrice[1]) ) {
$text = $valueWithPrice[0].' - [ '.$valueWithPrice[1].' € ]';
}
$text = str_replace(',', '@@@', $text); //temp replace the commas
$selects[] = array('value' =>$valueWithPrice[0], 'text' => $text );
}
$verpakking_id = 'customProductData['.$product->virtuemart_product_id.']['.$params->virtuemart_custom_id.']['.$params->virtuemart_customfield_id .'][custom_qvariant]';
$verpakking_par = '"'.$verpakking_id.'"';
$html = JHTML::_('select.genericlist', $selects, $verpakking_id,'class=customqvariant onchange=myFunction('.$verpakking_par.')','value','text',$selects[0],false,true);
$html = str_replace('@@@', ',', $html); //reinsert the commas
echo $html;
echo '<button id="kleuren" style="border: 1px solid #ccc; border-radius: 5px; background-color: #fff; width: 220px;" onclick="ToonKleurenWaaier('.$product_id.');return false;"><img src="/images/Algemeen/ncs.png" /></button>';
$keuze = substr($selects[0]['value'], 0, 8);
if ($keuze=="Gekleurd") {
// in dit geval mag het kleurveld en de button getoond worden
} else {
// indien de keuze niet begint met Gekleurd dan dient de functie myFunction aangeroepen te worden.
// zodat het veld kleur_veld en button_kleur status hidden moet worden, idem zoals gebeurt in de functie myFunction
// die aangeroepen wordt als de keuze gewijzigd wordt in onchange
// Hier dient de code aangevuld te worden om de functie aan te roepen
}
?>
<script>
function myFunction(parameter) {
var a = parameter;
var b = 'customProductData'+a.replace(/\D/g,'')+'custom_qvariant';
var p1 = a.indexOf("[");
var p2 = a.indexOf("]");
var c = a.substring(p1+1, p2);
var verpakking = document.getElementById(b).value;
var gekleurd = verpakking.substring(0,8);
var kleur_veld = document.getElementById(c);
var kleur_titel = document.getElementsByClassName ("product-fields-title-wrapper");
var button_kleur = document.getElementById ("kleuren");
if (gekleurd == "Gekleurd") {
kleur_veld.style.visibility = "visible";
button_kleur.style.visibility = "visible";
} else {
kleur_veld.style.visibility = "hidden";
button_kleur.style.visibility = "hidden";
}
}
function ToonKleurenWaaier(par_id) {
var veld_id = par_id;
var y = (screen.height/2)-(700/2);
var x = (screen.width/2)-(950/2);
myWindow = window.open ('/Kleurenkiezer.html', 'myWindow', 'left=' + x + ', top=' + y + ', height=700, width=950, toolbar=no, menubar=no, ');
}
function verberg(parameter) {
var a = parameter;
var p1 = a.indexOf("[");
var p2 = a.indexOf("]");
var c = a.substring(p1+1, p2);
var kleur_veld = document.getElementById(c);
var button_kleur = document.getElementById ("kleuren");
kleur_veld.style.visibility = "hidden";
button_kleur.style.visibility = "hidden";
}
</script>
Gewijzigd op 25/02/2017 17:45:43 door Luc V
Ik ben wel even verder aan het zoeken gegaan met de info die je me hiervoor gaf.
Als ik één en ander test zou volgens mij dit moeten werken
window.onload=verberg();
door net voor </script> te plaatsen.
Ik heb in elk geval gemerkt dat hierdoor het script gestart wordt en de parameter wordt meegegeven, maar toch lukt het niet om het veld en de button te verbergen als de pagina geladen wordt en de waarde in het selectieveld niet begint met 'Gekleurd'
Toevoeging op 25/02/2017 20:35:03:
Ik heb nog even verder wat getest en merk volgende probleem.
Als ik de functie myFunction aanroep krijg ik voor de variabele kleur_veld de waarde [object HTMLInputElement] en als ik de functie verberg aanroep krijg ik de waarde null voor de variabele kleur_veld.
Dit is alleszins volgens mij de reden waarom het niet lukt. Nu alleen nog even zoeken waarom de waarde van de variabele kleur_veld verschillend is bij het uitvoeren van de 2 functies, als deze toch vertrekken vanuit dezelfde parameters. Ik heb de indruk dat het window.onload wordt uitgevoerd voor dat het veld kleur_veld geplaatst is. Bij uitvoering van het script zie ik dit ook. Dus het window.onload wordt net iets te snel uitgevoerd. Ik vermoed dat dit de oorzaak is, maar weet momenteel nog niet hoe dit opgelost kan worden. Iemand een idee ?
Gewijzigd op 25/02/2017 20:18:33 door Luc V
Zet het script eens helemaal achteraan in je HTML-document, net voor </html>.
Dit doe je op de volgende manier:
In de vraagstelling of de tekst in het selectieveld begint met Gekleurd of niet heb ik ingeval van niet een Iframe toegevoegd. Eigenlijk iets dat niet nodig is, maar ik vond een voorbeeldje op internet waarmee dit wel werkte. Het Iframe heb ik enkel nodig om een functie te kunnen uitvoeren zodra het Iframe geladen is. Daarvoor heb ik in het script een nieuwe regel toegevoegd die de functie verberg uitvoert, zodra het Iframe geladen is. De wijze om de variabele mee te geven zoals Ivo aangaf heb ik ook kunnen gebruiken.
if ($keuze=="Gekleurd") {
// in dit geval mag het kleurveld en de button getoond worden
} else {
echo '<iframe id="myFrame" src="/images/Algemeen/ncs.png" height="0"></iframe>';
}
?>
<script>
document.getElementById("myFrame").onload = function() {verberg()};
Maar wat is of was nu eigenlijk het probleem in 1e instantie? De oplossing die ik hierboven geef zou gewoon moeten werken (mits de rest klopt uiteraard).
Je moet zelf maar kijken wat je ermee doet, maar een iframe toevoegen lijkt me echt iets wat je niet wil. Ik denk toch echt dat er iets anders verkeerd gaat.
Zoals U wellicht zal weten zijn dit allemaal aparte bestanden. Waar dien ik dan uw regel net voor </html> toe te voegen. Is dit dan in de index.php van Joomla ?
Zeg maar 'je' hoor.
Ik ken Joomla niet zo heel goed. Ik zou zeggen probeer het gewoon eens :-)