TobiasKrais / d2u_news

Redaxo 5 Addon zum Verwalten von Nachrichten
https://www.kaltenbach.com/de/news-und-messen/
MIT License
11 stars 0 forks source link

Denkfehler bei der Ausgabe #4

Closed madiko closed 6 years ago

madiko commented 6 years ago

Hallo Tobias,

in der Ausgabe ist noch ein Denkfehler. Leider komme ich nicht drauf, wie das am geschicktesten zu lösen ist ¯_(ツ)_/¯

Bereits bei der ersten DB-Abfrage (Kategorien) schränkst Du die Zahl der News ein. Sobald aber die zweite Bedingung dazu kommt, kann es sein, dass in dieser eingeschränkten Auswahl nicht mehr ausreichend Treffer sind für Bedingung zwei - obwohl in der DB noch weitere Datensätze hinterlegt wären.

Meine Ideen zur Lösung:

Zudem glaube ich, dass es Sinn macht, die Reihenfolge umzudrehen: Erst die Abfrage nach den Typen (Arten) - dann nach den Kategorien.

Ich hänge unten mal meinen Code soweit wie ich kam an. Es funzt aber noch nicht. Wo ist mein Denkfehler?

Viele Grüße, Franziska

EINGABE

<!-- Kategorien im AddOn auslesen -->
<div class="row">
    <div class="col-lg-2">
        <p><b>Kategorie(n)</b></p>
    </div>

    <div class="col-lg-10">
        <?php
            $categories = \D2U_News\Category::getAll(rex_clang::getCurrentId(), TRUE);
            if (count($categories) > 0) {
                print '<select name="REX_INPUT_VALUE[2]" multiple="multiple" style="width: 100%" size="46">';
                print '<option value="0">Nachrichten aller Kategorien anzeigen</option>';
                foreach ($categories as $category) {
                    echo '<option value="'. $category->category_id .'" ';
                    if ("REX_VALUE[2]" == $category->category_id) {
                        echo 'selected="selected" ';
                    }
                    echo '>'. $category->name .'</option>';
                }
                print '</select>';
            }
        ?>
    </div>
</div>

<!-- Typ der News auswählen -->
<?php
if(rex_plugin::get('d2u_news', 'news_types')->isAvailable()) {
?>

    <div class="row">
        <div class="col-lg-12"><br></div>
    </div>

    <div class="row">

        <div class="col-lg-2">
            <p><b>Typ(en)</b><br>(Ohne Auswahl werden Nachrichten aller Typen angezeigt.)</p>
        </div>

        <div class="col-lg-10">
            <?php
                $selected_types = rex_var::toArray("REX_VALUE[3]");
                $types = \D2U_News\Type::getAll(rex_clang::getCurrentId(), TRUE);

                if ($selected_types =='') {

                    if (count($types) > 0) {
                        print '<select name="REX_INPUT_VALUE[3][]" multiple="multiple" style="width: 100%" size="11">';
                        foreach ($types as $type) {
                            echo '<option value="'. $type->type_id .'" ';
                            echo '>'. $type->name .'</option>';
                        }
                        print '</select>';
                    }                       

                }

                else {

                    if (count($types) > 0) {
                        print '<select name="REX_INPUT_VALUE[3][]" multiple="multiple" style="width: 100%" size="8">';
                        foreach ($types as $type) {
                            echo '<option value="'. $type->type_id .'" ';
                            if (in_array($type->type_id, $selected_types)) {
                                echo 'selected="selected" ';
                            }
                            echo '>'. $type->name .'</option>';
                        }
                        print '</select>';
                    }                   

                }

            ?>
        </div>
    </div>

    <div class="row">
        <div class="col-lg-12"><br></div>
    </div>

<?php
}
?>

<?php

// Aufruf der MForm-Instanz
$mform1 = new MForm();

