Home > Magento > Code > Magento 2 : KONSEP MODULE

Magento 2 : KONSEP MODULE

DASAR-DASAR MVC MAGENTO

Magento 2 menggunakan arsitektur MVC -> Model, View, Controller

Dimana Model View Controller (MVC) merupakan suatu konsep yang memisahkan pengembangan aplikasi berdasarkan komponen utama yang membangun sebuah aplikasi seperti manipulasi data, user interface dan bagian yang menjadi kontrol aplikasi.

Model : biasanya berhubungan langsung dengan database untuk memanipulasi data (insert, update, delete, search) dan menangani validasi dari bagian controller, namun tidak dapat berhubungan langsung dengan bagian view.

View : merupakan bagian yang menangani presentation logic. Pada suatu aplikasi web bagian ini biasanya berupa file template HTML yang diatur oleh controller. View berfungsi untuk menerima dan merepresentasikan data kepada user. Bagian ini tidak memiliki akses langsung terhadap bagian model.

Controller : merupakan bagian yang mengatur hubungan antara bagian model dan bagian view. Berfungsi untuk menerima request dan data dari user kemudian menentukan apa yang akan diproses oleh aplikasi.

Berikut bagan ilustrasinya :

Struktur dalam membuat suatu model adalah :

Block : adalah bagian dari ViewModel. Tempat untuk memanggil template

Controller : bertanggung jawab untuk menangani proses pengguna saat berinteraksi dengan sistem

etc : Konfigurasi file XML-dimana modul mendefinisikan dirinya dan bagian-bagiannya (routes, models, blocks, observers, dan tugas cron) di dalam folder ini.

Model : untuk Models dan ResourceModels

Setup : tempatnya kelas Migrasi (Migration classes), bertanggung jawab atas skema dan pembuatan data

view : tempat file Layout (XML) dan file template (PHTML) untuk aplikasi/menampilkan di front-end dan admin

Akses data dalam Magento 2 melalui beberapa cara :

  • Models
  • Resource Models : adalah data mappers untuk struktur penyimpanan
  • Collections : merangkum kumpulan model dan fungsionalitas terkait, seperti penyaringan (filtering), pemilahan (sorting), dan paging

Bagannya seperti berikut :

Dependency injection (DI)

adalah pola desain yang memungkinkan objek A untuk menyatakan dependensinya ke objek eksternal B yang memasok dependensi tersebut.

Simplenya adalah memanggil class B pada Class A

Referensi :

http://devdocs.magento.com/guides/v2.2/extension-dev-guide/depend-inj.html

Untuk contoh-contohnya bisa dilihat di :

https://alanstorm.com/magento2_dependency_injection_2015/

 

DASAR-DASAR PEMBUATAN MODULE

Untuk membuat sebuah modul pertama-tama kita harus mendaftarkan dulu module kita.

Buat file registration.php di folder root module.

Dalam hal ini contohnya :

app\code\Andi\News\

isinya :

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Andi_News',
    __DIR__
);

Kemudian didaftarkan dan dibuat versinya di module.xml dalam folder :

app\code\Andi\News\etc\

yang isinya :

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
  <module name="Andi_News" setup_version="1.0.0" data_version="1.0.0" />
</config>

Untuk tampilannya kita harus membuat routes.xml di folder :

app\code\Andi\News\etc\frontend\

dengan isi :

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
  <router id="standard">
    <route id="news" frontName="news">
      <module name="Andi_News"/>
    </route>
  </router>
</config>

Dimana router id ada 2.

router id=”standard” digunakan di frontend

router id=”admin” digunakan di admin

Kemudian kita persiapkan Modul-nya.

Buat file News.php di folder : app\code\Andi\News\Model\

Yang isinya :

<?php
namespace Andi\News\Model;
use Magento\Framework\Model\AbstractModel;
class News extends \Magento\Framework\Model\AbstractModel
{
    protected function _construct()
    {
        $this->_init('Andi\News\Model\ResourceModel\News');
    }
}

