cmsにカスタムフィールドを追加する-Magento


7

私はMagentoを初めて使用し、CMSに統合しようとしている静的ページがあります。

Wordpressがこの機能を持っているのと同じような方法でCMSにカスタムフィールドを追加する方法を何日も探していました。

私はいくつかのリンクを見つけました:

http://www.atwix.com/magento/adding-custom-attribute-to-a-cms-page/ <-このチュートリアルで何をする必要があるのか​​がわかりにくい/わかりにくい

http://mrpalvinder.wordpress.com/2014/05/30/how-to-add-custom-fields-in-cms-edit-page-admin-panel/ <-役に立たない

一部のコンテンツがサイトの別の場所にあり、すべてを1つのコンテンツエディターに追加しても、コンテンツを希望どおりに分割できないため、この機能が必要です。次に、このコンテンツをテンプレートファイルで呼び出すことができるようにしたいと考えています。

私がこれをプログラムで実行できるか、拡張機能を使用できるかどうかに関係なく、助かります。

ありがとう。


atwixの記事は理にかなっていますが、それを実現するにはモジュール作成の基本を学ぶ必要があります。
デクスター

@Dexterのおかげで、モジュールについてさえ知らなかったので、おそらくatwixチュートリアルで苦労しています。モジュールの作成について調べます。
fnk 2014年

回答:


16

先に述べたように、atwixブログは実際にはこれに関して非常に優れていますが、メインモジュールのパーツも含めるように拡張します。

モジュールを作成

したがって、最初にモジュールを作成するには、モジュールxmlファイルが必要になるため、の下にファイルを作成しますapp/etc/modules/StackExchange_Example.xml。次のようになります。

<?xml version="1.0"?>
<config>
    <modules>
        <StackExchange_Example>
            <active>true</active>
            <codePool>local</codePool>
            <depends/>
        </StackExchange_Example>
    </modules>
</config>

これは基本的に、拡張機能がローカルコードプールにあることをMagentoに知らせることです。次に、実際のモジュール構成を作成する必要があり、これはフォルダーの下にあるはずapp/code/local/StackExchange/Example/etc/config.xmlです。このファイルが何をするかによって、この拡張機能が実際に何をするか、モデル、ブロック、コントローラーなどのアイテムがMagentoに伝えられます。

今回のケースでは、現在、オブザーバーのモデル定義のみが必要です。1つのイベントをリッスンしadminhtml_cms_page_edit_tab_content_prepare_formて、cmsタブに新しいフィールドを追加し、データベースに列を追加できるようにリソースを設定します。

したがって、config.xmlファイルは次のようになります。

<?xml version="1.0"?>
<config>
    <modules>
        <StackExchange_Example>
            <version>0.1.0</version>
        </StackExchange_Example>
    </modules>
    <global>
        <models>
            <stackexchange_example>
                <class>StackExchange_Example_Model</class>
            </stackexchange_example>
        </models>
        <events>
            <adminhtml_cms_page_edit_tab_content_prepare_form>
                <observers>
                    <stackexchange_example_page_edit_tab_content>
                        <type>singleton</type>
                        <class>stackexchange_example/observer</class>
                        <method>addNewCmsField</method>
                    </stackexchange_example_page_edit_tab_content>
                </observers>
            </adminhtml_cms_page_edit_tab_content_prepare_form>
        </events>
        <resources>
            <stackexchange_example_setup>
                <setup>
                    <module>StackExchange_Example</module>
                </setup>
            </stackexchange_example_setup>
        </resources>
    </global>
</config>

テーブルにフィールドを追加

次に、フィールドをデータベーステーブルに追加して、cmsページの他のコンテンツと同時に保存できるようにします。これを行うには、下にphpファイルを作成する必要がありますapp/code/community/StackExchange/Example/sql/stackexchange_example_setup/install-0.1.0.php。このファイルが行うことは、テーブルをロードして新しい列を追加するだけです。

