Artikel erweitern, neue Felder, save problem und neuer tab

Hallo Leute,

ich habe mir jetzt einen Wolf gesucht. Es gibt zwar ein paar Beiträge hier, die in die Richtung Modulerweiterung gehen, mir aber nicht helfen können.

Folgendes.

Ich benötige vier neue Felder für Vaterartikel.
Diese habe ich auch schon angelegt, und mit hilfe meiner bescheidenen Kenntnisse es so hinbekommen, dass ich einen neuen Reiter in der Artikelverwaltung habe, und dort vier inputfelder zu sehen sind.
Wenn ich die Felder per MysqlTool eintrage, werden diese auch geladen.

Wenn ich diese per submitbutton speichern möchte kommt folgende Fehlermeldung.

oxSystemComponentException---!--NOT CAUGHT--!--oxException (time: 2014-01-16 11:55:11): [0]: Function 'getLink' does not exist or is not accessible! (article_extension) Stack Trace: #0 /path/to/application/components/oxcmp_lang.php(52): oxSuperCfg->__call('getLink', Array) #1 /path/to/application/components/oxcmp_lang.php(52): article_extension->getLink(2) #2 /path/to/application/controllers/oxubase.php(2239): oxcmp_lang->render() #3 /path/to/core/oxshopcontrol.php(491): oxUBase->render() #4 /path/to/core/oxshopcontrol.php(396): oxShopControl->_render(Object(ExceptionError)) #5 /path/to/core/oxshopcontrol.php(161): oxShopControl->_process('exceptionError', 'displayExceptio...') #6 /path/to/core/oxid.php(40): oxShopControl->start() #7 /path/to/index.php(28): Oxid::run() #8 /path/to/admin/index.php(29): require_once('/path/to/...') #9 {main} Faulty component --> 

Ausserdem habe ich das Problem, dass wenn ich auf den neuen Reiter in der Artikelverwaltung gehe, ich danach zwar die anderen Reiter anclicken kann, deren Inhalt aber nicht mehr gezeigt wird. Das geht dann erst wieder,
wenn ich im Hauptmenu auf Artikelverwaltung clicke.

Das Modul ist so aufgebaut, wobei ich die funktionen “render” und "save"
von der application/controllers/admin/article_main.php abgeschaut habe, und auf das (wahrscheinlich) nötigste verkleinert habe.

modules/article_extension/menu.xml

<?xml version="1.0" encoding="ISO-8859-15"?>
<OX>
	<OXMENU id="NAVIGATION_ESHOPADMIN">
	<MAINMENU id="mxmanageprod">
	    <SUBMENU id="mxarticles" cl="article" list="article_list">
			<TAB id="steckbrief" cl="article_extension" />
	    </SUBMENU>
	</MAINMENU>
    </OXMENU>
</OX>

modules/article_extension/article_extension.php:

<?php
class article_extension extends oxAdminDetails
{
	//protected $_sThisTemplate = 'article_extension.tpl';
	public function render()
	{
		$myConfig = $this->getConfig();
        parent::render();

        $this->_aViewData['edit'] = $oArticle = oxNew( 'oxarticle' );

        $soxId = $this->getEditObjectId();
        $svoxId = oxConfig::getParameter( "voxid" );
        
        if ( isset( $svoxId ) && $svoxId == "-1" && isset($soxparentId) && $soxparentId && $soxparentId != "-1") {
        	return false;
        }
        
        if (  $soxId && $soxId != "-1") 
        {
        	// load object
        	$oArticle->loadInLang( $this->_iEditLang, $soxId );
        	
        	// why? load object in other languages
        	/*$oOtherLang = $oArticle->getAvailableInLangs();
        	if (!isset($oOtherLang[$this->_iEditLang])) {
        		// echo "language entry doesn't exist! using: ".key($oOtherLang);
        		$oArticle->loadInLang( key($oOtherLang), $soxId );
        	} */       	
        }
        $oDB = oxDb::getDB();

        $sArticleTable = getViewName( 'oxarticles', $this->_iEditLang );
        $sSelect  = "select $sArticleTable.oxtitle, $sArticleTable.wuchshoehe, $sArticleTable.bluehfarbe, $sArticleTable.bluehzeitpunkt, $sArticleTable.standort from $sArticleTable";
        $sSelect .= " where $sArticleTable.oxid = '".$soxId."'";
        

        $rs = $oDB->Execute( $sSelect);
        if ($rs != false && $rs->RecordCount() > 0) {
        	while (!$rs->EOF) {
        		$sArtTitle = new oxField($rs->fields[0]);
        		$wuchshoehe = new oxField($rs->fields[1]);
        		$bluehfarbe = new oxField($rs->fields[2]);
        		$bluehzeitpunkt = new oxField($rs->fields[3]);
        		$standort = new oxField($rs->fields[4]);
        		$rs->MoveNext();
        	}
        }
        $this->_aViewData['oxtitle'] = $sArtTitle;
        $this->_aViewData['wuchshoehe'] = $wuchshoehe;
        $this->_aViewData['bluehfarbe'] = $bluehfarbe;
        $this->_aViewData['bluehzeitpunkt'] = $bluehzeitpunkt;
        $this->_aViewData['standort'] = $standort;
      
        return 'article_extension.tpl';
	}
		
