1

バックエンドでモジュールを作成しているので、シェルモジュールを作成しました(管理者のトップメニューのアイテムとアクセスするページ)。基本的に、管理者が数字を入力してボタン「追加」をクリックできる入力フィールドが必要です"、これにより、データベース内の既存のテーブルに行が挿入されます。

$connection = Mage::getSingleton('core/resource')->getConnection('core_write');

$connection->beginTransaction();
$fields = array();
$fields['name']= 'andy';
$connection->insert('test', $fields);
$connection->commit();

データベース内に「test」というテーブルがあります。上記のコードを Controller ファイルに入れると、管理ページにアクセスしたときにデータベースに行が正常に追加されます。しかし、挿入されたデータをユーザーが入力できるようにする必要があります。

そのコードをモデルに移動し、何らかの方法で入力データをモデルに送信して、それで作業を行わせる必要がありますか? か否か。これが正しければ、誰かがモデルへのデータ送信を研究するのに適した場所を教えてもらえますか? (それさえ可能なら)

iv たくさんのチュートリアルを試しましたが、どれも私が必要としているものには大きすぎます。何も表示する必要はありません。入力ボックスと保存ボタンがあれば十分です。

編集

以下を含むファイル block/Adminhtml/Form/Edit/Form.php を作成しました。. .

class AndyBram_Presbo_Block_Adminhtml_Form_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
{
protected function _prepareForm()
{
$form = new Varien_Data_Form(
array(
'id' => 'edit_form',
'action' => $this->getUrl('*/*/test'),
'method' => 'post',
)
);

$form->setUseContainer(true);
$this->setForm($form);

$fieldset = $form->addFieldset('display', array(
'legend' => 'Display Settings',
'class' => 'fieldset-wide'
));

$fieldset->addField('label', 'text', array(
'name' => 'label',
'label' => 'Label',
));

if (Mage::registry('andybram_presbo')) {
$form->setValues(Mage::registry('andybram_presbo')->getData());
}

return parent::_prepareForm();
}
}

私のコントローラーには、以下のような2つの機能があります。. .

public function indexAction()
    {
        $this->loadLayout();

        $this->_addContent($this->getLayout()->createBlock('presbo/adminhtml_form_edit_form'));



    }   
    public function testAction()
    {
        echo 'form data here';
        $this->loadLayout();
        $this->renderLayout();

    }

フォームは正常に表示されますが、送信するボタンや「アクションを実行する」というボタンはありません

さらに編集

testAction に正常に送信され、「ここにフォームデータ」がエコーされるフォームに送信ボタンが正常に追加されました。

データにアクセスする方法

iv以下の行を追加しました

$postData = $this->getRequest()->getPost();

$postData をエコーすると、「配列」が表示されます

$postData[0] をエコーすると、空白のページだけが表示されます

アイデアや指針はありますか?

4

1 に答える 1

3

Magento はMVC フレームワークとして構築されているため、その通りです。コントローラーからモデルにデータを渡す必要があり、コントローラーのコードで直接 DB の更新を行わないでください。例の最適なソースは、独自の Magento コードです。データを DB に保存して、その実行方法を確認する任意のコントローラー アクションを実行できます。例:チェックapp/code/core/Mage/Adminhtml/controllers/NotificationController.php方法markAsReadAction()

そこには、次のことがわかります。

  • データは呼び出しによってリクエストから取得されます $this->getRequest()->getParam('id')-実際、これは送信されたデータを取得する方法という質問に対する答えです
  • データはモデルに設定され、呼び出しによって DB に保存されます。
    $model->setIsRead(1)->save()

モデルを操作するのと同じアプローチに従うことを強くお勧めします。これにより、コードのサポートが大幅に改善され、簡単になります。

Magento の「MVC」アーキテクチャの「M」文字は、モデルとリソース モデルの 2 つのレイヤーで表されることに注意してください。

モデル:

  • エンティティのビジネス ロジックが含まれます。たとえば、ショッピング カート モデルに 10 個のアイテムを追加すると、割引ルールがトリガーされます
  • の一般名を持つクラスで表されます。<Your_Module>_Model_<Model_Name>
  • Mage_Core_Model_AbstractDB を操作する必要がある場合は、DB 通信を担当するリソース モデルを拡張して用意します。
  • 基本的な保存/読み込みメソッドを実装する必要はありません。先祖 Mage_Core_Model_Abstractはすでにすべてのルーチンを使用する準備が整っているためです。
  • への呼び出しによって作成されましたMage::getModel('<your_module>/<model_name>')

リソース モデル:

  • DB抽象化レイヤーとして機能し、DBからデータを保存/ロードし、他のDBクエリを実行します
  • Mage_Core_Model_Resource_Db_AbstractDBと通信するために拡張
  • の一般名を持つクラスで表されます。 <Your_Module>_Model_Resource_<Model_Name>
  • DBと通信する必要がある場合、対応するモデルによって自動的に作成されます

したがって、コントローラーでは、モデルのみを作成することに関心があります。リソース モデルは、モデルによって自動的に作成されます。

そして、上記のすべてによると、コントローラーは次のようになります。

public function testAction()
{
    $model = Mage::getModel('your_module/your_model');
    $model->setName('andy');
    $model->save();
}

必要なものの完全に機能する例をここからダウンロードできます。

特定のケースに応じて、提供されるコードにはいくつかのバリエーションがあります。しかし、それはあなたが望むものを実装するための一般的なアプローチを表しています.

于 2012-11-18T10:16:14.083 に答える