Zend Framework: validátor voľnej domény

Toto je krátky návod ako si vytvoriť vlastný validátor v Zend Frameworku pre overenie Vami zadanej domény či je dostupná pre registráciu. Na internete je podobných scriptov dosť ale nie všetky fungujú spoľahlivo. Táto ukážka by mala fungovať a je tu prerobená do validátora v ZF.

Celý validátor pre overenie domény v ZF

class My_Validate_AvailableDomain extends Zend_Validate_Abstract
{
const NOT_AVAILABLE = 'NotAvailableDomain';
const NOT_VALID = 'NotValidDomain';
const NO_TLD = 'NoTLD';

protected $_messageTemplates =

array(
self::NOT_AVAILABLE => 'Táto doména nie je voľná! Skúste vybrať inú...',
self::NOT_VALID => 'Neplatná doména, nesprávny tvar domény!',
self::NO_TLD => 'Vyberte TLD domény! (Top Level Domains)'
);

public function isValid($value, $context = null)
{

$value = (string) $value;
$this->_setValue($value);

if(!eregi("^[a-z0-9_\-]*$", $value)) {
$this->_error(self::NOT_VALID);
return false;
}

if(isset($context['tld']) && $context['tld'] == "") {
$this->_error(self::NO_TLD);
return false;
}

###################

// ked budete pridavat domeny, musite zvysovat cislo v premennej podla poctu tld
$tlds = 32;

$tldt['co.uk'] = 1;
$tld[1]=".co.uk";
$nic[1]="whois.nic.uk";
$rep[1]="No match for";

$tldt['org.uk'] = 2;
$tld[2]=".org.uk";
$nic[2]="whois.nic.uk";
$rep[2]="No match for";

$tldt['net.uk'] = 3;
$tld[3]=".net.uk";
$nic[3]="whois.nic.uk";
$rep[3]="No match for";

$tldt['me.uk'] = 4;
$tld[4]=".me.uk";
$nic[4]="whois.nic.uk";
$rep[4]="No match for";

$tldt['com'] = 5;
$tld[5]=".com";
$nic[5]="whois.opensrs.net";
$rep[5]="Can't get information";

$tldt['net'] = 6;
$tld[6]=".net";
$nic[6]="whois.opensrs.net";
$rep[6]="Can't get information";

$tldt['org'] = 7;
$tld[7]=".org";
$nic[7]="whois.publicinterestregistry.net";
$rep[7]="Not found";

$tldt['biz'] = 8;
$tld[8]=".biz";
$nic[8]="whois.nic.biz";
$rep[8]="not found";

$tldt['info'] = 9;
$tld[9]=".info";
$nic[9]="whois.afilias.net";
$rep[9]="not found";

$tldt['cc'] = 10;
$tld[10]=".cc";
$nic[10]="whois.nic.cc";
$rep[10]="no match";

$tldt['uk.com'] = 11;
$tld[11]=".uk.com";
$nic[11]="whois.centralnic.com";
$rep[11]="no match";

$tldt['uk.net'] = 12;
$tld[12]=".uk.net";
$nic[12]="whois.centralnic.com";
$rep[12]="no match";

$tldt['name'] = 13;
$tld[13]=".name";
$nic[13]="whois.nic.name";
$rep[13]="no match";

$tldt['sk'] = 14;
$tld[14]=".sk";
$nic[14]="whois.ripe.net";
$rep[14]="Not found.";

$tldt['cz'] = 15;
$tld[15]=".cz";
$nic[15]="whois.nic.cz";
$rep[15]="No entries found.";

$tldt['eu'] = 16;
$tld[16]=".eu";
$nic[16]="whois.eu";
$rep[16]="Status:      FREE";

$tldt['at'] = 17;
$tld[17]=".at";
$nic[17]="whois.nic.at";
$rep[17]="nothing found";

$tldt['de'] = 18;
$tld[18]=".de";
$nic[18]="whois.denic.de";
$rep[18]="free";

$tldt['ru'] = 19;
$tld[19]=".ru";
$nic[19]="whois.ripn.ru";
$rep[19]="No entries found";

$tldt['tv'] = 20;
$tld[20]=".tv";
$nic[20]="whois.nic.tv";
$rep[20]="No match for";

$tldt['be'] = 21;
$tld[21]=".be";
$nic[21]="whois.geektools.com";
$rep[21]="Status:      FREE";

$tldt['ch'] = 22;
$tld[22]=".ch";
$nic[22]="whois.nic.ch";
$rep[22]="We do not have an entry";

$tldt['li'] = 23;
$tld[23]=".li";
$nic[23]="whois.nic.ch";
$rep[23]="We do not have an entry";

$tldt['lt'] = 24;
$tld[24]=".lt";
$nic[24]="whois.domreg.lt";
$rep[24]="Status:      available";

$tldt['lv'] = 25;
$tld[25]=".lv";
$nic[25]="whois.nic.lv";
$rep[25]="%ERR - Nothing found";

$tldt['se'] = 26;
$tld[26]=".se";
$nic[26]="whois.nic-se.se";
$rep[26]="not found.";

$tldt['ac'] = 27;
$tld[27]=".ac";
$nic[27]="whois.nic.ac";
$rep[27]="- Available";

$tldt['ag'] = 28;
$tld[28]=".ag";
$nic[28]="whois.nic.ag";
$rep[28]="Not found";

$tldt['cc'] = 29;
$tld[29]=".cc";
$nic[29]="whois.nic.cc";
$rep[29]="No match";

$tldt['cn'] = 30;
$tld[30]=".cn";
$nic[30]="whois.cnnic.net.cn";
$rep[30]="no matching record";

$tldt['cx'] = 31;
$tld[31]=".cx";
$nic[31]="whois.nic.cx";
$rep[31]="Status: Not Registered";

$tldt['ws'] = 32;
$tld[32]=".ws";
$nic[32]="whois.worldsite.ws";
$rep[32]="No match for";

###########################

$domainname = $value;
$texttld = $context['tld'];
$stld = $tldt[$texttld];
$domname= $domainname.'.'.$texttld; //$tldt[$stld];

$wnic=$nic[$stld];
$ns = fsockopen($wnic,43); fputs($ns,"$domname\r\n");
while(!feof($ns)) $result .= fgets($ns,128); fclose($ns);
if (eregi($rep[$stld],$result)) {
return true;
} else {
$this->_error(self::NOT_AVAILABLE);
return false;
}
}
}

