2012-02-09 3 views
2

Я работаю над созданием того, что, как я надеюсь, когда-нибудь станет общедоступным расширением Magento (эта часть, которую я упоминаю, потому что для меня важно, что я делаю «правильную вещь» здесь). Одна из вещей, которые я хотел бы сделать, это добавить поле в панель инструментов Magento по умолчанию, в основном новую «коробку», точно такую ​​же, как «Top 5 Search Terms», за исключением моего собственного контента. Я хотел бы, чтобы мой новый пользовательский ящик был последним полем, которое отображается (в идеале).Каков правильный способ добавления пользовательской панели «панели» в бэкэнде Magento без редактирования шаблонов по умолчанию?

Проблема, с которой я сталкиваюсь, заключается в том, что шаблон, отвечающий за визуализацию панели, вызывает выделение определенных блоков, и эти блоки вложены внутри html. Другими словами, где часто есть область, где дочерние блоки будут отображены в хороший разумный элемент HTML, в этой ситуации оказывается, что отображаются определенные блоки. Вот содержание /app/design/adminhtml/default/default/template/dashboard/index.phtml

<div class="dashboard-container"> 
      <?php echo $this->getChildHtml('store_switcher') ?> 
      <table cellspacing="25" width="100%"> 
       <tr> 
        <td><?php echo $this->getChildHtml('sales') ?> 
         <div class="entry-edit"> 
          <div class="entry-edit-head"><h4><?php echo $this->__('Last 5 Orders') ?></h4></div> 
          <fieldset class="np"><?php echo $this->getChildHtml('lastOrders'); ?></fieldset> 
         </div> 
         <div class="entry-edit"> 
          <div class="entry-edit-head"><h4><?php echo $this->__('Last 5 Search Terms') ?></h4></div> 
          <fieldset class="np"><?php echo $this->getChildHtml('lastSearches'); ?></fieldset> 
         </div> 
         <div class="entry-edit"> 
          <div class="entry-edit-head"><h4><?php echo $this->__('Top 5 Search Terms') ?></h4></div> 
          <fieldset class="np"><?php echo $this->getChildHtml('topSearches'); ?></fieldset> 
         </div> 
        </td> 
        <td> 
         <div class="entry-edit" style="border:1px solid #ccc;"> 
          <?php echo $this->getChildHtml('diagrams') ?> 
          <?php if (is_array($this->getChild('diagrams')->getTabsIds())) : ?> 
           <div id="diagram_tab_content"></div> 
          <?php endif; ?> 
          <div style="margin:20px;"> 
           <?php echo $this->getChildHtml('totals') ?> 
          </div> 
          <div style="margin:20px;"> 
           <?php echo $this->getChildHtml('grids') ?> 
           <div id="grid_tab_content"></div> 
          </div> 
         </div> 
        </td> 
       </tr> 
      </table> 
     </div> 

Если бы я делал это в моем собственном магазине, я полагаю, что я мог бы достичь этого относительно легко путем редактирования базы Magento шаблон приборной панели index.phtml выше, добавить то, что мне нужно, чтобы мой блок визуализации, что-то вроде:

<div class="entry-edit"> 
    <div class="entry-edit-head"> 
     <h4><?php echo $this->__('Top 5 Search Terms') ?></h4></div> 
     <fieldset class="np"><?php echo $this->getChildHtml('myDashboardBox'); ?></fieldset> 
    </div> 
</div> 

Но это не мой собственный магазин, так что это не очень похоже на вариант.

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

0) Что-то очевидно, что я не вижу, что вы скажете, что это идеальное/правильное решение.

1) Могу (может быть?) уметь добавлять свой пользовательский блок внутри одного из этих других блоков в этой области ("topSearches "," sales "и т. д.) и сделать мой блок. Это не кажется очень «чистым»

2) Возможно, у меня есть блок, сделанный где-то еще на странице панели инструментов, а затем переместите его с помощью javascript в нужное место. Это было бы довольно легко, я предполагаю, но по понятным причинам чувствую себя очень «взломанным».

Есть ли у кого-нибудь отзывы о том, как это сделать, или ЕСЛИ есть способ? Имейте в виду, что я снова хочу опубликовать этот модуль, поэтому моя цель - сделать хорошую работу и сделать как можно меньше «взлома».

Спасибо вам большое за чтение!

+0

