Anasayfa | Giriş Yapın | Üye Olun | Gökçe Kim? | İletişim
Gökçe’nin Web Güncesi (gwg)

Gökçe’nin Web Güncesi (gwg)

Welcome to darkside of the Source, we have cookies!

Gökçe’nin Web Güncesi (gwg) RSS Feed
 
 

ExtJS için backend cevap sınıfı

PHP ile ExtJS için kolayca json cevapları oluşturabileceğiniz, çok basit, fakat muhtemelen işinize yarayacak bir sınıf. Çok bulandırmadan kodu yazıp, yazıyı bitiriyorum.

Ext_Response.php

<?php
/**
 * Ext response..
 *
 *  @author Gokce Yalcin <breathalyse@gmail.com>
 *
 */

class Ext_Response {
    public $response;
    public $errors;
    public $data;
    public $row = array();
    public $namespace = array();
    /**
     * Build the response, default behavior is echo.
     *
     * @param bool $return
     */

    public function build($return=0) {
        if ($this->errors) {
            $this->response["success"] = false;
            $this->response["errors"] = $this->errors;
        }
        else {
            $this->response["success"] = true;
            if ($this->data) $this->response["data"] = $this->data;
        }
        if ($this->row) {
            $this->row = $this->response["rows"] = $this->row;
            $this->response['total'] = count($row);
        }
        $this->response["namespace"] = (array) $this->namespace;
        if ($return) echo json_encode($this->response);
        else echo json_encode($this->response);
    }
    /**
     * Name calls for itself
     *
     * @param string $id
     * @param string $msg
     */

    public function add_error($id,$msg) {
        $this->errors[] = array('id'=>$id,'msg'=>$msg);
    }
    /**
     * @param string $id
     * @param mixed $value
     */

    public function add_data($id,$value) {
        $this->data[] = array('id'=>$id,'value'=>$value);
    }
    /**
     * @param string $key
     * @param mixed $value
     */

    public function add_namespace($key,$value) {
        $this->namespace[$key] = $value;
    }
    /**
     * @param array $value
     */

    public function add_row($value) {
        $this->row[] = $value;
    }

}

Kullanımına üç örnek:

1- Forma Veri Yüklerken

Backend

$e = new Ext_Response();
foreach ($config as $k => $v) {
$e->add_data($k,$v);
}
$e->add_data('value1',$config['basepath'].'/fetch/cycle.php');
$e->add_data('value2',$config['basepath'].'/fetch/fetch.php');

$e->build();

Frontend

form = Ext.FormPanel({ . . });
form.load({
        waitMsg:'Parameters Loading',
        url: 'setting_controller.php',
        params: {
            action: 'load'
        }
});

2-Veri kaydederken ve lazımsa namespace kullanımı

BE