Kita akan memanggil tabel melalui file News.php di folder :

app\code\Andi\News\Model\ResourceModel\

Yang isinya :

<?php
namespace Andi\News\Model\ResourceModel;
use \Magento\Framework\Model\ResourceModel\Db\AbstractDb;
class News extends AbstractDb
{
    protected function _construct()
    {
        $this->_init('news', 'news_id');
    }
}

Dimana news adalah nama tabel dan news_id adalah kolom primary key

Buat file Collection.php di folder : app\code\Andi\News\Model\ResourceModel\News\

Isinya :

<?php
namespace Andi\News\Model\ResourceModel\News;
use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
class Collection extends AbstractCollection
{
    protected function _construct()
    {
        $this->_init(
            'Andi\News\Model\News',
            'Andi\News\Model\ResourceModel\News'
        );
    }
}

Buat file News.php di folder : app\code\Andi\News\Block\

Isinya :

<?php
namespace Andi\News\Block;
use Magento\Framework\View\Element\Template\Context;
use Magento\Framework\View\Element\Template;
class News extends \Magento\Framework\View\Element\Template
{
  public function __construct(
    \Magento\Backend\Block\Template\Context $context,
    array $data = []
  )
  {
    parent::__construct($context, $data);
  }
  public function getNews()
  {
    return 'News';
  }
  public function getNewsCollection()
  {
    $newsCollection = $this->model->getCollection();
    return $newsCollection;
  }
}

Nama Class harus sama dengan nama file.

Contoh dalam hal ini nama file adalah News.php maka class-nya menjadi Class News.

Kita buat Index.php di folder : app\code\Andi\News\Controller\Index\

Isinya :

<?php
namespace Andi\News\Controller\Index;
use \Magento\Framework\App\Action\Action;
use \Magento\Framework\View\Result\PageFactory;
use \Magento\Framework\View\Result\Page;
use \Magento\Framework\App\Action\Context;
use \Magento\Framework\Exception\LocalizedException;
class Index extends Action
{
    protected $resultPageFactory;
    public function __construct(
        Context $context,
        PageFactory $resultPageFactory
    )
    {
        parent::__construct($context);
       $this->resultPageFactory = $resultPageFactory;
    }
    public function execute()
    {
        $resultPage = $this->resultPageFactory->create();
        return $resultPage;
    }
}

Untuk melakukan pemasangan module kita buat Schema.

Buat file InstallSchema.php di folder : app\code\Andi\News\Setup\

Dimana file ini bertanggungjawab mengatur installasi.

Termasuk di dalamnya struktur database.

Isinya :

<?php
namespace Andi\News\Setup;
use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use \Magento\Framework\DB\Ddl\Table;
class InstallSchema implements InstallSchemaInterface
{
    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $installer = $setup;
        $installer->startSetup();
        $table_andi_news = $setup->getConnection()
            ->newTable($setup->getTable('news'))
            ->addColumn(
                'news_id',
                \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
                null,
                ['identity' => true, 'unsigned' => true, 'nullable' => false,'primary' => true],
                'Entity ID'
            )
            ->addColumn(
                'content',
                \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                null,
                [],
                'Content'
            )
            ->addColumn(
                'date',
                \Magento\Framework\DB\Ddl\Table::TYPE_DATE,
                null,
                [],
                'Date'
            )
            ->addColumn(
                'author',
                \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                null,
                [],
                'Author'
            );
        $setup->getConnection()->createTable($table_andi_news);
        $setup->endSetup();
    }
}

INPUT DATA KE TABEL

Jika ingin menginstal data ke tabel yang telah dibuat, perlu menggunakan file InstallData.php.

Buat di folder : app\code\Andi\News\Setup\

Isinya :

