Hoi allemaal

ik heb onderstaande code in mijn script staan, nou is het zo dat ik heeel veel keywords heb zeg maar en dit soort code nu ongeveer 1500 regels inneemt in mijn script..

ik bendus op zoek naar een simpelere code waarin ik de keywords in de database bijvoorbeeld zet en de nummers van de categorieen ook

of is er een andere oplossing ?

if (strpos($data['name'], 'Zweetdeken') OR strpos($data['name'], 'Zweetdeken')!== false) {
			$array = array("1", "5", "21");
			foreach($array as $cat){
			$this->db->query("INSERT INTO " . DB_PREFIX . "product_to_category SET product_id = '" . (int)$product_id . "', category_id = '" . $cat . "'");
			}
			echo "ik heb het volgend artikel toevoegd ". $data['name'] .", check je het even ?<br /> aan categorie " . $cat . " zweetdeken";

		} else {
			$data['category'] = '0';

		}


		if (strpos($data['name'], 'rok') OR strpos($data['name'], 'blouse') OR strpos($data['name'], 'Blouse') OR strpos($data['name'], 'jurk') OR strpos($data['name'], 'skirt') OR strpos($data['name'], 'dress') !== false) {
		
			$array = array("1", "2", "25");
			foreach($array as $cat){
			$this->db->query("INSERT INTO " . DB_PREFIX . "product_to_category SET product_id = '" . (int)$product_id . "', category_id = '" . $cat . "'");
			}
			echo "ik heb het volgend artikel toevoegd ". $data['name'] .", check je het even ?<br /> aan categorie " . $cat . " (110, 137)";
	
		} else {
			$data['category'] = '0';

		}


graag hoor ik jullie mening
Wat dacht je van een eigen gemaakte functie?

<?php
function addProduct($name) {
// verwerk de boel

// return true terug als het gelukt is, of anders een false.
return true;
}
>> of is er een andere oplossing ?

Ja. Een 'regel' bij het programmeren is dat je werkt volgens het DRY principe. DRY staat voor Don't Repeat Yourself. Ofwel, code die zichzelf telkens herhaalt met als enige verschil de variabelen (zweetdeken, blouse, jurk enz.) moet je ombouwen naar 1 code-blok waaraan je variabelen kunt meegeven. De variabelen zelf kun je opslaan in een array of liever nog database, waarbij je de producten koppelt aan categorieën.

Het eerste probleem is waarschijnlijk dat er verschillende keywords zijn die over hetzelfde gaan. Hoe is het bijvoorbeeld mogelijk dat er blijkbaar zowel een keyword "blouse" alsook "Blouse" bestaat? Deze zouden uniek moeten zijn?

Dan zie ik het verband niet helemaal dat je een kledingstuk als "rok" of "blouse" op dezelfde manier categoriseert.

En vervolgens heb je een stapel "magische constanten" -1,5,21 en 1,2,25- (daadwerkelijke categorieën) waar je deze informatie aan ophangt. Op die manier dupliceer je een heleboel informatie in je database.

Misschien is het ook een beter als je deze "keywords" of "tags" echt los ziet van categorieën.

De categorieën kunnen best statisch en voorgedefinieerd zijn. Klassificeer een "rok" of "jurk" ook echt als zodanig, en als je hier geen onderscheid tussen maakt, laat dan een van de twee categorieën vervallen. Of introduceer een attribuut "lengte" ofzo.

En dan de "keywords" of "tags". Misschien moet je hier anders tegenaan kijken, deze zouden bijvoorbeeld termen als "casual", "zakelijk" of zelfs "bloemetjesmotief" kunnen bevatten; hoe dan ook, die zijn niet noodzakelijkerwijs gekoppeld aan een specifiek kledingsstuk (blouse of broek) maar overstijgen deze indeling, of liever gezegd, dit is gewoon een andere indeling. Dit zou dus een koppeling kunnen vormen tussen het product en de keyword/tag. Maar dat staat dus verder los van de indeling van het product in een (of meer) categorie(ën).

Zowel voor de categorieën alsook de keywords/tags is het zaak dat jij tot op zekere hoogte de regie houdt over de indeling. Je zult deze dus op een of andere manier moeten kunnen beheren zodat je een wildgroei van soortgelijke of dezelfde namen voorkomt anders groeit je systeem dicht en nog belangrijker, dan schiet je waarschijnlijk je doel voorbij: het kunnen zoeken, filteren en vinden van producten met specifieke eigenschappen.

Ook moet je misschien nog onderscheid maken tussen producteigenschappen en keywords/tags en besluiten wat waar thuishoort. Wat hoort bij productinformatie thuis, en wat niet. Neem bijvoorbeeld een t-shirt. De eigenschap "halsvorm" hoort waarschijnlijk wel bij dit product, met als mogelijke waarden V-hals, ronde hals et cetera. Maar stel nu dat dit specifieke t-shirt hoorde bij een of andere collectie van een merk. Dit zou dan wellicht beter in een keyword/tag thuis kunnen horen "Levis wintercollectie 2019" oid.

Het op een goede manier bouwen van productconfiguraties en -indelingen is nog niet heel erg makkelijk.
Deze code is onderdeel van een api koppeling in opencart naar een leverancier. het doet alleen producten importeren en wordt alleen bij nieuwe producten gebruikt dus zo zware belasting geeft het allemaal niet.. de nummers coresponderen inderdaad met categorieen en dit is in opencart zelf dus hier kan ik niks aan wijzigen..

