Een checkbox op "checked" zetten als bijbehorend item in shopping cart zit.

Status
Niet open voor verdere reacties.

Colinch

Gebruiker
Lid geworden
22 nov 2012
Berichten
36
Hallo,

Ik heb een shopping cart systeem waarmee mensen op de website bepaalde items kunnen toevoegen. Er zijn in totaal zo'n 15 items.
Als ze de selectie die ze hebben gemaakt willen doormailen naar de winkel (het is een soort offerte die ze zelf samen stellen) komen ze op de contact pagina.
Daar staan dus die 15 checkboxes van elk item.

Nu wil ik dus ervoor zorgen dat die checkboxes zichzelf aanvinken als het bijbehorende item in de shopping cart zit, maar ik weet niet precies hoe.

Hier de website: www.colinch.com/11eventswebsite/diensten.php

Hier de officiele contact pagina (waar de checkboxes moeten komen): http://www.colinch.com/11eventswebsite/contactaanvraag/contactformulier.php

Hier een test pagina waar ik iets met een array wilde doen maar wat niet lukte: http://www.colinch.com/11eventswebsite/contactaanvraag/offerte.php

Ik hoop echt dat iemand me kan helpen, dat is de website af.
 
Als het goed is krijg je twee arrays, eentje met alle producten en een met welke producten in het mandje zitten.

Als het goed is heeft elk product een unieke code, als je die als array key gebruikt kun je via array_key_exists() controleren of ie bestaat:

PHP:
$products = array(
  array( 'id' =>1, 'name' => 'Product 1' ),
  array( 'id' => 14, 'name' => 'Product 2' ),
  array( 'id' => 5, 'name' => 'Product 3' )
);

$cart = array(
  14 => array(
     array( 'id' => 14, 'name' => 'Product 2' )
  )
);

foreach($products AS $product)
{
    $checked = array_key_exists($product['id'], $cart) ? ' checked="checked"' : '';
    echo '<input type="checkbox"'. $checked .'> '. $product['name'] .'<br />';
}
 
Ja, dat werkt alleen hoe gebruik ik mijn eigen arrays (dus ipv products 1, 2, 3)?
Ik ben nog niet heel goed met php maar ik begin het te leren :D
 
Dan zul je uit moeten leggen of laten zien hoe die er qua structuur uit zien
 
Ik denk dat laten zien het beste is, hier een paar functies (ik heb dit script ergens vandaan):

PHP:
	function addtocart($pid,$q){
		if($pid<1 or $q<1) return;
 
		if(is_array($_SESSION['cart'])){
			if(product_exists($pid)) return;
			$max=count($_SESSION['cart']);
			$_SESSION['cart'][$max]['productid']=$pid;
			$_SESSION['cart'][$max]['qty']=$q;
		}
		else{
			$_SESSION['cart']=array();
			$_SESSION['cart'][0]['productid']=$pid;
			$_SESSION['cart'][0]['qty']=$q;
		}
	}
	function product_exists($pid){
		$pid=intval($pid);
		$max=count($_SESSION['cart']);
		$flag=0;
		for($i=0;$i<$max;$i++){
			if($pid==$_SESSION['cart'][$i]['productid']){
				$flag=1;
				break;
			}
		}
		return $flag;
	}
 
?>

