Kaip grafinis paslaugų atvaizdavimas gali pakelti pardavimus
Tai puikus pavyzdys, kaip paslaugų pristatymo grafinis sprendimas gali pakelti pardavimus. Internetinių projektų kūrimo lyderė 37signals nusprendė pabandyti “pažaisti” su paslaugos Basecamp planų pristatymų, su tiklsu, kad esami klientai pereitų prie brangesnių planų. Tam tikslui nusamdė web dizainerį iš šalies, kad įgautų “šviežaus oro”. Kadangi dažnai būna taip, jog ilgai dirbantis prie produkto pradeda nepastebėti tam tikrų niuansų. Kas iš tikrųjų naudinga, tai pats dizaineris gan smulkiai aprašė visą kelią iki naujo grafinio atvaizdavimo sukūrimo.
O rezultatai tokie:
- 13% daugiau planų keitimo į aukštesnį per dieną
- 33% daugiau planų keitimo į “Plus” per dieną
- 8% daugiau uždirbtų $
Genialiai paprastas būdas web formų apsaugai nuo spam
Užklydęs pas Eimantą komentaruose radau genialiai paprastą sprendimą, kaip apsaugoti web formas nuo spamo:
su CSS užslėpti lauką, kurio pavadinimas yra tarkim “description1″. Su sąlyga, kad spam botas nežino, kurių laukų reikia, o kurių ne, jis bijodamas to, kad neužpildys kokio privalomo lauko, suvaro ką nors visur.
O čia imi ir patikrini, jeigu laukas, kurio vartotojas net neturėjo matyti užpildytas – spiri lauk.
Minties autorius – Artūras.
Palengvinkim bei pagreitinkim CSS rašymą su LESS
Trumpai, LESS yra Ruby gems programa, leidžianti plačiau išnaudoti darbą su CSS. Jeigu kartais tenka padirbėti su CSS, tai šis įrankis nebus labai naudingas, tačiau kam tenka ištisai dirbti šioje srityje, verta pagalvoti apie pabandymą. Įdiegimas bei naudojimas labai paprastas.
Plačiau susipažinti einam tiesiai prie pavyzdžių:

