19

I am working on a site that has, I believe 9 separate Magento instances, same site.

Therefore there are strict procedures surrounding any back-end data - config and even for CMS blocks.

I would like to find out how to add a CMS block via a setup script.

36

For this, I suggest using the data folder of one of your custom modules.
Let's say that the module is currently at version 1.0.4.

Create the file data/[module]_setup/data-upgrade-1.0.4-1.0.5.php with the following content:

Edit: changed file name

$content = 'BLOCK CONTENT HERE';
//if you want one block for each store view, get the store collection
$stores = Mage::getModel('core/store')->getCollection()->addFieldToFilter('store_id', array('gt'=>0))->getAllIds();
//if you want one general block for all the store viwes, uncomment the line below
//$stores = array(0);
foreach ($stores as $store){
    $block = Mage::getModel('cms/block');
    $block->setTitle('Block title here');
    $block->setIdentifier('block_identifier_here');
    $block->setStores(array($store));
    $block->setIsActive(1);
    $block->setContent($content);
    $block->save();
}

After this just change the version in config.xml to 1.0.5 clear the cache and refresh any page.

  • Adding a CMS is block is hardly a bugfix so feature version must be bumped. 😜 – user487772 Jan 25 '18 at 18:07
  • Would Mage::app()->getStores() do the same? – user487772 Jan 25 '18 at 18:09
8
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

$staticBlock = array(
                'title' => 'Test Block',
                'identifier' => 'test-block',                   
                'content' => 'Sample Test Block',
                'is_active' => 1,                   
                'stores' => array(0)
                );

Mage::getModel('cms/block')->setData($staticBlock)->save();

From: http://blog.chapagain.com.np/magento-create-cms-page-static-block-programmatically/#sthash.1FYKYYhI.dpuf

4

Instead of using the sql folder, you should put any setup scripts modifying CMS data in the data folder. See app/code/core/Mage/Cms/data/cms_setup for some good examples. These install scripts add static blocks and CMS pages.

For changing config values, use this code:

$installer->setConfigData(
    Mage_Page_Model_Config::XML_PATH_CMS_LAYOUTS,
    'your_value_here'
);

Also, Here's a useful article

1

You can also use below code in upgrade script:

$installer = $this;
/* @var $installer Mage_Core_Model_Resource_Setup */
$connection = $installer->getConnection();
/* @var $connection Varien_Db_Adapter_Pdo_Mysql */

$installer->startSetup();
$connection->insert($installer->getTable('cms/block'), array(
    'title'             => 'Footer Links',  
    'identifier'        => 'footer-links',
    'content'           => '<ul>\r\n<li><a href=\"{{store direct_url=\"about-magento-demo-store\"}}\">About Us</a></li>\r\n<li class=\"last\"><a href=\"{{store direct_url=\"customer-service\"}}\">Customer Service</a></li>\r\n</ul>',
    'creation_time'     => now(),
    'update_time'       => now(),
));
$connection->insert($installer->getTable('cms/block_store'), array(
    'block_id'   => $connection->lastInsertId(),
    'store_id'  => 0
));
$installer->endSetup();
  • You should not add content to the database with direct SQL if it can be avoided (which is almost always). In this case you can use the model cms/block to add data safely. – Ian Oct 2 '14 at 16:56
0

The following code create and update static block using magento scripts

http://www.pearlbells.co.uk/how-to-create-and-update-the-static-blocks-using-magento-script/

function createBlock($blockData) {

$block = Mage::getModel('cms/block')->load($blockData['identifier']);
$block->setTitle($blockData['title']);
$block->setIdentifier($blockData['identifier']);
$block->setStores(array($blockData['storeId']));
$block->setIsActive($blockData['active']);
$block->setContent($blockData['content']);
$block->save();

}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.