• 21-03-2013, 18:03:59
    #1
    phpQuery server taraflı, zincirleme yapılabilen, CSS3 ve Jquery örnek alınmış selector yapısı kullanan DOM API kütüphanesidir.
    Adresi: https://code.google.com/p/phpquery/
    Dökümantasyon: https://code.google.com/p/phpquery/wiki/Manual
    Eğer jQuery ile haşır neşir olan birisi iseniz DOM manipulasyonunu ne kadar kolaylaştırdığını biliyorsunuzdur. phpQuery aynı fonksiyonel özellikleri size PHP ile kullanma imkanını sunuyor. Karmakarışık HTML kodu manipülasyonlarına elveda diyebilirsiniz.

    phpQuery ile jQuerynin sağladığı imkanların çoğuna erişim sağlayabilirsiniz, bunlar 4 kategoriye ayrılıyor

    - DOM elementi oluşturmada (HTML elementleri yaratmak)
    - HTML elementlerini seçmek ve manipüle etmek
    - DOM elementleri arasında geçiş
    - Sonucu browsera yansıtmak

    phpQuery de bulunan jQueryden portlanan bölümler

    - Selector yapısı (Çeşitli koşulları sağlayan HTML elementlerini bulup seçme)
    - Attributes (HTML kodlarının öznitelikleri ile çalışma)
    - Traversing (Seçilen elementlerin bulunduğu liste arasında dolaşmak)
    - Manipulasyon (Seçilen elementin içeriğini değiştirmek,eklemek ve silmek)
    - Ajax (Server taraflı AJAX istekleri oluşturmak)
    Bu javascriptteki ajaxtan farklı, işlemi browser gerçekleştirmiyor arkaplanda PHP gerçekleştiriyor
    - Events (Seçili elementlere DOM etkinlikleri atamak, Form gönderme işlemi, tıklama veya içerik değişmesi gibi)

    phpQuery nasıl kullanılır

    Şimdi sizlere ikili sütun ile başlık ve farklı renk satır rengi içeren aşağıdaki tablonun nasıl oluşturulduğunu göstereceğim.



    Önce phpQuery ile HTML dökümanı oluşturalım:

    <?php
    require("phpQuery/phpQuery.php");
    $doc = phpQuery::newDocument("<div/>");
    Yukarıdaki kod basit bir div tagı içeren HTML dökümanı oluşturacak. Kütüphane çeşitli döküman oluşturma metodlarını içeriyor. Biz en basiti ile giriş yapıyoruz. Diğerlerini kütüphane içindeki demo.php ve dökümantasyon sayfasından görebilirsiniz.

    Şimdi bir liste oluşturalım ve HTML dökümanımıza ekleyelim

    $doc["div"]->append("<ul><li>Product Name</li><li>Price</li></ul>");
    $products = array(
        array("Product 1","$30"),
        array("Product 2","$50"),
        array("Product 3","$20"));
    
    foreach($products as $key=>$product) {
        $doc["div ul"]->append("<li>$product[0]</li><li>$product[1]</li>");
    }
    print $doc;

    Şimdi bir listemiz var. Fakat bütün elementler tek sütun. Rengi farklı olacak elementleri 2. sütuna koyuyoruz

    $doc["div ul"]->attr("style", "width:420px;");
    
    $doc["div ul"]->find("li:even")->attr("style","width:200px; float:left; padding:5px; list-style:none;");
    
    $doc["div ul"]->find("li:odd")->attr("style","width:200px; float:left; padding:5px; list-style:none;");
    Burada style özniteliğini oluşturarak örneğimize CSS stili ekliyoruz, fakat gerçekten ihtiyacınız yoksa asla bu yönteme başvurmayın. Her zaman CSS dosyalarını kullanın.


    Şimdi başlık bölümünü aydınlatalım ve tekli sütunların rengini belirleyelim

    $doc["div ul"]->find("li:nth-child(4n)")->attr("style","background:#EEE; width:200px; float:left; padding:5px; list-style:none;");
    
    $doc["div ul"]->find("li:nth-child(4n-1)")->attr("style","background:#EEE; width:200px; float:left; padding:5px; list-style:none;");
    
    $doc["div ul"]->find("li:lt(1)")->attr("style","background:#CFCFCF; width:200px; float:left; padding:5px; list-style:none;");
    Örneğimizin sonuna geldik, şimdi phpQuery ile HTML kodlarına müdahale etmek hakkında bir nebze fikir oluşmuştur kafanızda.


    phpQuery nin önemi

    Burada phpQuerynin özelliklerinden bahsettik ama aklınızda jQuery varken neden ihtiyaç duyalım sorusu oluşabilir.

    Bir durum düşünün: aşağıdaki gibi bir tablo var elimizde, bu tabloda iş yapılan webmasterların bilgileri bulunuyor




    Şimdi bu tabloyu oluşturmak için gerekenler
    - 60 dan fazla Mark olanlar mavi ile aydınlatılacak
    - 3 yıldan fazla çalışma tecrübesi olanlar işaretlenip Senior Software Engineer olarak kabul edilecek diğerleri ise Software Engineer olarak.
    - Şirket ücretleri iş tecrübesiyle orantılı dağıtıyor

    * 1 Yıl - 5000$
    * 2 Yıl - 10000$
    * 3 Yıl - 20000$
    * 3 yıldan fazla - 50000$

    Kriterlere uyan çalışanlar yeşil ile aydınlatılacak

    Çıktı aşağıdaki gibi gözükecek:



    Normalde kodu yazan kişi aşağıdaki şekilde bir kod oluşturmalı:
    echo <<<ENDHTML
    <div id="main">
     <div class="row_head">
      <div>Name</div>
      <div>Marks</div>
      <div>Experience</div>
      <div>Position</div>
      <div>Expected Salary</div>
     </div>
    ENDHTML;
    foreach ($applicants as $applicant) {
        echo '<div class="row">';
        echo "<div>" . $applicant["name"] . "</div>";
        echo '<div class="' . marksClass($applicant["marks"]) . '">' . $applicant["marks"] . "</div>";
        echo "<div>" . $applicant["experience"] . "</div>";
        echo "<div>" . positionLink($applicant["experience"]) . "</div>";
        echo '<div class="' . salaryClass($applicant["experience"], $applicant["salary"]) . '">' . $applicant["salary"] . "</div>";
        echo "</div>";
    }
    echo "</div>";
    
    function marksClass($info) {
        return ($info > 60) ? "pass" : "fail";
    }
    
    function positionLink($experience) {
        return ($experience > 3)
            ? '<a href="#">Apply for Senior Software Engineer</a>'
            : '<a href="#">Apply for Software Engineer</a>';
    }
    
    function salaryClass($experience, $salary) {
        switch ($experience) {
            case 1:
                return ($salary < 5000) ? "accept" : "reject";
            case 2:
                return ($salary < 10000) ? "accept" : "reject";
            case 3:
                return ($salary < 20000) ? "accept" : "reject";
            default:
                return ($salary < 50000) ? "accept" : "reject";
        }
    }
    şimdi aynı işlemi phpQuery ile yapalım ve avantajlarını karşılaştıralım

    require("phpQuery/phpQuery.php");
    $doc = phpQuery::newDocument('<div id="main"></div>');
    phpQuery::selectDocument($doc);
    
    $doc["#main"]->append('
    <div id="main">
     <div class="row_head">
      <div>Name</div>
      <div>Marks</div>
      <div>Experience</div>
      <div>Position</div>
      <div>Expected Salary</div>
     </div>');
    
    foreach ($applicants as $key => $applicant) {
        $doc["#main"]->append('<div class="row" id="app_' . $key . '"></div>');
        foreach ($applicant as $field => $info) {
            $doc["#main"]->find("#app_" . $key)->append('<div class="_' . $field . '">' . $info . "</div>");
            if ($field == "experience") {
                $doc["#main"]->find("#app_" . $key)->append('<div style="width:400px" class="_position">-</div>');
            }
        }
    }
    
    addMarksClass($doc);
    addSalaryClass($doc);
    addPositionLink($doc);
    
    print $doc;
    
    function addMarksClass(&$doc) {
        $marks = pq("._marks");
        foreach ($marks as $appMark) {
            if (pq($appMark)->html() > 60) {
                pq($appMark)->addClass("pass");
            }
            else {
                pq($appMark)->addClass("fail");
            }
        }
    }
    
    function addSalaryClass(&$doc) {
        $marks = pq("._salary");
        foreach ($marks as $appMark) {
            $experience = pq($appMark)->parent()->find("._experience" )->html();
            $salary = pq($appMark)->html();
    
            switch ($experience) {
                case 1:
                    pq($appMark)->addClass(($salary < 5000) ? "accept" : "reject");
                    break;
                case 2:
                    pq($appMark)->addClass(($salary < 10000) ? "accept" : "reject");
                    break;
                case 3:
                    pq($appMark)->addClass(($salary < 20000) ? "accept" : "reject");
                    break;
                default:
                    pq($appMark)->addClass(($salary < 50000) ? "accept" : "reject");
            }
        }
    }
    
    function addPositionLink(&$doc) {
        $experience = pq("._experience");
        foreach ($experiece as $appExp) {
            if (pq($appExp)->html() > 3) {
                pq($appExp)->parent()->find("._position")->html('<a href="#">Apply for Senior Software Engineer</a>');
            }
            else{
                pq($appExp)->parent()->find("._position")->html('<a href="#">Apply for Software Engineer</a>');
            }
        }
    }
    phpQuery jQuery bilginiz varsa size çok basit gelecek, Yukardaki kodların hepsi kendi kendini açıklıyor. Sadece pq() mevcut dökümanı işaret ediyor.
    Kodlar ne kadar birbirine benzerse benzesin, phpQuery ile oluşturulan kodlama daha kaliteli ve daha az kompleksli olduğu için uygunca geliştirilebilir.


    Döküman aşağıdaki adresten alınıp türkçeleştirilmiştir.
    http://phpmaster.com/server-side-htm...sing-phpquery/
  • 22-03-2013, 08:45:23
    #2
    Super
  • 22-03-2013, 09:19:12
    #3
    php ve jquery biliyorum ama bana nedense karışık bir şekilde hamallık gibi geldi.

    alt tarafı

    <ul>
    <?php
    while(){
    ?>
    <li>falan filan</li>
    <?php } ?>
    </ul>

    yazacağız diye o kadar classı, fonksiyonu, yapıyı öğrenmeye gerek yok gibi geldi.
  • 22-03-2013, 09:32:35
    #4
    Kimlik doğrulama veya yönetimden onay bekliyor.
    fatihsarac adlı üyeden alıntı: mesajı görüntüle
    php ve jquery biliyorum ama bana nedense karışık bir şekilde hamallık gibi geldi.

    alt tarafı

    <ul>
    <?php
    while(){
    ?>
    <li>falan filan</li>
    <?php } ?>
    </ul>

    yazacağız diye o kadar classı, fonksiyonu, yapıyı öğrenmeye gerek yok gibi geldi.
    basit işlerde gereksiz gibi görünüyorsa hiç kullanmayalım sınıfları, fonksiyonları? makarna kod yazmayı tüm dünya bıraksa biz Türkler bırakmayız arkadaş kanımızda yok
  • 22-03-2013, 16:36:17
    #5
    Yeni bilgiler öğrenmek size birşeyler kaybettirmez. Ben dikkatimi çeken şeyler oldukça burada paylaşıyorum okuyup öğrenmek ve kullanmak sizlere kalmış

    http://www.sercankd.com/incimobil/index.php (link küfürlü yazılar içerir)
    Bu siteyi while döngüsü içinde regex ile yapın bakalım hangisi daha çok hamallık oluyor
  • 22-03-2013, 18:41:18
    #6
    bu tarz framework'ler "yazılımcı" kişiyi sınırlar. bu tarz hazır sistemler genelde ajanslarda kullanılır. bunun sebeplerini de biliyoruz zaten; seri üretim projeler yapmak, belli bir standartlarda olması (o standartların dışına çıkılamaması) ve bir yazılımcı işten ayrılır ya da başka bir işe yönelmesi gerektirse, onun yerine bakacak kişinin işini kolaylaştırmaktır. performans değildir yani. bu zamana kadar incelediğim ve denediğim hiç bir framework, arkadaşın dediği gibi "makarna" kodlamalardan daha performanslı çalışmamıştır.


    ben hazır sınıfları kullanmayalım gibi bir şey demedim. tabii ki hazır sınıfları kullanmalıyız. amerikayı tekrardan keşfetmeye gerek yok. fakat o sınıfın neler yaptığını, nasıl çalıştığını bilmeliyiz ki yetersiz kaldığı yerde o sınıfı geliştirebilelim. o sınıfı "yeterli vaktimiz ve isteğimiz" varsa oturup kendimiz de yazabilecek yeterlilikte olabilelim.

    şimdi şöyle düşünelim; ben oturdum bu phpquery sistemini öğrendim. yeni projelerde kullanmaya başladım. 1 sene sonra phpquery'nin geliştiricileri artık geliştirmeyeceklerini açıkladılar. benim için de yeterli gelmemeye başladı. ee n'apıcam? ısrarla kullanmaya devam mı edicem. n'olacak benim bu sistemi öğrenmeye, kullanmaya çalıştığım zamana?

    @Deimosx hocam while içinde regex derken?

    verdiğin örnekteki sayfanın kaynak koduna baktım, <html><head> tag'ları öncesinde divler mevcut. bence bu tarz şeylerden önce html w3 standartlarını öğrenmek daha mantıklı olacaktır.
  • 22-03-2013, 19:03:05
    #7
    Hocam dediğiniz doğru ama benim burda anlatmaya çalıştığım nokta insanları HTML kodlarını regex ile işlemekten vazgeçirmek. Bu sadece bir örnekti bunu okuyup anlamaya çalışan adam araştırma becerisine sahip olan bir adamdır kanaatimce ve araştırmasının devamını kendisi getirebilir.

    O örnekte html standartlarına pek dikkat etmediğimi söyleyeyim zaten bir önemi yoktu maksat çalışan elle tutulan birşey yapmaktı. Benden başka kullananı yoktu ayrıca bu anlamda da standartlara gerek yok.
  • 23-03-2013, 13:04:51
    #8
    Üyeliği durduruldu
    Kod fazlaligi gibi. Az ve oz yazmaktansa niye karmasik kodlar tercih edelim ki. Topu topu 3 satir bir tablo olusturmussun, 10 satir kod yazmissin. Abartmayalim hocam bence issizlikten yazilmis gereksiz ve anlamsiz bir kod parcasi.

    --R10.NET; Flood Engellendi -->-> Yeni yazılan mesaj 13:04:51 -->-> Daha önceki mesaj 12:57:57 --

    fatihsarac adlı üyeden alıntı: mesajı görüntüle
    @Deimosx hocam while içinde regex derken?

    verdiğin örnekteki sayfanın kaynak koduna baktım, <html><head> tag'ları öncesinde divler mevcut. bence bu tarz şeylerden önce html w3 standartlarını öğrenmek daha mantıklı olacaktır.
    mudurum sen her kodunda onlari kullaniyormusun? @Deimosx arkadas buraya ornek bir kod yazmis oturup kimsenin onlarin uzerine site kuracagini sanmiyorum.
  • 23-03-2013, 13:49:16
    #9
    Lütfen kullanmayı bilmediğiniz veya kullanmayı tercih etmediğiniz şeyler hakkında insanları yanıltıcı yorum yapmayalım.Bilgi paylaşıldığı zaman içerisinden olumlu birşeyler çıkarmaya çalışmakta fayda var unutmayın.
    Maksat kod kısaltmaksa aşağıdaki örneği normal PHP ve regex ilişkisi ile yazmayı dener misiniz, yalnız her fonksiyonu her parantezi iç içe sokmayacak şekilde.

      $adres = file_get_contents("http://adres.com/haber.html");
      $doc = phpQuery::newDocument($adres);
      phpQuery::selectDocument($doc);
      echo = pq('#haberDiv')->html();
    Durun ben sizin yerinize yazayım.

    $adres = file_get_contents("http://adres.com/haber.html");
    preg_match("#<div [^>]*id=['\"]haberDiv['\"](.*?)</div>#",$adres,$haber);
    echo $haber;
    Hangisini yazması daha kolay, ben regexp biliyorum peki herkes biliyor mu?

    Peki bu iş zincirlemeye gittiği zaman regex sizi kurtaracak mı? #haberDiv içerisinde ismi cismi belli olmayan elementleri almanız gerektiğinde nasıl alacaksınız? DOM kullanmayı acilen öğrenmenizi öneriyorum.

    İyi günler.