Hele simpele vraag

Status
Niet open voor verdere reacties.

pewie37

Gebruiker
Lid geworden
2 sep 2007
Berichten
506
Hallo forumleden :D

Situatie:
Aangezien ik HELEMAAL geen php kan schrijven....
Ik heb echt iets heeeel simpels voor jullie php-guru's waar een van jullie me misschien mee wil helpen?

Uitleg:
Het gaat om een dropship-webwinkel waarbij mijn leverancier naast een <inkoopprijs> ook een <adviesprijs> heeft die bij veel producten €0,00 euro is. Deze wil ik tijdens het automatische import-proces laten berekenen naar een correcte <adviesprijs>. De formule daarvoor heb ik al in excel gemaakt en de betreffende (wordpress)plugin heeft een custom php-veldje. In een voorbeeld op de site van de plugin ontwikkelaar doen ze dit met "choose_price_to_return" (zie scriptje onderaan)

Vraag:
Als de <adviesprijs> groter 0 is dan blijft deze wat het is
Anders (als de verkoopprijs 0 euro is) dan: <adviesprijs>+(2-(<inkoopprijs>*0.000107142857))

Variabelen
Inkoopprijs: <inkkoopprijs>

Hoop dat iemand kan helpen
Dank je wel alvast :thumb:






Scriptje op ontwikkelaars-website:

function choose_price_to_return ($price1, $price2) {
if ($price1 > $price2) {
return $price1;
} else {
return $price2;
}
}
 
Als de <adviesprijs> groter 0 is dan blijft deze wat het is
Anders (als de verkoopprijs 0 euro is) dan: <adviesprijs>+(2-(<inkoopprijs>*0.000107142857))
In andere woorden
Als (adviesprijs kleiner of glijk aan 0) EN (verkoopprijs is gelijk aan 0)
bereken dan nieuwe adviesprijs = 2 - (inkoopprijs * 0.000107142857)

In php ziet dit er zo uit
Code:
if ($adviesprijs <= 0 && $verkoopprijs == 0) {
  $adviesprijs = 2 - ($inkoopprijs * 0.000107142857);
}

Als een php functie is gewenst
Code:
function choose_price_to_return ($inkoop, $verkoop, $advies) {
  if ($advies <= 0 && $verkoop == 0) {
    return (2 - ($inkoop * 0.000107142857));
  } else {
    return $advies;
  }
}

// voorbeeld hoe je de functie kan aanroepen
$adviesprijs = choose_price_to_return ($inkoopprijs, $verkoopprijs, $adviesprijs);

Als je een nette afronding wilt hebben (bijv. bij inkoop 52 euro), voeg dan een 'round' toe.
Code:
round(2 - ($inkoop * 0.000107142857), 2)
 
Laatst bewerkt:
He Moderator.
Dank je wel voor de je input :thumb:

Enige is dat de "EN" functie er niet in hoort omdat alleen de adviesprijs vaak op 0 staat maar de inkoopprijs nooit
Hoe haal ik dat er uit?

groet,
Peter
 
Het eerste stukje van je vraag is de "conditie" en daar staat geen inkoopprijs in
"Als de <adviesprijs> groter 0 is dan blijft deze wat het is
Anders (adviesprijs is 0 of kleiner dan 0) EN (als de verkoopprijs 0 euro is) dan ........"

Dit komt overeen met: if ($adviesprijs <= 0 && $verkoopprijs == 0)

Het laatste stukje van je vraag is de berekening als is voldaan aan de conditie.
"....... dan <adviesprijs>+(2-(<inkoopprijs>*0.000107142857))"

Dit komt overeen met $adviesprijs = 2 - ($inkoopprijs * 0.000107142857)

Wat wil je anders in de conditie en/of in de berekening?
 
Laatst bewerkt:
Wat ik zou willen is dat de adviesprijs middels de formule word berekend als deze op 0 staat.
De inkoopprijs is altijd een x-bedrag omdat dat de prijs van de groothandel is natuurlijk (anders zou een product gratis zijn).

