• 22-10-2014, 17:27:15
    #10
    loc adlı üyeden alıntı: mesajı görüntüle
    home.php dosyamda blocklarımı ayrı ayrı php dosyalarında barındırıp bunları anasayfaya çekmeye çalışıyorum. Fakat çektiğim dosyanın include 'block.php'; şeklinde görünmesini istemediğim için viewblock adlı bir fonksiyon yaptım ve örnek veriyorum
    <?= viewblock("newproducts"); ?>
    şeklinde yaptığım zaman bloğumu oraya çekmesini istedim. Fonksiyonum aşağıdaki gibi:

    fonksiyonum:

    if (!function_exists('viewblock'))
    {
       function viewblock($module)
       {
          $blockpath = "app/views/blocks/{$module}.php";
          return (include $blockpath);
       }
    }

    block kodlarım aşağıdaki gibi.


    <?php $np=0; foreach ($newproducts as $newproduct){ ?>
    	<section class="item news<?php if($np==0){ ?> active<?php } ?>">
    		<img src="<?= $newproduct['image']; ?>">
    		<div class="title">
    			<a href="/products/<?= $newproduct['id']; ?>/"><?= $newproduct['title']; ?></a>
    		</div>
    		<p><strong>Ürün Fiyatı:</strong> <?= $newproduct['price']; ?></p>
    		<a href="/products/<?= $newproduct['id']; ?>/" class="details">Detaylı Bilgi</a>
    	</section>
    <?php $np++; } ?>
    aldığım 2 hata:


    Notice: Undefined variable: newproducts in /Applications/XAMPP/xamppfiles/htdocs/proje/app/views/blocks/newproducts.php on line 10
    
    Warning: Invalid argument supplied for foreach() in /Applications/XAMPP/xamppfiles/htdocs/proje/app/views/blocks/newproducts.php on line 10

    fonksiyon kullanmak yerine php dosyasını direkt olarak include etsem herhangi bir problem yok. Niye burada hata veriyor anlam veremedim.


    Problem include edilen dosyanın içindeki $newproducts değişkeninin fonksiyon içinde tanımlanmamasından kaynaklanıyor.
    Fonksiyona modul ismi ile birlikte newproducts değişkenini de vermek gerekiyor.
    Mesela


    if (!function_exists('viewblock'))
    {
       function viewblock($module, $newproducts = '')
       {
          $blockpath = "app/views/blocks/{$module}.php";
          return (include $blockpath);
       }
    }


    <?php $np=0; foreach ($newproducts as $newproduct){ ?>
    	<section class="item news<?php if($np==0){ ?> active<?php } ?>">
    		<img src="<?= $newproduct['image']; ?>">
    		<div class="title">
    			<a href="/products/<?= $newproduct['id']; ?>/"><?= $newproduct['title']; ?></a>
    		</div>
    		<p><strong>Ürün Fiyatı:</strong> <?= $newproduct['price']; ?></p>
    		<a href="/products/<?= $newproduct['id']; ?>/" class="details">Detaylı Bilgi</a>
    	</section>
    <?php $np++; } ?>

    <?= viewblock("newproducts", $newproducts); ?>
    Global scope değişkeni local scope fonksiyon içinde çağıramazsınız. Ya çağıracağınız değişkeni fonksiyon içinde global olarak tanımlamanız, ya da fonksiyona vereceğiniz ek bir parametre ile fonksiyon içine aktarmanız lazım.
  • 22-10-2014, 17:36:41
    #11
    digiklan adlı üyeden alıntı: mesajı görüntüle
    Problem include edilen dosyanın içindeki $newproducts değişkeninin fonksiyon içinde tanımlanmamasından kaynaklanıyor.
    Fonksiyona modul ismi ile birlikte newproducts değişkenini de vermek gerekiyor.
    Mesela


    if (!function_exists('viewblock'))
    {
       function viewblock($module, $newproducts = '')
       {
          $blockpath = "app/views/blocks/{$module}.php";
          return (include $blockpath);
       }
    }


    <?php $np=0; foreach ($newproducts as $newproduct){ ?>
    	<section class="item news<?php if($np==0){ ?> active<?php } ?>">
    		<img src="<?= $newproduct['image']; ?>">
    		<div class="title">
    			<a href="/products/<?= $newproduct['id']; ?>/"><?= $newproduct['title']; ?></a>
    		</div>
    		<p><strong>Ürün Fiyatı:</strong> <?= $newproduct['price']; ?></p>
    		<a href="/products/<?= $newproduct['id']; ?>/" class="details">Detaylı Bilgi</a>
    	</section>
    <?php $np++; } ?>

    <?= viewblock("newproducts", $newproducts); ?>
    Global scope değişkeni local scope fonksiyon içinde çağıramazsınız. Ya çağıracağınız değişkeni fonksiyon içinde global olarak tanımlamanız, ya da fonksiyona vereceğiniz ek bir parametre ile fonksiyon içine aktarmanız lazım.
    1. sorum:

    Şimdi ben her blok eklemek istediğimde fonksiyona $newproducts='' gibi bir parametre tanımlamam gerekecek. Bunu bir standarda bağlamak için ne yapmam gerekir?

    2. sorum üstteki kodlarınız çalıştı bunun için teşekkür ederim fakat verdiği çıktıda bir de 1 şeklinde rakam çıktısı veriyor. Bu neyden kaynaklanıyor olabilir?
  • 22-10-2014, 19:35:03
    #12
    loc adlı üyeden alıntı: mesajı görüntüle
    1. sorum:

    Şimdi ben her blok eklemek istediğimde fonksiyona $newproducts='' gibi bir parametre tanımlamam gerekecek. Bunu bir standarda bağlamak için ne yapmam gerekir?

    2. sorum üstteki kodlarınız çalıştı bunun için teşekkür ederim fakat verdiği çıktıda bir de 1 şeklinde rakam çıktısı veriyor. Bu neyden kaynaklanıyor olabilir?
    fonksiyonu

    function viewblock($module, $newproducts = '') şeklinde tanımladık.
    Bu ikinci öğe opsiyonel demektir. yani sen newproducts diye ikinci bir parametre tanımlamazsan o fonksiyon içine boş olarak tanımlanacak ve devre dışı olacaktır.

    muhtemelen return ile hiç bir değer döndürmediğiniz için, fonksiyon içinde verilen çıktılarla 1 değerini döndürüyor. fonksiyon sorunsuz işlem yaparsa ve döndürdüğü tanımlanmış bir değer yoksa true ya da 1 değeri döndürebilir.

    fonksiyonu şu şekilde tanımlayın.

    if (!function_exists('viewblock'))
    {
    function viewblock($module, $newproducts = '')
    {
    $blockpath = "app/views/blocks/{$module}.php";
    if(include($blockpath) == TRUE){
    return TRUE;

    }else{
    return FALSE;
    }
    }
    }
  • 22-10-2014, 19:59:46
    #13
    digiklan adlı üyeden alıntı: mesajı görüntüle
    fonksiyonu



    function viewblock($module, $newproducts = '') şeklinde tanımladık.

    Bu ikinci öğe opsiyonel demektir. yani sen newproducts diye ikinci bir parametre tanımlamazsan o fonksiyon içine boş olarak tanımlanacak ve devre dışı olacaktır.



    muhtemelen return ile hiç bir değer döndürmediğiniz için, fonksiyon içinde verilen çıktılarla 1 değerini döndürüyor. fonksiyon sorunsuz işlem yaparsa ve döndürdüğü tanımlanmış bir değer yoksa true ya da 1 değeri döndürebilir.



    fonksiyonu şu şekilde tanımlayın.



    if (!function_exists('viewblock'))

    {

    function viewblock($module, $newproducts = '')

    {

    $blockpath = "app/views/blocks/{$module}.php";

    if(include($blockpath) == TRUE){

    return TRUE;



    }else{

    return FALSE;

    }

    }

    }

    1 çıktısı <?= dememden kaynaklanıyormuş. = i kaldırınca düzeldi ama opsiyonel dediğimiz değişkenin adı da değişecek. Mesela burada newproducts dedim başka yerde hotproducts veya newmembers diyebilirim. Sence burada sıkıntı oluşmaz mı? Fonksiyon için ($module, $source='') şeklinde bir tanımlama yapsak viewblock içinde tanımladığım değeri source değişkeninin algılamasını nasıl sağlayabilirim? Yani böyle bir yapı daha dinamik olur diye düşünüyorum.
  • 23-10-2014, 01:07:41
    #14
    loc adlı üyeden alıntı: mesajı görüntüle
    1 çıktısı <?= dememden kaynaklanıyormuş. = i kaldırınca düzeldi ama opsiyonel dediğimiz değişkenin adı da değişecek. Mesela burada newproducts dedim başka yerde hotproducts veya newmembers diyebilirim. Sence burada sıkıntı oluşmaz mı? Fonksiyon için ($module, $source='') şeklinde bir tanımlama yapsak viewblock içinde tanımladığım değeri source değişkeninin algılamasını nasıl sağlayabilirim? Yani böyle bir yapı daha dinamik olur diye düşünüyorum.
    o zaman
    ya modül içindeki dışarıdan gelen değişkeni hep aynı tutacaksın,
    ya da her modülün ilk satırına bir eşitleme satırı koyacaksın.

    eğer yeni modülde source olacaksa değişken
    ilk satırına
    $source = $newproducts; yazarsın olur biter.
  • 23-10-2014, 09:12:12
    #15
    digiklan adlı üyeden alıntı: mesajı görüntüle
    o zaman
    ya modül içindeki dışarıdan gelen değişkeni hep aynı tutacaksın,
    ya da her modülün ilk satırına bir eşitleme satırı koyacaksın.

    eğer yeni modülde source olacaksa değişken
    ilk satırına
    $source = $newproducts; yazarsın olur biter.
    Şimdi bu dediğinin çalışması için $source değişkenini viewblock fonksiyonunu çalıştırmadan önce eşitlemem lazım. Yani

    $source = $newproducts;
    viewblock('newproducts', $source);
    şeklinde yaparsam bir problem yok. Peki bunun olduğu sayfada bir blok daha tanımladığım zaman yine $source = $newmembers; gibi bir tanımlama yapmam gerekecek. Üstteki kodla çakışma olmaz mı?
  • 23-10-2014, 16:04:37
    #16
    loc adlı üyeden alıntı: mesajı görüntüle
    Şimdi bu dediğinin çalışması için $source değişkenini viewblock fonksiyonunu çalıştırmadan önce eşitlemem lazım. Yani

    $source = $newproducts;
    viewblock('newproducts', $source);
    şeklinde yaparsam bir problem yok. Peki bunun olduğu sayfada bir blok daha tanımladığım zaman yine $source = $newmembers; gibi bir tanımlama yapmam gerekecek. Üstteki kodla çakışma olmaz mı?
    eşitlemeyi modul dosyası içinde yapacaksın

    yani function

    if (!function_exists('viewblock'))

    {

    function viewblock($module, $source= '')

    {

    $blockpath = "app/views/blocks/{$module}.php";

    if(include($blockpath) == TRUE){

    return TRUE;



    }else{

    return FALSE;

    }

    }

    }


    modul dosyası

    <?php
    $newproducts = $source;
    $np=0; foreach ($newproducts as $newproduct){ ?>
    <section class="item news<?php if($np==0){ ?> active<?php } ?>">
    <img src="<?= $newproduct['image']; ?>">
    <div class="title">
    <a href="/products/<?= $newproduct['id']; ?>/"><?= $newproduct['title']; ?></a>
    </div>
    <p><strong>Ürün Fiyatı:</strong> <?= $newproduct['price']; ?></p>
    <a href="/products/<?= $newproduct['id']; ?>/" class="details">Detaylı Bilgi</a>
    </section>
    <?php $np++; } ?>

    ekstra bir parametre varsa fonksiyonun içine source değişkeniyle bunu gönder, sonra modül içinde bu değişken gerekliyse bunu modül içindeki değişkene eşitle.

    fonksiyon mantığınız tam olarak oturmamış hocam.
    fonksiyon dışarıya kapalı bir ortamdır, kendi değişken ve işlemlerine sahiptir.
    Fonksiyon içine dışarıdan istediğiniz değişkenleri sokar, istediğiniz işlemi yapar ve sonucu döndürürsünüz.
  • 23-10-2014, 16:21:20
    #17
    digiklan adlı üyeden alıntı: mesajı görüntüle
    eşitlemeyi modul dosyası içinde yapacaksın

    yani function

    if (!function_exists('viewblock'))

    {

    function viewblock($module, $source= '')

    {

    $blockpath = "app/views/blocks/{$module}.php";

    if(include($blockpath) == TRUE){

    return TRUE;



    }else{

    return FALSE;

    }

    }

    }


    modul dosyası

    <?php
    $newproducts = $source;
    $np=0; foreach ($newproducts as $newproduct){ ?>
    <section class="item news<?php if($np==0){ ?> active<?php } ?>">
    <img src="<?= $newproduct['image']; ?>">
    <div class="title">
    <a href="/products/<?= $newproduct['id']; ?>/"><?= $newproduct['title']; ?></a>
    </div>
    <p><strong>Ürün Fiyatı:</strong> <?= $newproduct['price']; ?></p>
    <a href="/products/<?= $newproduct['id']; ?>/" class="details">Detaylı Bilgi</a>
    </section>
    <?php $np++; } ?>

    ekstra bir parametre varsa fonksiyonun içine source değişkeniyle bunu gönder, sonra modül içinde bu değişken gerekliyse bunu modül içindeki değişkene eşitle.

    fonksiyon mantığınız tam olarak oturmamış hocam.
    fonksiyon dışarıya kapalı bir ortamdır, kendi değişken ve işlemlerine sahiptir.
    Fonksiyon içine dışarıdan istediğiniz değişkenleri sokar, istediğiniz işlemi yapar ve sonucu döndürürsünüz.
    Ben anlatamadım tam olarak. İstediğimiz değişkeni tanımladık. Tamam burada problem yok. Ama senin yapmış olduğun $newproducts = $source; eşitlemesi fonksiyon ile include etmeye çalıştığım dosyanın içinde. Yani bu direkt olarak fonksiyonun içinde olduğu için yine hata verecek ve ben mi yanlış düşünüyorum diye deneme yaptım veriyor zaten Demek istediğim bu değişkeni modülü çağırmadan eşitlemek. Yani

    $newproducts = $source;
    viewblock('newproducts', $source);
    Şeklinde çağırmam lazım ki fonksiyon içine sokacağım değişkeni fonksiyon çalışmadan önce tanımlamış olayım. Olay bundan sonra oluyor ve kafamı kurcalayan kısım şurası.

    1. Modül için üstteki kodu yazdım. Akabinde 2. bir modül daha çağıracağım.
    $newmembers = $source;
    viewblock('newmembers', $source);
    Yani son haliyle sayfamız şöyle oldu diyelim:

    <div class="sol">
    <?
    $newproducts = $source;
    viewblock('newproducts', $source);
    ?>
    </div>
    <div class="sag">
    <?
    $newmembers = $source;
    viewblock('newmembers', $source);
    ?>
    </div>

    Buradaki $source değişkenleri çakışmayacak mı? Aynı dosya içinde aynı değişkeni farklı iki değişkene atamaya çalışıyoruz. Benim beyin burada stop ediyor.
  • 23-10-2014, 16:45:39
    #18
    Hocam hala fonksiyon kavramın oturmamış.
    Benim söylediğim şekilde yapsaydın hata olmazdı.
    Sende fonksiyon kavramı henüz netleşmemiş.

    Bak şöyle anlatayım. Bir fonksiyon kaç değişkene göre hareket edecekse bu değişkenleri fonksiyonun içine aktarman lazım.

    Modül dosyasının ismi bir değişken, diğer değişkende çağırılan modül dosyasının içinde işleme girecek bir değişken varsa o.

    Değişken isimlerini anlamlı yazarsan sorun kalmaz.

    function viewblock($modul_ismi, $ekstra_parametre){


    }

    Şimdi sen burada fonksiyonu çağırırken ikinci değişken olarak $source da yazsan, $newproducts da yazsan fonksiyonun içine $ekstra_parametre olarak geçecek.

    Senin yapman gereken fonksiyonun içine geçen bu $eksta_parametre değişkenini modül içinde aynı isimle kullanmak, ya da başka bir değişken kullanıyorsan ona eşitlemek.

    İlk mesajına göre kodları yeniden yazıyorum.


    if (!function_exists('viewblock'))
    {
       function viewblock($module, $ekstra_parametre= '')
       {
          $blockpath = "app/views/blocks/{$module}.php";
          return (include $blockpath);
       }
    }

    <?php 
    $newproducts = $ekstra_parametre;
    $np=0; foreach ($newproducts as $newproduct){ ?>
    	<section class="item news<?php if($np==0){ ?> active<?php } ?>">
    		<img src="<?= $newproduct['image']; ?>">
    		<div class="title">
    			<a href="/products/<?= $newproduct['id']; ?>/"><?= $newproduct['title']; ?></a>
    		</div>
    		<p><strong>Ürün Fiyatı:</strong> <?= $newproduct['price']; ?></p>
    		<a href="/products/<?= $newproduct['id']; ?>/" class="details">Detaylı Bilgi</a>
    	</section>
    <?php $np++; } ?>
    <?pgp echo viewblock("newproducts", $newproducts); ?>