$mform1->addFieldset('Allgemeine Einstellungen für die News');

    // Anzahl der News
    $mform1->addTextField("1.number", array('label' => 'Anzahl der News', 'placeholder' => '9'));

    // Ausrichtung Text
    $mform1->addSelectField("1.txt_align", array(0 => 'zentriert', 1 => 'links-bündig', 2 => 'rechts-bündig'), array('label'=>'Ausrichtung Text', "default-value" => "1")); 

    // Graustufen
    $mform1->addSelectField("1.grayscale", array(0 => 'nein', 1 => 'ja'), array('label'=>'Graustufen', 'default-value' => '1'));

    // Breite des Containers für die Karten
    $mform1->addSelectField("1.small", theme_setting::getKey('master')['small'], array('label' => 'Kleine Displays', 'default-value' => "small-100"));
    $mform1->addSelectField("1.medium", theme_setting::getKey('master')['medium'], array('label' => 'mittlere Displays', 'default-value' => 'medium-030'));
    $mform1->addSelectField("1.large", theme_setting::getKey('master')['large'], array('label' => 'große Displays', 'default-value' => 'large-030'));
    $mform1->addSelectField("1.xlarge", theme_setting::getKey('master')['xlarge'], array('label' => 'größte Displays', 'default-value' => 'xlarge-025'));

// get formular
echo $mform1->show();

?>

AUSGABE

<?php