Dus anders zou ik graag hebben....
Anders (adviesprijs is 0 of kleiner dan 0) dan .........
"EN (als de verkoopprijs 0 euro is)" helemaal weg want dat is nooit het geval anders was mijn inkoop €0,00 :)
 
"EN (als de verkoopprijs 0 euro is)" helemaal weg want dat is nooit het geval anders was mijn inkoop €0,00 :)
Zie je berichtje 1, ik vond het al een aparte conditie :)

Nu is de vraag inderdaad simpel ;)
Ter info: alles tussen { en } is het DAN gedeelte.

ALS (adviesprijs kleiner of gelijk aan 0) {
adviesprijs = 2 - (inkoopprijs * 0.000107142857)
}

In php is dit
Code:
if ($adviesprijs <= 0) {
  $adviesprijs = 2 - ($inkoopprijs * 0.000107142857);
}

of als functie
Code:
function choose_price_to_return ($inkoop, $advies) {
  if ($advies <= 0) {
    return (2 - ($inkoop * 0.000107142857));
  } else {
    return $advies;
  }
}

// aanroepen met
$adviesprijs = choose_price_to_return ($inkoopprijs, $adviesprijs);
 
Laatst bewerkt:
Nog 1 vraag
Het doet n.l. helemaal niets.
De prijzen blijven zoals ze in de feed staan.
De code heeft dus geen invloed.

Ik heb bij de adviesprijs een "[1]" achter gezet omdat als ik een record uit de product feed naar een woocommerce veld toe sleep het ook zo komt te staan: "<adviesprijs[1]>"
De spelfout in "$inkkoopprijs" staat zo in de feed dus moet die ook zo overnemen.

Krijg 't maar niet voor elkaar :confused:

Ter info: http://www.wpallimport.com/documentation/advanced/if-statements/



PHP:
function choose_price_to_return ($inkkoopprijs, $adviesprijs) {
  if ($adviesprijs <= 0) {
    return (2 - ($inkkoopprijs * 0.000107142857));
  } else {
    return $adviesprijs;
  }
}

// aanroepen met
$adviesprijs[1] = choose_price_to_return ($inkkoopprijs, $adviesprijs)

Feed1.PNG
Feed2.PNG
 
Laatst bewerkt:
Ik heb bij de adviesprijs een "[1]" achter gezet
Dan is het zeer waarschijnlijk een array[] waarmee je verschillende prijzen kan hebben onder dezelfde naam. Bijvoorbeeld prijs[1] , prijs[2] en prijs[3] hebben dezelfde naam maar het zijn verschillende prijzen, elk met een eigen bedrag.

- De php variabelen, bijv. $adviesprijs[1] heten anders.
Dan is het gissen voor mij.

- De template variabelen, bijv. {adviesprijs[1]} heten anders.
Ook dan is het gissen voor mij.

- De prijzen worden aangeboden als tekst ipv getal.
Dan is de oplossing
Code:
<?php
function choose_price_to_return ($inkkoopprijs, $adviesprijs) {
  $ink = (float)$inkkoopprijs;
  $adv = (float)$adviesprijs;
  if ($adv <= 0) {
    return (2 - ($ink * 0.000107142857));
  } else {
    return $adv;
  }
}

- Misschien hoort dit in je template veld te staan:
Code:
[choose_price_to_return({inkkoopprijs[1]}, {adviesprijs[1]})]


aanv. Kan je hier wat mee: Execute PHP
 
Laatst bewerkt:
Zet deze 2 regels in de function, dan kan je controleren of je in de function terecht komt én wat de adviesprijs dan is.
Code:
function choose_price_to_return ($inkkoopprijs, $adviesprijs) {
  if (isset($adviesprijs)) echo '<script>alert("Bedrag: ' . $adviesprijs . '")</script>';
  else echo '<script>alert("Variabele niet gevonden.")</script>';
  // ... de rest van de function ...
}