Я искал 0) решение уже довольно давно, но не повезло. Лучший метод, который я придумал до сих пор, - это наблюдать за рендерингом html, но он включает 'str_replace()', который никогда не выглядит очень чистым. Если вам интересно, я могу объяснить, как я это делаю. – OSdave

+0

Эй, спасибо за ответ OSdave! Я думаю, что могу представить, как может работать метод str_replace, но я бы, вероятно, включил это, поскольку мои другие решения были (очевидно) несколько «хакерскими». В настоящее время (и я потратил всего несколько часов на это, пытаясь понять это) мое личное лучшее решение, вероятно, является решением JS, просто потому, что у большинства людей будет JS, и я мог бы сделать поле в другом месте и иметь его выглядит нормально в случае, если JS не работает по какой-либо причине, но если он перемещает его туда, где он должен быть. Я надеюсь, что кто-то еще откроет мне глаза;) –

ответ

8

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

Сначала добавьте наблюдателя для событий core_block_abstract_prepare_layout_after и core_block_abstract_to_html_after.

<adminhtml> 
    <events> 
     <core_block_abstract_prepare_layout_after> 
      <observers> 
       <your_module> 
        <class>your_module/observer</class> 
        <method>coreBlockAbstractPrepareLayoutAfter</method> 
       </your_module> 
      </observers> 
     </core_block_abstract_prepare_layout_after> 
     <core_block_abstract_to_html_after> 
      <observers> 
       <your_module> 
        <class>your_module/observer</class> 
        <method>coreBlockAbstractToHtmlAfter</method> 
       </your_module> 
      </observers> 
     </core_block_abstract_to_html_after> 
    </events> 
</adminhtml> 

Эти два события отправляются для каждого блока, который конкретизируется и оказанной в Mage_Core_Block_Abstract. По моему опыту, это не такая проблема, использующая их в интерфейсе adminhtml, но на внешних наблюдателях для этих событий слишком много накладных расходов.

Возвращаясь к задаче, вам необходимо создать класс наблюдателя.

class Your_Module_Model_Observer 
{ 
    public function coreBlockAbstractPrepareLayoutAfter(Varien_Event_Observer $observer) 
    { 
     if (Mage::app()->getFrontController()->getAction()->getFullActionName() === 'adminhtml_dashboard_index') 
     { 
      $block = $observer->getBlock(); 
      if ($block->getNameInLayout() === 'dashboard') 
      { 
       $block->getChild('topSearches')->setUseAsDashboardHook(true); 
      } 
     } 
    } 

    public function coreBlockAbstractToHtmlAfter(Varien_Event_Observer $observer) 
    { 
     if (Mage::app()->getFrontController()->getAction()->getFullActionName() === 'adminhtml_dashboard_index') 
     { 
      if ($observer->getBlock()->getUseAsDashboardHook()) 
      { 
       $html = $observer->getTransport()->getHtml(); 
       $myBlock = $observer->getBlock()->getLayout() 
        ->createBlock('you_module/block') 
        ->setTheValuesAndTemplateYouNeed('HA!'); 
       $html .= $myBlock->toHtml(); 
       $observer->getTransport()->setHtml($html); 
      } 
     } 
    } 
} 

Ваш шаблон нужно будет приспособить для того, что вы вставляете родной брат <div> из внутри брата или сестры, но в противном случае вы должны быть хорошо.

</fieldset></div> 
<div class="entry-edit"> 
    <div class="entry-edit-head"><h4>Your Module</h4></div> 
    <fieldset class="np">Your Content 

Оставьте его в том, что, так как родительский шаблон будет закрывать <fieldset> и <div> для вас (уродливый, как черт, я знаю).

+0

Винай, как всегда, ты замечательный. Большое вам спасибо за ваш продуманный и хорошо сформированный ответ. Я, безусловно, вижу преимущества этого, «храбрый» бит заставляет меня немного съеживаться, но я полагаю, возможно, на данный момент это, вероятно, меньшее из двух зол! Любое понимание того, почему Magento, возможно, решил создать эти блоки как таковые? Я полагаю, что я не первый, кто захочет добавить свою собственную панель инструментов на бэкэнд ... Я знаю, что вкладки (где графики находятся на панели инструментов) более легко/«чисто» расширяемы/модифицируемы. Еще раз спасибо Винаи! –

+0

Я тоже задал себе тот же вопрос много раз. Я думаю, что это просто казалось хорошим способом сделать это в то время. Вероятно, сегодня он будет построен по-разному, с возможностью расширения. – Vinai

+0

Я думаю, мы все люди! Vielen herzlichen Dank! –