// Auslesen des kompletten Arrays für die gewählte Zahl der News
if(rex_addon::get("d2u_news")->isAvailable()) {

// Allgemeine Angaben auslesen
$container = rex_var::toArray("REX_VALUE[1]");
    $number_set = $container["number"];
    $txt_align = $container["txt_align"];
    $small = $container["small"];
    $medium = $container["medium"];
    $large = $container["large"];
    $xlarge = $container["xlarge"];
    $grayscale = $container["grayscale"];

    if($number_set !='') {
        $number = $number_set;
    }
    else {
        $number = '9';
    }

// Datum sprachspezifisch auslesen
if(!function_exists('formatDate')) {
    /**
     * Formats the date for language specific options.
     * @param string $date DAte in Format YYYY-MM-TT
     * @param int $clang_id Redaxo clang id
     * @return string Formated date
     */
    function formatDate($datum, $clang_id) {
        if($datum != "") {
            $d = explode("-", $datum);
            $unix = mktime(0, 0, 0, $d[1], $d[2], $d[0]);

            return date("d.m.Y",$unix);
        }
    }
}

// Mehrsprachigkeit
$sprog = rex_addon::get("sprog");
$tag_open = $sprog->getConfig('wildcard_open_tag');
$tag_close = $sprog->getConfig('wildcard_close_tag');   

// den kompletten String auslesen
$alle = \D2U_News\News::getAll(rex_clang::getCurrentId());  

// News-Kategorien auslesen
$category_id = "REX_VALUE[2]" > 0 ? "REX_VALUE[2]" : 0;
$category = $category_id > 0 ? new \D2U_News\Category($category_id, rex_clang::getCurrentId()) : FALSE;

// News nach Kategorie einschränken
$news = [];
    if($category !== FALSE) {
        $news = $category->getNews(TRUE);
    }
    else {
        $news = \D2U_News\News::getAll(rex_clang::getCurrentId(), TRUE);
    }

// News-Typen (sofern das News-Types-Plugin aktiviert wurde)
$selected_news_types = [];
if(rex_plugin::get('d2u_news', 'news_types')->isAvailable()) {

    // Typen auslesen
    $selected_news_type_ids = rex_var::toArray("REX_VALUE[3]");
    if ($selected_news_type_ids !='') {

        foreach ($selected_news_type_ids as $selected_news_type_id) {
            $selected_news_types[] = new \D2U_News\Type($selected_news_type_id, rex_clang::getCurrentId());
        }

        if(count($selected_news_types) > 0) {
            foreach ($news as $current_news) {
                foreach($selected_news_types as $selected_news_type) {
                    if(!in_array($selected_news_type, $current_news->types)) {
                        unset($news[$current_news->news_id]);
                    }
                }
            }
        }

    }

}

// Ausgabe Backend
if(rex::isBackend()) {

    // arrays auslesen
    //dump($alle);
    //dump($container);
    dump($news);

    // alles ausgeben - Darstellung komplett/**************** DEBUG **************/
    //print "Gewählte Newstypen:";
    //print "<pre>";
    //print_r($selected_news_types);
    //print "</pre>";
    /**************** DEBUG **************/

    //Allgemeine Einstellungen für den gesamten Block
    echo "<div class=\"row\"><div class=\"col-lg-12\">\n";

        echo "<h3>Meldungen als Überblick</h3>\n";

        echo "<h4>Filtern der Inhalte</h4>";

            // Kategorien
            echo "<i>Gewählte Kategorie(n)</i>: ";
            print ($category !== FALSE ? $category->name : 'alle');
            echo "<br>\n";

            //Typen
            echo "<i>Gewählte(r) Typ(en)</i>: ";

                // Kein spezifischer Typ = alle ausgewählt
                if ('REX_VALUE[3]' =='') {
                    echo "alle <br>\n";
                }

                else {                  
                    $first_type = TRUE;
                    foreach ($selected_news_types as $selected_news_type) {
                        if($first_type)  {
                            $first_type = FALSE;
                        }
                        else {
                            print ", ";
                        }
                        print "$selected_news_type->name <br>\n";
                    }               
                }   

            echo "<br>\n";  

        echo "<h4>Allgemeine Einstellungen zum Layout</h4>\n";

            // Zahl der Meldungen
            echo "<i>Anzahl der News</i>: ";
            if ($number !='') { echo "$number <br>\n"; }
            else { echo "9 <br>\n"; }

            // Design
            echo "<i>Ausrichtung des Textes</i>: ";
            if ($txt_align == '0') { echo "zentriert";}
            if ($txt_align == '1') { echo "links-bündig"; }
            if ($txt_align == '2') { echo "rechts-bündig"; }
            echo "<br>\n";

            echo "<i>Breite der News</i>: ";
            echo $container["small"];
            echo " | ";
            echo $container["medium"];
            echo " | ";
            echo $container["large"];
            echo " | ";
            echo $container["xlarge"];
            echo "<br>\n";

            echo "<i>grayscale der Bilder</i>: ";   
            if ($grayscale =='0') { echo "nein"; }
            else { echo "ja"; }         

    echo "</div></div>\n"; // row wieder schließen

} // Ende Ausgabe Backend

// Ausgabe Frontend
else {

    // Alle News auslesen
    if(count($news) > 0) {

        echo "<div class=\"row\">\n";

            for ($i = 1; $i <= $number; $i++) {

                // Schleife für alle News
                foreach ($news as $nachricht) {

                    // Variablen auslesen

                        // Bild-Infos
                        $media = $nachricht->picture;
                        $alt_tag = $nachricht->name;

                        // Texte
                        $headline = $nachricht->name;
                        $teaser = markitup::parseOutput ('textile', $nachricht->teaser);

                        // Verlinkung

                            // Intern verlinkt
                            if ($nachricht->link_type == "article" && $nachricht->article_id > 0) {
                                $url = rex_getUrl($nachricht->article_id);
                            }

                            // Extern verlinkt
                            else if ($nachricht->link_type == "url" && $nachricht->url != "") {
                                $url = $nachricht->url;
                            }

                            // Link zu einer "Maschine" im AddOn d2u-Machinery
                            else if (rex_addon::get("d2u_machinery")->isAvailable()) {

                                echo "else if ($nachricht->link_type == \"machine\" && $nachricht->d2u_machines_machine_id > 0) {
                                    $machine = new Machine($nachricht->d2u_machines_machine_id, rex_clang::getCurrentId());
                                    $url = $machine->getURL();
                                }";

                            }

                        // Tag der Veröffentlichung
                        $date = formatDate($nachricht->date, rex_clang::getCurrentId());

                        // Autor --> Benutzername muss noch korrekt ausgelesen werden
                        //$author = $nachricht->updateuser;

                    // alles zusammenbauen und ausgeben

                        // Column
                        echo "<div class=\"column card";

                        if ($txt_align == '1') { echo " txtalign-left"; }
                        if ($txt_align == '2') { echo " txtalign-right"; }

                        echo " $small $medium $large $xlarge\">\n";             

                            // Details zur News
                            echo "<div class=\"card-details\">";                

                                // Aufmacher mit Verlinkung
                                if ($media !='') {                          

                                    echo "<a href=\"$url\" title=\"$alt_tag\">\n";

                                    echo "<img ";
                                    if ($grayscale == '1') { echo " class=\"grayscale\"";}
                                    echo " src=\"/media/$media\"";
                                    echo " title=\"$alt_tag\"";
                                    echo " />\n";

                                    echo "</a>\n";                              

                                } // Ende Aufmacher

                                // Card-Text mit Weiterlesen und Infos
                                echo "<div class=\"card-text\">\n";

                                    if ($headline !='') {
                                        echo "<a href=\"$url\" title=\"$alt_tag\">";
                                        echo "<h5>$headline</h5>\n";
                                        echo "</a>";
                                    }

                                    if ($teaser !='') {
                                        echo "$teaser \n";
                                    }

                                    echo "<p><a href=\"$url\" title=\"$alt_tag\">Weiterlesen</a></p>\n";

                                    echo "<p class=\"quellen\">Veröffentlicht: $date</p>";

                                echo "</div>\n"; // Ende Card-Text              

                            echo "</div>\n"; // Ende card-details

                        echo "</div>\n"; // Ende column card                

                } // Ende Schleife für alle News                        

            } // Ende Zähler

        echo "</div>\n"; // Ende der umschließenden row für alle News

    } // Ende count alle > 0

    // fallback, sollten keine entsprechenden News gefunden werden.
    else {
        echo "

            <div class=\"row\">\n

                <div class=\"column small-100 medium-100 large-100\">

                    <p class=\"instruction\">

                        Ooops, aktuell liegen keine Meldungen vor. 
                        <br>
                        Das kann sich jedoch täglich ändern. Schau bald wieder vorbei - es lohnt sich!                      
        ";

        // Flurfunk -- Achtung Links prüfen und ggf. anpassen

        echo "
                        <br><br>
                        Du möchtest es nicht dem Zufall überlassen und auf dem Laufenden bleiben? 
                        <br>                        
                        Bitte trage Dich in meinen <a href=\"/flurfunk\">Flurfunk</a> ein und folge mir via <a href=\"#impressum\">Social Media</a>.

                    </p>

                </div>

            </div>

        ";
    }

} // Ende Ausgabe Frontend

} // Ende d2u_news AddOn is available

