Contao-Camp 2024
Ergebnis 1 bis 7 von 7

Thema: Toggle Veröffentlichung nachträglich in Modul einbauen

  1. #1
    Contao-Fan Avatar von dtptiger
    Registriert seit
    20.06.2009.
    Ort
    Nürnberg
    Beiträge
    816

    Standard Toggle Veröffentlichung nachträglich in Modul einbauen

    Hallo,

    ich möchte gerne in ein leider nicht mehr gewartetes Modul die Funktion "veröffentlichen", das grüne Auge, einbauen.
    Inzwischen hab ich den Code gefunden, allerdings muss ja der Pfad stimmen, wie finde ich den richtigen Pfad?

    Ich habe anhand anderer Extension versucht zu verstehen ... und komme nicht weiter,

    Das ist der echte Pfad zur dca:
    /linking-you/contao-speisekarte/src/Resources/contao/dca/tl_contao_speisekarte_speisen.php

    Der funktioniert nicht:

    Code:
    			'toggle' => array(
    				'label'  => &$GLOBALS['TL_LANG']['tl_contao_speisekarte_speisen']['toggle'],
    				'icon' => 'visible.gif',
    				'attributes' => 'onclick="Backend.getScrollOffset();return AjaxRequest.toggleVisibility(this,%s)"',
    				'button_callback' => array('linking-you\\contao_speisekarte\\tl_contao_speisekarte_speisen.php', 'toggleSlideIcon'),
    			),
    Danke für jede Hilfe!
    Gruß dtptiger

  2. #2
    Contao-Nutzer Avatar von Black Pirate
    Registriert seit
    10.02.2015.
    Beiträge
    224

    Standard

    Der Callback erwartet an dieser Stelle eine function, nicht einen Pfad.

    Also zB.
    Code:
    'button_callback'     => array('tl_meinTLName', 'toggleIcon'),
    und die function muss dann natürlich noch unten am DCA hinzugefügt werden, damit das System weiss, was es machen soll, wenn du aufs "grüne Auge" klickst.

  3. #3
    Contao-Fan Avatar von dtptiger
    Registriert seit
    20.06.2009.
    Ort
    Nürnberg
    Beiträge
    816

    Standard

    Danke! Versuche ich heute Abend zu realsieren.

  4. #4
    Contao-Fan Avatar von dtptiger
    Registriert seit
    20.06.2009.
    Ort
    Nürnberg
    Beiträge
    816

    Standard

    Helplessly hoping ..

    Ich versuche zu verstehen indem ich mir bei rocksolid das toggle array abkupfere, da steht ein Pfad drinn:

    Code:
    			'toggle' => array(
    				'label' => &$GLOBALS['TL_LANG']['tl_rocksolid_mega_menu_column']['toggle'],
    				'icon' => 'visible.gif',
    				'attributes' => 'onclick="Backend.getScrollOffset();return AjaxRequest.toggleVisibility(this,%s)"',
    				'button_callback' => array('MadeYourDay\\RockSolidMegaMenu\\MegaMenu', 'toggleColumnIcon'),
    			),
    meine Pfade sind vom System nicht akzeptiert :

    Code:
    [2022-02-28T21:52:52.820019+01:00] request.CRITICAL: Uncaught PHP Exception RuntimeException: "System::import() failed because class "linking-you\tl_contao_speisekarte_speisen.php" is not a valid class name or does not exist." at /var/customers/webs/mysite.de/vendor/contao/core-bundle/src/Resources/contao/library/Contao/System.php line 198 {"exception":"[object] (RuntimeException(code: 0): System::import() failed because class \"linking-you\\tl_contao_speisekarte_speisen.php\" is not a valid class name or does not exist. at /var/customers/webs/mysitede/vendor/contao/core-bundle/src/Resources/contao/library/Contao/System.php:198)"} []
    noch unten am DCA hinzugefügt werden, damit das System weiss,
    Ist sowas damit gemeint?
    Code:
    		'published' => array(
    			'label' => &$GLOBALS['TL_LANG']['tl_contao_speisekarte_speisen']['published'],
    			'exclude' => true,
    			'filter' => true,
    			'flag' => 1,
    			'inputType' => 'checkbox',
    			'eval' => array('doNotCopy'=>true),
    			'sql' => "char(1) NOT NULL default ''",
    		),

    Frage dtptiger, janz Mutig

  5. #5
    Contao-Nutzer Avatar von Black Pirate
    Registriert seit
    10.02.2015.
    Beiträge
    224

    Standard

    Bei deinem Beispiel von MegaMenü - folge dem Pfad und sieh dir die php datei an.
    Dort ist mit einer class eine zugehörige public function definiert.

    Also wenn deine DCA zum Beispiel
    Code:
    'button_callback'     => array('meineFunk', 'toggleIcon'),
    heisst, dann sollte folgendes kommen
    Code:
    <?php
    class meineFunk
    {
        public function toggleIcon
        {
        // dein Ablauf...
        }
    }
    Was deine function machen sollte:
    - auf klick von Sichtbar auf Unsichtbar und auch andersrum natürlich.

    Das wäre dann mal die Ansicht - es wechselt also auf klick das Icon.


    Nun hat aber das wechseln des icons noch keinen Einfluss genommen auf den Datensatz, der soll ja aktiviert/deaktiviert werden.
    Dazu benötigt es eine weitere function, die dem zugehörigen Datensatz ein SQL Update macht.
    Sprich der angeklickte Datensatz muss das Feld "published" ändern von checkbox 0 oder 1

  6. #6
    Contao-Nutzer
    Registriert seit
    28.05.2020.
    Beiträge
    21

    Frage Ähnliches Problem

    Hallo,
    ich habe ein ähnliches Problem und komme einfach nicht weiter.

    Unter /app/Resources/contao/dca habe ich meine php Datei liegen.

    Darin habe ich erstmal folgende $GLOBAL Konstante definiert:
    PHP-Code:
    $GLOBALS['TL_DCA']['tl_torg_my_network'] = [
        
    'config' => [
            
    'dataContainer' => 'Table',
            
    'enableVersioning' => true,
            
    'sql' => [
                
    'keys' => [
                    
    'id' => 'primary',
                ],
            ],
            
    'onload_callback' => [
                
    // TODO: better use a service for the callback!
                
    function (\Contao\DataContainer $dc) {
                    
    /* $db = \Contao\Database::getInstance(); // db conn
                    $pid = \Contao\Input::get('pid'); // get parameter
                    $result = $db->prepare('SELECT * FROM `tl_torg_my_network` WHERE customer_id = 1')
                                ->execute(); */

                    
    $objUser = \Contao\BackendUser::getInstance();
                    if (!
    $objUser->isAdmin) {
                        
    $GLOBALS['TL_DCA']['tl_torg_my_network']['list']['sorting']['filter'] = [['customer_id=?'$objUser->customer_id]];
                    } else {
                        
    $GLOBALS['TL_DCA']['tl_torg_my_network']['list']['sorting']['panelLayout'] = 'filter,search,limit';
                    }
                },
            ]
        ],
        
    'list' => [
            
    'sorting' => [
                
    'mode' => 2,
                
    'fields' => array('customer_id',),
                
    'format' => '%s',
                
    'panelLayout' => 'search,limit'
            
    ],
            
    'label' => [
                
    'fields' => array('member_id:mm_torg_member.fullname''member_id:mm_torg_member.company''customer_id:mm_torg_customer.company'),
                
    'format' => '%s %s %s',
                
    'showColumns' => true
            
    ],
            
    'operations' => [
                
    'edit' => [
                    
    'href' => 'act=edit',
                    
    'icon' => 'edit.svg',
                ],
                
    'powerteam' => [
                    
    'icon' => 'blitz.svg',
                    
    'attributes'          => 'onclick="Backend.getScrollOffset();return AjaxRequest.togglePowerteam(this,%s)"',
                    
    'button_callback'     => array('tl_torg_my_network''togglePowerteamIcon')
                ],
                
    'active' => [
                    
    'icon' => 'visible.svg',
                    
    'attributes'          => 'onclick="Backend.getScrollOffset();return AjaxRequest.toggleActive(this,%s)"',
                    
    'button_callback'     => array('tl_torg_my_network''toggleActiveIcon')
                ],
                
    'datapolicy' => [
                    
    'icon' => 'paragraph_green.png',
                    
    'attributes'          => 'onclick="Backend.getScrollOffset();return AjaxRequest.toggleDatapolicy(this,%s)"',
                    
    'button_callback'     => array('tl_torg_my_network''toggleDatapolicyIcon')
                ],
            ],
        ],
        
    'fields' => [
            
    'id' => [
                
    'sql' => ['type' => 'integer''unsigned' => true'autoincrement' => true],
            ],
            
    'pid' => [
                
    'foreignKey' => 'tl_torg_my_network.name',
                
    'sql' => ['type' => 'integer''unsigned' => true'default' => 0],
                
    'relation' => ['type'=>'belongsTo''load'=>'lazy']
            ],
            
    'tstamp' => [
                
    'sql' => ['type' => 'integer''unsigned' => true'default' => 0]
            ],
            
    'customer_id' => [
                
    'label' => &$GLOBALS['TL_LANG']['tl_torg_my_network']['customer_id'],
                
    'inputType' => 'text',
                
    'filter' => true,
                
    'eval' => ['tl_class' => 'w50''maxlength' => 5'mandatory' => true],
                
    'sql' => ['type' => 'integer''notnull' => true'unsigned' => true]
            ],
            
    'member_id' => [
                
    'label' => &$GLOBALS['TL_LANG']['tl_torg_my_network']['member_id'],
                
    'inputType' => 'text',
                
    'filter' => true,
                
    'eval' => ['tl_class' => 'w50''maxlength' => 5'mandatory' => true],
                
    'sql' => ['type' => 'integer''notnull' => true'unsigned' => true]
            ],
            
    'is_powerteam' => [
                
    'label' => &$GLOBALS['TL_LANG']['tl_torg_my_network']['is_powerteam'],
                
    'inputType' => 'checkbox',
                
    'eval' => ['tl_class' => 'w50''maxlength' => 1],
                
    'sql' => ['type' => 'integer''notnull' => true'unsigned' => true'default' => 0]
            ],
            
    'is_active' => [
                
    'label' => &$GLOBALS['TL_LANG']['tl_torg_my_network']['is_active'],
                
    'inputType' => 'checkbox',
                
    'eval' => ['tl_class' => 'w50''maxlength' => 1],
                
    'sql' => ['type' => 'integer''notnull' => true'unsigned' => true'default' => 0]
            ],
            
    'privacy_accepted' => [
                
    'label' => &$GLOBALS['TL_LANG']['tl_torg_my_network']['privacy_accepted'],
                
    'inputType' => 'checkbox',
                
    'eval' => ['tl_class' => 'w50''maxlength' => 1],
                
    'sql' => ['type' => 'integer''notnull' => true'unsigned' => true'default' => 0]
            ],
            
    'custom_description' => [
                
    'label' => &$GLOBALS['TL_LANG']['tl_torg_my_network']['custom_description'],
                
    'inputType' => 'textarea',
                
    'eval' => ['tl_class' => 'clr''rte' => 'tinyMCE'],
                
    'sql' => ['type' => 'text''notnull' => false]
            ],
        ],
        
    'palettes' => [
            
    'default' => '{my_network_legend},custom_description,is_powerteam,is_active,privacy_accepted'
        
    ],
    ]; 
    Im folgenden geht es um die unter `operations` eingehängten Icons powerteam, active und datapolicy. "edit" funktioniert!

    In der gleichen Datei habe ich nun eine Klasse definiert:
    PHP-Code:
    class tl_torg_my_network extends Backend {... 
    in der wiederum die in den Icons als button_callback hinterlegten Funktionen enthält (z.B. toggleDatapolicyIcon):
    PHP-Code:
        public function togglePowerteamIcon($row$href$label$title$icon$attributes) {
            if (
    strlen(Input::get('id_powerteam'))) {
                
    $this->togglePowerteam(Input::get('id_powerteam'), (Input::get('state') == 1), (@func_get_arg(12) ?: null));
                
    $this->redirect($this->getReferer());
            }

            
    $href .= '&amp;id_powerteam=' $row['id'] . '&amp;state=' $row['is_powerteam'];
            
    $icon $row['is_powerteam'] ? 'lightning-icon.png' 'gray_lightning-icon.png';
            return 
    '<a href="' $this->addToUrl($href) . '" title="' StringUtil::specialchars($title) . '"' $attributes '>' Image::getHtml("files/torg/img/backend_icons/".$icon$label'data-state="' . ($row['is_powerteam'] ? 0) . '"') . '</a> ';
        } 
    Zudem habe ich etwas weiter unten auch eine PHP Funktion:
    PHP-Code:
       public function togglePowerteam($intId$stateDataContainer $dc=null)
        {
            
    // Set the ID and action
            
    Input::setGet('id'$intId);
            
    Input::setGet('act''powerteam');

            if (
    $dc)
            {
                
    $dc->id $intId// see #8043
            
    }

            
    // Get the current record
            
    if ($dc)
            {
                
    $objRow $this->Database->prepare("SELECT * FROM tl_torg_my_network WHERE id=?")
                                         ->
    limit(1)
                                         ->
    execute($intId);
                if (
    $objRow->numRows){
                    
    $dc->activeRecord $objRow;
                }
            }

            
    $time time();
            
    // Update the database
            
    $this->Database->prepare("UPDATE tl_torg_my_network SET tstamp=$time, is_powerteam='" . ($state 0) . "' WHERE id=?")
                           ->
    execute($intId);

            if (
    $dc)
            {
                
    $dc->activeRecord->tstamp $time;
                
    $dc->activeRecord->is_powerteam = ($state '1' '');
            }
        } 

    Wenn ich nun aber in der Backendliste dieses Button klicke, lädt die Seite neu und ich sehe ich in der Konsole einen JS-Error:

    Code:
    Uncaught TypeError: AjaxRequest.toggleDatapolicy is not a function
        at HTMLAnchorElement.onclick
    BTW: Der href-Link des Icons sieht in etwa so aus:
    Code:
    contao?do=my_network&&id_privacy=12345&state=1&rt=xxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxx&ref=yyyyyyy
    Nach einem Klick auf das Icon wird die eigentliche Contao-Backendseite erneut geladen.

    Soweit klar ist, dass er die JS-Function `toggleDatapolicy` nicht findet, die scheinbar in der bundles/contaocore/core.min.js erwartet wird.

    Was mir nicht ganz klar ist:
    1. Muss ich nun noch einen JS-Function erstellen oder macht contao dies selbstständig aus der in der Datei enthaltenen `public function togglePowerteam()`?
    2. Wenn ich da was erstellen muss, kann dass doch nicht in der core.js sein, oder? Sonst wäre es ja nicht upgrade-safe?!
    3. Woran kann es liegen, dass

  7. #7
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.896
    Partner-ID
    10107

    Standard

    Vielleicht tust du dir mit https://github.com/codefog/contao-ha...ggle-operation leichter.
    » sponsor me via GitHub or PayPal or Revolut

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •