Archive for category CakePHP
Często podmieniasz fragmenty stringów (cakePHP)?
Jeśli tak – mam dla Ciebie małą podpowiedź String::insert()
Przydatne, jeśli potrzebujesz zdefiniowany łańcuch w którym podmieniasz tylko niektóre fragmenty:
$wiadomosc = ":name ma :pet";
echo String::insert(
$wiadomosc,
array(
"name"=>"Ala",
"pet" => "Kota"
)
); // Ala ma Kota
Z pewnością uprości to Twój kod, jeśli znikną z niego wszystkie str_replace itp.
Polecam też resztę klasy String i innych w cake/lib – często okazują się przydatne.
Tutorial: dashboard web 2.0 dla leniwych…
W moim pierwszym tutorialu napiszę jak wydajnie korzystać z tego co daje Ci cakePHP i jQuery. Aktualnie cake opiera się na współpracy z innym frameworkiem javascript – prototype. Ale już w wersji 1.3 core cake’a ma współpracować z jquery. Już nie mogę się doczekać. Ten tutorial oparłem na wersji 1.3.0-beta dlatego, że przy okazji jego pisania chciałem rzucić okiem na kolejną wersję tego świetnego frameworka php. Jednak nie będę korzystał z żadnych helperów jquery, zatem większość z tych rad powinna pasować do wersji 1.2 (w razie problemów – chętnie służę pomocą).
Jest to mój pierwszy tutorial, więc proszę o wskazówki, komentarze i odrobinę wyrozumiałości.
Efekt jaki chcemy osiągnąć można obejrzeć jako demo oraz źródła na świetnym hostingu, który gorąco wszystkim webdeveloperom i ich klientom polecam: vipserv.org.
W tym tekście zakładam, ze znasz podstawy cakePHP i javascript. Czyli przynajmniej zrobiłeś sławny blog tutorial , wiesz jak mniej więcej używać narzędzia bake, oraz potrafisz przynajmniej zniknąć element na stronie i zmienić jego kolor przy pomocy czystego javascript’u.
Dashboard na zakładkach
Zacznijmy od przygotowania przykładowej aplikacji. Wypiekamy (cake bake) aplikację złożoną z dwóch modeli Thing i Item (każda tabela składa się z id i pola tekstowego name).
Następnie tworzymy dla niej zbiorczy widok (tzw. dashboard, metoda all())
// /app/controllers/items_controller.php
class ItemsController extends AppController {
//...
function all() {}
}
// /app/views/items/all.ctp
<?php echo $this->requestAction(
array(
"controller"=> "items",
"action"=> "index"),
array("return")
); ?>
<?php echo $this->requestAction(
array(
"controller"=> "things",
"action"=> "index"),
array("return")
); ?>
Na razie nie przejmujcie się kwestią requestAction i wydajności. Zazwyczaj efekty requestAction należy umieszczać w cache’owanych elementach, ale w naszym przypadku już niedługo zrezygnujemy z samego requestAction.
Zróbmy z tego widoku zakładki modyfikując widok all.ctp w następujący sposób:
<script type="text/javascript">
$(document).ready(function() {
$("#tabs").tabs();
});
</script>
<div id="tabs">
<ul>
<li><a href="#tabs-1">Items</a></li>
<li><a href="#tabs-2">Things</a></li>
</ul>
<div id="tabs-1">
<?php echo $this->requestAction(
array(
"controller"=> "items",
"action"=> "index"),
array("return")
); ?>
</div>
<div id="tabs-2">
<?php echo $this->requestAction(
array(
"controller"=> "things",
"action"=> "index"),
array("return")
); ?>
</div>
</div>
Żeby wypieczone widoki były “otoczone” ramką z zakładki – trzeba w nich dodać taki fragment na samym końcu plików index.ctp:
<div style="float: none; clear: both;"> </div>
Dodajmy więcej elementów, żeby zobaczyć jak zachowuje się pagination…
insert into items(`name`) values ('Item 4'), ('Item 5'), ('Item 6'), ('Item 7')
i zmieńmy parametry stronicowania, żeby efekty stronicowania zobaczyć szybko
class ItemsController extends AppController {
//...
var $paginate = array(
'limit'=> 5
);
//...
Widzimy, że w naszym zbiorczym widoku link ciągle prowadzi do items/index. Wolelibyśmy, żeby stronicowanie odbyło się w zakładkach.
Można oczywiście próbować rozwiązania via php. Oprogramować obsługę parametrów w metodzie all(), zmienić cel linków stronicowania i sortowania w widokach. I ogólnie dużo napracować się nad tym, żeby nasz kod wyglądał źle
. Już za chwilę moc javascript i w szczególności jQuery przyjdzie nam z pomocą. Zanim to nastąpi – zamieńmy nasze zakładki na Ajaxowe zmieniając widok all.ctp:
// views/items/all.ctp
<script type="text/javascript">
$(document).ready(function() {
$("#tabs").tabs();
});
</script>
<div id="tabs">
<ul>
<li>
<?php echo $html->link(
"Items",
array(
"controller"=> "items",
"action"=> "index"
)
);
?>
</li>
<li>
<?php echo $html->link(
"Things",
array(
"controller"=> "things",
"action"=> "index"
)
);
?>
</li>
</ul>
</div>
…prościzna, prawda? Kwestię requestAction też już mamy z głowy. Jednak pojawił się problem – wnętrze zakładek pojawiło się w powtórzonym layoucie.
Szybko naprawimy to w app_controller.php przy pomocy RequestHanlder:
// /app/app_controller.php
var $components = array("RequestHandler");
function beforeFilter(){
if($this->RequestHandler->isAjax()){
$this->layout = "ajax";
}
}
Wrócmy do kwestii stronicowania (i sortowania przy okazji). Chcemy, aby kolejne strony ładowały się w danej zakładce. Wykorzystajmy do tego potęgę jQuery.
Dodajemy taki prosty skrypt
// views/items/all.ctp
$('#tabs a[href*=/sort:],#tabs a[href*=/page:]').live('click', function(){
$('#tabs>div:visible').load($(this).attr('href'));
return false;
});
Jeśli interesuje Cię co się w tym fragmencie dzieje, zapraszam na do innego wpisu. W dużym skrócie: łapiemy linki, które mają w adresie “sort:” i “page:” i zmuszamy je aby przeładowały zawartość zakładki, zamiast całej strony.


cakephp comments
Posted by Greg in CakePHP on March 11th, 2010
Mam wielu gości, którzy wpadają na tego bloga przez frazę “cakephp comments”. Niestety lądują tu przez przypadek – piszę o cakephp i na końcu każdego postu są komentarze
Nic interesującego i potwierdza to bounce rate powyżej 99%
Jednak mimo, że osobiście nie mam nic do zaoferowania w tej kwestii – mogę pozostawić drogowskaz dla wszystkich poszukujących:
Plugin komentarzy cakePHP
Jak już podepniecie ten mechanizm w swoich systemach – wpadnijcie znów do mnie i poczytajcie o tym jak stworzyć fajny widok zbiorczy web 2.0 i poznać przy okazji możliwości jQuery.
Powodzenia!
CakePHP, comments, plugin
No Comments