Silverstripe: Sorgulari Cachleme

Mart 26th, 2012

Silverstripe de genellikle birbiriyle iliskili birden cok nesne ile calisiriz. Bu nesneler ile calismak kod yazarken nekadar güzel olsada, sitenin performansini oldukca etkilemektedir.

Silverstripe bu konuda cok kolay bir cache Sistemi kullanmakda.

Böyle basit bir sorgumuz var sayalim

$result = DataObject::get('ProductCategory',"URLSegment='".Convert::raw2sql($urlSegment)."'");

Bu sorgu icin yeni bir fonksiyon yazalim ve bakalim sorunu nasil cözeriz.

protected function getCategoryID($urlSegment) {
    //cachekey olusturalim
    //preg_replace kullanmamiz lazim cünki Zend_Cache a-zA-Z_0-9 disindaki karakterlere izin vermiyor
    $cachekey = 'Cache_Category'.preg_replace('/-/','_',$urlSegment);
    // SS_Cache in factory methodu üzerinden cache objesini olusturalim
    $cache       = SS_Cache::factory($cachekey);
    //cache yükliyelim
    $result     = $cache->load($cachekey);
    //cache varsa unserialize yapip result degiskenine atiyalim
    if ($result) {
	$result = unserialize($result);
    } else {
        //cache yoksa veya süresi gecmisse yukaridaki sorgumuzu calistirip kaydedelim
	$result = DataObject::get('ProductCategory',"URLSegment='".Convert::raw2sql($urlSegment)."'");
	$cache->save(serialize($result));
    }
    return $result;
}

UPDATE: 17.05.2012
Pagination ve resimli iliskilerde serialize yüzünden cikan sorunlar yüzünden cache i biraz degistirdik.

protected function getCategoryID($urlSegment) {
if (!isset($_GET['start']) || !is_numeric($_GET['start'])){
			$start = 0;
		} else {
			$start = intval($_GET['start']);
		}
    $cachekey = 'Cache_Category'.preg_replace('/-/','_',$urlSegment);
    $cache       = SS_Cache::factory($cachekey);
    $result     = $cache->load($cachekey);
    if ($result) {
	$result = unserialize($result);
        //kayit ettigimiz arrayi bir DataObjectSet e ceviriyoruz.
        $doSet = $this->buildDataObjectSet($result, 'DataObjectSet', $this->class);
        //pagination icin limitleri belirleyelim
	$doSet->setPageLimits($start, 10, $doSet->Count());
	return $doSet;
    } else {
	$result = DataObject::get('ProductCategory',"URLSegment='".Convert::raw2sql($urlSegment)."'");
        //tüm icerikleri bir Array e alip, cache e öyle kayit ediyoruz.
        if($result!= null) {
	     $saveArr = array();
              foreach($result as $value) {
		$saveArr[] = $value->getAllFields();
	     }
	    $cache->save(serialize($saveArr));
	}
    }
    return $result;
}

Bu arada yukaridada yazdigim gibi SS_Cache arka planda Zend_Cache kullanmakda.
Template de degisen birsey yok.
Template cache lerine birdahaki yazimizda anlatmaya calisacagim.

Silverstripe API: http://api.silverstripe.org/2.4/sapphire/core/SS_Cache.html

Kategoriler: PHP, Silverstripe

Etiketler:, Yorum Yapılmamış

Php 5.4 yayinlandi

Mart 2nd, 2012

kaciranlar icin yazayim dün gece 8. RC ardindan Php 5.4 yayinlandi.
Degisiklikleri uzun uzun anlatmiyacagim, release ler ciktiginda birsürü blogda zaten yeniliklerden bahsedildi.
Önemli degisiklilere kisa bir göz gezdirelim.

1. Traits
Php gibi tek mirasli dillerde kodu tekrar kullanmak icin olan bir yöntemdir.

<?php
class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}

