Jak se nepíše webová služba

Dostal jsem nabídku na udělání portálu pro zjišťování insolvence jak osob tak firem.
Úloha by se to zdála celkem snadná po tom co jsem zjistil, že existuje webová služba ISIR.
Aniž by člověk musel být analyticky zdatný, tak hned čeká, že pod touto webovou službou budou existovat například metody getPerson(rodne_cislo) a getCompany(IC) a jejich návratová hodnota bude TRUE/FALSE podle toho zda daný subjekt v insolvenci je nebo není.
Po seznámení se se službou končí logika na tom, že webová služba má dvě metody. Ale nejmenují se getPerson(rodne_cislo) a getCompany(IC), ale neočekávaně getIsirPub0012(long_1) a getIsirPub001(Calendar_1). Tady je otázka, zda daná firma, která tuto službu ministerstvu dodala měla tak nízký rozpočet, že si nemohla dovolit tyto metody ani smysluplně pojmenovat o argumentech raději nemluvě.
Ale tady absurdita teprve začíná…
Dále je třeba se zabývat co vlastně tyto metody poskytují. První zmiňovaná (getIsirPub0012(long_1)) vrátí maximálně 1000 záznamů (co je v tomto případě záznam napíšu později) s ID větším nebo rovno než je parametr long_1. Než začnete přemýšlet k čemu to může sloužit, tak si počkejte na vysvětlení co je vlastně obsahem záznamu. Ale než toto objasním tak ještě vysvětlím druhou metodu. Druhá metoda (getIsirPub001(Calendar_1)) očekává parametr datum ve formátu 2011-11-24T00:00:00.000Z a vrací maximálně 1000 záznamů vzniklých po tomto čase. Hmm…

A teď velké objasnění co je vlastně obsahem záznamu. Záznam je jen „doklad“ o změně stavu. Takže pokud se těchto záznamů během celého soudního řízení vytvoří 100, tak musím zpracovávat 100 nedůležitých záznamů abych čekal na ten poslední a věděl jestli daný subjekt je v insolvenci a nebo není.

Pokud to zatím z textu nevyplývá, tak je třeba zmínit, že není možné jednoduše zjistit zda subjekt XY v insolvenci je a nebo není. Jediný způsob je si stáhnout kompletní databázi a následně to vyhledat až v ní. V databázi je ke dnešku přes 3.000.000 záznamů.

A jen perličkou na konec uzavřu toto povídání zmínkou o dokumentaci. Poslední aktualizace (k mému údivu) byla zrovna dneska, kde přibyl graf přechodů mezi stavy a informace o připojení. Graf je dost nepřehledný, ale ten vychází z procesu a lepší něco než nic. Informace o připojení mi přijde jako věc, která tu snad musela být od začátku (?!?), tak proč se v dokumentu objevila až po čtyřech letech a ještě s jednou zásadní chybou (viz obrázek).
ISIR připojení k webové službě

To jako fakt někdo myslí vážně, že takto má fungovat nějaká webová služba?

Posted in Uncategorized | Leave a comment

Zamezní propagace submitu odeslání vnořeného formuláře

Pokud potřebujeme vyvolávat submit událost vnořeného formuláře a zároveň omezit odeslání vnějšího, tak musíme použít následující postup.
Pro názornost máme následující příklad:

<form id="frm">
	<!-- nějaké formulářové pole -->
	<!-- kus HTML -->
	<!-- následuje INPUT, který se odesílá pomocí AJAXu, jak na click, tak na klávesu enter -->
	<input name="zprava" id="zprava" type="text" />
	<input type="button" id="sb_submit" value="Odeslat" />
	<!-- kus HTML -->
</form>

A pomocí následujícího JavaScriptu docílíme kýžené funkcionality.

$(function() {
	var enter = false;		// pomocná proměnná
	$('#frm').submit(function(e) {
		if (enter) {		// pokud byl stisknut enter v poli, které nesouvisí s hlavním formulářem (viz nastavení níže) ...
       			enter = false;	// ... proměnou vynulujeme pro další použití ...
       			return false;	// ... tak odeslání vnějšího formuláře neprovádíme
		}
	});
 
	// odeslání na stisk klávesy enter
	$('#zprava').keydown(function(e) {
		if (e.keyCode == 13) {	// došlo ke zmáčknutí klávesy enter
			enter = true;	// nastavíme pomocnou proměnou na TRUE
			send();		// odešleme data
		}
	});
 
	// odeslání na událost onClick
	$('#sb_submit').click(function(e) {
		send();
	});
});
Posted in ajax, jQuery, js | Leave a comment

Refresh (reload) stránky pomocí javascriptu

Zaujala mě zmínka na jednom z blogů, kde autor ukázal 535 (slovy pětsettřicetpět) způsobů, jak pomocí javascriptu refreshovat/reloadovat stránku.

535 způsobů jak refreshovat/reloadovat stránku pomocí javascriptu