Hier wat uit de pagina zelf:
PHP:
<?php
			if(is_array($_SESSION['cart'])){
            	echo '<tr bgcolor="#FFFFFF" style="font-weight:bold"><td width="50px">Module</td><td>Product</td><td>Opties</td></tr>';
				$max=count($_SESSION['cart']);
				for($i=0;$i<$max;$i++){
					$pid=$_SESSION['cart'][$i]['productid'];
					$q=$_SESSION['cart'][$i]['qty'];
					$pname=get_product_name($pid);
					if($q==0) continue;
			?>


<?php
			$result=mysql_query("select * from products");
			while($row=mysql_fetch_array($result)){
		?>

Ik hoop hiermee wat duidelijk te hebben gemaakt, ik ben nog niet zo bekend met arrays :S
 
Je hebt al een functie om te controleren of een product voorkomt in de winkelmand namelijk product_exists()

Dat wordt een kwestie van aanroepen als je de producten toont.

Afhankelijk van je databasestructuur wordt het dus zoiets:
PHP:
while($row = mysql_fetch_assoc($result)) {
    $checked = product_exists($row['product_id']) ? ' checked="checked"' : '';
    echo '<input type="checkbox"'. $checked .'> '. $row['product_name'] .'<br />';
}
 
Ik heb er nu dit van gemaakt:
PHP:
while($row = mysql_fetch_assoc($result)) {
    $checked = product_exists($row['serial']) ?  ' checked="checked"' : '';
    echo '<input type="checkbox"'. $checked .'> '. $row['name'] .'<br />';
}

Maar het werkt nog niet, ik ben sowieso nog niet zeker of ik bij product_exists($pid) moet zetten maar dat werkte ook niet.
Ik snap trouwens niet waarom dat vraagteken daar staat achter products_exists(...)?
Misschien dat hij het daarom niet doet, verder zou ik toch zeggen dat alles perfect is.

Dit zijn mijn rijen uit de database:
serial, name description, price, picture
En in dit geval zijn alleen serial en name belangrijk.

Bedankt voor alle hulp!

Edit 1:
En hij hoeft op zich niet eens alle checkboxes automatisch aan te maken.
Misschien, als dat makkelijker is, kan ik het ook zo maken dat ik gewoon in alle bestaande <input>'s gewoon die $checked neerzet.

Edit 2:

Ik heb nu diezelfde code voor de checkbox in de tabel geplakt waar hij de inhoud laat zien van je winkelmand, en ik krijg de volgende foutmelding (die ik niet krijg als de code ergens anders staat):

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, null given in /home/colin78955/domains/colinch.com/public_html/11eventswebsite/contactaanvraag/offerte.php on line 119
 
Laatst bewerkt:
Ik snap trouwens niet waarom dat vraagteken daar staat achter products_exists(...)?
Dit is misschien duidelijker:
PHP:
// Standaard
if(product_exists($row['serial']))
{
     $checked = ' checked="checked"';
}
else
{
    $checked = '';
}

// Standaard geoptimaliseerd
$checked = '';
if(product_exists($row['serial']))
{
     $checked = ' checked="checked"';
}

// "Ternary conditional operator"
$checked = product_exists($row['serial']) ?  ' checked="checked"' : '';
Allen doen hetzelfde :)

Hoe ziet je code er uit om een item aan de cart toe te voegen?
 
Dat is inderdaad wat duidelijker!

De functie om hem toe te voegen staat in een paar berichten hier boven

Dit heb ik verder in de pagina zelf staan mbt product toevoegen.
PHP:
if($_REQUEST['command']=='add' && $_REQUEST['productid']>0){
		$pid=$_REQUEST['productid'];
		addtocart($pid,1);
		header("location:products2.php");
		exit();
	}

<?php
			$result=mysql_query("select * from products");
			while($row=mysql_fetch_array($result)){
		?>
    	<tr>
        	<td><img src="<?php echo $row['picture']?>" /></td>
            <td>   	<b><?php echo $row['name']?></b><br />
            		<?php echo $row['description']?><br />
 
                    <input type="button" class="button" value="Toevoegen aan offerte" onclick="addtocart(<?php echo $row['serial']?>)" />
			</td>


EDIT:
Volgens mij doet hij het! Zoals je ziet in het script hierboven vanaf $result=mysql_query(select*........)
daar heeft hij bepaalde echo's zoals name, description etc. en ik heb er een echo bij gezet (die van de checkbox):
PHP:
<?php
			$result=mysql_query("select * from products");
			while($row=mysql_fetch_array($result)){
		?>
    	<tr>
        	<td><img src="<?php echo $row['picture']?>" /></td>
            <td>   	<b><?php echo $row['name']?></b><br />
            		<?php echo $row['description']?><br />
  !@[B]Hier->  [/B]                    <?php $checked = product_exists($row['serial']) ?  ' checked="checked"' : '';
    echo '<input type="checkbox"'. $checked .'> '. $row['name'] .'<br />';
 ?>
                  
                    <input type="button" class="button" value="Toevoegen aan offerte" onclick="addtocart(<?php echo $row['serial']?>)" />
			</td>

Waarom hij het anders op een andere plek niet deed weet ik niet, maar als ik hem dus hier bij de andere code ertussen zet werkt het wel? :D
 
Laatst bewerkt:
Dit lijkt mij niet te gaan werken want je gebruikt nu een PHP-functie als Javascript functie via onclick (tenzij je natuurlijk een JS-functie hebt "addtocart")

Het lijkt mij ook netter om via vinkjes aan te geven welke je wilt toevoegen, probeer deze niet geteste versie eens:
PHP:
<?php
// hierboven moet je ergens de cart- en database-functies inladen, er mag GEEN output / HTML zijn
if($_SERVER['REQUEST_METHOD'] == "POST") {
    if(is_array($_POST['item'])) {
        foreach($_POST['item'] AS $item)
        {
            if(! product_exists($item)) {
                // Add item if it doesn't exist
                addtocart($item, 1);
            }
        }
    } else {
        // Show error if the variable is empty
    }
}
?>
<form action="" method="post">
    <table>
    <?php
    $result = mysql_query("SELECT * FROM products");
    while($row=mysql_fetch_array($result)) {
        $checked = product_exists($row['serial']) ?  ' checked="checked"' : '';
    ?>
        <tr>
            <td><input type="checkbox"<?= $checked ?> name="item[]" value="<?= $row['serial'] ?>" />
            <td><img src="<?= $row['picture'] ?>" /></td>
            <td><b><?= $row['name'] ?></b><br />
                    <?= $row['description'] ?><br />
            </td>
        </tr>
    }
    ?>
    </table>
    <input type="submit" value="Voeg geselecteerde items toe aan winkelwagen" />
</form>
 
Ja het werkt nu inderdaad wel! Bedankt!

Alleen snap ik niet helemaal wat je met de vinkjes bedoeld om aan te geven welke je wilt toevoegen.

Uiteindelijk moet het er zo uit komen te zien:

Ieder "product" heeft een eigen pagina, met een add button en een box die de inhoud van de "winkelmand" laat zien.
Uiteindelijk kom je op de offerte pagina de checkboxes pas tegen, dat is gewoon een lijst van alle producten en degene die in de winkelmand staan zijn aangevinkt (dat werkt nu :) )
De reden dat er ook niet-aangevinkte checkboxes staan is zodat mensen op het laatste moment nog dingen kunnen toevoegen aan de "eind-order".

Uiteindelijk worden de checkboxes via de offerte pagina (wat eigenlijk een contact formulier is) door-gemailed.
Alleen wist ik nog niet zeker hoe ik dat met de values moest gaan doen, maar dat heb je in het bericht hierboven al gedaan door daar gewoon value <?= $row['serial'] ?> neer te zetten.
Maar dan vraag ik me af of hij dat dan ook neerzet voor de niet-aangevinkte checkboxes die daarna wel worden aangevinkt door de gebruiker.

In ieder geval bedankt voor alle hulp, het enige wat ik moet doen is de juiste stukjes script in mijn echte website zetten en zoals het er nu naar uitziet gaat dit werken!
 
Laatst bewerkt:
Maar dan vraag ik me af of hij dat dan ook neerzet voor de niet-aangevinkte checkboxes die daarna wel worden aangevinkt door de gebruiker.
Het is info uit de database dus ook al is iets niet aangevinkt zal ie het er wel plaatsen. :)
 
Het is info uit de database dus ook al is iets niet aangevinkt zal ie het er wel plaatsen. :)
Dat is waar, ik snap het nu helemaal!
En het werkt ook goed nu, voor elk item wordt een checkbox aangemaakt en evt. aangevinkt.

Alleen heb ik dan nog 1 vraag, ik weet niet of ik daar een nieuw topic voor aan moet maken?

Nu komt er namelijk 1 lange lijst van producten, maar het lijkt me leuk als het er een beetje zoals dit uitziet:

[] Product 1 [] Product 5 [] Product .
[] Product 2 [] Product 5 [] Product .
[] Product 3 [] Product 5 [] Product .
[] Product 4 [] Product 5 [] Product .

Of iets wat er op lijkt, in ieder geval niet 1 lange lijst.
Dus per 3-4 producten gaat hij een rij opzij, zou dit mogelijk zijn?
 
Bedankt, dit werkt perfect!

En een klein css vraagje: hoe zorg ik ervoor dat content na de .container div begint op een nieuwe regel? Dus niet na de laatste .column maar daaronder?
 
http://jsfiddle.net/rxuL5/4/

Gebruik maken van een clearfix
Code:
.container
{
    width: 480px;
    background: grey;
}
.column
{
    float: left;
    width: 100px;
    margin: 10px;
    background: black;
}
.clearfix {
  *zoom: 1;
}
.clearfix:before,
.clearfix:after {
    display: table;
    content: "";
}
  .clearfix:after {
    clear: both;
  }
HTML:
<div class="container">
        <div class="column">
            data
        </div>
        <div class="column">
            data
        </div>
        <div class="column">
            data
        </div>
        <div class="column">
            data
        </div>
        <div class="column">
            data
        </div>
        <div class="clearfix"></div>
    lorem
</div>
 
Heb je de pagina ergens online staan? Dat kijkt wat makkelijker :)