class MyHelloWorld extends Base {
    use SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello();
?>

cikti
Hello World

2. shortened array syntax

<?php
function getArray() {
    return array(1, 2, 3);
}

// on PHP 5.4
$secondElement = getArray()[1];

// as of PHP 5.4
$array = [
    "foo" => "bar",
    "bar" => "foo"
];

3. Constructor ardindan direk Metod calistirila bilinir (Fluent Interface)

echo (new Foo)->bar()

< ?=
short_open_tag ‘e bakılmaksızın < ?= artık her zaman kullanılabilir.

4. Binär sayi bicimi kullanimi eklenmistir (0b)

$binary = 0b001001101;
echo $binary;

Class::{expr}()

class Test{
    public function method() {
        echo 'Hello';
    }

    public static function staticmethod() {
        echo 'Static';
    }
}

$method = 'staticmethod';
$test = new Test();

$test->method();        //Prints Hello
$test->$method();       //Prints Static
$test->{'method'}();    //Prints Hello

Test::method();         //Prints Hello
Test::$method();        //Prints Static
Test::{'method'}();     //Prints Hello

6. $GLOBALS lerde artik “lazy initialisation” kullaniliyor

Callable Type Hinting

<?php

// A function that uses type hinting
function typeHinting(callable $a) {
     echo $a() . PHP_EOL;
}

// A closure
$closure = function () {
     return __FUNCTION__;
};

// Call the type hinting function with the closure
typeHinting($closure); // {closure}

class testClass {
     public function testMethod() {
          return __METHOD__;
     }
}

// A mock object
$testObj = new testClass();

// The new way of calling object methods
$objCallable = array($testObj, 'testMethod');

// Call type hinting function with the new method calling way
typeHinting($objCallable); // testClass::testMethod

upload progress e direk erisim

session.upload_progress.enabled = 1
session.upload_progress.prefix = upload_progress_
session.upload_progress.name = PHP_SESSION_UPLOAD_PROGRESS
<form action="upload.php" method="POST" enctype="multipart/form-data">
 <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="johannesupload" />
 <input type="file" name="file1" />
 <input type="file" name="file2" />
 <input type="submit" />
</form>

E_STRICT E_ALL un parcasi haline geldi
php.ini deki “default_charset” ISO-8859-1 den UTF-8 degistirildi
Php 5.4 kendi icinde kücük bir Webserver barindirmakta

Safe Mode, register_globals, register_long_arrays php.ini den kaldirildi
Magic Quotes (magic_quotes_gpc)

Simdlik bukadar unuttuklarim varsa asagiya ekleyiniz ;)

Linkler:
http://php.net/releases/5_4_0.php
http://docs.php.net/manual/en/migration54.new-features.php
http://blog.claudiupersoiu.ro/2012/02/11/php-5-4-closures-the-right-way/
http://schlueters.de/blog/archives/151-Upload-Progress-in-PHP-trunk.html
http://php.net/manual/en/features.commandline.webserver.php

Kategoriler: PHP

Etiketler: Yorum Yapılmamış

jQuery UI Dialog enterle tetiklemek

Aralık 2nd, 2011

jQuery UI dialog da bir formu doldurup entere bastigimizda genelde hic bir tepki almayiz. Oysaki cogumuz giris bilgilerini doldurduktan sonra entere basmayi aliskinlik haline getirmisiz. Jquery Ui dialog ile bir login formu gösteriyorsaniz sayfanizda ve kullanicilariniza bir iyilik yapmak istiyorsaniz, asagidaki kodu programiniza eklemeyi unutmayiniz.

$('#dialog').live('keyup', function(e){
	  	if (e.keyCode == 13) {
	    	$(':button:contains("Einloggen")').click();
	  	}
	});

Einloggen yazan yere Dialog da buttona verdiginiz adi giriniz.
dialog da gösterdiginiz div in id si

Kategoriler: Javascript/Ajax/Jquery

Etiketler:, Yorum Yapılmamış

Eclipse 3.7 Android ADT kurulum hatasi

Kasım 9th, 2011

Eclipse 3.7 de Android ADT kurarken söyle bir hata ile karsilasanlar varsa.