Kterému způsobu dáváte přednost vy?

Posted in js | Leave a comment

SPRÁVNÉ ŘEŠENÍ PRO: Přímé stažení souboru v NETTE pomocí redirectu formuláře

Již dříve jsem nastínil jak na to. Ale to bylo řešení postavené na dříve osvojených principech (si všechno napsat sám) a až nyní jsem našel způsob, jak to napsat elegantněji pomocí NETTE.

Presenter:

< ?php
 
class PcClientPresenter extends BasePresenter
{
	protected function createComponentForm($name) {
		$form = new AppForm($this, $name);
		$form->addPassword('heslo', 'Heslo: ')
			->addRule(Form::FILLED, 'Heslo musí být vyplněné.');
		$form->addSubmit('send', 'Stáhnout soubor »');
 
		$form->onSubmit[] = array($this, 'formSubmitted');
	}
 
	public function formSubmitted($form) {
		$file = WWW_DIR . '/data/soubor.zip'; // soubor může být úplně mimo web root (=nestáhnutelný pomocí URL)
		$fileName = 'Soubor po stažení.zip'; // název pod kterým se bude soubor stahovat uživateli
 
		$arr = $form->getValues();
		if ($arr['heslo'] === 'HESLO') {
			$httpResponse = Environment::getHttpResponse();
			$httpResponse->setHeader('Pragma', "public");
			$httpResponse->setHeader('Expires', 0);
			$httpResponse->setHeader('Cache-Control', "must-revalidate, post-check=0, pre-check=0");
			$httpResponse->setHeader('Content-Transfer-Encoding', "binary");
			$httpResponse->setHeader('Content-Description', "File Transfer");
			$httpResponse->setHeader('Content-Length', filesize($file));
			$this->sendResponse(new DownloadResponse($file, $fileName, array('application/octet-stream', 'application/force-download', 'application/download')));
		} else {
			$this->flashMessage('Nesouhlasí zadané heslo.', 'error');
		}
	}
 
	public function actionDefault() {}
}

Pro pořádek připojuji i obsah šablony:

{block #content}
<h1>Stažení PC klienta</h1>
    <div class="flash {$flash->type}">{$flash->message}</div>
    {control form}
{/block}
Posted in nette, php | Leave a comment

Jak neotravovat uživatele s antispamem?

Známe to všichni. Chceme se registrovat na nějaký web, jít do internetového bankovnictví, odeslat objednávku v eshopu, přispět do diskuze a vyskočí na nás jen těžko čitelná slátanina různě pokrouceného textu. Ano první popisovaná možnost je dneska velmi oblíbená captcha.
Captcha

A světe div se. Ve většině případů je toto řešení zbytečné a příliš obtěžující… Jaké má dneska vývojář další možnosti? Existuje možnost zabránit SPAMu a zároveň, aby to uživatele nijak neobtěžovalo? Zkusím projít dneska běžně používané řešení a pak odpovědět na položené otázku.

Polidštěné antispamy, vyžadující interakci uživatele

Vyžádání si opisu textu:
Antispam opis textu
Vybrání odpovídající možnosti:
Antispam výběr dne.
Vybrání odpovídajícího obrázku:
Antispam select images
Nicméně tyto antispamy opět vyžadují spolupráci uživatele a s nadsázkou i jisté znalosti.

Další metodou je na komentáře nasadit nějaký klasický antispam, jaký známe například z emailů. Tuto možnost využívá například i plugin Akismet pro publikační systém WordPress (používá ho i tento blog). Tento systém funguje na principu, že nebrání spamovacím robotům v tom příspěvek založit (což chválím – uživateli nehází klacky pod nohy), ale následnou analýzou se snaží identifikovat, zda příspěvek zobrazí či ne. Tady je ale na druhou stranu potřebná interakce administrátora, což může být na serveru, který je v centru dění dost obtěžující.
Wordpress Akismet

Dokonalé antispamové řešení
Využijeme základu z prvního polidštěného příkladu:
Antispam opis textu
HTML:

<p id="antispam">
    Ochrana proti spamu. Napište prosím číslo dvacet-čtyři: 
    <input type="text" name="robot" value="" id="antispaminput"/>
</p>

Ale doplníme to následujícím Javascriptovým kódem:

document.getElementById("antispaminput").value = "24";
document.getElementById("antispam").style.display = "none";

případně v jQuery:

$("antispaminput").val(24);
$("antispam").css('display', 'none');

ten způsobí, že se pole automaticky vyplní a zároveň skryje. Uživatel má pocit, že žádný antispam neřeší, ale na pozadí ho za něho řeší prohlížeč. Pokud ale uživatel (prohlížeč) nepodporuje Javascript (vlastnost webových robotů), tak mu políčko zůstane zobrazeno a musí touto kontrolou projít.

Proč tedy je tak moderní „otravovat“ uživatele luštěním a vyplňováním pokřivených znaků?

Posted in jQuery, js | 1 Comment