Trieda validátora sa volá  My_Validate_AvailableDomain pretože je uložená v adresári library/My/Validate/AvailableDomain.php . Vytvoríme si 3 konštanty ktoré budú označovať stavy ktoré môžu nastať a popíšeme k nim chybové hlášky ktoré sa vrátia ak overenie neprebehne v poriadku, ak prebehne script vráti len true.
const NOT_AVAILABLE = 'NotAvailableDomain';
const NOT_VALID = 'NotValidDomain';
const NO_TLD = 'NoTLD';

protected $_messageTemplates =
array(
  self::NOT_AVAILABLE => 'Táto doména nie je voľná! Skúste vybrať inú...',
  self::NOT_VALID => 'Neplatná doména, nesprávny tvar domény!',
  self::NO_TLD => 'Vyberte TLD domény! (Top Level Domains)'
);

Ďalšie na rade je zoznam registrátorov podľa krajiny.  V tomto scripte si nie som istý či pobeží overenie EU domén a INFO pravdepodobne bude treba len dať inú URL adresu pre WHOIS.

Script obsahuje aj overenie tvaru domény kde ak sa nezhoduje tvar podľa regulárneho výrazu vráti to FALSE. Pokračovať bude len ak je tvar správny.

Hodnoty z formulára pre overenie

Validátor je navrhnutý tak, že preberie 2 hodnoty z formulára a to: TLD, a názov domény (pomenujme si ich domain a tld). TLD bude klasický selectbox a názov domény bude klasický input pre text. V tomto scripte sa preberajú v tomto mieste:

$domainname = $value;
$texttld = $context['tld'];
$stld = $tldt[$texttld];
$domname= $domainname.'.'.$texttld;

Zobrazenie formulára a overenie domény

Samotné volanie validátora je jednoduché, prikladám ukážku kde mám vytvorené políčka formuláru domain a tld. Pri TLD vložíme cez addMultiOption do rozbaľovátka hodnoty ktoré chceme overovať. (MOBI a EU možno nepojde, treba upraviť WHOIS)

$name = new Zend_Form_Element_Text('domain');
$name ->setLabel('Názov domény')
->setRequired(true)
->addFilter('StripTags')
->addFilter('StringTrim')
->addFilter('StringToLower')
->addValidator('NotEmpty')
->addValidator('AvailableDomain')
->addValidator('stringLength', false, array(1, 100));
$name->addPrefixPath('My_Validate', 'My/Validate/','validate');
$name->setDecorators(array('Composite','CustomHtml'));
$this->addElement($name);

$tld = new Zend_Form_Element_Select('tld');
$tld->addMultiOption('', '');
$tld->addMultiOption('sk', 'sk');
$tld->addMultiOption('cz', 'cz');
$tld->addMultiOption('com', 'com');
//$tld->addMultiOption('eu', 'eu');
$tld->addMultiOption('biz', 'biz');
$tld->addMultiOption('info', 'info');
$tld->addMultiOption('name', 'name');
$tld->addMultiOption('net', 'net');
$tld->addMultiOption('org', 'org');
//$tld->addMultiOption('mobi', 'mobi');
$tld->addMultiOption('de', 'de');
$tld->setLabel('')
->addFilter('StripTags')
->addFilter('StringTrim')
->setDecorators(array('Composite','CustomHtml'))
->addValidator('NotEmpty');
$this->addElements(array($tld));

V prípade, že overenie neprebehne script vráti hlášku podľa konštanty na začiatku scriptu. Môže to vyzerať napríklad takto.

Najdôležitejšie je mať políčka domain a tld. V políčku domain treba zavolať

$name->addPrefixPath('My_Validate', 'My/Validate/','validate');
$name->addValidator('AvailableDomain');

Ostatné prebehne automaticky pretože validátor volá obsah políčok podľa ich mena. Dúfam, že som pomohol pri vytváraní vlastného validátora pre overenie domény. Podobným spôsobom môžete vytvoriť akýkoľvek validátor pre overenie čohokoľvek. Štruktúra a spôsob ostáva, jediné čo zmeníte je vnútro tiedy kde sa niečo overuje a vracia TRUE alebo FALSE. To je celé...



Podobné články

Pridať komentár

1 Komentár

  1. Zend Framework: validátor voľnej domény | Peter Oravec Blog | domeny hovorí:

    [...] resztę artykułu: Zend Framework: validátor voľnej domény | Peter Oravec Blog frameworku, pre-overenie, pre-registr, vod-ako This entry was posted on mar 21st, 2010 at [...]

Facebook komentáre ()

Napíš komentár