Cannot complete the install because one or more required items could not be found.
Software being installed: Android Development Tools 15.0.0.v201110251216-213216 (com.android.ide.eclipse.adt.feature.group 15.0.0.v201110251216-213216)
Missing requirement: Android Development Tools 15.0.0.v201110251216-213216 (com.android.ide.eclipse.adt.feature.group 15.0.0.v201110251216-213216) requires ‘org.eclipse.wst.sse.core 0.0.0′ but it could not be found

http://download.eclipse.org/releases/indigo adresini Help -> Install New Software -> Add eklemeleri ve kurulumu yeniden denemeleri gerekiyor.
Bende sorun bu sekilde cözüldü.

kolay gelsin

Kategoriler: Android, Java

Etiketler:, Yorum Yapılmamış

Silverstripe yeni sayfa tipleri

Kasım 1st, 2011

Silverstripe’i ilk kurdugumuzda bazi standard sayfa türleri ile gelir.
Sistemimizin gereksinime göre degisik sayfa türleri üretmemiz gereklidir.
Bugünki yazimizda SS’de baska bir sayfa türü nasil olusturulur ona bakacagiz.

Önce SS ile default olarak gelen sayfa türlerini taniyalim:

  • Page:en temel sayfa türüdür.Ilerki yazilarda üretecegimiz tüm sayfalar bu türden olacaktir
  • ErrorPage:Hata oldugunda gösterilicek olan sayfa. Degisik hatalara degisik sayfalar üretile bilinir. mesela 404 bulunamadi ile 403 erisim engellendi sayfalari degisik görüne bilinir
  • RedirectorPage: Baska bir sayfaya veya Websitesine yönlendirmek icin kullanilir
  • VirtualPage: baska bir sayfanin icerigini kullanir. Redirector sayfasindan bunu ayiran, sadece sitemiz icindeki sitelerde kullanilir ve icerigini kopyalar.

Kendi Sayfa türümüzü olusturalim
/mysite/code klasörü icinde Baslik, tarih, resim ve icerik eklene bilen bir sayfa türü üretelim, adinida ArticlePage koyalim.

/mysite/code/ArticlePage.php

<?php

class ArticlePage extends Page { // Model
    static $db = array(
       'Date' => 'Date',
    );
    public static $has_one = array(
        'Picture' => 'Image',
    );
    function getCMSFields() {
       $fields = parent::getCMSFields();

       $fields->addFieldToTab('Root.Content.Main', new DateField('Date'), 'Content');
       $fields->addFieldToTab("Root.Content.Main", new ImageField('Picture'));

       return $fields;
    }
}
/* controller */
class ArticlePage_Controller extends Page_Controller {
}

?>

Silverstripe MVC tasarim kalibini kullanmaktadir.
Silverstripe de olusturdugumuz her sayfa Model ve Controller kismini barindirmaktadir.
Her sayfa Page sayfasindan extend etmelidir.

static $db = array('Date' => 'Date',);

db degiskeninin özel bir islevi vardir, veritabani alanlari tanimlamak icin kullanilir.
Örnegimizde tarihi kaydetmek icin Date tipinde bir alan adi tanimladik.

has_one degiskeni her ArticlePage sayfamiza bir resim eklemesini söylüyor.
Bu baglantilara daha sonraki bir yazimizda daha detayli bakacagiz.

Gerekli alanlari tanimladikdan sonra bunlari Admin e eklememiz gerekiyor.
GetCMSFields ile bu isi yapa biliriz.

View kismina bakalim.
theme dosyamizda ArticlePage.ss adinda bir dosya olusturalim.
/themes/blackcandy/templates/Layout/ArticlePages.ss


    <div>
        <h1>$Title</h1>
        <div>Date : $Date.nice</div>
        <div>$Picture</div>
        $Content
        $Form
    </div>