ik ben bezig met jullie opmerkingen te verwerken in een class maar helemaal eruit komen lukt niet...

maar als jullie me op weg willen helpen ben ik zeer blij, ik ben niet van plan om heel opencart opnieuw te gaan schrijven maar het script wat de api betreft wil ik wel graag optimaliseren.

is er iemand misschien bereidwillig al dan niet tegen vergoeding me hiermee te helpen. ik heb een aantal foutjes en nieuwe dingen die erin moeten komen.

[size=xsmall]Toevoeging op 19/05/2020 12:23:35:[/size]

ik heb nu onderstaande code.
klopt dit een beetje met de volgende tabel in de DB en inhoud.
Maar hoe moet ik dit dan laten uitvoeren in de code?
dit moet dan uitgevoerd worden in de functie addProduct

function keyword2Product($name) {
	$keywords = $this->db->query("SELECT * FROM " . DB_PREFIX . "keywords2category WHERE product_id = '" . (int)$product_id . "' LIMIT 1");

if (strpos($data['keyword'])!== false) {
			$array = array($data['category']);
			foreach($array as $cat){
			$this->db->query("INSERT INTO " . DB_PREFIX . "product_to_category SET product_id = '" . (int)$product_id . "', category_id = '" . $cat . "'") or die(mysqli_error($db));
			}
			echo "ik heb het volgend artikel toevoegd ". $data['name'] .", check je het even ?<br /> aan categorie " . $cat . " zweetdeken";

		} 
return true;
}


