IT related news, fotography, fun and webdevelopment
15 sep
In mijn vorige tutorial beschreef ik het toevoegen van extra registratie velden bij een bestelling of klant registratie.
Er van uitgaand dat dit gelukt is, kan ik me voorstellen dat je nu tegen het validatie probleem aanloopt.
In dit artikel zal ik de validatie van de gegevens voor de checkout beschrijven.
Dit is dus bij het afronden van een bestelling, voor niet geregistreerde (nieuwe) klanten
In dit voorbeeld maak ik van telefoonnummer een niet verplicht veld.
Om te beginnen moet je zorgen dat de Javascript validatie niet reageert op dit attribute (op telefoonnummer) ga hiervoor naar de juiste view.
Standaard is dit app/design/frontend/{thema}/{template}/template/checkout/onepage/billing.phtml
Standaard zul je hier dit zien:
<li> <div class="input-box"> <label for="billing:telephone">< ?php echo $this->__('Telephone') ?> <span class="required">*</span></label><br /> <input type="text" name="billing[telephone]" value="<?php echo $this-/>htmlEscape($this->getAddress()->getTelephone()) ?>" title="< ?php echo $this->__('Telephone') ?>" class="required-entry input-text" id="billing:telephone" /> </div> <em> verdere code is achterwege gelaten.</em>
Om te zorgen dat de Javascript validatie telefoonnummer niet meer als verplicht attribute behandeld, hoef je slechts de CSS class ‘required-entry’ te verwijderen.
Je krijgt dus dit:
class="input-text" i.p.v. class="required-entry input-text"
Nu zal Magento bij het afronden van deze stap (en de bestelling) echter nog altijd melden dat telefoonnummer verplicht is.
Dit komt doordat het ajax-request naar de model Mage_Sales_Model_Quote_Address gaat, deze klasse erft op zijn beurt weer over van Mage_Customer_Model_Address_Abstract. De laatst genoemde heeft een public function validate, welke verantwoordelijk is voor de validatie.
Echter is het roekeloos aanpassen van deze model een slecht idee, aangezien je dat in de Mage_Core aan het aanpassen bent, zul je bij updates van Magento mogelijk in de problemen komen. Hiervoor moet je dus de chill-klasse overerven en deze van nieuwe logica (een nieuwe validate functie) voorzien.
Het extenden van een bestaande core class wordt in een eerder artikel al uitgelegd maar hier toch nog even in het kort.
Maak een eigen module en brengt Magento hiervan op de hoogte middels een xml config bestand.
/** * @desc Override the validate function * @author Johan van de Pol * @version 0.1.0 * * @category ACSI * @package ACSI_Global * @copyright Copyright (c) 2009 Johan van de Pol * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ class ACSI_Global_Sales_Model_Quote_Address extends Mage_Sales_Model_Quote_Address { /** * Validate address attribute values * * @return Mixed | Bool (true by no errors) | Array (With error messages by errors) */ public function validate() { $errors = array(); $helper = Mage::helper('customer'); $this->implodeStreetAddress(); if (!Zend_Validate::is($this->getFirstname(), 'NotEmpty')) { $errors[] = $helper->__('Please enter first name.'); } if (!Zend_Validate::is($this->getLastname(), 'NotEmpty')) { $errors[] = $helper->__('Please enter last name.'); } if (!Zend_Validate::is($this->getStreet(1), 'NotEmpty')) { $errors[] = $helper->__('Please enter street.'); } if (!Zend_Validate::is($this->getCity(), 'NotEmpty')) { $errors[] = $helper->__('Please enter city.'); } if (!Zend_Validate::is($this->getTelephone(), 'NotEmpty')) { $errors[] = $helper->__('Please enter telephone.'); } if (!Zend_Validate::is($this->getPostcode(), 'NotEmpty')) { $errors[] = $helper->__('Please enter zip/postal code.'); } if (!Zend_Validate::is($this->getRegion(), 'NotEmpty')) { $errors[] = $helper->__('Please enter region.'); } if (!Zend_Validate::is($this->getCountryId(), 'NotEmpty')) { $errors[] = $helper->__('Please enter country.'); } if ($this->getCountryModel()->getRegionCollection()->getSize() && !Zend_Validate::is($this->getRegionId(), 'NotEmpty')) { $errors[] = $helper->__('Please enter state/province.'); } if (empty($errors)) { return >true; } return $errors; //Eventueel orignele functie nog aanroepen //parent::validate(); } }
In je eigen validate functie moet je uiteraard de validatie van de telefoon verwijderen dus
if (!Zend_Validate::is($this->getTelephone(), ‘NotEmpty’)) {
etc. moet weg.
Wellicht ten overvloede, maar in de config van je module moet uiteraard wel het volgende staan:
< ?xml version="1.0"?> <config> <global> <sales> <rewrite> <quote_address>ACSI_Global_Sales_Model_Quote_Address</quote_address> </rewrite> </sales> </global> </config>
Op deze manier zorgt Magento ervoor dat jou klasse wordt aangeroepen i.p.v. het origineel, door hem te extenden blijft de verdere functionaliteit gewaarborgd en kan je makkelijk functies herschrijven, in dit voorbeeld hebben we een parent functie herschreven.
Met deze kennis is het mogelijk om alle afwijkende attributen te valideren en te tonen etc.
Maar mocht het standaard pakket voldoende zijn en wil je slechts hiervoor validatie hebben, dan volstaat deze extensie:
Deze extensie werkt overigens op nagenoeg dezelfde manier.
Vergeet overigens niet de mappen app/design/frontend/default/thema/layout/dull/ en
app/design/frontend/default/thema/template/dull/ te kopiëren naar je eigen template/thema.
Mochten er vragen zijn, contact op nemen kan altijd: magento at johanvandepol dot nl
Deze tutorial is geschreven op het moment dat Magento 1.3.2.3 de meest recente versie was.