Archive for the ‘Websites bouwen’ category

Update alle MySQL collate en character sets met 1 SQL commando

August 9th, 2011

Aan het begin bij het opzetten van wat nu een grote database is geworden, heb ik gekozen voor de standaard latin codering. Door allerlei veranderingen in de PHP code en de overstap naar Zend Framework moest de collcation overgezet worden naar utf8-unicode-ci. Met zo’n 80 tabellen met ieder gemiddeld zo’n 30 velden is dat een hoop werk om handmatig te doen.

Dus google erbij gehaald en uiteindelijk het in enkele minuten voor elkaar gekregen met de volgende SQL:

select concat( 'alter table `', a.table_name, '` convert to character set utf8 collate utf8_unicode_ci;' )
from information_schema.tables a
where a.table_schema = "schema"

Vergeet niet om achter table_schema de juiste database in te vullen in plaats van schema wat er nu staat. De uitvoer van de bovenstaande SQL kan je weer kopieren en plakken via de SQL tab van je database in phpMyAdmin.

Om het ook meteen in Zend Framework goed te krijgen moest ik ook nog bij het aanmaken van het Zend_DB object een driver optie meegeven:

'driver_options' => array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8;'

Dit plaats je dus in de zelfde array als waar je ook de login, wachtwoord en database opgeeft voor de te openen database.

Zend Framework class voor Twinfield SOAP API

July 9th, 2011

Tijdens de ontwikkeling van het nieuwe controle paneel moest er onder andere een Zend Framework class geschreven worden voor verbinding tussen ons eigen systeem en Twinfield. Hier heeft Twinfield een heel mooie API beschikbaar via SOAP. Hieronder de basis van de My_Soap_Client_Twinfield class.

Zodra de class verder af is, zal ik nog een update plaatsen.

