Hallo liebe Contaofreunde,
es soll ein eigenes Widget erstellt werden, welches dem keyValueWizard ähnlich ist. Es sollen insgesamt 5 Inputfelder sein. Die eingegebenen Daten sollen in der Datenbank abgespeichert werden.
Ich habe die keyValueWizard.php kopiert und verändert. Sie sieht folgendermaßen aus:
PHP-Code:
<?php
class MyWizard extends \Widget
{
/**
* Submit user input
* @var boolean
*/
protected $blnSubmitInput = true;
/**
* Template
* @var string
*/
protected $strTemplate = 'be_widget';
/**
* Add specific attributes
*
* @param string $strKey
* @param mixed $varValue
*/
public function __set($strKey, $varValue)
{
switch ($strKey)
{
case 'maxlength':
if ($varValue > 0)
{
$this->arrAttributes['maxlength'] = $varValue;
}
break;
default:
parent::__set($strKey, $varValue);
break;
}
}
/**
* Validate the input and set the value
*/
public function validate()
{
$mandatory = $this->mandatory;
$options = $this->getPost($this->strName);
// Check keys only (values can be empty)
if (is_array($options))
{
foreach ($options as $key=>$option)
{
// Unset empty rows
if ($option['key'] == '')
{
unset($options[$key]);
continue;
}
$options[$key]['name'] = trim($option['key']);
$options[$key]['unit'] = trim($option['value']);
$options[$key]['unit_price'] = trim($option['value']);
$options[$key]['tax'] = trim($option['value']);
$options[$key]['total'] = trim($option['value']);
if ($options[$key]['key'] != '')
{
$this->mandatory = false;
}
}
}
$options = array_values($options);
$varInput = $this->validator($options);
if (!$this->hasErrors())
{
$this->varValue = $varInput;
}
// Reset the property
if ($mandatory)
{
$this->mandatory = true;
}
}
/**
* Generate the widget and return it as string
*
* @return string
*/
public function generate()
{
$arrButtons = array('copy', 'drag', 'up', 'down', 'delete');
$strCommand = 'cmd_' . $this->strField;
// Change the order
if (\Input::get($strCommand) && is_numeric(\Input::get('cid')) && \Input::get('id') == $this->currentRecord)
{
$this->import('Database');
switch (\Input::get($strCommand))
{
case 'copy':
// $this->Database->prepare("UPDATE tl_my_modul SET title='new title' WHERE id=5")->execute();
array_insert($this->varValue, \Input::get('cid'), array($this->varValue[\Input::get('cid')]));
break;
case 'up':
$this->varValue = array_move_up($this->varValue, \Input::get('cid'));
break;
case 'down':
$this->varValue = array_move_down($this->varValue, \Input::get('cid'));
break;
case 'delete':
$this->varValue = array_delete($this->varValue, \Input::get('cid'));
break;
}
$this->Database->prepare("UPDATE " . $this->strTable . " SET " . $this->strField . "=? WHERE id=?")
->execute(serialize($this->varValue), $this->currentRecord);
$this->redirect(preg_replace('/&(amp;)?cid=[^&]*/i', '', preg_replace('/&(amp;)?' . preg_quote($strCommand, '/') . '=[^&]*/i', '', \Environment::get('request'))));
}
// Make sure there is at least an empty array
if (!is_array($this->varValue) || !$this->varValue[0])
{
$this->varValue = array(array(''));
}
// Initialize the tab index
if (!\Cache::has('tabindex'))
{
\Cache::set('tabindex', 1);
}
$tabindex = \Cache::get('tabindex');
// Begin the table
// $return = '<table class="tl_optionwizard" id="ctrl_'.$this->strId.'">
$return = '<table id="ctrl_'.$this->strId.'">
<thead>
<tr>';
$titles = $GLOBALS['TL_LANG']['tl_my_modul']['bill_title'];
for($i = 0; $i < count($titles); $i++)
{
$return .= '<th>' . $titles[$i] . '</th>';
}
$return .= '
</tr>
</thead>
<tbody class="sortable" data-tabindex="'.$tabindex.'">';
// Add fields
for ($i=0, $c=count($this->varValue); $i<$c; $i++)
{
$return .= '
<tr>
<td><input type="text" name="'.$this->strId.'['.$i.'][name]" id="'.$this->strId.'_key_'.$i.'" class="tl_text_2" tabindex="'.$tabindex++.'" value="'.specialchars($this->varValue[$i]['name']).'"'.$this->getAttributes().'></td>
<td><input type="text" name="'.$this->strId.'['.$i.'][unit]" id="'.$this->strId.'_value_'.$i.'" class="tl_text_2" tabindex="'.$tabindex++.'" value="'.specialchars($this->varValue[$i]['unit']).'"'.$this->getAttributes().'></td>
<td><input type="text" name="'.$this->strId.'['.$i.'][unit_price]" id="'.$this->strId.'_value_'.$i.'" class="tl_text_2" tabindex="'.$tabindex++.'" value="'.specialchars($this->varValue[$i]['unit_price']).'"'.$this->getAttributes().'></td>
<td><input type="text" name="'.$this->strId.'['.$i.'][tax]" id="'.$this->strId.'_value_'.$i.'" class="tl_text_2" tabindex="'.$tabindex++.'" value="'.specialchars($this->varValue[$i]['tax']).'"'.$this->getAttributes().'></td>
<td><input type="text" name="'.$this->strId.'['.$i.'][total]" id="'.$this->strId.'_value_'.$i.'" class="tl_text_2" tabindex="'.$tabindex++.'" value="'.specialchars($this->varValue[$i]['total']).'"'.$this->getAttributes().'></td>';
// Add row buttons
$return .= '
<td style="white-space:nowrap;padding-left:3px">';
foreach ($arrButtons as $button)
{
$class = ($button == 'up' || $button == 'down') ? ' class="button-move"' : '';
if ($button == 'drag')
{
$return .= \Image::getHtml('drag.gif', '', 'class="drag-handle" title="' . sprintf($GLOBALS['TL_LANG']['MSC']['move']) . '"');
}
else
{
$return .= '<a href="'.$this->addToUrl('&'.$strCommand.'='.$button.'&cid='.$i.'&id='.$this->currentRecord).'"' . $class . ' title="'.specialchars($GLOBALS['TL_LANG']['MSC']['ow_'.$button]).'" onclick="Backend.keyValueWizard(this,\''.$button.'\',\'ctrl_'.$this->strId.'\');return false">'.\Image::getHtml($button.'.gif', $GLOBALS['TL_LANG']['MSC']['ow_'.$button]).'</a> ';
}
}
$return .= '</td>
</tr>';
}
// Store the tab index
\Cache::set('tabindex', $tabindex);
return $return.'
</tbody>
</table>';
}
}
Die Inputfelder lauten name, unit, unit_price, tax, total.
DCA
PHP-Code:
'bill_table' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['text'],
'inputType' => 'MyWizard',
'exclude' => true,
'sql' => "text NULL"
)
Das Widget wird im Modul dargestellt, leider werden die Daten nicht abgespeichert.
1. Wie kommen denn die Werte, die man in die Inputfelder eingeben hat in die Datenbank?
2. Geht das über onload_callback ?
3. Was kann man tun, damit die Daten abgespeichert werden?
Vielleicht gibt es einen einfacheren Weg, dieses Widget zu erstellen. Zwei Dinge müssen erfüllt sein:
1. Es müssen 5 Inputfelder sein
2. Man muss duplizieren und löschen können. (Die Reihenfolge zu ändern ist nicht notwendig)
(Bitte keine weiterführende Links senden, die nicht zum Ziel führen. Bitte auch keine Erweiterungsvorschläge.)
Danke schon einmal im Voraus für jede hilfreiche Antwort!
Viele Grüße,
Peter
Lesezeichen