hab mich jetzt mal selbst ran gesetzt und ein paar dateien geändert. ich musste 4 dateien ändern, 3 in administrator/com_menus und 1 in administrator/com_modules.
das erste was ich geändert habe war die datei com_menus/models/item.php. habe dort zwei funktionen hinzugefügt die die datenabfrage regeln.
Code:
## Hack
function getAllModules(){
$db = &$this->getDBO();
$query = "SELECT id as value,CONCAT_WS('-position=',title,position) as text from #__modules WHERE published=1 AND client_id=0";
$db->setQuery($query);
$db->query();
$modules = $db->loadObjectList();
return $modules;
}
function getSelectedModules($menuid){
$db = &$this->getDBO();
$query = "SELECT moduleid as value from #__modules_menu WHERE menuid=0 OR menuid=".(int) $menuid;
$db->setQuery($query);
$db->query();
$modules = $db->loadObjectList();
return $modules;
}
##end Hack
dann habe ich die funktion edit() in der datei com_menus/views/item/view.php um folgendes erweitert
Code:
#Begin Hack
$model = &$this->getModel();
$selectedModules= $model->getSelectedModules($item->id);
$allModules = $model->getAllModules();
$this->assignRef('allModules', $allModules);
$this->assignRef('selectedModules', $selectedModules);
# End Hack
anschliessend musste ich in der com_menus/views/item/tmpl/form.php etwas javascript hinzufügen
Code:
<!-- Begin Hack
Das Script wurde von mir aus der Datei controller.php der com_modules kopiert
-->
<script type="text/javascript">
function allselections() {
var e = document.getElementById('selections');
e.disabled = true;
var i = 0;
var n = e.options.length;
for (i = 0; i < n; i++) {
e.options[i].disabled = true;
e.options[i].selected = true;
}
}
function disableselections() {
var e = document.getElementById('selections');
e.disabled = true;
var i = 0;
var n = e.options.length;
for (i = 0; i < n; i++) {
e.options[i].disabled = true;
e.options[i].selected = false;
}
}
function enableselections() {
var e = document.getElementById('selections');
e.disabled = false;
var i = 0;
var n = e.options.length;
for (i = 0; i < n; i++) {
e.options[i].disabled = false;
}
}
</script>
<!-- End Hack -->
und die 'Menu Item Details Section' tabelle um die ausgabe in einer auswahlliste erweitern
Code:
<!-- Begin Hack
* Dieser Teil wurde aus der Datei admin.modules.html.php der Komponente com_modules
* kopiert und leicht verändert.
-->
<tr>
<td valign="top" class="key">
<?php echo JText::_( 'Modules' ); ?>:
</td>
<td>
<?php if ($this->item->client_id != 1) : ?>
<?php if ($this->item->pages == 'all') { ?>
<label for="modules-all"><input id="modules-all" type="radio" name="modules" value="all" onclick="allselections();" checked="checked" /><?php echo JText::_( 'All' ); ?></label>
<label for="modules-none"><input id="modules-none" type="radio" name="modules" value="none" onclick="disableselections();" /><?php echo JText::_( 'None' ); ?></label>
<label for="modules-select"><input id="modules-select" type="radio" name="modules" value="select" onclick="enableselections();" /><?php echo JText::_( 'Select From List' ); ?></label>
<?php } elseif ($this->item->pages == 'none') { ?>
<label for="modules-all"><input id="modules-all" type="radio" name="modules" value="all" onclick="allselections();" /><?php echo JText::_( 'All' ); ?></label>
<label for="modules-none"><input id="modules-none" type="radio" name="modules" value="none" onclick="disableselections();" checked="checked" /><?php echo JText::_( 'None' ); ?></label>
<label for="modules-select"><input id="modules-select" type="radio" name="modules" value="select" onclick="enableselections();" /><?php echo JText::_( 'Select From List' ); ?></label>
<?php } else { ?>
<label for="modules-all"><input id="modules-all" type="radio" name="modules" value="all" onclick="allselections();" /><?php echo JText::_( 'All' ); ?></label>
<label for="modules-none"><input id="modules-none" type="radio" name="modules" value="none" onclick="disableselections();" /><?php echo JText::_( 'None' ); ?></label>
<label for="modules-select"><input id="modules-select" type="radio" name="modules" value="select" onclick="enableselections();" checked="checked" /><?php echo JText::_( 'Select From List' ); ?></label>
<?php } ?>
<?php endif; ?>
</td>
</tr>
<tr>
<td class="key" valign="top" align="right">
<?php echo JText::_( 'Show Modules' ); ?>:
</td>
<td>
<?php echo JHTML::_('select.genericlist', $this->allModules, 'selections[]', 'class="inputbox" size="15" multiple="multiple"', 'value', 'text', $this->selectedModules, 'selections' );?>
</td>
</tr>
<!-- End Hack -->
last but not least musste ich noch die funktion save() in der datei administrator/components/com_modules/controller.php ändern da module die bei allen menulinks angezeigt werden sollen in der tabelle #__modules_menu mit einer 0 gekenzeichnet werden.
Code:
//Begin Hack
//dieser Teil wird überflüssig
// check needed to stop a module being assigned to `All`
// and other menu items resulting in a module being displayed twice
/*if ( $menus == 'all' ) {
// assign new module to `all` menu item associations
$query = 'INSERT INTO #__modules_menu'
. ' SET moduleid = '.(int) $row->id.' , menuid = 0'
;
$db->setQuery( $query );
if (!$db->query()) {
return JError::raiseWarning( 500, $db->getError() );
}
}
else
{*/
//das hier brauchen wir noch, Orginal Code
foreach ($selections as $menuid)
{
// this check for the blank spaces in the select box that have been added for cosmetic reasons
if ( (int) $menuid >= 0 ) {
// assign new module to menu item associations
$query = 'INSERT INTO #__modules_menu'
. ' SET moduleid = '.(int) $row->id .', menuid = '.(int) $menuid
;
$db->setQuery( $query );
if (!$db->query()) {
return JError::raiseWarning( 500, $db->getError() );
}
}
}
//} End Hack
ja das wars auch schon, bei mir funzt es prima und erspart mir ne menge sucherrei wenn ich einen neuen menueintrag hinzufügen möchte. würde es aber immer erstmal lokal testen da es ein hack ist und es sein kann das ich etwas übersehen habe!!!!
am ende noch ein hinweiss, sollte man schon module haben die bei allen links angezeigt werden, sollte man im backend bereich unter erweiterungen->module diese aufrufen und nochmals speichern damit diese module auch allen menu-einträgen zugeordnet werden und nicht wie vorher mit einer 0 gekennzeichnet sind. hat folgenden hintergrund, wenn man vorher einen menu-eintrag bearbeitet und dort ein modul abwählt das vorher mit einer 0 gezeichnet war, wirds nur noch in diesem einen menu-eintrag angezeigt!!!
und am end noch das übliche, machste ein update ist alles weg
Lesezeichen