Что может вызвать ошибку PHP в операторе включения? - PullRequest
1 голос
/ 20 мая 2010

Хорошо, это была глупая ошибка. Я не имел ничего общего с разрешениями или чем-то еще, я думал, что это может быть. Это была простая синтаксическая ошибка в файле, который, я даже не думал, загружался.

Напоминает мне цитату из первого учителя информатики, который у меня когда-либо был:

"Если вы уверены, что весь ваш код верен, а программа не работает, значит, вы уверены, что это неправильно."

Извините за погоню за гусями.

Исходное сообщение:

У меня есть ошибка в моем PHP-коде, которая терроризирует меня уже несколько дней.

Я пытаюсь привязать новый модуль к существующему сайту Magento (v1.4), хотя я очень плохо знаком с фреймворком Magento. Я думаю, что я довольно близок к тому, чтобы "Hello, World" для блока, который я хочу отобразить в бэкэнде, но я получаю ошибку 500 при выборе пункта меню.

Мне удалось отследить его (используя echo stmts) до строки в файле Layout.php (app \ code \ core \ Mage \ Core \ Model \ Layout.php, строка 472ish):

        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>";
        }

Для моего блока это дает только «перед конструктором ...», так что я знаю, что это то, что терпит неудачу. Немного больше отладки показывает, что класс в $ block (новый блок, который я пытаюсь показать) не существует. Я ожидал, что функция __autoload позаботится об этом, но ни один из моих выводов в __autoload не отображается.

В качестве последнего шага я попытался включить оператор Mage.php в абсолютное местоположение класса блока, но до и после эхо-кода было похоже, что этот оператор включения становится прерывистой линией.

У меня возникает соблазн задуматься о «разрешениях», но я не очень разбираюсь в управлении сервером со всем этим, и у меня ограниченный доступ к тестовому серверу (тестовый сервер принадлежит клиенту).

Чтобы предвидеть вопрос: в лог-файле PHP нет сообщений об ошибках. На самом деле я не уверен, что этот сайт сообщает об ошибках в файл журнала (я ничего не видел с этого сайта), хотя клиент уверен, что все включено.

IIS 7. Интегрированный режим, я почти уверен. Кто-нибудь знает, что может быть причиной этого?

На вопросы Джо:

Имя блока FiveTalent_BikeCompat_Adminhtml_Block_Bikes .
Класс находится в файле [magento_root] \ app \ code \ local \ FiveTalent \ BikeCompat \ Adminhtml \ Block \ Bikes.php . Функция mageFindClassFile подтверждает, что находит файл для класса.

Я почти уверен, что правильно использую методы загрузки Magento. По общему признанию шаблон пути немного отличается от вашего примера, но я думаю, что это потому, что я пытаюсь создать блок Adminhtml. Это действие на выполняемом контроллере:

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

Снова я возвращаюсь к вопросу о том, имеет ли веб-сервер (в данном случае IIS) права на чтение файла. Я посмотрю, не смогу ли я достать кого-нибудь с доступом к серверу, чтобы проверить это.

Ответы [ 3 ]

0 голосов
/ 20 мая 2010

Ошибки в __autoload НЕ будут отображаться, evar. Вы в одиночестве в __autoload. Я бы серьезно проверил свою функцию __autoload. Я бы проверил ошибки на заглавные буквы, это может быть проблемой.

0 голосов
/ 20 мая 2010

Автозагрузчик Magento работает просто отлично. Пожалуйста, введите значение $ block и добавьте его к своему вопросу. Ваше имя блока, вероятно, будет соответствовать соглашению об именах: YourCompany_YourModule_Block_Some_Path. Если это не так, возможно, это ваша ошибка. Если это так, пожалуйста, убедитесь, что файл (очевидно, переключить путь в соответствии с вашим классом) app/code/local/YourCompany/YourModule/Block/Some/Path.php существует и содержит правильное объявление класса. Если это также так, убедитесь, что у Apache есть права на чтение этого файла.

Разобравшись с этой проблемой, вы можете рассмотреть возможность перехода к методам загрузки Magento. «Правильный» способ сделать это в Magento (при условии повторения указанного выше имени класса):

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

Использование загрузчика Magento избавит вас от многих неприятностей в будущем и позволит другим использовать ваш код Magento с большей уверенностью.

Надеюсь, это поможет!

Спасибо, Джо

0 голосов
/ 20 мая 2010

error_log директива конфигурации php может быть использована для установки пользовательского журнала ошибок
и log_errors один будет направлять туда все сообщения об ошибках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...