Tevens berichten verplaatst naar je eigen vraag ;)
 
Ok, dat is waar :P

Hier de webpagina: http://www.colinch.com/52/contact.php
Ik heb het nu deels voor elkaar maar het komt er nog steeds niet mooi onder.

Zoals je ziet staat ieder input veld met bijbehorende tekst in een container.
Maar de eerste container die wordt (waarschijnlijk door die clearfix) er wel onder gezet maar ook gecentreerd. (ook te zien op plaatje in vorige post)
 
Van de container-class maken:
Code:
.container {
    width: 504px;
    margin-bottom: 25px;
    overflow: hidden;
    }
Er onder heb je voor de textbox en de dropdown twee keer een <div id="container"> gebruikt; dat moet ook een class="container" zijn.
Nu kan je de <div class="clearfix"></div> en de twee <br>'s uit de eerste container gewoon weghalen, want die zijn dan niet meer nodig. :)

Toelichting:
De items met de class="column" hebben allemaal een {float:left}. De inhoud van het eerstvolgende gewone element er achter begint dan rechts van de laatste float, als daar nog ruimte is. Een float is namelijk: zich onttrekken aan de "normal flow", d.w.z. ontsnappen uit het block-karakter van de omvattende container.
Een {overflow:hidden} op een omvattende float-container zorgt ervoor dat alle floats erbinnen blijven, en de volgende <div> dus op de volle breedte er onder kan komen. Ook een eventuele background-color van de container wordt dan doorgetrokken tot onder de floats.
Komt op hetzelfde neer als een clearing-div plaatsen, maar werkt vaak makkelijker.

  • Om een spelletje floats en clears te spelen: zie hier. :d
    Hoe deze constructie in elkaar zit begint hier.
Met vriendelijke groet,
CSShunter
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan