2010-10-19 28 views
1

J'essaie de créer un rapport personnalisé dans le back-end Magento; Ma stratégie consiste à faire en sorte que mon nouveau module imite la fonctionnalité Rapports/Ventes/Commandes existante dans le panneau d'administration, puis effectue les changements nécessaires une fois que j'ai vu comment les pièces s'emboîtent. J'ai ajouté mon nouvel élément de menu, et le module charge la mise en page d'administration de base et quelques fils d'Ariane, de sorte que la configuration du module et la configuration du contrôleur sont correctement configurées. Cependant, les blocs de mise en forme ne sont pas en cours de chargement. Voici le code du problème. Supposons que j'ai une copie du fichier de bloc correspondant à app/code/local/BULX/Rapports/Bloc/Rapport/Ventes/Ventes/Grid.php:Configuration de la mise en page Magento pour le nouveau module d'administration

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

Mon fichier de configuration a

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

Si je change le code pour

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

avec le fichier suivant app/code/local/BULX/Rapports/Bloc/Test.php

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

-je obtenir le même résultat: non à html 'sortie, pas de sortie de l'appel get_class

J'ai ajouté des déclarations de journaux comme suggéré ici: http://www.fontis.com.au/blog/magento/magento-debugging-loading-blocks-layouts-and-config-files

et il est clair de ce Magento est pas trouver des blocs de mise en page dans mon nouveau module. Les tutoriels d'Alan Storm sont généralement incroyablement utiles, mais je ne trouve pas ce dont j'ai besoin dans alanstorm.com/magento_admin_controllers (désolé pas assez de réputation pour avoir deux hyperliens); pour autant que je sache, j'ai configuré ma configuration de manière identique. Une difficulté est que la chaîne 'report_sales_sales.grid' n'apparaît nulle part - ces Grids apparaissent dans beaucoup d'endroits dans l'admin, et ils sont construits dynamiquement par une structure que je n'ai pas trouvée.

Qu'est-ce qui me manque? C'est Enterprise Edition, 1.8. Merci!

Répondre

4
  1. Astuce générale de débogage PHP, jamais "écho" au navigateur, toujours var_dump ($ var). Cela fera des choses intelligentes, comme imprimer réellement "faux" pour un faux booléen au lieu d'une chaîne vide, ce qui est ce qui se passe ici.

  2. Votre tentative pour obtenir le bloc nommé "report_sales_sales.grid" renvoie très probablement faux. C'est parce qu'un bloc de ce nom n'a pas été ajouté à The Layout.

  3. Je ne suis pas certain, mais je pense est un bloc par ce nom est ajouté quelque part dans la chaîne d'exécution a déclenché par la mise à jour de mise en page particulière dans app/design/adminhtml/default/default/layout/sales.xml

    store_ids created_at_order Date de création de la commande updated_at_order Order Upda ted Date report_type note La commande Mettre à jour le rapport de date est en temps réel et ne nécessite pas de rafraîchissement des statistiques.

Très probablement, le bloc nommé sales.report.grid.container (avec un URI adminhtml/report_sales_sales qui coresponds aux Mage_Adminhtml_Block_Report_Sales_Sales de classe) ajoute un sous-bloc (mais ne me citez pas que)

Le plus important étant que votre approche générale était bonne, mais vous n'avez pas assez copié. La requête à la page Magento s'exécute avec le handle Layout "adminhtml_report_sales_sales". Une requête sur votre page va se dérouler avec un Layout gérer quelque chose comme "adminhtml_report_index_sales", ce qui signifie que le bloc de mise en page ci-dessus n'est pas chargé dans le système. (Si cela n'a pas de sens, lire sur Layout Handles.)

Vous avez besoin soit

  1. Configurez votre module pour utiliser un fichier de mise en page personnalisée qui ajoute le bloc pour vos poignées

  2. utilisation local.xml pour faire la même chose que ci-dessus (mise en garde, je ne suis pas sûr local.xml est utilisé pour le système de mise en page Admin)

  3. Ajoutez de manière pragmatique les blocs nécessaires dans l'action de votre contrôleur.

+0

Un gestionnaire de disposition d'administration doit-il toujours commencer par adminhtml? Peut-être que c'est mon problème: mon handle va bulxreport_index_sales, mais peut-être qu'il devrait être adminhtml_bulxreport_index_sales. Cela ne semble pas fonctionner non plus, cependant. J'ai dû mettre cela de côté pendant quelques jours et je ne pourrai pas le remettre en place pour quelques autres, malheureusement – kevinpaulconnor

3

Vérifiez le fichier app/design/adminhtml/default/default/layout/sales.xml pour la section <adminhtml_report_sales_sales> - qui correspond à l'URL demandée. Il a un bloc de type "adminhtml/report_sales_sales" qui est un conteneur de grille, les conteneurs de grille créent automatiquement leur bloc de grille enfant. Le bloc manquant "report_sales_sales.grid" est donc créé avec un bloc "adminhtml/report_sales_sales" défini dans la mise en page. Comme votre page est neuve, son URL n'a pas encore de section correspondante dans un fichier XML de mise en page, donc pas de conteneur de grille, donc pas de grille. Copiez la section <adminhtml_report_sales_sales> du fichier sales.xml dans votre propre fichier de présentation et nommez-la en fonction de l'URL de votre page.

+0

Ok, cela a du sens. J'ai défini bulxreports.xml dans le module config et copié la section adminhtml_report_sales_sales, en le renommant bulxreports_index_sales, mais cela n'a eu aucun effet. Devrais-je renommer le paramètre qui passe à getBlock pour correspondre à l'URL? Que puis-je rechercher d'autre? – kevinpaulconnor

+0

Essayez d'installer LayoutViewer à partir de Alanstorm.com, qui vous indiquera quelles poignées de disposition sont dans la demande actuelle pour que vous travailliez avec. Ou son extension commercebug. –

+0

LayoutViewer est génial et je l'utilise régulièrement sur le frontal. Je ne savais pas que cela fonctionnait dans le panneau d'administration, merci. – kevinpaulconnor