Model, view ve Controlleri tamamladikdan sonra adres satirina /dev/build/?flush=all yazip degisiklikleri kaydedelim.
Simdi Admin de yeni bir sayfa üretmek istedigimizde ArticlePage sayfamizi sece biliriz.

Kategoriler: Cms, PHP, Silverstripe

Etiketler:, , 1 Yorum

Silverstripe snippetler

Eylül 4th, 2011

Adres satirina eklenenler
Template in olusturdugu kodu görmek icin

?isDev=1&showtemplate=1

önbellegi temizlememe

?flush=all

kodu ve db yi senkronlamak icin önemli (http://localhost/dev/build seklinde olmali)

/dev/build

Tüm sayfalari birden yayinlamak

/admin/publishall/

veritabanini olusturur ama kayitlari eklemez

/dev/build?dont_populate=1

config dosyasindaki degere aldirilmadan, Test moduna gec

?isTest=1

tüm queryleri göstermek icin:

?showqueries=1

tüm insert ve updateleri gösterir ama calistirmaz

?previewwrite=1

performance icin

?debug_memory=1
?debug_profile=1
?debug_profile=1&profile_trace=1

diger

?debugmanifest=1
?debugmethods=1
?debugfailover=1
?debug_request=1
?debug=1

mysite/_config.php icine eklenenler
development moda gecmek icin (standard live mod)

Director::set_environment_type('dev'); 

(daha fazla…)

Kategoriler: Cms, PHP, Silverstripe

Etiketler:, , Yorum Yapılmamış

MSSQL snippetler

Temmuz 15th, 2011

Konuyu Mssql Snippet konusuna cevirmeye karar verdim.
Aradigimda kolaylikla bulabilmek icin bu satirlari ekliyorum.
Mssql de bir DB nin tüm indexlerini görüntülemek icin bu satirlari kullana bilirsiniz.

SELECT i.object_id, i.name, o.name
 FROM sys.indexes as i, sys.objects as o
 WHERE i.name not like 'queue%'
 and i.object_id = o.object_id
 AND o.name NOT like 'sys%'

db de eski programdan tarihleri ve zamanlari ayni olan siparisler vardi buda benim bir queryimi bozuyordu, ayni olan zamanlarin birine 3 saniye fazladan ekledim.

update orders set
or_datetime=DATEADD(ss,03,or_datetime)
where or_id in (select MAX(or_id) from orders as x
		where or_datetime in(select or_datetime
		   from orders where x.or_person_id=or_person_id
		   group by or_datetime having count(*) > 1)
               group by or_person_id
)

devami gelecek…

Kategoriler: Veritabani

Etiketler: Yorum Yapılmamış

C# .COM bileseniyle Excel export

Temmuz 14th, 2011

Bugün son günlerde urastigim birseyi sizlerle paylasmak istiyorum.
Datagridview dan Excel e veri export etmem gerekiyordu, bunun icin hemen bir Library aradim, FF de arkadasin birisi sagolsun yardimci olmaya calisti.
Ben vermis oldugu linkten NPOI kütüphanesini kesfettim ve kullanmaya basladim.
Ama Iki gün önce farkettimki 10 000 satir lik bir export haddinden fazla (>10 dk) sürüyordu. Halbuki yapilacak olan export nice 10 000 leri yapa bilmeli.
Devam arastirdim bizim servere disaridan erisim kapali sadece Citrix icinden calisiyor ve üstünde Excel bulunuyordu, bende .COM bilesenlerini kullanmaya karar verdim.
Yeni bir test yapip en basit haliyle söyle bir kod olusturdum.

private void btn_export_Click(object sender, EventArgs e) {
    Excel.Application xlApp;
    Excel.Workbook xlWorkBook;
    Excel.Worksheet xlWorkSheet;
    object misValue = System.Reflection.Missing.Value;

    xlApp = new Excel.Application();
    xlApp.ScreenUpdating = false;
    xlApp.Calculation = Excel.XlCalculation.xlCalculationManual;
    xlWorkBook = xlApp.Workbooks.Add(misValue);
    xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
    int ix = 0;
    int j = 0;
    //datagridview un baslik sütunünü ekliyelim
    for (int x = 0; x < dgv_search_result.Columns.Count; x++)
    {
        xlWorkSheet.Cells[1, x + 1] = dgv_search_result.Columns[x].HeaderText;
    }
    //basliklari kalin yazalim ve yaziyi ortaliyalim
    xlWorkSheet.get_Range("A1", "T1").Font.Bold = true;
    xlWorkSheet.get_Range("A1", "T1").VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
    //ardindan Datagridview daki satirlari excel dosyamiza yazalim
    for (ix = 1; ix <= rowcount; ix++) {
       for (j = 0; j <= dgv_search_result.ColumnCount - 1; j++){
          DataGridViewCell cell = dgv_search_result[j, ix - 1];
          //10. sutünü Text olarak formatliyalim
          if(j==10)
             xlWorkSheet.Cells[ix + 1, j + 1].NumberFormat = "@";
          xlWorkSheet.Cells[ix + 1, j + 1] = cell.Value;
         }
     }

     //kayit edelim
      xlWorkBook.SaveAs(extraction_export.FileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
      xlWorkBook.Close(true, misValue, misValue);
       xlApp.Quit();
     //objeleri yok edelim
      releaseObject(xlWorkSheet);
      releaseObject(xlWorkBook);
      releaseObject(xlApp);
}
private void releaseObject(object obj){
   try
   {
      System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
      obj = null;
   }
   catch (Exception ex)
   {
       obj = null;
       MessageBox.Show("Hata olustu " + ex.ToString());
   }
   finally
   {
        GC.Collect();
   }
 }

(daha fazla…)

Kategoriler: C#

Etiketler: 2 Yorum

Silverstripe

Temmuz 12th, 2011

COktandir kullanmaya vakit bulamadigim, ama sonunda kullandigim acik kaynakli bir CMS/Framework den bahsetmek istiyorum.
Simdiye kadar kullandigim CMS ler arasinda bir PHP cinin kullana bilecegi en iyi CMS diye bilirim.

Silverstripe (SS) alt yapisinda yine SS in kurucularinin yazmis olduklari Sapphire Framework kullanilmakda.

SS icin bircok eklenti mevcut bunlara silverstripe.org sitesinden baka bilirsiniz.

SUana kadar tespit ettiklerim:

  • güclü nesne yönelimli yapisi
  • MVC-Pattern
  • Scaffolding
  • kolay genisletilebilirlik
  • kullanim kolayligi
  • eklentiler

.. vs bu liste uzar gider php de yeni bir CMS ariyan varsa demo icin buraya baka bilir: Silverstripe Demo

Bu arada bir günde Theming ile birlikde bir site olusturdum gecen hafta.
Silverstripe 2.4 Module Extension, Themes and Widgets kitabini okumaya basladim bundan sonra silverstripe hakkinda daha cok seyler yazacagim insallah.

Kategoriler: Cms, PHP, Silverstripe

Etiketler:, , 2 Yorum

Zend ViewHelper ve birden cok Metot barindirma

Mart 29th, 2011

View Scriptlerde komplex fonksiyonlari bircok kez calistirmak gerekiyorsa, bildigimiz gibi bunu Zend Framework ün bize sunmus oldugu View Helperler ile gerceklestire biliriz.
Bu yazimizda View Helperde birden cok Metodu nasil barindirirz ona bakalim.
Helper dedigimiz aslinda basit bir Sinif.
Diyelimki “String” adinda bir helper olusturmak istiyoruz.
Bu string helperi bize string adinda bir string geri versin istiyoruz.
Zend Studio nun varsayilan sablonunda helperler /application/views/helpers klasörü altinda kayit edile bilinir.
Bu klasörün icinde String.php diye bir dosya olusturalim.
Ve icine sunu kaydedelim
(daha fazla…)

Kategoriler: PHP, Zend Framework

Etiketler:, Yorum Yapılmamış

Feed

http://www.skorp.eu /