Настройка макета Magento для нового модуля администратора - PullRequest
1 голос
/ 19 октября 2010

Я пытаюсь создать собственный отчет в бэкэнде Magento; Моя стратегия состоит в том, чтобы сначала заставить мой новый модуль имитировать существующие функции отчетов / продаж / заказов в административной панели, а затем внести необходимые изменения, как только я увижу, как эти части сочетаются друг с другом. Я добавил свой новый пункт меню, и модуль загружает базовый макет администратора и несколько хлебных крошек, поэтому конфигурация модуля и конфигурация контроллера настроены достаточно правильно. Однако блоки макетов не загружаются. Вот код проблемы. Предположим, у меня есть копия файла соответствующего блока в app / code / local / BULX / Reports / Block / Report / Sales / Sales / Grid.php:

class BULX_Reports_IndexController extends Mage_Adminhtml_Report_SalesController { 

  public function salesAction {

  //...otherwise identical to parent class

  //should load reference to Grid block
  $gridBlock = $this->getLayout()->getBlock('report_sales_sales.grid');

  /* in original Mage module, will output Mage_Adminhtml_Block_Report_Sales_Sales_Grid
     in BULX_Report, outputs nothing. */
  echo get_class($gridBlock)."<br>";

Мой файл конфигурации имеет

<global>
  <blocks>
    <bulx_reports>
      <class>BULX_Reports_Block</class>
    </bulx_reports>
  </blocks>
  ...
</global>

Если я изменю код на

$gridBlock = $this->getLayout()->getBlock('bulx_reports/test');

со следующим файлом в app / code / local / BULX / Reports / Block / Test.php

class BULX_Reports_Block_Test extends Mage_Core_Block_Abstract
{
 protected function _toHtml() {
  echo 'to html';
 }
}

Я получаю тот же результат: нет вывода в HTML, нет вывода из вызова get_class

Я добавил записи журнала, как предложено здесь: http://www.fontis.com.au/blog/magento/magento-debugging-loading-blocks-layouts-and-config-files

и из этого ясно, что Magento не находит никаких блоков компоновки в моем новом модуле. Уроки Alan Storm, как правило, невероятно полезны, но я не могу найти то, что мне нужно, в alanstorm.com/magento_admin_controllers (извините, недостаточно репутации, чтобы иметь две гиперссылки); насколько я могу судить, я настроил свою конфигурацию идентично. Сложность в том, что строка report_sales_sales.grid нигде не появляется - эти сетки появляются во многих местах администратора, и они создаются динамически с помощью структуры, которую я не нашел.

Чего мне не хватает? Это Enterprise Edition, 1.8. Спасибо!

Ответы [ 2 ]

4 голосов
/ 20 октября 2010
  1. Общая подсказка по отладке PHP, никогда не "эхо" для браузера, всегда var_dump ($ var).Это будет делать умные вещи, такие как фактическая распечатка «ложь» для логического ложного вместо пустой строки, что, как я думаю, происходит здесь.

  2. Ваша попытка получитьблок с именем «report_sales_sales.grid», скорее всего, возвращает false.Это потому, что блок с этим именем не был добавлен в макет.

  3. Я не уверен, но я предполагаю, что блок с этим именем добавляется где-то в цепочке выполнения, установленной определенным обновлением макета в app/design/adminhtml/default/default/layout/sales.xml

    store_ids create_at_order Дата создания заказа updated_at_order Дата обновления заказа report_type note Отчет Дата обновления заказа в режиме реального времени, не требует обновления статистики.

Скорее всего, блок с именем sales.report.grid.container (с URI adminhtml/report_sales_sales, который соответствует классу Mage_Adminhtml_Block_Report_Sales_Sales) добавляет подблок (но не цитируйте меня об этом)

Суть в том, что ваш общий подход здесь был хорош, но вы недостаточно копировали.Запрос к странице Magento выполняется с дескриптором Layout "adminhtml_report_sales_sales".Запрос на вашу страницу будет выполняться с дескриптором Layout, что-то вроде «adminhtml_report_index_sales», что означает, что вышеуказанный блок макета не загружается в систему.(если это не имеет смысла, прочитайте Дескрипторы макетов .)

Вам необходимо

  1. Сконфигурировать свой модуль для использования пользовательского макетафайлы, которые добавляют блок для ваших дескрипторов

  2. Используйте local.xml, чтобы сделать то же самое, что и выше (предостережение, я не уверен, local.xml используется для системы макетов администратора)

  3. Прагматично добавьте необходимые блоки в действие вашего контроллера.

3 голосов
/ 19 октября 2010

Проверьте файл app/design/adminhtml/default/default/layout/sales.xml для раздела <adminhtml_report_sales_sales> - который соответствует запрошенному URL. Он имеет блок типа «adminhtml / report_sales_sales», который является контейнером сетки, контейнеры сетки автоматически создают свой дочерний блок сетки.

Таким образом, отсутствующий блок "report_sales_sales.grid" создается с помощью блока "adminhtml / report_sales_sales", определенного в макете. Поскольку ваша страница новая, у ее URL еще не будет соответствующего раздела в XML-файле макета, поэтому нет контейнера сетки, поэтому нет сетки. Скопируйте раздел <adminhtml_report_sales_sales> из sales.xml в свой собственный файл макета и назовите его так, чтобы он соответствовал URL вашей страницы.

...