Ne include deyimi üzerinde bir PHP hatası neden olabilir?

1 Cevap php

Tamam, bu aptalca bir hataydı. Ben bunun olabileceğini düşündüm izinleri veya başka bir şey ile ilgisi yoktu. Ben bile düşünmüyordu bir dosyada basit bir sözdizimi hatası yüklenen oldu.

Şimdiye kadar ilk bilgisayar bilimleri öğretmeni bir alıntı hatırlatıyor:

"Eğer tüm kodu doğru eminseniz ve program bir şey işe yaramazsa belirli bir yanlış vardır."

Kaz kovalamak için üzgünüm.

Original Post:

Şimdi birkaç gündür beni terörize ediyor benim PHP kodunda bir hata var.

Ben Magento çerçeve çok yeni değilim ama ben, varolan Magento (v1.4) siteye yeni bir modül toka çalışıyorum. Ben backend görüntülenmesini istediğiniz bir blok üzerinde "Dünya, Merhaba" almak oldukça yakın olduğumu düşünüyorum, ama menü öğesi seçildiğinde 500 hatası alıyorum.

Ben Layout.php dosyası (app \ code \ core \ Mage \ Core \ Model \ Layout.php, hat 472ish) bir satıra (eko stmts kullanarak) izini başardı:

        if (class_exists($block, false) || mageFindClassFile($block)) {
            $temp = $block;
            echo "<p>before constructor: $temp</p>";
            $block = new $block($attributes);
            echo "<p>after constructor: $temp</p>";
        }

Benim blok için, bu "... kurucusuna önce" sadece verir, bu yüzden bu başarısız ne olduğunu biliyorum. Biraz daha fazla hata ayıklama $ bloğun (I göstermeye çalışıyorum yeni bloğu) sınıf yok olduğunu ortaya koymaktadır. Ben __ özdevinimli_yükle işlevi bu dikkat çekmek için umuyordum, ama __ autoload benim yansımaları, hiçbiri görüntüleniyor.

Bir son dakika çabası olarak, ben blok sınıfının mutlak konuma Mage.php bir include deyimi çalıştı, ancak benzer önce ve sonra yankılanırken include deyimi o kırılma hattı haline gelir ortaya.

Ben "izinleri" düşünmeye başlamak için cazip, ama ben de tüm bu sunucu yönetimi tarafında tecrübeli değilim, ve ben (test sunucusu istemciye ait) sınama sunucusuna erişim sınırlıdır.

Soruyu tahmin: PHP günlük dosyasında bildirilen hiçbir hata vardır. Aslında müşteri her şeyin açık olduğunu belli olmasına rağmen bu site, (ben bu siteden bir şey görmedim) günlük dosyası hataları raporlama ikna değilim.

IIS 7. Entegre modu, ben eminim. Herkes bu neden olabilir biliyor musun?

Per Joe's questions:

The name of the block is FiveTalent_BikeCompat_Adminhtml_Block_Bikes.
The class is in the file [magento_root]\app\code\local\FiveTalent\BikeCompat\Adminhtml\Block\Bikes.php. The mageFindClassFile function confirms that it finds the file for the class.

I'm pretty sure I am using Magento's loading methods properly. Admittedly the path pattern is a little different from your example, but I think this is because I am trying to create an Adminhtml block. This is the action on the controller that is executing:

public function indexAction() {
    $this->loadLayout();
    $block = $this->getLayout()->createBlock('adminhtml/bikes', 'bikecompat');
    $this->_addContent($block);
    $this->renderLayout();
}

Again, I'm back to the question of the webserver (IIS, in this case) having rights to read the file. I'll see if I can't get hold of someone with access to the server to check this.

1 Cevap

Magento autoloader gayet güzel çalışıyor. $ Blok değerini yankı ve soru olduğunu ekleyiniz. Sizin blok adı muhtemelen adlandırma kuralını takip edecektir: YourCompany_YourModule_Block_Some_Path. Değil durum, bu muhtemelen hatadır. Bu durumda, emin olun dosyası (besbelli, sınıf maç için geçiş yolu) app/code/local/YourCompany/YourModule/Block/Some/Path.php var ve sağ sınıf bildirimi içeren olun. Bu da doğruysa, Apache bu dosyayı okumak için haklarına sahip olduğundan emin olun.

Eğer bu sorunu çözdüğün sonra, Magento'nın yükleme yöntemleri üzerinde hareket düşünebilirsiniz. (Yine yukarıdaki classname varsayarak) Magento bunu "doğru" yolu:

<?php
Mage::getLayout()->createBlock("yourmodule/some_path");

Magento yükleyici kullanarak size daha sonra yolda bir sürü sorun kaydedebilirsiniz, ve diğerleri daha güvencesi ile Magento kodu kullanmak için izin verecektir.

Umarım ki olur!

Thanks, Joe