CREATE TABLE `keywords2category` (
  `id` int(11) NOT NULL,
  `keyword` varchar(255) NOT NULL,
  `category` varchar(255) NOT NULL,
  `status` int(2) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `keywords2category` (`id`, `keyword`, `category`, `status`, `product_id`) VALUES
(2, 'Zweetdeken', '1,5,21', 1, 11),
Heb ik nou zo moeilijk probleem of is dit forum gewoon dood.

ik heb netjes volgens de regels gepost heb het zelf geprobeerd post de gehele code met nette omschrijving.

en geen reacties. weet niemand het of kan ik beter naar een andere website gaan..
Met behulp van deze class :

https://github.com/bennettstone/simple-mysqli

en deze aanvulling :

<?php

class Variations extends DB  {

	public function addProduct( $table, $name, $product_id, $categorien )
	{
		foreach( $categorien as $categorie )
		{
			$query = 'INSERT INTO ' . $table . ' SET product_id = "' . (int)$product_id . '", category_id = "' . $categorie . '"';
			echo $query . '<br />';
			//$this->link->query( $query );
		}
		return TRUE;
	}

	public function updateProduct( $data )
	{
		$query = "SELECT * FROM power_options_data WHERE pwr_sku = '" . $this->link->escape($data['sku']) . "' LIMIT 1";

		$option = $this->link->query( $query );
		
		// print $data;
		// print "<br />data sku ".$data['sku']."<br />";
		// print "data sku ".$data['eancode']."<br />";
		// print "".$data['variations']['eancode']."<br />";
		// echo "data variations ". $data['variations']['0401103078-5001-2XL']['eancode'] ."";
		// foreach om alles door te lo(o)pen.
		foreach( $data['variations'] as $variation )
		{
			$query = "UPDATE power_options_data SET pwr_quantity = '" . (int)$variation['stock'] . "' WHERE pwr_product_code = '" . (int)$variation['eancode'] . "'";
			$this->link->query( $query );
			print "<br />data sku ".$data['sku']."<br />";
			echo "<pre>variation stock " . (int)$variation['stock'] . "</pre>";
			//echo "<pre>".print_r($variation)."</pre>"; // ter debugging om te kijken wat er in de array zit.
			echo "<pre>variation eancode ". $variation['eancode']."";
		}

		if ( $option->num_rows )
		{
			$pwr_id = $option->row['pwr_id'];
			$query = "UPDATE power_options_data SET pwr_quantity = '" . (int)$variation['stock'] . "' WHERE pwr_product_code = '" . (int)$variation['eancode'] . "'";
			$this->link->query( $query );
			//print_r(" . (int)$variation['stock'] . ")
		}
	}

} // end class
?>


heb ik dit bedacht :

<h1>Variatie</h1>

<?php
include ('class.db.php');
include ('variations_class.php');

$variatie = new Variations();

?>

<h2>Een enkel artikel</h2>

<?php
$table      = 'product_to_category';
$name       = 'zweetdeken';
$produktid  = 12;
$categorien = ["1", "5", "21"];

$succes = 'Artikel <span style="color: navy;font-weight: bold;">' . $name . '</span> is toevoegd.<br />Check even aan categorie <span style="color: navy;font-weight: bold;">' . $categorien[count($categorien)-1] . ' (' . $name . ')</span>.';
$faal   = 'Niets toegevoegd';

echo $variatie->addProduct ( $table, $name, $produktid, $categorien ) == TRUE ? $succes : $faal ;

?>

<h2>Meerdere artikelen</h2>

<?php

$artikelen = [
	[
	'table'      => 'product_to_category',
	'name'       => 'zweetdeken',
	'produktid'  => 12,
	'categorien' => ["1", "5", "21"]
	],
	[
	'table'      => 'product_to_category',
	'name'       => 'blouse',
	'produktid'  => 20,
	'categorien' => ["1", "2", "25"]
	]
];

echo '<pre>' . print_r( $artikelen, TRUE ) . '</pre>';

foreach ( $artikelen as $artikel )
{
	echo '<p>';
	echo $artikel['name'] . ' : ' . $artikel['produktid'] . '<pre>' . print_r( $artikel['categories'], TRUE ) . '</pre>' ;
	echo '</p>';

	$succes = 'Artikel <span style="color: navy;font-weight: bold;">' . $artikel['name'] . '</span> is toevoegd.<br />Check even aan categorie <span style="color: navy;font-weight: bold;">' . $artikel['categorien'][count($artikel['categorien'])-1] . ' (' . $artikel['name'] . ')</span>.';
	$faal   = 'Niets toegevoegd';

	echo $variatie->addProduct ( $artikel['table'], $artikel['name'], $artikel['produktid'], $artikel['categorien'] ) == TRUE ? $succes : $faal ;
}
?>


Of dit de bedoeling is, mag een ander beoordelen.

Deze code in de db.class :

private $link = null;


veranderen in

protected $link = null;
Michael vanDijk op 18/05/2020 17:22:38
Deze code is onderdeel van een api koppeling in opencart naar een leverancier. het doet alleen producten importeren en wordt alleen bij nieuwe producten gebruikt dus zo zware belasting geeft het allemaal niet..

Uhm, houdt dat niet in dat jij de regie hebt over hoe jij je keywords en categorieën indeelt? Je zegt ook (letterlijk) "nou is het zo dat ik heeel veel keywords heb". Schiet dat dan niet het doel van keywords voorbij? En vervolgens dupliceer je deze keywords ook over (nog meer) categorieën?

Michael vanDijk op 18/05/2020 17:22:38
ik heb een aantal foutjes en nieuwe dingen die erin moeten komen.

Misschien is het inderdaad ook handig dat je omschrijft hoe je dit alles uiteindelijk in wilt gaan zetten. En dan kunnen we ook kijken of die aanpak wel een goede is. Op dit moment lijkt het erop dat je de aardappelstempel te enthousiast hanteert.

Michael vanDijk op 18/05/2020 17:22:38
ik heb nu onderstaande code.
klopt dit een beetje met de volgende tabel in de DB en inhoud.

Geen idee. Zou je in woorden kunnen vertellen wat de bedoeling is, zodat we dit kunnen rijmen met de code? De functie/methode kent in ieder geval de waarden $product_id en $data niet - deze worden nergens meegegeven.

Michael vanDijk op 18/05/2020 17:22:38
Maar hoe moet ik dit dan laten uitvoeren in de code?
dit moet dan uitgevoerd worden in de functie addProduct

Dit is in zekere zin van latere zorg, dat is slechts de "uitvoering". Als deze code goed in elkaar zit is dit slechts een kwestie van een aanroep? Waar ik mij eerder zorgen over maak: dit alles is, zoals jij aangaf, een importroutine. Dit is dus een batch van wijzigingen die in het geheel uitgevoerd dient te worden, of in het geheel niet. Ik zou dus verwachten dat deze hele operatie in een database-transactie wordt uitgevoerd. Dit zie ik nergens terug in de code.

Michael vanDijk op 21/05/2020 11:47:31
Heb ik nou zo moeilijk probleem of is dit forum gewoon dood.

ik heb netjes volgens de regels gepost heb het zelf geprobeerd post de gehele code met nette omschrijving.

en geen reacties. weet niemand het of kan ik beter naar een andere website gaan..


Niemand is verplicht om hier te reageren, simpelweg omdat je aan de balie staat en op de bel aan het duwen bent wil niet zeggen dat je bediend wordt. Dit is geen afhaalchinees. Jij bent geen betalende klant.

Je geeft ons ook een puzzelstukje en verwacht dat wij een oplossing uit onze hoge hoed toveren. Misschien levert dit op den duur wel een efficientere oplossing op, maar het is mogelijk nog steeds geen goede oplossing.

Je krijgt waarschijnlijk meer bijval en positieve feedback op het moment dat je ook kunt motiveren waarom je dit alles in deze vorm wilt gieten (schets eens het grotere plaatje, in plaats van het geven van een enkel puzzelstuk) in plaats van de houding "dit is hoe het moet zijn en ik wil graag de kortere code om dit ding te doen". En als je dat dan gedaan hebt, dan is wellicht het eindantwoord dat de aanpak om moet, en mogelijk ook de code hoe je dit verder gaat gebruiken.

Dat is dan wellicht niet het advies wat je wilt horen, maar de eindconclusie kan best zijn dat het ontwerp gewoon stinkt. Als je geen zin hebt in deze discussie besteed het dan uit aan iemand die niet al teveel nadenkt over ontwerp en voor een paar knaken aan de molen wil draaien.

Wij weten op dit moment niet hoe de importroutine zou moeten luiden en we weten ook niet of dat wel een goede aanpak is omdat we niet weten of de vorm van de data waarin je dit importeert wel de juiste/het handigste is voor verder gebruik.
Michael vanDijk op 21/05/2020 11:47:31

Heb ik nou zo moeilijk probleem of is dit forum gewoon dood.


A problem well stated is a problem half-solved.
okay probeer ik het opnieuw ;-) ik wilde alleen het topic beetje kort houden kwa code leek me namelijk in dit geval niet heel erg nodig maar goed als jullie het graag willen post ik alle code wel die in het script zitten.