<?php
namespace Andi\News\Setup;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
class InstallData implements InstallDataInterface
{
  private $newsFactory;
  public function __construct(
    \Andi\News\Model\NewsFactory $newsFactory
  )
  {
    $this->newsFactory = $newsFactory;
  }
  public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
  {
    $setup->startSetup();
    $tableName = $setup->getTable('news');
    $newsData = [
      [
        'content' => 'Isi Konten A',
        'date'      => date('Y-m-d H:i:s'),
        'author'  => 'Andi'
      ],
      [
        'content' => 'Isi Konten B',
        'date'      => date('Y-m-d H:i:s'),
        'author'  => 'Bagus'
      ],
    ];
    $newsModel = $this->newsFactory->create();
    foreach ($newsData as $data) {
      $newsModel->setData($data)->save();
    }
    $setup->endSetup();
  }
}

Jalankan :

php bin/magento setup:upgrade

php bin/magento setup:di:compile

php bin/magento cache:clean

php bin/magento cache:flush

Tabel akan terbentuk

Data masuk ke dalam tabel

Untuk menampilkannya di frontend harus dibuat file layout dan template-nya.

Buat file news_index_index.xml untuk layout di folder :

app\code\Andi\News\view\frontend\layout\

Isinya :

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <head>
        <title>
            Magento 2 News Module
        </title>
    </head>
    <body>
        <referenceContainer name="content">
             <block class="Magento\Framework\View\Element\Text" name="news.text">
                <action method="addText">
                    <argument name="text" xsi:type="string">Tes Text Layout</argument>
                </action>
            </block>
            <block class="Magento\Framework\View\Element\Messages" name="news.messages">
                <action method="addWarning">
                    <argument name="text" xsi:type="string"><![CDATA[<p>Danger</p>]]></argument>
                </action>
            </block>
            <block class="Andi\News\Block\News" name="news" template="Andi_News::news.phtml" cacheable="false"/>
        </referenceContainer>
    </body>
</page>

Beberapa class yang bisa digunakan bisa dilihat di :

vendor\magento\framework\View\Element

seperti :

vendor\magento\framework\View\Element\Text.php

dimana di dalamnya terdapat fungsi-fungsi seperti :

addText, _toHtml dan lainnya

vendor\magento\framework\View\Element\Messages.php

dimana di dalamnya terdapat fungsi-fungsi seperti :

addMessage, addError, addWarning, addNotice, addSuccess dan lainnya

Tampilannya akan seperti :

Dan file template news.phtml di folder : app\code\Andi\News\view\frontend\templates\

Isinya :