else {

    echo "Bitte installiere das AddOn d2u_news.";

}

?>
TobiasKrais commented 6 years ago

Stimmt. Schau die in den Modulen den neuen Code an. Siehe der Commit oben. Nur die Änderungen in den Modulen sind für dich interessant. Das sollte das Problem lösen. Funktioniert es bei dir? Ich habe es noch nicht getestet.

madiko commented 6 years ago

Hallo Tobias,

Entschuldigung, ich kam erst heute dazu, die neue Version zu testen und einzubauen.

Mit etwas Denkarbeit habe ich es jetzt auch in mein Modul integrieren können.

Ich musste noch die Abfrage einbauen, ob IDs gewählt wurden (nicht leer):

// News-Typen (sofern das News-Types-Plugin aktiviert wurde)
$selected_news_types = [];
if(rex_plugin::get('d2u_news', 'news_types')->isAvailable()) {

    // IDs der News-Typen auslesen
    $selected_news_type_ids = rex_var::toArray("REX_VALUE[3]");
    if ($selected_news_type_ids !='') {

        // Alle gewählten News-Typen auslesen
        foreach ($selected_news_type_ids as $selected_news_type_id) {
        $selected_news_types[] = new \D2U_News\Type($selected_news_type_id, rex_clang::getCurrentId());
        }

    }

}

Es scheint mir, dass das bei Deinen Modulen auch sinnvoll ist.

Nochmals vielen Dank und beste Grüße, Franziska

TobiasKrais commented 6 years ago

Danke für den Code. Ich denke ich werde ihn (zumindest bis jetzt) nicht einbauen.