Later, als het werkt, haal je deze 2 regels weer weg.
 
Code:
<?php
function choose_price_to_return ($inkkoopprijs, $adviesprijs) {
  if (isset($adviesprijs)) echo '<script>alert("Bedrag: ' . $adviesprijs . '")</script>';
  else echo '<script>alert("Variabele niet gevonden.")</script>';
  if (empty($adviesprijs)) {
    $ink = (float)$inkkoopprijs;
    return ( round(2 - ($ink * 0.000107142857), 2) );
  } else {
    $adv = (float)$adviesprijs;
    return $adv;
  }
}

<?php
Volgens documentatie (klik) begint het script hiermee.

function choose_price_to_return ($inkkoopprijs, $adviesprijs) {
Functienaam "choose_price_to_return" krijgt als invoer 2 parameters $inkkoopprijs en $adviesprijs

if (isset($adviesprijs)) echo '<script>alert("Bedrag: ' . $adviesprijs . '")</script>';
else echo '<script>alert("Variabele niet gevonden.")</script>';

Deze 2 regels zijn alléén om te testen, als alles werkt haal je ze weer weg.

if (empty($adviesprijs)) {
$ink = (float)$inkkoopprijs;
return ( round(2 - ($ink * 0.000107142857), 2) );

Als adviesprijs 0 is of niet is ingevuld, maak dan van inkkoopprijs een getal,
dan nieuwe prijs berekenen, afronden op 2 cijfers, en teruggeven als nieuwe adviesprijs .

} else {
$adv = (float)$adviesprijs;
return $adv;

Als adviesprijs wel is ingevuld en groter is dan 0,
maak dan van adviesprijs een getal en geef ongewijzigde adviesprijs terug.


Functie getest, werkt perfect. Het is aan jou 'm te integreren in je applicatie.
 
Laatst bewerkt:
Mijn "Hele simpele vraag" blijkt toch niet zo simpel als ik dacht.

De prijzen blijven allemaal stug zoals ze in de feed staan.
Lijkt erop alsof het script de plugin niet overruled.
 
De prijzen blijven allemaal stug zoals ze in de feed staan.
Lijkt erop alsof het script de plugin niet overruled.
Het script mailen naar dit emailadres (klik) en vragen hoe je het moet integreren.
 
Ik heb de volgende mail gekregen...

You must call the function in the price field where you want the returned value saved. Here's an example of how to call it ( replace the element names with your real ones ):
[choose_price_to_return( {inkkoopprijs}, {adviesprijs} )]
In action: https://cl.ly/83cf1af6c4de

Na een paar dingen geprobeerd te hebben schijnt dit in eerste instantie de oplossing
[choose_price_to_return( {$inkkoopprijs}, {$adviesprijs} )]
Deze code geeft inderdaad de prijzen weer MAAR gewoon ook de 0 euro prijzen :(

Ik zie echter in de code "if (empty($adviesprijs)) {"
Het moet zijn "als de adviesprijs 0 is, niet als de adviesprijs leeg is.
Of betekend empty in PHP ook 0 ?


PHP:
<?php
function choose_price_to_return ($inkkoopprijs, $adviesprijs) {

  /* if (isset($adviesprijs)) echo '<script>alert("Bedrag: ' . $adviesprijs . '")</script>'; */
  /* else echo '<script>alert("Variabele niet gevonden.")</script>'; */

  if (empty($adviesprijs)) {
    $ink = (float)$inkkoopprijs;
    return ( round(2 - ($ink * 0.000107142857), 2) );
  } else {
    $adv = (float)$adviesprijs;
    return $adv;
  }
}
?>
 
Even getest. empty(...) werkt goed met de volgende waarden

prijs = 0 (geheel getal)
prijs = 0.00 (getal met decimalen)
prijs = "0" (tekst bestaande uit het nul teken)
prijs = "" (lege tekst)
prijs = ? (nog nooit een waarde gekregen)

Alleen het volgende werkt niet goed bij empty(...)
prijs = "0.00" (tekst bestaande uit meerdere nul tekens)
Dit zou betekenen dat de prijzen geen echte getallen zijn maar teksten die uit cijfer tekens bestaan.

Als de prijzen echte getallen zijn (geen teksten met cijfers) dan kan je empty(...) gebruiken.

Als je wilt controleren op "gelijk aan 0 of kleiner dan 0", gebruik dan if ($adviesprijs <= 0) {
$adviesprijs moet in dit geval wel een echt getal zijn, dus geen tekst met cijfers.


Aanv.
Om erachter te komen of de bedragen echte getallen zijn (of niet) zou je de volgende regel direct onder de if(...) regel kunnen zetten.
Code:
echo '<script>alert("Type variabele: ' . gettype($adviesprijs) . '")</script>';
Met de informatie die je krijgt te zien kan voor meer zekerheid worden gezorgd bij de werking van de function.
 
Laatst bewerkt:
OPGELOST :D

Dank je wel, ik ben helemaal blij :thumb:
Heb alleen nog 1 vraagje (weet niet of dit misschien in een nieuw lijntje moet?)

Als ik een adviesprijs van 397,31 heb, kan ik dan achter de komma alles op 0 houden en de 3e digit van rechts (in dit geval de "7") veranderen in een 9 als die groter is dan 5 en in een 5 als die kleiner is dan 5?
Dus zodat mijn verkoopprijs alleen bedragen zoals 249.00 of 2175,00 worden (geen 543.95)
Het moeten natuurlijk wel getallen blijven.

Dank je wel weer alvast
 
Laatst bewerkt:
Klopt het onderstaande in voorbeeld prijs euro 37n,42

Als prijs groter/gelijk aan 1 euro dan afronden op ,00
Als n groter dan 5 dan wordt n = 9
Als n kleiner/gelijk aan 5 dan wordt n = 5

Bij kleine bedragen (1,87) krijg je dan grote afrondingen naar beneden, wil je dit?

Wil je deze vraag als nieuw topic beginnen?
 
Laatst bewerkt:
1. Voorstelling is correct.
2. Die lage prijs is inderdaad niet handig. Misschien beter alleen toe te passen als de prijs groter is dan 100.00
 
De uitleg heb ik ertussen gezet.
PHP:
function choose_price_to_return ($inkkoopprijs, $adviesprijs) {
  // maak van prijzen een getal (in het geval het teksten zijn)
  $ink = (float)$inkkoopprijs;
  $adv = (float)$adviesprijs;
  // als adv 0 of '0' is, of als adv lege '' is, of als adv geen waarde heeft
  if (empty($adv)) {
    // bereken adv met ink formule
    $adv = 2 - ($ink * 0.000107142857);
  }
  // voordat we verder gaan adv afronden op 2 cijfers achter komma
  $adv = round($adv, 2);
  // als adv groter/gelijk aan 100
  if ($adv >= 100) {
    // verwijder cijfers achter de komma (345.67 > 345.00)
    $adv = floatval(intval($adv));
    // als adv format: cijfer [1-9], één of meer [0-9], cijfer [0-5]
    if (preg_match('/^[1-9][0-9]+[0-5]$/', $adv) == true) {
      // dan afronden op 10-tal en 5 erbij optellen (bijv. 172 > 170 > 175)
      $adv = round($adv, -1, PHP_ROUND_HALF_DOWN) + 5;
    // als adv format: cijfer [1-9], één of meer [0-9], cijfer [6-9]
    } elseif (preg_match('/^[1-9][0-9]+[6-9]$/', $adv) == true) {
      // dan afronden op 10-tal en 1 er vanaf halen (bijv. 137 > 140 > 139)
      $adv = round($adv, -1, PHP_ROUND_HALF_DOWN) - 1;
    }
  }
  // geef waarde van adv terug
  return $adv;
}
Getest, het werkt. Alleen heb je opgegeven dat een prijs met tiental '0' wordt verandert (120 wordt 125). Klopt dit?
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan