Magento2 :ajouter un téléavertisseur dans une grille personnalisée au niveau du frontend

magento.stackexchange https://magento.stackexchange.com/questions/115116

  •  29-09-2020
  •  | 
  •  

Question

J'ai ajouté une grille dans le compte client et j'obtiens également la collecte. Mais lorsque je souhaite ajouter un téléavertisseur dans cette grille, cette fois-là, j'obtiens une erreur du type :

ÉTAT SQL[42S22] :Colonne introuvable :1054 Colonne inconnue 'main_table.attribute_id' dans 'field list', la requête était :SELECT COUNT(DISTINCT main_table.attribute_id) FROM custommodule_test COMME main_table OÙ (customer_id='2') {"is_exception":false} []

En fait, il n'y a aucun attribut_id déposé dans ma table et je ne filtre pas ce nom de fichier comme vous le voyez.

Jetez un coup d'oeil s'il vous plait :

test.phtml

<?php if ($block->getPagerHtml()): ?>
    <div class="order-products-toolbar toolbar bottom"><?php echo $block->getPagerHtml(); ?></div>
<?php endif; ?>

bloc/test.php

protected function _prepareLayout()
{
    parent::_prepareLayout();
    if ($this->getCollection()) {
        $pager = $this->getLayout()->createBlock(
            'Magento\Theme\Block\Html\Pager',
            'custom.collection.test'
        )->setCollection(
            $this->getCollection()
        );
        $this->setChild('pager', $pager);
        $this->getCollection()->load();
    }
    return $this;
}
public function getPagerHtml()
{
    return $this->getChildHtml('pager');
}

public function getCollection()
{
    if (!$this->getData('collection')) {
        $this->setCollection(
            $this->_objectMangaer->get('Namespace\Modulename\Model\Test')->getCollection()->addFieldToFilter('customer_id',2)
        );
    }
    return $this->getData('collection');
}

Veuillez noter :Si j'appelle directement

 $this->getCollection() ;
à partir du fichier phtml, j'ai obtenu une collection correcte.

Était-ce utile?

La solution

Pour répondre à cette exigence, nous avons suivi de nombreuses approches et trouvé la meilleure solution pour la pagination sur la collection personnalisée Magento2.Ici, nous allons expliquer la meilleure approche, veuillez suivre les étapes.

Note:En supposant que vous ayez créé un module de base dans Magento2.Ici, Ipragmatech est notre package et Ipreward est notre module.Veuillez modifier le nom de votre classe en conséquence.

Étape 1:Créez un contrôleur nommé Myrewad, action Index (Myreward/Index.php) et ajoutez le code suivant pour exécuter la méthode

<?php
  namespace Ipragmatech\Ipreward\Controller\Myreward;
  class Index extends \Magento\Framework\App\Action\Action
     {
        public function execute()
           {
               $this->_view->loadLayout();
               $this->_view->renderLayout();
           }
    }

Étape 2:Créez un bloc (en supposant que vous ayez déjà créé un modèle pour votre table.Ici, nous avons une table personnalisée et nous avons créé le modèle en tant que récompense) nommez Reward.php et ajoutez le code suivant.Dans ce code, nous avons ajouté le pager dans notre collection personnalisée.

<?php
namespace Ipragmatech\Ipreward\Block\Myreward;

use Ipragmatech\Ipreward\Block\BaseBlock;

class Reward extends BaseBlock
  {
/**
 * @var \Ipragmatech\Ipreward\Model\Reward
 */
protected $_rewardCollection;

/**
 * Reward constructor.
 * @param \Magento\Framework\App\Action\Context $context
 * @param \Ipragmatech\Ipreward\Model\Reward $rewardCollection
 */
public function __construct(
    \Ipragmatech\Ipreward\Block\Context $context,
    \Ipragmatech\Ipreward\Model\Reward $rewardCollection,
){
    $this->_rewardCollection = $rewardCollection;
    parent::__construct($context);
}

protected function _prepareLayout()
{

    parent::_prepareLayout();
    $this->pageConfig->getTitle()->set(__('My Reward History'));

    if ($this->getRewardHistory()) {
        $pager = $this->getLayout()->createBlock(
            'Magento\Theme\Block\Html\Pager',
            'reward.history.pager'
        )->setAvailableLimit(array(5=>5,10=>10,15=>15,20=>20))
            ->setShowPerPage(true)->setCollection(
            $this->getRewardHistory()
        );
        $this->setChild('pager', $pager);
        $this->getRewardHistory()->load();
    }
    return $this;
}

public function getPagerHtml()
{
    return $this->getChildHtml('pager');
}
/**
 * function to get rewards point transaction of customer
 *
 * @return reward transaction collection
 */
Public function getRewardHistory()
{
    //get values of current page
    $page=($this->getRequest()->getParam('p'))? $this->getRequest()->getParam('p') : 1;
    //get values of current limit
    $pageSize=($this->getRequest()->getParam('limit'))? $this->getRequest
    ()->getParam('limit') : 5;


    $collection = $this->_rewardCollection->getCollection();
    $collection->setPageSize($pageSize);
    $collection->setCurPage($page);
    $logger->info("Here reward collection: ".$collection->getSelect());
    $logger->info("Here reward collection: Page:".$page." Page size :"
        .$pageSize);
    return $collection;
}

} Étape 3:Ajout/Modification du code suivant sur le fichier de mise en page app/code/Ipragmatech/Ipreward/view/frontend/layout/ipreward_myreward_index.xml

  <?xml version="1.0"?>
  <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"               layout="2columns-left" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
    <update handle="customer_account"/>
      <body>
        <referenceContainer name="content">          
        <block class="Ipragmatech\Ipreward\Block\Myreward\Reward" name="myreward_reward" template="myreward/reward.phtml">
        </block>
       </referenceContainer>      
   </body>
 </page>

Étape 4:Ajoutez votre fichier phtml sous app/code/Ipragmatech/Ipreward/view/frontend/templates/myreward/reward.phtml et ajoutez le code suivant

enter image description here

et le résultat ressemblera à ceci

enter image description here

Parfois, nous avons été confrontés à un problème CSS dans lequel la limite de pages n'est pas affichée, alors utilisez le CSS suivant si vous rencontrez le même problème.

 .custom-pager .limiter{
      display: block !important;
  }

J'espère que cela vous aidera beaucoup.Veuillez nous faire savoir si vous rencontrez un problème concernant la personnalisation de Magento.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top