Nemokama knyga “Super Awesome Advanced CakePHP Tips” PDF formatu
Vakar Matt iš PseudoCoder išleido trumpą pdf knygą “Super Awesome Advanced CakePHP Tips” visiškai nemokamai. Trumpai peržvelgsiu, ką naudingo joje galima rasti:
- Trumpą paaiškinimą apie Containable Behavior naudingumą
- Funkcijos find perdarymą savo aplikacijos reikmėms (kaip pvz $Model->find(’latest’) ar $Model->find(’tag’, array(’php’, ‘cakephp’)), iš ties patogu!)
- Prisijungusio vartotojo informacijos gavimas bet kurioje MVC dalyje (Model, View ar Controller) per User::get(’id’)
- Automatinis vartotojo veiksmų sekimas (pvz kas ir kada sukūrė ar redagavo puslapio informaciją)
- Unit Testing
- Funkcijų add/edit sujungimas į vieną (tiek Controller, tiek View dalyse)
- Paprastas sprendimas SEO nuorodoms
- JQuery naudojimas vietoj Prototype ir script.aculo.us
- Aplikacijos optimizavimas
- Bei keletas naudingų patarimų
Šią knygą sudaro vos 64 puslapiai, viskas konkrečiai ir aiškiai aprašyta. Labai rekomenduoju perskaityt.
Rodyti/Paslėpti teksto turinį Ajax pagalba
Kartais prireikia tam tikrų informacinių blokų paslėpimo/rodymo funkcijos (kaip pvz didelės kategorizuotos registracijos formos, kur užpildyti laukus neprivaloma). Toks būdas sutaupo nemažai vietos vertikaliai.
Pirmiausia reikės prototype bibliotekos, parsiunčiam į /webroot/js/ katalogą. Toliau aplikacijos kontroleryje (Controller) nurodome JavascriptHelper’io biblioteką:
-
var $helpers = array('Html', 'Form', 'Javascript');
Belieka tik šablone (View) įterpti šį kodą:
-
<?php
-
// įterpiama prototype biblioteka
-
echo $javascript->link('prototype');
-
-
// nuoroda, kuri paslepia/parodo turinį
-
echo $html->link('Rodyti/Paslėpti','#', array('onclick' => "Element.toggle('content');")); ?>
-
?>
-
-
<div id="content" style="display: none;">
-
Tekstas
-
</div>
Užklausos į duomenų bazę cache’avimas
Lygiai su tokia problema ir man teko susidurti, kaip šio rašinio autoriui. Kada užkešuoti kontrolerio funkciją neužtenka, nes ji gražina du ar daugiau skirtingus duomenų kiekius. Šis sprendimas leidžia kešuoti kiekvieną užklausimą į duomenų bazę atskirai:
-
// Cache query to /tmp/cache/sql/model-test_sql_query
-
$results = $this->Model->find('all', array(
-
'cache' => 'test_sql_query'
-
));
-
-
// Cache query to /tmp/cache/sql/model-another_query that expires in 24 hours
-
$results = $this->Model->find('all', array(
-
'cache' => array('another_query', '+24 hours')
-
));
Visa dokumentacija bei kodas – milesj.me
Wordpress ir CakePHP draugija
Jeigu esate sukūrę aplikaciją CakePHP karkasų, tačiau reikia įdiegti ir Wordpress blogą kaip pvz www.example.com/blog/ adresu, šis sprendimas .htaccess pagalba jums padės:
-
RewriteEngine on
-
RedirectMatch temp ^/blog/wp-admin$ http://www.example.com/blog/wp-admin/
-
RewriteRule blog$ /blog/ [L]
-
RewriteRule blog/wp-admin$ /blog/wp-admin/ [L]
-
RewriteRule ^$ app/webroot/ [L]
-
RewriteRule (.*) app/webroot/$1 [L]
Šaltinis: sebgalarneau.com
BaseApp ypatingai lengvas (iki 50Kb) PHP5 karkasas, įkveptas CakePHP API
Nors BaseApp dar nėra jokios dokumentacijos, bet tas lengvumas patraukė dėmesį. Trumpai aprašomas:
- Ypatingai mažas (iki 50Kb archyvuotas)
- Labai greitas
- Beveik jokios konfigūracijos
- Greit išmokstamas
- Lengvai išplečiamas
- Licenzija be apribojimų
Techninės detalės:
- PHP5
- Pilnai MVC
- CakePHP API bei šablonai
- Active Records bei ORM
- Reikšmių validacija bei helper’iai
- Beveik visos palaikomos duomenų bazės
- FireBug palaikymas
- “Sausainių” (Cookie) bei sesijų valdymas
Kas dirbęs su CakePHP, manau nesunkiai sugebėtų šiek tiek pažaist su šiuo karkasu ir be dokumentacijos.
counterCache įrašų skaičiui saugoti
Imkime kaip pavyzdį užduočių valdymo (ToDo) aplikaciją ir norime sužinoti kiek kiekvienoje kategorijoje yra nebaigtų darbų.
-
CREATE TABLE IF NOT EXISTS `task_categories` (
-
`id` int(10) unsigned NOT NULL auto_increment,
-
`item_count` int(10) unsigned NOT NULL,
-
`name` varchar(32) NOT NULL,
-
`created` datetime NOT NULL,
-
PRIMARY KEY (`id`)
-
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-
-
CREATE TABLE IF NOT EXISTS `task_items` (
-
`id` int(10) unsigned NOT NULL auto_increment,
-
`task_category_id` int(10) unsigned NOT NULL,
-
`user_id` int(10) unsigned default NULL,
-
`name` varchar(128) NOT NULL,
-
`description` text NOT NULL,
-
`status` tinyint(3) unsigned NOT NULL,
-
`created` datetime NOT NULL,
-
PRIMARY KEY (`id`),
-
KEY `task_category_id` (`task_category_id`,`user_id`)
-
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Taigi, turime du modelius – TaskCategory ir TaskItem.:
-
class TaskItem extends AppModel {
-
var $name = 'TaskItem';
-
-
var $belongsTo = array(
-
'TaskCategory' => array(
-
'className' => 'TaskCategory',
-
'foreignKey' => 'task_category_id',
-
'counterCache' => 'items_count',
-
'counterScope' => 'status = 0'
-
)
-
);
-
}
-
class TaskCategory extends AppModel {
-
var $name = 'TaskCategory';
-
-
var $hasMany = array(
-
'TaskItem' => array(
-
'className' => 'TaskItem',
-
'foreignKey' => 'task_category_id',
-
'dependent' => true,
-
)
-
);
-
}
Šiuo atveju žiūrim į TaskItem modelyje ‘counterCache’ => ‘items_count’ ir ‘counterScope’ => ’status = 0′ nustatymus. Pirmasis nurodo lentelės lauką kur bus saugojamas įrašų kiekis, antrasis nurodo, jog skaičiuoti tik tuos, kada TaskItem.active lygus 0 (darbas neatliktas).
Viskas, nuo šiol nereiks atskirai skaičiuoti kiekvienos kategorijos neatliktų darbų kiekio papildomomis užklausomis bei funkcijomis. Tuo pačiu gauname optimizuotą sistemą.

MySQL procedūrų naudojimas CakePHP
Pačiam dar neteko naudoti, bet pastebėjau gerą įrašą ta tema. Pirmiausia duomenų bazės nustatymuose (config/database.php) nustatom tvarkyklę:
-
'driver' => 'mysqli'
Procedūra iškviečiama $this->query() pagalba:
-
function findAd($site) {
-
$advert = $this->query('CALL display_ad("'.$site.'");');
-
return $advert;
-
}
Toliau šią funkciją panaudojam kontroleryje:
-
function show($site = null){
-
$advert = $this->Advert->findAd($site);
-
$this->set('advert', $advert[0]);
-
}


2009.07.02