$connect_function = $_POST['db_persistant'] ? 'mysql_pconnect' : 'mysql_connect';
$link = @$connect_function($_POST['db_host'],$_POST['db_user'],$_POST['db_pass']);
if (!$link) $e->add_error('db_user','Cant connect to the DB. Supplied host / user / password combination is not correct.');
else {
@mysql_select_db($_POST['db_name']);
if (mysql_error($link)) $e->add_error('db_name','Can't select DB.');
else {
@mysql_unbuffered_query("SELECT count(*) FROM video WHERE published=0");
if (mysql_error($link)) {
$e->add_error('
db_name','This DB has not STXTube tables');
}
}
}
if (empty($e->errors)) {
//insert DB
foreach ($query as $q) $db->query($q);
$writeable = is_writable($config['
basepath'].'/config.php');
if (!empty($wc)) {
foreach ($config as $c=>$v) if (!isset($wc[$c])) $wc[$c]=$v;
if ($writeable) {
file_put_contents($config['
basepath'].'/config.php',$write);
$e->add_data('
cyclecronvalue',$_POST['basepath'].'/fetch/cycle.php');
$e->add_data('
fetchcronvalue',$_POST['basepath'].'/fetch/fetch.php');
}
else {
$e->add_namespace('
write',highlight_string($write,true));
}
}
}
$e->build();

FE

buttons = [{
    text: 'Save',
    handler: function() {
        form.getForm().submit({ .. ,params:{action:'update'},url:'setting_controller.php',success:function(b,r) {
        if (r.result.namespace.write) //namespaceden, write
        Ext.Msg.alert('Degrading, config is not writable','Your config.php is not writable, so you have to do replace content of config.php by following code:'+
        '
<pre style="overflow:auto;border:1px solid #e1e1e1;margin:0;background-color:#fff" mce_style="overflow:auto;border:1px solid #e1e1e1;margin:0;background-color:#fff">'
+r.result.namespace.write+'</pre>
'
);
        }});
    }
},{
    text: 'Cancel',
    handler: function() {
        form.getForm().reset();
    }
}]

4- Değişken alanlarda, save sırasında gelen veriyi forma yükleme

BE

$e = new Ext_Response();
if (false)
$e->add_error("x","bu yanlis");
$e->add_data("bu","yeni");
$e->build();

FE

saveButton = {
    text: 'Save',
    handler: function() {
        form.getForm().submit({ .. },url:'setting_controller.php',success:function(b,r) {
        if (r.result.data) r.form.setValues(r.result.data); //cagrilmasi sart.
        }});
    }
}

5- Grid

BE

if ($_POST['sort']) {
    $order[] = $_POST['sort'].' '.$_POST['dir'];
}
else
$order[] = 'program_name desc';

$sql = 'SELECT * FROM program';
$res = $db->query($sql);
while($r = mysql_fetch_assoc($res)) {
    $r['block'] = ($r['block'] ? true : false);
    $e->add_row($r);
}
$e->build();
var store = new Ext.data.JsonStore({
    url: 'programgrid_controller.php',
    root: 'rows',
    totalProperty: 'total',
    remoteSort:true,
    baseParams: {'action':'load'},
    sortInfo: {field:'site_id', direction:'ASC'},
    fields: [
    {name: 'program_id'},
    {name: 'program_name'},
    {name: 'program_url'}
    ]
});
var grid = new Ext.grid.GridPanel({
        id:'stxGridProgram',
        store: store,
                ..
});
store.load();

3 Yorum - “ExtJS için backend cevap sınıfı”

  1. 1
    bbayer:

    Güzel bir çalışma olmuş ancak bu sınıfın biraz daha geliştirilmeye ihtiyacı var.. Mesela ExtJS in her bir bileşeni için PHP tarafındada bir. kapsulleme yaparsan veriyapısını her defasında modelleme ihtiyacın ortadan kalkar. Ext_Response sınıfını kapsulleyen örneğin Ext_FormValidation_Response gibi ..

  2. 2
    Gökçe YALÇIN:

    Bahsettiğin sadece render edilecek şeyi geçirmekse, bu zaten PHP’de yapılabilir, bütün elemanların config’leri javascript objectler, ve aynı içerikdeki bir array’i, json_encode ederek aynı çıktıyı sağlayabiliriz, fakat büyük ihtimalle daha kapsamlı bir şey var aklında.

    Buradaki sınıf, sadece frontend-backend haberleşmesini sağlayan, sadece json datastore’la çalışan bir cevap sınıfı, neticede kısa ve öz bir işi var. Senin söylediğinse, anladığım kadarıyla ap ayrı bir interface ile view/view helper sınıfı. Bir yerlerde yapılmış ve sanıyorum bir çok sabit işlerde (örneğin bir web veritabanı yöneticisi gibi) kullanılmıştır (bir çeviri platformunda rastlamıştım mesela, fakat bulamadım şimdi). Ben bu türden bir şeyin, malesef şimdiye kadarki projelerim ağır UI programlaması gerektirdiğinden, ihtiyaçlarımı karşılayacağını düşünmedim. Ayrıca maalesef Ext çoğu özel UI programlamasında standart prosedürlerle değil, workarroundlarla iş yürüttüğünden, 100% uyum sağlayacak bir yapı kurmak da frontend’de de bir çok değişiklik gerektireceğinden tek taraflı bir iş olmaktan çıkıyor.

    Fakat eğer standart formlar, düşük UI programlaması ve farklı layout tasarımları gerektirmeyen ve aynı tipteki verileri aynı şekilde düzenleneceği/gösterileceği bir proje çıkarsa olursa muhtemelen işlerimi çok hızlandırır, muhtemelen ZF böyle giderse o vakte kadar bize kalmadan çoktan bir decorator çıkartmış olur ya neyse.

    Tam bu işlevi görmüyor, fakat daha ‘özel’ kullanımlara izin veren yapıları tercih ediyorum. Ham datayı view haline başka bir arayüzle geçirmektense, xtemplate’leri genişletmek ve sonrasında kullanmak bana daha eğlenceli geldi. Çokça kullanılan yapıları, örneğin bir quick tip’i Ext’de bunun yapılabileceği ‘<input ext:qtitle=”dede” ext:qbody=”dede”/>’ FBML ‘e (facebook markup) bakarsak, bunun proje bazında özelleştirilmiş tam bir örneğini bulmak mümkün.

  3. 3
    salih sevik:

    Tebrikler Güzel Çalışma.

Bir cevap bırakın


Additional comments powered by BackType