class My_Soap_Client_Twinfield extends Zend_Soap_Client
{
protected $cache = NULL;

protected $user = "********";
protected $password = "********";
protected $organisation = "********";
protected $administration = "********";

protected $header = NULL;

protected $data = false;

private function getSession() {
$ret = false;

$params = array( 'user' => $this->user,
'password' => $this->password,
'organisation' => $this->organisation
);

$cache = Zend_Registry::get ( 'Cache' );

if( $this->data === false && ( $this->data = $cache->load( md5("Twinfield_Session_And_Url") ) ) === false ) {
$client = new Zend_Soap_Client( "https://login.twinfield.com/webservices/session.asmx?wsdl" );

$client->logon( $params );

$doc = new domDocument();
$doc->loadXML( $client->getLastResponse() );

$this->data['SessionID'] = $doc->getElementsByTagName('SessionID')->item(0)->textContent;
$cluster = $doc->getElementsByTagName('cluster')->item(0)->textContent;
$this->data['cluster'] = $cluster . '/webservices/processxml.asmx?wsdl';

$client = new Zend_Soap_Client( $cluster . '/webservices/session.asmx?wsdl' );
$header = new SoapHeader( 'http://www.twinfield.com/', 'Header', array( 'SessionID' => $this->data['SessionID'] ) );
$client->addSoapInputHeader( $header );
$client->SelectCompany( array( 'company' => $this->administration ) );

$doc = new domDocument();
$doc->loadXML( $client->getLastResponse() );
$result = $doc->getElementsByTagName('SelectCompanyResult')->item(0)->textContent;

# Alleen het resultaat bewaren als alles goed gegaan is
if( strcmp( $result, "Ok" ) ) {
$cache->save( $this->data );
$ret = true;
}
}

return $ret;
}

public function __construct( ) {
if( $this->getSession() ) {
parent::__construct( $this->data['cluster'] );

$this->header = new SoapHeader( 'http://www.twinfield.com/', 'Header', array( 'SessionID' => $this->data['SessionID'] ) );

# Add permanent session header
$this->addSoapInputHeader( $this->header, true );
} else {
throw new Exception( "Error creating Twinfield session" );
}
}

Gebruik niet de FTP layer in Joomla

November 11th, 2010

Voor mijn webhosting bedrijf beantwoord ik via de helpdesk regelmatig vragen over CMS systemen. Daarbij loop je ook regelmatig tegen vreemde situaties aan, maar wat de ontwikkelaars van Joomla gedacht hebben tijdens de ontwikkeling van de FTP layer is mij volslagen onduidelijk.

Joomla is al een CMS met de meeste beveiligingslekken en wordt het vaakst gehackt. Daarbij komt de hacker binnen en krijgt vaak daarbij volledige toegang tot het account. Met de introductie van de FTP layer wil Joomla problemen omzeilen met rechten, maar vergeet daarbij wel te vermelden dat deze FTP gegevens in klare tekst in het configuratie bestand worden gezet.

Gevolg hiervan: als de Joomla installatie gehackt wordt heeft de hacker ook meteen de beschikking over je FTP login gegevens. Vaak zijn deze gegevens gelijk aan de SSH login gegevens en de login gegevens voor het controle paneel van het eventuele webhosting bedrijf waar je je website hebt onder gebracht. Oftewel: de hacker kan overal bij, inclusief de domeinregistratie gegevens.

Als je dus niet oppast en de hacker is een beetje handig, dan ben je uiteindelijk zelfs je domein kwijt. Gebruik de FTP layer van Joomla dus niet. Het gebruik hiervan is ook vaak niet nodig. Zeker niet als de PHP scripts door de webserver uitgevoerd worden onder de eigen user.

Eenvoudige Zoom functie met javascript

April 12th, 2010

In de Sieraden webwinkel waar ik al eerder over schreef zat een mooie zoomfunctie in: Als je met het pijltje over een foto heen gaat, dan wordt er een vergroting getoond van het gedeelte waar je met de muis overheen gaat. Dit is een aanvulling op de JQuery javascript library. Op zich al heel mooi, maar het is handiger als je de vergroting naast het origineel hebt staan. Dit naar voorbeeld van de wehkamp zoom (zie ‘n willekeurig artikel), zoals we die zelf inmiddels noemen.

Zelf dacht ik dat dit lastig ging worden, maar er is naast de reeds genoemde module ook een module die het precies op die manier doet: jqZoom. Geweldig. Omdat er al een zoom functie in de website zat, was de aanpassing heel eenvoudig: andere scripts instellen en de html iets aanpassen. Zie de installatie uitleg op de jqZoom pagina.

Het resultaat mag er zijn (al zeg ik het zelf): Kettingen en Armbanden worden nu netjes vergroot naast het origineel. Helemaal geweldig.

iDeal gateway voor CMS Made Simple

April 2nd, 2010

Al enige tijd ben ik bezig met de webshop voor een Sieraden webwinkel. Hierbij heb ik gebruik gemaakt van CMS Made Simple. Hiervoor bestaat alleen een betaalde iDeal gateway. Daar hou ik niet zo van, dus vandaar dat ik eindelijk maar eens ga terug geven aan de open source community door een gratis iDeal gateway voor CMS Made Simple te schrijven.
Na een paar keer uitgesteld te hebben, heb ik vandaag de eerste release gedaan: CMS Made Simple iDeal gateway, versie 0.1.0.
Deze versie is getest tegen de iDeal simulator en de Rabobank test en live omgeving. De code is gebaseerd op onder andere de code van de iDeal simulator website, en die code is ook getest tegen de ING en ABN Amro omgevingen. Dus ik ga er vanuit dat het allemaal probleemloos werkt.

Form met read-only veld

September 15th, 2009

Het was niet duidelijk hoe er een veld getoond kan worden binnen een form, dat niet gewijzigd kan worden. Na wat zoekwerk kwam de volgende constructie naar boven:

$form->addElement(‘text’, ‘ip’,
array(‘label’ => ‘IP adres’, ‘value’ => $_SERVER['REMOTE_ADDR'] ));
$form->getElement(‘ip’)->helper = ‘formNote’;

Chaining routes with wildcard (*) does not work

September 8th, 2009

Enkele maanden geleden al tegen een vervelend probleem gelopen in Zend Framework. Het heeft mij een dag gekost om er achter te komen dat Chaining routes met een wildcard niet goed werken. Al vanaf versie 1.8.x zit er een bug in dat de variabele $matchedPath niet goed geupdate wordt in Zend_Controller_Router_Route. Op deze variabele wordt later in de code weer gecontroleerd of het hele pad gematched is.

Zoals ook gepost in de issue tracker van Zend Framework, heb ik er een oplossing voor die ik iedere keer doorvoer als ik een upgrade uitvoer. Als ik het goed zie in de comments zal het probleem in de volgende release gefixt zijn. Ik hoop het.

Update: Hoewel het lang heeft geduurd, is dit probleem eind 2009 gefixt in versie 1.10.0.