<style>
    table {font-family: arial, sans-serif;  border-collapse: collapse;  width: 60%;  margin-top: 30px !important; margin: 0 auto;}
    td, th {border: 1px solid #dddddd;  text-align: left;  padding: 8px;} table th {text-align: center !important;}
    tr:nth-child(even) {background-color: #dddddd;}
    .news-id{width:2%} .news-content{width:20%} .news-date{width:15%} tr .news-date{text-align: center;} .news-author{width: 20%}
</style>
<table>
  <tr>
    <th class="news-id">ID</th>
    <th class="news-content">Isi</th>
    <th class="news-date">Tanggal</th>
    <th class="news-author">Penulis</th>
  </tr>
    <?php
        foreach ($block->getNewsCollection() as $key=>$news){
            echo '<tr>
                    <td>'.$news->getNewsId().'</td>
                    <td>'.$news->getContent().'</td>
                    <td class="news-date">'.$news->getDate().'</td>
                    <td>'.$news->getAuthor().'</td>
                  </tr>';
        }
    ?>
</table>

Hasilnya menjadi seperti :

UPDATE DATA

Pada saat magento upgrade perlu perubahan versi baik untuk schema maupun data.

Perubahan versi bisa dilakukan melalui perubahan versi di file module.xml yang ada di folder :

app\code\Andi\News\etc\module.xml

Maupun melalui table setup_module

Kemudian kita akan menambahkan satu tabel baru yaitu tabel Author.

Untuk mengakses database kita perlu Model.

1 Model untuk 1 akses ke tabel.

Dalam contoh ini, untuk mengakses table author diperlukan Model untuk author.

File Author.php di dalam folder : app\code\Andi\News\Model\Author.php

Isinya :

<?php
namespace Andi\News\Model;
use Magento\Framework\Model\AbstractModel;
class Author extends \Magento\Framework\Model\AbstractModel
{
    protected function _construct()
    {
        $this->_init('Andi\News\Model\ResourceModel\Author');
    }
}

Dan file Author.php  di folder app\code\Andi\News\Model\ResourceModel\untuk mengakses tabel.

Isinya :

<?php
namespace Andi\News\Model\ResourceModel;
use \Magento\Framework\Model\ResourceModel\Db\AbstractDb;
class Author extends AbstractDb
{
    protected function _construct()
    {
        $this->_init('author', 'author_id');
    }
}

Kemudian dibuat file Collection.php di dalam folder :

app\code\Andi\News\Model\ResourceModel\Author\Collection.php

Isinya :

<?php
namespace Andi\News\Model\ResourceModel\Author;
use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
class Collection extends AbstractCollection
{
    protected function _construct()
    {
        $this->_init(
            'Andi\News\Model\Author',
            'Andi\News\Model\ResourceModel\Author'
        );
    }
}

Penambahan tabel author ini dilakukan melalui UpgradeSchema dan UpgradeData.

Isi file UpgradeSchema.php di folder app\code\Andi\News\Setup\:

<?php
namespace Andi\News\Setup;
use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use \Magento\Framework\DB\Ddl\Table;
class UpgradeSchema implements UpgradeSchemaInterface
{
    public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup();
        $connection = $setup->getConnection();
        $table_andi_news = $setup->getConnection()
            ->newTable($setup->getTable('author'))
            ->addColumn(
                'author_id',
                \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
                null,
                ['identity' => true, 'unsigned' => true, 'nullable' => false,'primary' => true],
                'Author ID'
            )
            ->addColumn(
                'author_name',
                \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                null,
                [],
                'Author Name'
            );
        $setup->getConnection()->createTable($table_andi_news);
        $setup->endSetup();
    }
}

Isi file UpgradeData.php di folder app\code\Andi\News\Setup\:

<?php
namespace Andi\News\Setup;
use Magento\Framework\Setup\SetupInterface;
use Magento\Framework\Setup\UpgradeDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Store\Model\ScopeInterface;
class UpgradeData implements UpgradeDataInterface
{
  private $authorFactory;
  public function __construct(
    \Andi\News\Model\AuthorFactory $authorFactory
  )
  {
    $this->authorFactory = $authorFactory;
  }
  public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
  {
    $setup->startSetup();
    $tableName = $setup->getTable('author');
    $newsData = [
      [
      'author_name'  => 'Andi'
      ],
      [
      'author_name'  => 'Bagus'
      ],
    ];
    $newsModel = $this->authorFactory->create();
    foreach ($newsData as $data) {
      $newsModel->setData($data)->save();
    }
    $setup->endSetup();
  }
}

Pada saat UpradeSchema dan UpgradeData perlu dilakukan pengecekan versi secara otomatis.

Menambahkan kode :

if (version_compare($context->getVersion(), '1.0.1') < 0)

sehingga code nya menjadi :

if (version_compare($context->getVersion(), '1.0.1') < 0) {
    $table_andi_news = $setup->getConnection()
    ->newTable($setup->getTable('author'))
    ->addColumn(
        'author_id',
        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
        null,
        ['identity' => true, 'unsigned' => true, 'nullable' => false,'primary' => true],
        'Author ID'
    )
    ->addColumn(
        'author_name',
        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
        null,
        [],
        'Author Name'
    );
}

Pada saat pembuatan tabel baru juga perlu dicek apakah tabel tersebut sudah ada atau belum melalui code :

if ($installer->getConnection()->isTableExists($tableName) != true)

sehingga codenya menjadi :

if (version_compare($context->getVersion(), '1.0.1') < 0) {
    if ($installer->getConnection()->isTableExists($tableName) != true) {
        $table_andi_news = $setup->getConnection()
            ->newTable($setup->getTable('author'))
            ->addColumn(
                'author_id',
                Table::TYPE_INTEGER,
                null,
                ['identity' => true, 'unsigned' => true, 'nullable' => false,'primary' => true],
                'Author ID'
            )
            ->addColumn(
                'author_name',
                Table::TYPE_TEXT,
                null,
                [],
                'Author Name'
            );
    }
}

Dan code file UpgradeSchema.php menjadi :

<?php
namespace Andi\News\Setup;
use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\DB\Adapter\AdapterInterface;
use \Magento\Framework\DB\Ddl\Table;
class UpgradeSchema implements UpgradeSchemaInterface
{
    public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $installer = $setup->startSetup();
        if (version_compare($context->getVersion(), '1.0.1') < 0)
        {
            $tableName = $installer->getTable('author');
            if ($installer->getConnection()->isTableExists($tableName) == true) {
                $table = $installer->getConnection()
                    ->newTable($tableName)
                    ->addColumn(
                        'author_id',
                        Table::TYPE_INTEGER,
                        null,
                        ['identity' => true, 'unsigned' => true, 'nullable' => false,'primary' => true],
                        'Author ID'
                    )
                    ->addColumn(
                        'author_name',
                        Table::TYPE_TEXT,
                        null,
                        [],
                        'Author Name'
                    );
                $installer->getConnection()->createTable($table);
            }
        }
        if (version_compare($context->getVersion(), '1.0.2') < 0) {
            $tableName = $installer->getTable('news');
            if ($installer->getConnection()->isTableExists($tableName) == true)
            {
                $installer->getConnection()->changeColumn(
                    $tableName,
                    'author',
                    'author_id',
                    [
                        'type' => Table::TYPE_INTEGER,
                        'length' => 10,
                        'comment' => 'Author ID'
                    ]
                );
            }
        }
        if (version_compare($context->getVersion(), '1.0.3') < 0) {
            $tableName = $installer->getTable('author');
            if ($installer->getConnection()->isTableExists($tableName) == true)
            {
                $email = $installer->getConnection()->addColumn(
                        $tableName,
                        'author_email',
                        Table::TYPE_TEXT,
                        null,
                        [],
                        'Author Email'
                    );
            }
        }
        $installer->endSetup();
    }
}