ik doe me best. deels is code wat al in het systeem zit opencart en deels is wat er is gemaakt in ene php script die via een api verbinding maakt met een leverancier en zodoende producten importeert in de database. mits er nieuwe producten zijn.


 
<?php
public function checkProduct($data) {
		$search = '';
		if ($data['sku']) {
			$search .= "sku = '" . $this->db->escape($data['sku']) . "'";
		}
		if ($search) {
			$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product WHERE " . $search . " LIMIT 1");
			if ($query->num_rows) {
				return $query->row['product_id'];
			}
		}
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_description WHERE name = '" . $this->db->escape(trim($data['name'])) ."' LIMIT 1");

		if ($query->num_rows) {
			return $query->row['product_id'];
		}
		return false;
	}

public function addProduct($data) {
		$language_id = 2;
		$prijsje = "";
		if (isset($data['customer_group_price_rrp'])) {
			$prijs_excl_btw = round($data['customer_group_price_rrp']['website_price'] / 1.21, 4);
			//$prijs_excl_btw = $prijs_excl_btw / 1.21;

			// Vermenigvuldigen met 1,21 voor 21% btw
			$prijs_incl_btw = 1.21 * $prijs_excl_btw;
			$prijs_incl_btw = round($prijs_incl_btw, 2);

			// Vermenigvuldigen met 4, casten naar integer en weer delen door 4
			$afgeronde_prijs_incl_btw = 4 * $prijs_incl_btw;
			$afgeronde_prijs_incl_btw = (int)$afgeronde_prijs_incl_btw;
			$afgeronde_prijs_incl_btw = $afgeronde_prijs_incl_btw / 4;
			
			$afgeronde_prijs_incl_btw = ceil($afgeronde_prijs_incl_btw) - 0.05;			

			$prijsje = $afgeronde_prijs_incl_btw / 1.21;
			//$prijsje = ceil($prijsje2) - 0.05;	
		}
		if (isset($details['customer_group_price']['special_price'])) {
			
			$prijs_excl_btw = round($data['customer_group_price_rrp']['website_price'] / 1.21, 4);
			$prijs_excl_btw = $prijs_excl_btw / 1.21;

			// Vermenigvuldigen met 1,21 voor 21% btw
			$prijs_incl_btw = 1.21 * $prijs_excl_btw;
			$prijs_incl_btw = round($prijs_incl_btw, 2);

			// Vermenigvuldigen met 4, casten naar integer en weer delen door 4
			$afgeronde_prijs_incl_btw = 4 * $prijs_incl_btw;
			$afgeronde_prijs_incl_btw = (int)$afgeronde_prijs_incl_btw;
			$afgeronde_prijs_incl_btw = $afgeronde_prijs_incl_btw / 4;
			
			$afgeronde_prijs_incl_btw = ceil($afgeronde_prijs_incl_btw) - 0.05;		
			$prijsje = $afgeronde_prijs_incl_btw / 1.21;
			
			//$data['price'] = round($data['customer_group_price_rrp']['special_price'] / 1.60, 4);
		}

		$default_status = 1;
		$default_category = 1;

		$this->db->query("INSERT INTO " . DB_PREFIX . "product SET model = '" . $this->db->escape(trim($data['model'])) . "', sku = '" . $this->db->escape($data['sku']) . "', ean = '" . $this->db->escape($data['eancode']) . "', quantity = '100', minimum = '1', subtract = '1', manufacturer_id = '6', shipping = '1', price = '" . (float)$prijsje . "', status = '". $default_status ."', tax_class_id = '9', date_added = NOW()") or die(mysqli_error($db));

		$product_id = $this->db->getLastId();

		$path = 'data/hvpolo/';

		if (isset($data['image'])) {
			$image = explode('/', $data['image']);

			if (count($image) > 1) {
				$image = $image[count($image) - 1];
			} else {
				$image = $image[0];
			}
			
			if (!file_exists(DIR_IMAGE . $path . $image)) {
				$this->getImage($data['image'], $image);
			}
			
			$this->db->query("UPDATE " . DB_PREFIX . "product SET image = '" . $this->db->escape($path . $image) . "' WHERE product_id = '" . (int)$product_id . "'") or die(mysqli_error($db));
		}

		$description = str_replace('. ', '.<br /><br />', $data['short_description']) . '<br /><br />' . str_replace('. ', '.<br /><br />', $data['description']) . '.';
		$description = str_replace('..', '.', $description);



		if (strpos($data['name'], 'Zweetdeken') OR strpos($data['name'], 'Zweetdeken')!== false) {
			$array = array("1", "5", "21");
			foreach($array as $cat){
			$this->db->query("INSERT INTO " . DB_PREFIX . "product_to_category SET product_id = '" . (int)$product_id . "', category_id = '" . $cat . "'") or die(mysqli_error($db));
			}
			echo "ik heb het volgend artikel toevoegd ". $data['name'] .", check je het even ?<br /> aan categorie " . $cat . " zweetdeken";

		} elseif (strpos($data['name'], 'rok') OR strpos($data['name'], 'blouse') OR strpos($data['name'], 'Blouse') OR strpos($data['name'], 'jurk') OR strpos($data['name'], 'skirt') OR strpos($data['name'], 'dress') !== false) {
		
			$array = array("1", "2", "25");
			foreach($array as $cat){
			$this->db->query("INSERT INTO " . DB_PREFIX . "product_to_category SET product_id = '" . (int)$product_id . "', category_id = '" . $cat . "'") or die(mysqli_error($db));
			}
			echo "ik heb het volgend artikel toevoegd ". $data['name'] .", check je het even ?<br /> aan categorie " . $cat . " (110, 137)";
	
		} elseif (strpos($data['name'], 'baseballcap')  OR strpos($data['name'], 'Baseball pet') !== false) {
			
			$array = array("1", "2", "17", "28", "32");
			foreach($array as $cat){
			$this->db->query("INSERT INTO " . DB_PREFIX . "product_to_category SET product_id = '" . (int)$product_id . "', category_id = '" . $cat . "'") or die(mysqli_error($db));
			}
			echo "ik heb het volgend artikel toevoegd ". $data['name'] .", check je het even ?<br /> aan categorie " . $cat . " (110, 137)";
	
		} 
// en dan nog veel meer met andere keywords die delete ik even voor het aantal regels .

		else {
		$this->db->query("INSERT INTO " . DB_PREFIX . "product_to_category SET product_id = '" . (int)$product_id . "', category_id = '1'") or die(mysqli_error($db));
		}

		$keyword = str_replace(' ', ', ', strtolower($data['name']));
		$this->db->query("INSERT INTO " . DB_PREFIX . "product_description SET product_id = '" . (int)$product_id . "', language_id = '" . (int)$language_id . "', name = '" . $this->db->escape($data['name']) . "', description = '" . $this->db->escape($description) . "', meta_title = '" . $this->db->escape($data['name']) . "', meta_description = '" . $this->db->escape($data['short_description']) . "', meta_keyword = '". $this->db->escape($keyword) ."'") or die(mysqli_error($db));

		$this->db->query("INSERT INTO " . DB_PREFIX . "product_to_store SET product_id = '" . (int)$product_id . "', store_id = '0'");

		$color_id = 48;
		$size_id = 47;

		// functie voor variations 
		if ($data['variations']) {
			// Product
			$this->db->query("INSERT INTO " . DB_PREFIX . "power_options_product SET pwr_product_id = '" . (int)$product_id . "', pwr_subtract = '1', pwr_price_prefix = '+', pwr_price_standard = '1', pwr_special_prefix = '=', pwr_special_standard = '1', pwr_points_prefix = '=', pwr_weight_prefix = '=', pwr_dimensions_prefix = '=', pwr_code = '0'") or die(mysqli_error($db));

			// Kleur
			$this->db->query("INSERT INTO " . DB_PREFIX . "power_options SET pwr_product_id = '" . (int)$product_id . "', pwr_level = '0', pwr_option_id = '" . (int)$color_id . "'") or die(mysqli_error($db));
			// Maat
			$this->db->query("INSERT INTO " . DB_PREFIX . "power_options SET pwr_product_id = '" . (int)$product_id . "', pwr_level = '1', pwr_option_id = '" . (int)$size_id . "'") or die(mysqli_error($db));

			foreach ($data['variations'] as $key => $variation) {
				$image = '';

				// Kleur
				$color = trim($variation['color']);

				$check = $this->db->query("SELECT option_value_id FROM " . DB_PREFIX . "option_value_description WHERE option_id = '" . (int)$color_id . "' AND name = '" . $this->db->escape($color) . "' LIMIT 1");

				if ($check->num_rows) {
					$color_value_id = $check->row['option_value_id'];
				} else {
					// Insert option value
					$this->db->query("INSERT INTO " . DB_PREFIX . "option_value SET option_id = '" . (int)$color_id . "'");

					$color_value_id = $this->db->getLastId(); 

					$this->db->query("INSERT INTO " . DB_PREFIX . "option_value_description SET option_value_id = '" . (int)$color_value_id . "', language_id = '" . (int)$language_id . "', option_id = '" . (int)$color_id . "', name = '" . $this->db->escape($color) . "'");
				}

				// Maat
				$size = trim($variation['shirt_size']);

				$check = $this->db->query("SELECT option_value_id FROM " . DB_PREFIX . "option_value_description WHERE option_id = '" . (int)$size_id . "' AND name = '" . $this->db->escape($size) . "' LIMIT 1");

				if ($check->num_rows) {
					$size_value_id = $check->row['option_value_id'];
				} else {
					// Insert option value
					$this->db->query("INSERT INTO " . DB_PREFIX . "option_value SET option_id = '" . (int)$size_id . "'");

					$size_value_id = $this->db->getLastId();

					$this->db->query("INSERT INTO " . DB_PREFIX . "option_value_description SET option_value_id = '" . (int)$size_value_id . "', language_id = '" . (int)$language_id . "', option_id = '" . (int)$size_id . "', name = '" . $this->db->escape($size) . "'");
				}

				// Power option aanmaken
				$this->db->query("INSERT INTO " . DB_PREFIX . "power_options_data SET pwr_product_id = '" . (int)$product_id . "', pwr_model = '" . $key . "', pwr_sku = '" . (int)$data['sku'] . "', pwr_product_code = '" . $variation['eancode'] . "', pwr_quantity = '" . $variation['stock'] . "', pwr_points = '0', pwr_weight = '0', pwr_length = '0', pwr_width = '0', pwr_height = '0'");

				$power_id = $this->db->getLastId();

				// Kleur en maat aan power koppelen
				$this->db->query("INSERT INTO " . DB_PREFIX . "power_options_value SET pwr_id = '" . (int)$power_id . "', pwr_product_id = '" . (int)$product_id . "', pwr_level = '0', pwr_option_value_id = '" . (int)$color_value_id . "'");
				$this->db->query("INSERT INTO " . DB_PREFIX . "power_options_value SET pwr_id = '" . (int)$power_id . "', pwr_product_id = '" . (int)$product_id . "', pwr_level = '1', pwr_option_value_id = '" . (int)$size_value_id . "'");
				
				if ($variation['image'] && $variation['image'] != $data['image']) {
					$image = explode('/', $variation['image']);

					if (count($image) > 1) {
						$image = $image[count($image) - 1];
					} else {
						$image = $image[0];
					}
					
					if (!file_exists(DIR_IMAGE . $path . $image)) {
						$this->getImage($variation['image'], $image);
					}
				}

				// Kleur koppelen als code als er een afbeelding is
				if ($image) {
					$this->db->query("INSERT INTO " . DB_PREFIX . "power_options_code SET pwr_product_id = '" . (int)$product_id . "', pwr_code = '" . (int)$color_value_id . "'");
					
					$power_code_id = $this->db->getLastId();
	
					// Kleur koppelen aan afbeelding code
					$check = $this->db->query("SELECT pwr_code_id FROM " . DB_PREFIX . "power_options_image WHERE pwr_product_id = '" . (int)$product_id . "' AND pwr_image = '" . $this->db->escape($path . $image) . "' LIMIT 1");

					if (!$check->num_rows) {
						$this->db->query("INSERT INTO " . DB_PREFIX . "power_options_image SET pwr_code_id = '" . (int)$power_code_id . "', pwr_product_id = '" . (int)$product_id . "', pwr_image = '" . $this->db->escape($path . $image) . "', pwr_sort_order = '0'");
					}
				}
			}
		}

		if ($data['name']) {
			$keyword = str_replace(' ', '-', strtolower($data['name']));
			
			$query = $this->db->query("SELECT url_alias_id FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($keyword) . "' LIMIT 1");

	        if ($query->num_rows) {
	            $keyword = $keyword . '-' . $product_id;
	        }

			$this->db->query("INSERT INTO " . DB_PREFIX . "url_alias SET query = 'product_id=" . (int)$product_id . "', keyword = '" . $this->db->escape($keyword) . "'");
		}
				if ($data['name']) {
			$keyword = str_replace(' ', '-', strtolower($data['name']));
			
			$query = $this->db->query("SELECT seo_url_id FROM " . DB_PREFIX . "seo_url WHERE keyword = '" . $this->db->escape($keyword) . "' LIMIT 1");

	        if ($query->num_rows) {
	            $keyword = $keyword . '-' . $product_id;
	        }

			$this->db->query("INSERT INTO " . DB_PREFIX . "seo_url SET store_id = '0', language_id = '2', query = 'product_id=" . (int)$product_id . "', keyword = '" . $this->db->escape($keyword) . "'");
		}




	}

private function getImage($url, $image) {
		$path = 'data/hvpolo/';

		$content = file_get_contents($url);
		
		$fp = fopen(DIR_IMAGE . $path . $image, "w");
		fwrite($fp, $content);
		fclose($fp);

		return DIR_IMAGE . $path . $image;
	}
?>


dan heb je nog het model
omdat het MVC is opgebouwd

 
api.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

class ControllerApiHvpolo extends Controller {

	protected $client;
	protected $session_id;
	protected $user = 'userid';
	protected $key = 'wachtwoord';
	protected $DefaultCategoryID = '0000';
	protected $storeID = '25';
	protected $emails = ['[email protected]', '[email protected]'];
//	protected $emails = ['[email protected]', '[email protected]'];

	public function index() {
		$this->client = new SoapClient('http://website.com/api/soap/?wsdl');
		$this->session_id = $this->client->login($this->user, $this->key);

		// Get all products from HV Polo
		try {
			$products = $this->client->call($this->session_id, 'ipad_api.customerproducts', [null, $this->DefaultCategoryID, $this->storeID]);

			if ($products) {
				$this->load->model('api/hvpolo');

	$counter = 0;
	$new = '';
	$duration = 0;
	$i=0;
	$max_aantal_producten_toevoegen = 50;
	$max_products = $max_aantal_producten_toevoegen;
				$mailsturen = '';


				$message = '<html><body>'; 
				$message .= '<table rules="all" style="border-color: #666;" cellpadding="10">';
				$message .= "Er zijn nieuwe producten toegevoegd. ";

				foreach ($products as $product) if ($i < $max_products) {
					// Check if product exists
				if (!$this->model_api_hvpolo->checkProduct($product)) {
					$details = $this->client->call($this->session_id, 'ipad_api.customerproduct', [$product['product_id'], $this->storeID]);
					
				if ($details['customer_group_price']['special_price'] > 0 ) {
					$special = "<span style='color:red;'>  Ja </span>";
				}
				else { 
					$special = " Nee";
				}
				
				if ($details) {
				$keyword = str_replace(' ', '-', strtolower($details['name']));

				// Add product if (does not exist)
				$mailsturen = 'yes';
				$message .= "<tr style='background: #eee;'><td><strong>Naam:</strong> </td><td><a href='https://rsruitersport.nl/clone2/".$keyword."'>".$details['name']."</a></td></tr>";
				$message .= "<tr><td><strong>Product id: </strong> </td><td>".$details['product_id']."</td></tr>";
				
				if (isset($details['customer_group_price']['website_price'])) {
				$message .= "<tr><td><strong>Product (advies) Prijs: </strong> </td><td>&euro; ". $details['customer_group_price_rrp']['website_price'] ."</td></tr>";
				}	
				if ($details['customer_group_price']['special_price'] > 0) {
				$message .= "<tr><td><strong>Product special price: </strong> </td><td><span style='color:red;font-width:bold;'> &euro; ". $details['customer_group_price']['special_price'] ." </span></td></tr>";
				}
									
							$starttime = microtime(true);
							$this->model_api_hvpolo->addProduct($details);
							$endtime = microtime(true);				
							$duration += ($endtime - $starttime);
							$counter++;
							$i+=1;
						}
					}
				}

					if ($mailsturen == 'yes') {
			

				$email = "[email protected]\r\n";

				$subject = 'Er zijn '.$counter.' nieuwe producten toegevoegd aan HV Polo';

				$headers = "From: [email protected]\r\n";
				$headers .= "Reply-To: [email protected]\r\n";
				$headers .= "CC: [email protected], [email protected], [email protected]\r\n";
				$headers .= "MIME-Version: 1.0\r\n";
				$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

				$message .= "<tr><td><strong>&nbsp; </strong> </td><td></td></tr>";
				$message .= "<tr><td><strong>Stastistiekjes </strong> </td><td></td></tr>";
				$message .= "<tr><td><strong>Aantal producten toegevoegd: </strong> </td><td>".$counter."</td></tr>";
				$message .= "<tr><td><strong>En dat duurde: </strong> </td><td>".$duration." ms</td></tr>";
				$message .= "</table>";
				$message .= "</body></html>";
	
				if ($counter > 0) {
									mail($email, $subject, $message, $headers);
							$this->db->query("INSERT INTO " . DB_PREFIX . "api_log SET type = 'import_new', aantal_producten = '". $counter ."',  duration = '" . $duration . "', datetime = NOW(), site = 'Hv Polo'");
							}								
								// Duration to DB table
								$this->db->query("INSERT INTO " . DB_PREFIX . "api_log SET type = 'import_new', aantal_producten = '". $counter ."',  duration = '" . $duration . "', datetime = NOW(), site = 'Hv Polo'");
							}
							echo "<h2> Er zijn geen producten meer.</h2>";
				}
		} catch(Exception $e) {
			foreach ($this->emails as $email) {
				mail($email, 'HV Polo API error', $e->getMessage());
			}
		}
	}
public function update() {
		$this->client = new SoapClient('http://website.com/api/soap/?wsdl');
		$this->session_id = $this->client->login($this->user, $this->key);
		try {
			$products = $this->client->call($this->session_id, 'ipad_api.customerproducts', [null, $this->DefaultCategoryID, $this->storeID]);
			if ($products) {
				$this->load->model('api/hvpolo');
					$counter = 0;
					$new = '';
					$duration = 0;
					$i=0;
					$max_aantal_producten_toevoegen = 1;
					$max_products = $max_aantal_producten_toevoegen;

				foreach ($products as $product) if ($i < $max_products) {
				if (!$this->model_api_hvpolo->checkProduct2($product)) {
					$details = $this->client->call($this->session_id, 'ipad_api.customerproduct', [$product['product_id'], $this->storeID]);
					
				if ($details) {
				if (isset($details['customer_group_price']['special_price'])) {
				}
									
							$starttime = microtime(true);
							$this->model_api_hvpolo->updateProduct($details);							
							$endtime = microtime(true);							
							$duration += ($endtime - $starttime);
							$counter++;
						//	echo "<pre>";
	 					//	print_r($product);
	 					//	print_r($details);
				 		//	echo "</pre>";
							$new .= ''. $details['name']. '\r\n';
							$new .= '<br />';
							$i+=1;
						}
					}
				}
					if ($new) {
			//echo "dit is gedaan?";
				if ($counter > 0) {
							$this->db->query("INSERT INTO " . DB_PREFIX . "api_log SET type = 'update', aantal_producten = '". $new ."',  duration = '" . $duration . "', datetime = NOW(), site = 'Hv Polo'");
							}
								
								// Duration to DB table
								$this->db->query("INSERT INTO " . DB_PREFIX . "api_log SET type = 'update', aantal_producten = '". $new ."',  duration = '" . $duration . "', datetime = NOW(), site = 'Hv Polo'");
							}
				}
				echo "dit is 2x";
		} catch(Exception $e) {
			foreach ($this->emails as $email) {
				mail($email, 'HV Polo API error', $e->getMessage());
			}
		}
	}

	public function update_orgineel() {
		$this->client = new SoapClient('http://website.com/api/soap/?wsdl');
		$this->session_id = $this->client->login($this->user, $this->key);


//Hoeveel dagen geschiedenis moet de update draaien?
				$aantal_dagen_update = '-100 day';


		// Get all products from HV Polo with updated stock
		try {
			$products = $this->client->call($this->session_id, 'ipad_api.customerstock', [$this->DefaultCategoryID, $this->storeID, 1]);

			if ($products) {
				$this->load->model('api/hvpolo');

				$duration = 0;

				foreach ($products as $product) {
					$starttime = microtime(true);

					$this->model_api_hvpolo->updateProduct($product);
					
					$endtime = microtime(true);
							
					$duration += ($endtime - $starttime);
				}

				// Duration to DB table
				$this->db->query("INSERT INTO " . DB_PREFIX . "api_log SET type = 'import_update', aantal_producten = '". $new ."', duration = '" . $duration . "', datetime = NOW(), site = 'main'");
			}
		} catch(Exception $e) {
			foreach ($this->emails as $email) {
				mail($email, 'API error', $e->getMessage());
			}
		}
	}
	
	public function clean() {
		$this->client = new SoapClient('http://website.com/api/soap/?wsdl');
		$this->session_id = $this->client->login($this->user, $this->key);


//Hoeveel dagen geschiedenis moet de update draaien?
				$aantal_dagen_update = '-300 day';
				try {
			$products = $this->client->call($this->session_id, 'ipad_api.customerstock', [$this->DefaultCategoryID, $this->storeID, 1, ['stock_last_change' => date('Y-m-d', strtotime('".$aantal_dagen_update."')) . ' 00:00:00']]);

			if ($products) {
				$this->load->model('api/hvpolo');

				$duration = 0;

				foreach ($products as $product) {
					$starttime = microtime(true);

					$this->model_api_hvpolo->deleteProduct($product);
					
					$endtime = microtime(true);
							
					$duration += ($endtime - $starttime);
				}

				// Duration to DB table
				$this->db->query("INSERT INTO " . DB_PREFIX . "api_log SET type = 'import_clean', aantal_producten = '". $new ."', duration = '" . $duration . "', datetime = NOW(), site = 'hv polo'");
			}
		} catch(Exception $e) {
			foreach ($this->emails as $email) {
				mail($email, 'HV Polo API error', $e->getMessage());
			}
		}
		
	}
		
} 
?>


moet ik nog meer code posten ? dan zal ik dat doen.
Misschien was het handig geweest als je in je starttopic had aangegeven dat het opencart betrof. Wij hadden hier ook naar moeten vragen.

Voordat je gaat nadenken hoe je dit gaat omschrijven lijkt het mij belangrijk dat je éérst een plan bedenkt:
- hoe je de sleutelwoorden gaat opschonen/indelen (hoe gebruik je deze in de website?), en
- hoe je deze sleutelwoorden vervolgens gaat behe(e)r(s)en om later weer wildgroei te voorkomen, het overzicht kunt bewaren, en je simpelweg niet in code hoeft te klooien als je eens iets wilt aanpassen

Op het moment dat je een pakket gebruikt dan heeft dit pakket meestal al een soort van filosofie over de indeling en het gebruik van functionaliteit. De product_to_category tabel lijkt standaard functionaliteit dus de kans is groot dat iemand anders tegen dit "specifieke" probleem is gelopen en hier al een oplossing voor verzonnen heeft. Maar deze sleutelwoorden zijn mogelijk een niet-bestaande extra laag in opencart die je zelf hebt toegevoegd? Heb je al eens gezocht hoe andere mensen dit hebben aangevlogen, of heb je op de marktplaats van opencart al eens rondgeneusd om te kijken of er misschien een uitbreiding beschikbaar is die ongeveer doet wat jij wilt?

Hoe dan ook, de importcode zal op een of andere manier een stuk logica moeten hebben - nadat je dus al die cleanup hebt gedaan enzo - en moet dus een soort van set van regels kunnen volgen om koppelingen totstand te brengen tussen een product en de bijbehorende categorieën, bij voorkeur zonder dit alles vast op te nemen in programmacode.

En misschien hoort dit niet eens in de import thuis, zie verder hieronder...

Bestaan op dit moment dit soort koppelingen alleen in code? Ik bedoel hiermee: stel dat het product een "zweetdeken" betreft, dan is het de bedoeling dat het product_id wordt gekoppeld aan de categorie-id's 1, 5, en 21. Dit is productconfiguratie, dit wil je niet verankeren in code (hard coding). Op welke andere plekken in jouw opencart website wordt vervolgens "zweetdeken" als zoekterm gebruikt? Misschien wil je dit als SEO-tag opnemen of wat dan ook als dit zo bepalend is?

Het is in ieder geval zaak dat je een uniforme aanpak verzint die overal bruikbaar is.

Je zou zelfs kunnen denken aan een extra entiteit "tags" oid om deze mapping eenmalig aan te maken. Je doet dan in feite hetzelfde als in je code, maar deze kun je dan op zijn minst beheren op het beeldscherm.

Ook zou je je af kunnen vragen of het uberhaupt wel een goed idee is dat je het maken van dit soort koppelingen opneemt in je import, en het daarmee afhankelijk maakt van de import. Even los van hoe je het voorgaande technisch oplost, stel dat je een nieuw sleutelwoord verzint die mogelijk ook aan bestaande alsook nieuwe categorieën hangt, het enige tijdstip waarop je deze wijzigingen kunt doorvoeren is dan tijdens een import? Of wat als je een indeling wat wilt omgooien, hoe ga je dat dan doen, al helemaal als het producten betreft die al geïmporteerd zijn? Je wilt eigenlijk niet dat je productconfiguratie (jouw eigen, site-specifieke, productconfiguratie dus) compleet gekoppeld is aan / afhankelijk is van een import.

Zou het eigenlijk niet veel logischer zijn dat je zelf alles eenmalig inregelt met keywords, en dat je dan in een aparte routine op een knop drukt die alle associaties in product_to_category weggooit en opnieuw opbouwt met de zelf opgestelde regels?

Reageren