<?php
$installer = $this;
/* @var $installer Mage_Core_Model_Resource_Setup */

$installer->startSetup();

$conn = $installer->getConnection();
$table = $installer->getTable('cms_page');

$conn->addColumn(
        $table,
        'your_column',
        Varien_Db_Ddl_Table::TYPE_TEXT,
        '255',
        array(
            'nullable' => false
        ),
        'Your Column Desc'
    );

$installer->endSetup();

これで明らかに、ここに必要な要件を追加して列を追加できます。

管理セクションに列を追加

これで、列を追加するためにリッスンするイベントが既に用意されているので、ここでオブザーバーと関数を作成します。したがって、ファイルapp/code/community/StackExchange/Example/Model/Observer.phpを作成すると、ファイルは次のようになります。

<?php

class StackExchange_Example_Model_Observer
{
    public function addNewCmsField($observer)
    {
        //get CMS model with data
        $model = Mage::registry('cms_page');
        //get form instance
        $form = $observer->getForm();
        //create new custom fieldset 'stackexchange_content_fieldset'
        $fieldset = $form->addFieldset('stackexchange_content_fieldset', array('legend'=>Mage::helper('cms')->__('Custom'),'class'=>'fieldset-wide'));
        //add new field
        $fieldset->addField('your_column', 'text', array(
            'name'      => 'your_column',
            'label'     => Mage::helper('cms')->__('Your Column'),
            'title'     => Mage::helper('cms')->__('Your Column'),
            'disabled'  => false,
            //set field value
            'value'     => $model->getYourColumn()
        ));

    }
}

これで十分です。cmsページを保存すると、アイテムもデータベースに保存されるので、途中です。これで、フロントエンドに表示する必要があります。

フロントエンド表示

現在、atwixで記述されている2番目の方法は実際には非常に優れています。基本的に、管理者を介して顧客のlayout.xmlスニペットをcmsページに追加し、テンプレートファイルを用意するだけです。

したがって、管理者のcmsページの下に、CMS -> Pages -> Your page -> Designここでできることは、このcmsページでのみ発生する特定のレイアウトxmlを追加することです。

<reference name="content">
    <block type="core/template" name="home" template="stackexchange/example/cmsattribute.phtml"/>
</reference>

このレイアウトではstackexchange/example/cmsattribute.phtml、ページのメインコンテンツの後にテンプレートを含む新しいブロックを追加します。

テンプレートapp/design/frontend/base/default/template/stackexchange/example/cmsattribute.phtmlを作成し、このテンプレートで現在のcmsページをロードして属性データを取得するだけです。

<?php echo Mage::getBlockSingleton('cms/page')->getPage()->getContentCustom(); ?>

atwixブログは非常に優れているので、2つの投稿を組み合わせてデータベースの更新に関する部分を追加するだけです。


ハ。StackExchange_Example。これは、例にとって本当に良い名前です。これからここで使用を開始します(許可がある場合)。このようにして、ここで質問をするプロジェクトの後にプロジェクトに取り組む人々は、おそらくSEの価値に気付くでしょう:)。
マリウス

@マリウスはもちろん私の許可を得ています。楽な生活を見るよりはましだと思います;)
デビッド・マナーズ

1
許可をありがとう。しかし、私は同意する必要があります...何も簡単な生活よりも優れています:)。
マリウス

2
atwixよりも優れていて、本当に役に立ちました。ただし、修正:app / code / communityでオブザーバーおよびsqlインストールファイルへのパスについて言及しているのに対し、モジュールのxmlファイルは「ローカル」コー​​ドプールでそれを定義しています。彼らが混乱する場合に備えて、初心者のためにちょうどそれを述べました。
Ajay Bisht

@DavidMannersはおそらく少し遅れている/古くなっていますが、値を保存するために取得できません!3回実行しましたが、cmsページに表示されますが、その値を保存できません。何が欠けている!
hahaha
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.