Begitu pula file UpgradeData.php dilakukan cek versi secara otomatis.

Sehingga code file UpgradeData.php menjadi :

<?php
namespace Andi\News\Setup;
use Andi\News\Model\Author;
use Andi\News\Model\AuthorFactory;
use Magento\Framework\Setup\SetupInterface;
use Magento\Framework\Setup\UpgradeDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Store\Model\ScopeInterface;
class UpgradeData implements UpgradeDataInterface
{
  private $authorFactory;
  public function __construct(AuthorFactory $authorFactory)
  {
    $this->authorFactory = $authorFactory;
  }
  private function createPage()
  {
    return $this->pageFactory->create();
  }
  public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
  {
    $setup->startSetup();
    if (version_compare($context->getVersion(), '1.0.1', '<')) {
      $newsData = [
        ['author_name'  => 'Author A'],
        ['author_name'  => 'Author B'],
      ];
      foreach ($newsData as $data) {
        $newsModel = $this->authorFactory->create();
        $newsModel->setData($data)->save();
      }
    }
     if (version_compare($context->getVersion(), '1.0.2', '<')) {
      $authorData = [
        ['author_name'=>'Author A', 'author_email' => 'author.a@gmail.com'],
        ['author_name'=>'Author B', 'author_email' => 'author.b@gmail.com'],
      ];
      foreach ($authorData as $dataauthor) {
        $authorModel = $this->authorFactory->create();
        $authorModel->setData($dataauthor)->save();
      }
     }
     $setup->endSetup();
  }
}