	public function save()
	{
		parent::save();
	
		$oConfig = $this->getConfig();
		$soxId    = $this->getEditObjectId();
		$aParams  = $oConfig->getRequestParameter( "editval" );
			
		// default values
		$aParams = $this->addDefaultValues( $aParams );
	
		// null values
		if (isset($aParams['oxarticles__oxvat']) && $aParams['oxarticles__oxvat'] === '') 
		{
			$aParams['oxarticles__oxvat'] = null;
		}
	
		// varianthandling variants have no steckbrief;-)
		$soxparentId = $oConfig->getRequestParameter( "oxparentid");
		if ( isset( $soxparentId) && $soxparentId && $soxparentId != "-1") 
		{
			unset( $aParams['oxarticles__oxparentid']);
		}
	
		$oArticle = oxNew( "oxarticle");
		$oArticle->setLanguage($this->_iEditLang);
	
		if ( $soxId != "-1") {
			$oArticle->loadInLang( $this->_iEditLang, $soxId);
		} 
		
		/*else {
			$aParams['oxarticles__oxid']        = null;
			$aParams['oxarticles__oxissearch']  = 1;
			$aParams['oxarticles__oxstockflag'] = 1;
			// shopid
			$aParams['oxarticles__oxshopid'] = oxRegistry::getSession()->getVariable( "actshop");
		}*/
		
		// resetting counts
		//$this->_resetCounts( $aResetIds );
	
		$oArticle->setLanguage(0);
	
		//triming spaces from article title (M:876)
		/*if (isset($aParams['oxarticles__oxtitle'])) {
			$aParams['oxarticles__oxtitle'] = trim( $aParams['oxarticles__oxtitle'] );
		}*/
	
		$oArticle->assign( $aParams );
		//$oArticle->setArticleLongDesc( $this->_processLongDesc( $aParams['oxarticles__oxlongdesc'] ) );
		$oArticle->setLanguage($this->_iEditLang);
		//$oArticle = oxRegistry::get("oxUtilsFile")->processFiles( $oArticle );
		$oArticle->save();
	
		// set oxid if inserted
		/*if ( $soxId == "-1") {
			$sFastCat = $oConfig->getRequestParameter( "art_category");
			if ( $sFastCat != "-1") {
				$this->addToCategory($sFastCat, $oArticle->getId());
			}
		}*/
	
		$this->setEditObjectId( $oArticle->getId() );
	}
	
	private function oPrint($data)
	{
		echo "<pre>".print_r($data,true)."</pre>";
	}
}

modules/article_extension/metadata.php

<?php

$sMetadataVersion = '1.0';

$aModule = array(
    'id'           => 'article_extension',
    'title'        => 'Artikel Erweiterung',
    'description'  => 'Artikel Erweiterung',
    'version'      => '1.0',
    'author'       => 'keno',
    'extend'       => array(),
	'files'        => array('article_extension' => 'article_extension/article_extension.php')
);

application/views/admin/tpl/article_extension.tpl

