Viewing 14 reply threads
  • Author
    Posts
    • #9466
      DennisR87
      Participant

        Hallo,

        ich hab ein Problem ich entwickle ein StateChart für das CustomerDashboard.

        aktuell hänge ich am Cache fest in dieser Stelle:

        my $Key = $LayoutObject->{UserLanguage} . '-' . $Self->{Name};
        
        my $CacheKey = 'TicketStats' . '-' . '$Param{UserID}' . '-' . $Key;
        
        my $Cache = $Kernel::OM->Get('Kernel::System::Cache')->Get(
        Type => 'Customer',
        Key => $CacheKey,
        );
        
        if ( ref $Cache ) {
        
        # send data to JS
        $LayoutObject->AddJSData(
        Key => 'CustomerTicketStats',
        Value => $Cache,
        );
        
        return $LayoutObject->Output(
        TemplateFile => 'CustomerTicketStats',
        Data => $Cache,
        AJAX => $Param{AJAX},
        );
        }
        

        Fehler kommt bei §key : Use of uninitialized value in concatenation (.) or string

      • #9468
        crythias
        Participant

          sorry this is in English … do you want ‚$Param{UserID}‘ to be enclosed in single quotes?

        • #9469
          Sven Oesterling
          Keymaster

            Hallo Dennis,

            erstmal stimme ich crythias zu, dass du $Param{UserID} vermutlich ohne die einfachen Anführungszeichen nutzen willst. Der Grund für dein warning ist aber, dass entweder $LayoutObject->{UserLanguage}, oder $Self->{Name} undef ist. Schreib doch mal ein:

            print STDERR "UsLa: $LayoutObject->{UserLanguage}\n";
            print STDERR "Name: $Self->{Name}\n";

            vor die „my $Key =“-Zeile, dann siehst du was drinnen steht, bzw. bekommst nochmal explizit ein warning für die entsprechende Zeile. (Unter der Voraussetzung, dass du auf einem nicht produktiven System bist, könntest du das Fred-Modul aus den OTOBO Addons installieren. Da könntest du die Fehlermeldung dann unter /opt/otobo/var/fred/STDERR.log lesen. Wobei du offensichtlich ja auch im Moment weißt, wo du sie angucken kannst, bringt also vmtl nicht viel, mehr nur als Hinweis gedacht.)

            Viel Erfolg und hoffentlich Spaß, Sven :)

          • #9471
            DennisR87
            Participant

              Hallo


              @crythias
              :  sicher hast du recht das die Anführungszeichen da nicht hin gehören.

              Das war ein Test um den Fehler zu finden hab die vergessen zu endfernen.

               

              @Sven Oesterling: danke für die Hilfe hab jetzt heraus gefunden das es an $Self->{Name} liegt.

              meine Vermutung ist das $Self in CustomerDashboard nicht geht.

              Hab erst mal weg gelassen aber ein anders Problem hab jetzt endlich soweit alles um geschrieben aber die Chart wird nicht angezeigt kann es sein das Charts nicht im CustomerDashboard -> Layout übernommen wird?

              • This reply was modified 2 years, 2 months ago by DennisR87.
            • #9472
              DennisR87
              Participant
                package Kernel::Output::HTML::CustomerDashboard::TileStatsGeneric;
                
                use strict;
                use warnings;
                
                use Kernel::System::DateTime qw(:all);
                
                our $ObjectManagerDisabled = 1;
                
                sub new {
                    my ( $Type, %Param ) = @_;
                
                    # allocate new hash for object
                    my $Self = {%Param};
                    bless( $Self, $Type );
                
                    return $Self;
                }
                
                sub Run {
                    my ( $Self, %Param ) = @_;
                
                    # check needed CustomerUserID
                    if ( !$Param{UserID} ) {
                        $Kernel::OM->Get('Kernel::System::Log')->Log(
                            Priority => 'error',
                            Message  => 'Need UserID!',
                        );
                        return '';
                    }
                
                    # get layout object
                    my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
                
                    my $Key      = $LayoutObject->{UserLanguage};
                    my $CacheKey = 'TicketStats' . '-' . $Param{UserID} . '-' . $Key;
                
                    my $Cache = $Kernel::OM->Get('Kernel::System::Cache')->Get(
                        Type => 'Customer',
                        Key  => $CacheKey,
                    );
                
                    if ( ref $Cache ) {
                	
                        # send data to JS
                        $LayoutObject->AddJSData(
                            Key   => 'CustomerTicketStats',
                            Value => $Cache,
                        );
                
                        return $LayoutObject->Output(
                            TemplateFile => 'CustomerTicketStats',
                            Data         => $Cache,
                            AJAX         => $Param{AJAX},
                        );
                    }
                
                    my %Axis = (
                        'State' => {
                            0 => 'Open',
                            1 => 'Closed',
                        },
                    );
                
                    my $OpenText       = $LayoutObject->{LanguageObject}->Translate('Open');
                    my $ClosedText     = $LayoutObject->{LanguageObject}->Translate('Closed');
                    my $StateText      = $LayoutObject->{LanguageObject}->Translate('State');
                    my @TicketsOpen    = ();
                    my @TicketsClosed  = ();
                    my @TicketWeekdays = ();
                
                    my $TicketObject = $Kernel::OM->Get('Kernel::System::Ticket');
                
                my $scalar = "Open";
                
                        unshift(
                            @TicketWeekdays,
                            $LayoutObject->{LanguageObject}->Translate( $Axis{'State'}->{0} )
                        );
                
                        my $CountOpen = $TicketObject->TicketSearch(
                
                            StateType => 'Open',
                            OrderBy => 'Down',
                            SortBy => 'Age',
                
                            CustomerUserID => $Param{UserID},
                            Result     => 'COUNT',
                
                            # search with user permissions
                            Permission => 'ro',
                
                        ) || 0;
                       push @TicketsOpen, $CountOpen;
                $scalar .= $CountOpen.";Closed";
                
                       unshift(
                            @TicketWeekdays,
                            $LayoutObject->{LanguageObject}->Translate( $Axis{'State'}->{1} )
                        );
                        my $CountClosed = $TicketObject->TicketSearch(
                
                            StateType => 'Closed',
                            OrderBy => 'Down',
                            SortBy => 'Age',
                
                            CustomerUserID => $Param{UserID},
                            Result     => 'COUNT',
                
                            # search with user permissions
                            Permission => 'ro',
                
                        ) || 0;
                        push @TicketsClosed, $CountClosed;
                $scalar .= $CountClosed;
                
                    unshift(
                        @TicketWeekdays,
                        $StateText
                    );
                
                    my @ChartData = (
                        $LayoutObject->{LanguageObject}->Translate('7 Day Stats'),
                        \@TicketWeekdays,
                        [ $OpenText, reverse @TicketsOpen ],
                        [ $ClosedText,  reverse @TicketsClosed ],
                    );
                
                    my %Data = (
                        TileID    => $Param{TileID},
                        Test      => $scalar,
                        %{ $Param{Config} },
                        Key       => int rand 99999,
                        ChartData => \@ChartData,
                    );
                
                    if ( $Param{Config}{CacheTTLLocal} ) {
                       $Kernel::OM->Get('Kernel::System::Cache')->Set(
                           Type  => 'Customer',
                           Key   => $CacheKey,
                           Value => \%Data,
                           TTL   => $Param{Config}{CacheTTLLocal} * 60,
                       );
                    }
                
                    # send data to JS
                    $LayoutObject->AddJSData(
                        Key   => 'CustomerTicketStats',
                        Value => \%Data
                    );
                
                    my $Content = $LayoutObject->Output(
                        TemplateFile => 'CustomerTicketStats',
                        Data         => \%Data,
                        AJAX         => $Param{AJAX},
                    );
                	
                    return $Content;
                }
                
                
              • #9474
                Sven Oesterling
                Keymaster

                  Hi Dennis,

                  ich nehme an, du versuchst quasi eines der Plugins vom Agentdashboard auf das Customerdashboard umzuschreiben. Die beiden Dashboards haben einen völlig unterschiedlichen Aufbau und funktionieren letztlich ganz anders, das geht so leider also nicht.

                  Wenn du da etwas neues schreiben willst brauchst du folgendes (am Beispiel der Toolbox):

                  • ein html-Template (Kernel/Output/HTML/Templates/Standard/Dashboard/TileToolBox.tt)
                  • das zugehörige perl-Modul (Kernel/Output/HTML/CustomerDashboard/TileToolBox.pm)
                  • optional/vmtl ein css File (vergleiche mit var/httpd/htdocs/skins/Customer/default/css/Core.Dashboard.Tiles.css)
                  • einen Eintrag in der SysConfig mit den entsprechenden Config-Optionen (such nach TileToolBox in der Framework.xml)

                  (Für sehr einfache Tiles kann man sich das perl-Modul sparen, und nur das Template angeben, dann wird TileCommon.pm verwendet, das quasi nur die Variablen weitergibt.) Das Einrichten des Dashboards, im Sinne der Anordnung der Tiles etc. geht im Moment leider noch nicht automatisiert, oder so, da kommt dann auch nochmal etwas css auf dich zu. Siehe auch: https://otobo.de/de/forums/topic/tile-bearbeitung-fuer-das-customer-portal/#post-9302

                  Eine schöne Woche, Sven

                • #9475
                  Sven Oesterling
                  Keymaster

                    Ah, vergessen – das Modul wird wie folgt aufgerufen:

                     $TileHTML .= $BackendObject->Run(
                    TileID => $TileID,
                    Template => $UsedTiles->{$Tile}{Template} || '',
                    Config => $UsedTiles->{$Tile}{Config} || {},
                    UserID => $Self->{UserID},
                    );

                    Wobei Config und Template dem entsprechenden Eintrag aus der SysConfig entsprechen. (Kernel/Modules/CustomerDashboardCommon.pm)

                    Wie bekommst du die Einrückung des Codes hin?^^ Wenn ich mit Strg+V einfüge, ist das alles weg…)

                  • #9476
                    DennisR87
                    Participant

                      Also um Code einzufügen gehe ich in „Text“ und dann „Code“ den Code aus Notepad++ einfügen und dann „/code“.

                      Also eine html-Template hab ich: /opt/otobo/Kernel/Output/HTML/Templates/Standard/CustomerTicketStats.tt
                      kann ich nicht Hochladen da kommt dann fehler von der Seite.

                      perl-Modul: /opt/otobo/Kernel/Output/HTML/CustomerDashboard/TileStatsGeneric.pm
                      code ist der oben ist.

                      also noch CSS und sysConfig.

                    • #9477
                      DennisR87
                      Participant

                        Hallo @svo

                        hab da doch noch fragen sorry.

                        also zum ersten https://otobo.de/de/forums/topic/tile-bearbeitung-fuer-das-customer-portal/#post-9302 das war ein Kollege von mir das heben wir hin bekommen.

                        ich lade auch mein Modul. Klappt auch.

                        Es wird mir auch angezeigt:

                        Nur bekomme ich kein Chart Daten.

                        Also zu meinen Fragen CSS glaube brauch ich nichts anpassen weil hab keine für die Chart gefunden.

                        Wie ist das mit der SysConfig gemeint?

                      • #9478
                        Sven Oesterling
                        Keymaster

                          Hm…stop! ;)

                          Es scheint mir, dass du mehr, oder weniger einfach eine Datei von den Agentsachen übernommen hast, das ‚$LayoutObject->AddJSData(‚ macht zum Beispiel keinen Sinn, wenn du nicht irgendwo eine JavaScript-Funktion geschrieben hast, die das verarbeitet, was du da hochlädst. Der Ansatz wird dir nichts bringen.

                          Guck dir die Sachen von der Toolbox an, die Dateien sind nicht so groß – versuch halbwegs zu verstehen, wie da das html generiert wird, und geh lieber von da aus. (Mit rechter Maustaste auf dein Tile und „Element untersuchen“, oder so, im Browser, kannst du auch sehen, was rauskommt.)

                          Wenn du einen Chart willst, musst du auch irgendwas einfügen, das dir den Chart generiert und so, das ist nicht automatisch da, z.B… Was ist denn da dein Plan?

                          Sven

                        • #9480
                          DennisR87
                          Participant

                            Also denn Ansatz hab ich klar aus dem Agent genommen hab es aber soweit umgeschrieben auf Customer.

                            Nur war mir nicht Klar was „AddJSData“ macht jetzt verstehe ich soweit also ist es ein JavaScript.

                            Ich hab mir die TileToolBox angeguckt und auch das TileTicketList sonst wäre ich bestimmt nicht soweit gekommen das er mir überhaupt was anzeigt.

                            Also muss ich jetzt ein JavaScript schreiben um die Informationen zu verarbeiten.

                            Diese liegen hier: /opt/otobo/var/httpd/htdocs/js/ ?

                             

                          • #9481
                            Sven Oesterling
                            Keymaster

                              Es via JavaScript zu machen ist zumindest eine Option. Da gibt es sicher auch reichlich plugins – in otobo kommt für’s AgentDashboard z.B. nvd3 zum Einsatz,…

                              Geht aber sicher auch anders, das bleibt letztlich völlig dir überlassen. Als Minimalbeispiel könntest du es auch völlig händisch machen:

                              # .tt-file
                              <div style="background-color: #dd0000; width: [% Data.Balken1 | html %]%; height: 24px;"></div>
                              <div style="background-color: #00cc55; width: [% Data.Balken2 | html %]%; height: 24px;"></div>
                              <div style="background-color: #0000ee; width: [% Data.Balken3 | html %]%; height: 24px;"></div>
                              # .pm-file
                              my $Content = $LayoutObject->Output(
                              TemplateFile => 'CustomerTicketStats',
                              Data => {
                              Balken1 => 30,
                              Balken2 => 90,
                              Balken3 => 50,
                              },
                              );

                              Ich hoffe, dass das deine Fragen zumindest so halb beantwortet…

                              (Ja, die js-Dateien liegen da, müssen, wenn du was neues schreibst, dann noch für die entsprechende Oberfläche geladen werden, da such mal ‚Loader::Module::CustomerDashboard‘ in der SysConfig.)

                            • #9482
                              DennisR87
                              Participant

                                Oh an diese Ideee hab ich nicht gedacht mit HTML elementen zu arbeiten.

                                Danke hab es jetzt hin bekommen:

                                War ein bisschen Arbeit aber läuft kann gern den Quelle Code Online stellen

                                • #11501
                                  Kevin Glück
                                  Participant

                                    Ich hätte Interesse an deinem Quellcode, ich bin genau auf der Suche nach sowas für unser CustomerDashboard.

                                • #9483
                                  Sven Oesterling
                                  Keymaster

                                    Cool – ja, gerne, mach das! :)

                                    Du kannst die Sachen entweder einfach hier ins Forum stellen, oder uns per email schicken (hello@otobo.de). Falls du einen github-Account, oder so hast, kannst du prinzipiell auch gerne einen pull-request machen.

                                    Viel Spaß, Sven

                                  • #13406
                                    Kevin Jovi
                                    Participant

                                      Hat jemand den Quelle Code und kann ihn posten? Wäre super :)

                                  Viewing 14 reply threads
                                  • You must be logged in to reply to this topic.