Untuk memasukkan data ke dalam tabel ataupun melakukan perubahan pada tabel seperti nama kolum, tipe kolom dan lainnya, jangan lupa versi modul harus dirubah.

Ada 2 hal yang harus dirubah yaitu :

File module.xmldi folder : app\code\Andi\News\etc\:

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
  <module name="Andi_News" setup_version="1.0.3" data_version="1.0.2"/>
</config>

setup_version=”1.0.3″ adalah versi terbaru untuk Schema

data_version=”1.0.2″ adalah versi terbaru untuk Data

Versi di tabel setup_module harus sama dengan di module.xml sebelum melakukan setup:upgrade

JOIN TABEL

Mencoba menggabungkan tabel News dengan tabel Author

Tabel News

Tabel Author

Query penggabungan :

SELECT `main_table`.*, `author`.* FROM `news` AS `main_table`

INNER JOIN `author` ON main_table.author_id = author.author_id

Hasil query tersebut :

Hasil yang diinginkan :

Sehingga hasil akhirnya seperti :

File News.php di folder app\code\Andi\News\Block\menjadi :

<?php
namespace Andi\News\Block;
use Magento\Framework\View\Element\Template\Context;
use Magento\Framework\View\Element\Template;
class News extends \Magento\Framework\View\Element\Template
{
  protected $_newsFactory;
  public function __construct(Context $context,
    \Andi\News\Model\NewsFactory $newsFactory,
    \Magento\Framework\App\ResourceConnection $Resource,
    array $data = []
  )
  {
    $this->_newsFactory = $newsFactory;
    $this->_resource = $Resource;
    parent::__construct($context, $data);
  }
  public function getNews()
  {
    return 'News';
  }
  public function getNewsCollection()
  {
    return $this->_newsFactory->create()->getCollection();
  }
  public function getJoinData()
  {
      $table_author = $this->_resource->getTableName('author');
      $collection = $this->_newsFactory->create()->getCollection();
      $collection->getSelect()
                 ->join(array('author' => $table_author),
                                             'main_table.author_id = author.author_id');
      //echo $collection->getSelect()->__toString();
      return $collection;
  }
}

File news.phtml di folder app\code\Andi\News\view\frontend\templates\menjadi :

<style>
  table {font-family: arial, sans-serif;  border-collapse: collapse;  width: 60%;  margin-top: 30px !important; margin: 0 auto;} td, th {border: 1px solid #dddddd;  text-align: left;  padding: 8px;} table th {text-align: center !important;}
  tr:nth-child(even) {background-color: #dddddd;} .news-id{width:2%} .news-content{width:20%} .news-date{width:15%} tr .news-date{text-align: center;} .news-author{width: 20%} .page-title-wrapper{text-align: center;}
</style>
<table>
  <tr>
    <th class="news-id">ID</th>
    <th class="news-content">Isi</th>
    <th class="news-date">Tanggal</th>
    <th class="news-author">Penulis</th>
    <th class="news-author">Email Penulis</th>
  </tr>
<?php
    foreach ($block->getJoinData() as $key=>$news){
        echo '<tr>
                <td>'.$news->getNewsId().'</td>
                <td>'.$news->getContent().'</td>
                <td class="news-date">'.$news->getDate().'</td>
                <td>'.$news->getAuthorName().'</td>
                <td>'.$news->getAuthorEmail().'</td>
              </tr>';
    }
?>
</table>

60 total views, 1 views today

About Andhi Irawan

Check Also

Get Module Name

$m = Mage::getConfig()->getNode(‘modules/’.$this->getModuleName()); 23 total views, 1 views today Post Views: 6

Leave a Reply

Your email address will not be published. Required fields are marked *