Extensions Tutorial: Teil 8 – CRUD (Update)
Nun sind wir fast am Ende unseres Tutorials angelangt. In Teil 8 werden wir nun noch das Ändern integrieren.
1. Dateistruktur anpassen
app/
etc/
modules/
- Mxperts_All.xml (Oder Ihre Firmenname IhreFirme_All.xml)
code/
local/
Mxperts/ (Oder Ihre Firmenname IhreFirme_All.xml)
Tutorial/ (Bezeichnung Ihrer Erweiterung)
Block/
- Index.php
Admin/
- Main.php
Main/
- Grid.php
- New.php
New/
- Form.php
- Edit.php
Edit/
- Form.php
controllers/
- AdminController.php
- IndexController.php
etc/
- config.xml
Helper/
- Data.php
Model/
- Tutorial.php
Mysql4/
- Tutorial.php
Tutorial/
- Collection.php
sql/
tutorial_setup/
- mysql4-install-0.2.0.php
- mysql4-upgrade-0.1.0-0.2.0.php
Wir haben den Block -> Admin ergänzt.
1. Legen Sie die Datei code/local/Mxperts/Tutorial/Block/Admin/Edit.php an
<?php
class Mxperts_Tutorial_Block_Admin_Edit extends Mage_Adminhtml_Block_Widget_Form_Container
{
public function __construct()
{
parent::__construct();
$this->_blockGroup = 'tutorial';
$this->_mode = 'edit';
$this->_controller = 'admin';
if( $this->getRequest()->getParam($this->_objectId) ) {
$tutorialData = Mage::getModel('tutorial/tutorial')
->load($this->getRequest()->getParam($this->_objectId));
Mage::register('frozen_tutorial', $tutorialData);
}
}
public function getHeaderText()
{
return Mage::helper('tutorial')
->__("Edit Element'%s'",
$this->htmlEscape(Mage::registry('frozen_tutorial')->getName()));
}
}
2. Legen Sie die Datei code/local/Mxperts/Tutorial/Block/Admin/Edit/Form.php an
<?php
class Mxperts_Tutorial_Block_Admin_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
{
protected function _prepareForm()
{
$form = new Varien_Data_Form(array(
'id' => 'edit_form',
'action' => $this->getUrl('*/*/save', array('id' => $this->getRequest()->getParam('id'))),
'method' => 'post'
));
$fieldset = $form->addFieldset('edit_tutorial', array('legend' => Mage::helper('tutorial')->__('Element Details')));
$fieldset->addField('name', 'text', array(
'name' => 'name',
'title' => Mage::helper('tutorial')->__('Name'),
'label' => Mage::helper('tutorial')->__('Name'),
'maxlength' => '50',
'required' => true,
));
$fieldset->addField('tags', 'text', array(
'name' => 'tags',
'title' => Mage::helper('tutorial')->__('Tags'),
'label' => Mage::helper('tutorial')->__('Tags'),
'maxlength' => '255',
'required' => true,
));
$fieldset->addField('summary', 'textarea', array(
'name' => 'summary',
'title' => Mage::helper('tutorial')->__('Summary'),
'label' => Mage::helper('tutorial')->__('Summary'),
'style' => 'width: 98%; height: 200px;',
'required' => true,
));
$form->setUseContainer(true);
$form->setValues(Mage::registry('frozen_tutorial')->getData());
$this->setForm($form);
return parent::_prepareForm();
}
}
3. Fügen Sie die Funktionen editAction() und saveAction() zur Datei code/local/Mxperts/Tutorial/controllers/AdminController.php hinzu
public function editAction()
{
$this->loadLayout();
$this->_addContent($this->getLayout()
->createBlock('tutorial/admin_edit'));
$this->renderLayout();
}
public function saveAction()
{
$tutorialId = $this->getRequest()->getParam('id', false);
if ($data = $this->getRequest()->getPost()) {
$tutorial = Mage::getModel('tutorial/tutorial')
->load($tutorialId)->addData($data);
try {
$tutorial->setId($tutorialId)->save();
Mage::getSingleton('adminhtml/session')
->addSuccess(Mage::helper('tutorial')
->__('Element was saved successfully'));
$this->getResponse()->setRedirect($this->getUrl('*/*/'));
return;
} catch (Exception $e){
Mage::getSingleton('adminhtml/session')
->addError($e->getMessage());
}
}
$this->_redirectReferer();
}
Das Editieren & anschließend speichern klappt ebenfalls sehr gut. Nun aber mal ne Frage wo einige die das hier lesen werden bestimmt das Schmunzeln bekommen:
Ich habe New, Edit & Main für die Anzeige des Grids. Reicht es zum löschen wirklich aus die Anpassung in der AdminController.php zu machen? (Ich meine es klappt ja, keine Frage)
Oder muss ich mir das als Programmier leihe so vorstellen das “Delete” quasi so eine Standard-Anweisung ist um im Hintergrund den Datensatz aus der Datenbank-Tabelle zu löschen. Und eben daher hier keine eigenen “Form.php” Dateien + Verzeichnis Delete benötigt werden & auch keine “Delete.php”.
Nur zum Verständnis – ich will eben wissen ob ich der Sache zum gegenwärtigen Zeitpunk noch folgen kann.
War diese Antwort hilfreich?
LikeDislike@ds_1984
Das hast du schon ganz richtig vermutet. Für die Neuanlage und Änderungen braucht man Eingabefelder. Der Inhalt der Felder wird dann in den Datensatz der entsprechenen Tutorial-ID geschrieben. Für das Löschen genügt es den delete Zeiger auf die entsprechende Tutorial-ID zu setzen und der Datensatz wird gelöscht.
Und auch richtig vermutet ist delete ein sql-Befehl
War diese Antwort hilfreich?
LikeDislike@ds_1984
Ich finde http://sqlzoo.net/de/ für dein Einstieg in die SQL-Syntax ganz nett. Man kann sich zumindest einen kleinen Überblick über die Möglichkeitnen von SQL verschaffen.
War diese Antwort hilfreich?
LikeDislikeHallo,
ich bekomme leider ein Fehler und zwar:
Fatal error: Call to a member function getName() on a non-object in …Edit.php on line 22
Laut mein Verständniß wird die Funktion “getName()” nicht gefunden bei
return Mage::helper(‘designer’)
->__(“Edit Element’%s’”,$this->htmlEscape(Mage::registry(‘frozen_tutorial’)->getName()));
die Funktion “registry” existiert, allerdings “getName()” evtl. nicht?
Jemand eine Idee bzw. was mache ich falsch?
War diese Antwort hilfreich?
LikeDislikeHallo,
hast Du mal den Konstruktor __construct geprüft. Hast Du alles richtig geschrieben? Dann prüfe mal ob Mage::registry(’frozen_tutorial’) überhaupt Werte beinhaltet.
Viele Grüße
Johannes Teitge
War diese Antwort hilfreich?
LikeDislikehallo,
in der registry ist der Parameter “$value” jedenfalls leer (keine Value “frozen_tutorial”, im $key steht der Pfad zur pear lib welcher richtig ist.
Der Konstruktor ist identisch, eben noch mal überprüft!
Es wird allerdings die if-schleife gar nicht aufgerufen …
Irgendwie liefert die Bedingungung:
$this->getRequest()->getParam($this->_objectId)
nichts zurück!
Mage::getModel wird richtig aufgerufen …
War diese Antwort hilfreich?
LikeDislikeKeiner eine Idee?
War diese Antwort hilfreich?
LikeDislikeHatte schon jemand eine Idee, da ich gerade genau das gleiche Problem habe, wie mein Vorredner.
War diese Antwort hilfreich?
LikeDislikeBei mir hakts da auch. Kann Datensatz erstellten, jedoch nicht Editieren und auch nicht löschen (obwohl Vollzugsmeldung ‘Element successfully deleted’ erscheint) ….
Habe leider auch keine Idee
War diese Antwort hilfreich?
LikeDislikeBei mir auch das gleiche Problem – wäre schön, wenn Jemand helfen kann. Danke!
War diese Antwort hilfreich?
LikeDislikeHallöle,
hatte das selbe Problem wie phoenix und Thomas.
Bei mir lag’s hieran:
In der app/code/local/Mxperts/Tutorial/Block/Admin/Main/Grid.php:
public function getRowUrl($row)
{
return $this->getUrl(‘*/*/edit’, array(
‘id’ => $row->getTutorialId(),
));
}
Dort hatte ich vergessen, die getTutorialId in “get{your_extension_name}Id()” umzubennen. Das liefert die gewünschte ID. Die ist wichtig beim Löschen als auch beim Editieren!
Hoffe, das hilft!
Tobi
War diese Antwort hilfreich?
LikeDislikeone up
http://www.mxperts.de/blog/extensions-tutorial-teil-9-frontend-ouput/
War diese Antwort hilfreich?
LikeDislike