[{*debug*}]
[{include file="headitem.tpl" title="GENERAL_ADMIN_TITLE"|oxmultilangassign box=" "}]

<form name="myedit" id="myedit" action="[{ $oViewConf->getSelfLink() }]" method="post" onSubmit="return copyLongDesc( '[{$field}]' );" style="padding: 0px;margin: 0px;height:0px;">
 [{$oViewConf->getHiddenSid()}]
<input type="hidden" name="cl" value="article_extension">
<input type="hidden" name="fnc" value="save">
<input type="hidden" name="oxid" value="[{ $oxid }]">
<input type="hidden" name="voxid" value="[{ $oxid }]">
<input type="hidden" name="editval[article__oxid]" value="[{ $oxid }]">

<div class="center">
  <h1>Steckbrief</h1>
	<p>[{ $sArtTitle }]</p>
	
	<label>Wuchshöhe</label><br/>
	<input type="text" name="editval[oxarticles__wuchshoehe]" value="[{ $wuchshoehe }]" /><br/>
	
	<label>Blühfarbe</label> <br/>
	<input type="text" name="editval[oxarticles__bluehfarbe]" value="[{ $bluehfarbe }]" /><br/>
	
	<label>Blühzeitpunkt</label><br/>
	<input type="text" name="editval[oxarticles__bluehzeitpunkt]" value="[{ $bluehzeitpunkt }]" /><br/>
	
	<label>Standort</label><br/>
	<input type="text" name="editval[oxarticles__standort]" value="[{ $standort }]" /><br/>
</div>
<input type="submit" name="save" value="speichern" />
</form>

Ich würde mich freuen, wenn mir jemand helfen kann.

Grüße
Keno

Ich vermute ja, dass article_extension von einer anderen Klasse erben muss.

Ich habe jetzt mal die in der Exception angemeckerte funktion “getLink” als dummy in die article extension geschrieben. Jetzt kommt nach dem submit…

Function 'addDefaultValues' does not exist or is not accessible! (article_extension) 

Oh. Jetzt sehe ich, dass addDefaultvalue nichts mit oxAdminDetails zu tun hat.

Die Existiert nur in den jeweiligen Controllern.
So. Die Zeile…

$aParams = $this->addDefaultValues( $aParams ); 

rausgenommen, und schon kann ich die neuen Felder benutzen.

Kann evtl. nochmal jemand sagen, ob das so alles save ist?

Jetzt bleibt nur noch das Problem, dass ich nicht mehr über die tabs navigieren kann, sobald ich in den neuen von mir erstellten (siehe menu.xml) tab wechsle. Ich kann dann auch keinen der Artikel aus der Liste mehr aufrufen. Es geht dann immer nur über das Hauptmenü.

Jetzt weiss ich, dass es am Javascript liegt.

Wenn ich von meinem neuen tab zu einem anderen wechseln will, spuckt
firebug folgendes aus

	
TypeError: oTransfer is null
oTransfer.cl.value = sLocation;

Wenn ich in der funktion changeEditBar in oxid.js per “console.log(sLocation+” : “+sPos )” mir die Werte ausgeben lasse, wird bei jedem wechsel in einen anderen Tab folgendes gezeigt.


article_seo : 10

article_overview : 9

article_review : 8

article_extension : 11

usw.

Also muss es noch eine andere Stelle geben, an der diese Info verarbeitet wird.

Ich habe nur keinen Schimmer, wo!

Hat denn keiner eine Idee?

Es fehlte das folgendes im template

<form name="transfer" id="transfer" action="[{ $oViewConf->getSelfLink() }]" method="post">
 	[{$oViewConf->getHiddenSid()}]
    <input type="hidden" name="oxid" value="[{ $oxid }]">
    <input type="hidden" name="oxidCopy" value="[{ $oxid }]">
    <input type="hidden" name="cl" value="article_extension">
    <input type="hidden" name="editlanguage" value="[{ $editlanguage }]">
	<input type="hidden" name="voxid" value="[{ $oxid }]">	
</form>

Jetzt gehts.

Viel Spaß beim nachbauen

Oxid 4.7.x

Vielen Dank für den Monolog :slight_smile:

Gruß