[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
PHP: Sortieren von Artikeln nach Slices-Wert mit USORT? - REDAXO Forum
Hallo,

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
Benutzeravatar
cukabeka
Beiträge: 821
Registriert: 31. Mai 2006, 00:01
Wohnort: Aschaffenburg

PHP: Sortieren von Artikeln nach Slices-Wert mit USORT?

18. Jan 2010, 00:15

Hallo!

Ich habe hier eine Nuss zum Knabbern, bei der ich nicht weiterkomme.
Ich habe ein Modul, in dem eine Jahreszahl angegeben wird. Nun möchte ich von einem anderen Modul aus die Artikel in der Kategorie nach diesem Slice-Wert sortieren. Klappt aber nicht!

Meine USORT-Funktion die ich laut http://wiki3.redaxo.de?n=R3.Sortiermöglichkeiten konstruiert habe, sieht so aus (mit trigger):

Code: Alles auswählen

if(!function_exists('GalerieSortByJahrSlice'))
{
  function GalerieSortByJahrSlice( $artA, $artB) {
	 var_dump ( OOArticleSlice::getSlicesForArticleOfType( $artA->getId(),31,0 ) -> getValue(3));
	 var_dump ( OOArticleSlice::getSlicesForArticleOfType( $artB->getId(),31,0 ) -> getValue(3));print"<br />";
     $updateA = OOArticleSlice::getSlicesForArticleOfType( $artA->getId(),31,0 ) -> getValue(3);
     $updateB = OOArticleSlice::getSlicesForArticleOfType( $artB->getId(),31,0 ) -> getValue(3);

     if ( $updateA == $updateB) {
        return 0;
     }

     return $updateA > $updateB ? -1 : 1;
  }
}
und nun gibt das blöde PHP das hier aus:
string(4) "2008" string(4) "2007"
string(4) "2009" string(4) "2008"
string(4) "2008" string(4) "2007"
string(4) "2009" string(4) "2008"
string(4) "2008" string(4) "2003"
string(4) "2009" string(4) "2008"
string(4) "2008"
Fatal error: Call to a member function getValue() on a non-object in /home/www/redaxo/include/classes/class.rex_article.inc.php(271) : eval()'d code on line 40
Kann mir da jemand einen heißen Tipp geben, warum das nicht klappt?

Danke!

Benutzeravatar
Xong
Beiträge: 2081
Registriert: 5. Jun 2008, 08:30
Wohnort: Halle (Saale)

18. Jan 2010, 00:33

Hi cukabeka!

getSlicesForArticleOfType gibt nicht immer ein Object vom Typ OOArticleSlice zurück, sondern manchmal auch ein Array von Objekten (wenn mehrere vorhanden sind) oder null (wenn kein Slice mit der ID im Artikel vorhanden ist).

Überprüfe also auf alle Eventualitäten und du solltest aus dem Schneider sein.
LG,
Xong

[ externes Bild ] Määääääääääääääääääääääääh!

Benutzeravatar
cukabeka
Beiträge: 821
Registriert: 31. Mai 2006, 00:01
Wohnort: Aschaffenburg

18. Jan 2010, 18:14

danke, das hat mich schon weitergebracht, inwzischen funktioniert es, wenn ich gewissenhaft bei allen artikeln den wert eintrage. das ist in der praxis aber möglicherweise nicht immer der fall.

nun knobele ich, wie ich die eventualitäten ausschließen kann.

im prinzip lautet meine forderung an redaxo: "Mach die Abfrage nur, wenn der Artikel dieses Modul mit gefülltem Slice enthält"

problem: dazu muss ich ja genau die bedingung stellen, die den error verursacht:

Code: Alles auswählen

if(OOArticleSlice::getSlicesForArticleOfType( $artA->getId(),31,0 ) -> getValue(3)!=NULL)
in diesem moment bekomme ich wieder den error.

sage ich nur

Code: Alles auswählen

if(OOArticleSlice::getSlicesForArticleOfType( $artA->getId(),31,0 ) !=NULL )
dann ist damit nichts gewonnen.

ist jetzt aber nicht so wichtig, wäre nur das i-tüpfelchen. also nicht den kopf zerbrechen..
:wink:

vielen dank auf jeden fall - ich wäre ohne deinen hinweis vollkommen verzweifelt.

Benutzeravatar
Xong
Beiträge: 2081
Registriert: 5. Jun 2008, 08:30
Wohnort: Halle (Saale)

18. Jan 2010, 19:26

cukabeka hat geschrieben:sage ich nur

Code: Alles auswählen

if(OOArticleSlice::getSlicesForArticleOfType( $artA->getId(),31,0 ) !=NULL )
dann ist damit nichts gewonnen.
Schon. Allerdings musst/solltest du dafür die Funktion leicht abändern:

Code: Alles auswählen

if(!function_exists('GalerieSortByJahrSlice'))
{
  function GalerieSortByJahrSlice( $artA, $artB) {
    // Überprüfung, ob Slice vorhanden
    if(
        (NULL == $sliceArtA = OOArticleSlice::getSlicesForArticleOfType( $artA->getId(),31,0 )) OR
        (NULL == $sliceArtB = OOArticleSlice::getSlicesForArticleOfType( $artA->getId(),31,0 ))
      )
      return 0;
    
    // Wenn mehrere Slices, dann nur ersten Slice beachten
    if(is_array($sliceArtA))
      $sliceArtA = $sliceArtA[0];
    if(is_array($sliceArtB))
      $sliceArtB = $sliceArtB[0];
    
    // REX_VALUE[3] abfragen
    $updateA = $sliceArtA->getValue(3);
    $updateB = $sliceArtB->getValue(3);
    
    // Werte vergleichen
    if($updateA == $updateB)
      return 0;
    return $updateA > $updateB ? -1 : 1;
  }
}
Ich hoffe, das hilft weiter.
LG,
Xong

[ externes Bild ] Määääääääääääääääääääääääh!

Benutzeravatar
cukabeka
Beiträge: 821
Registriert: 31. Mai 2006, 00:01
Wohnort: Aschaffenburg

18. Jan 2010, 19:51

xong, du bist der held! danke!

:D

miloezger
Beiträge: 29
Registriert: 20. Mai 2009, 10:46

Sortieren nach slice value

17. Apr 2010, 16:24

Evtl. könnt ihr mir weiter helfen ?

Liste Slices aus allen Unterkategorien auf:
Und möchte nun eine Sortierfunktion dass es mir alle Slices nach

$slice->getValue(10)

auflistet! Habt ihr mir einen Ansatz wo ich in meienm Code dir gewwünschte funktion aufrufe ?

Greetz

—————————————————————————————————————
<?php
$cat = OOCategory::getCategoryById(2);
$cat2 = $cat->getChildren();

foreach ($cat2 as $var)
{
$art = $var->getArticles();
$artName = $var->getName();

if (is_array($art))
{
foreach ($art as $var2)
{
if(!$var2->isStartpage())
{
$slice = OOArticleSlice::getFirstSliceForArticle($var2->getId());
usort($slices, "sortSlicesByValue10");

// SLICE DARSTELLEN
echo '<h1>'.$var2->getName().'</h1>';
echo '<h2>'.$slice->getValue(1).'</h2>';
echo '<p>Datum:'.$slice->getValue(10).'</p>';
echo '<p>Kategorie:'.$artName.'</p>';

echo '<img src="'.$REX['HTDOCS_PATH'].'/files/'.$slice->getMedia(1).'" alt="" title="" />';
}
}
}
}
?>




———————————————————————————

Benutzeravatar
cukabeka
Beiträge: 821
Registriert: 31. Mai 2006, 00:01
Wohnort: Aschaffenburg

19. Apr 2010, 12:58

habe vor kurzem mal wieder ein ähnliches problem gehabt; habe das mit if(is_object() {slice-abfrage} ) aus der welt geräumt, soweit ich mich erinnere.

hoffe, das hilft dir weiter.

miloezger
Beiträge: 29
Registriert: 20. Mai 2009, 10:46

19. Apr 2010, 22:20

hm, wiess nicht genau wie du das meinst mit isobject?!

Ich habe das Problem das ich mich in einer foreach schlaufe befinde und irgendwie steig ich nicht ganz durch wie ich die sortierung anbringen könnte...

Ausserdem wie sollte meine funktion ausschauen ?

// SORTIERFUNKTION
if(!function_exists('sortArticlesBySliceValue10'))
{
function sortArticlesBySliceValue10( $artA, $artB) {
$valueA = $artA->???
$valueB = $artB->???

if ( $valueA == $valueB) {
return 0;
}
return $valueA > $valueB ? -1 : 1;
}
}


bin total am anschlag! : (

miloezger
Beiträge: 29
Registriert: 20. Mai 2009, 10:46

19. Apr 2010, 22:50

PROBIERT:

<?php


// SORTIERFUNKTION

if(!function_exists('sortSlicesByValue'))
{
function sortSlicesByValue( $sliceA, $sliceB) {
$valueA = $sliceA->getValue(10);
$valueB = $sliceB->getValue(10);

if ( $valueA == $valueB) {
return 0;
}

return $valueA > $valueB ? -1 : 1;
}
}


$cat = OOCategory::getCategoryById(2);
$cat2 = $cat->getChildren();

foreach ($cat2 as $var)
{
$art = $var->getArticles();
$artName = $var->getName();

if (is_array($art))
{
foreach ($art as $var2)
{
if(!$var2->isStartpage())
{
$slice = OOArticleSlice::getFirstSliceForArticle($var2->getId());

if (count($slice) > 0)
{
usort($slice, "sortSlicesByValue");

// SLICE DARSTELLEN
echo '<h1>'.$var2->getName().'</h1>';
echo '<h2>'.$slice->getValue(1).'</h2>';
echo '<p>Datum:'.$slice->getValue(10).'</p>';
echo '<p>Kategorie:'.$artName.'</p>';

echo '<img src="'.$REX['HTDOCS_PATH'].'/files/'.$slice->getMedia(1).'" alt="" title="" />';

}
}
}
}
}


?>



GIBT:

Fatal error: Call to a member function getValue() on a non-object


:evil: :evil:

meugel
Beiträge: 38
Registriert: 9. Nov 2010, 21:12
Wohnort: suedtirol + wien
Kontaktdaten: Website

Re: Sortieren nach slice value

13. Okt 2011, 10:03

Hallo,

ich habe ein ähnliches Problem (vielleicht das selbe?) wie miloezger (falls es inzwischen eine Lösung gibt, bitte posten), und zwar:

wie bekomme ich die Values aus meinem ersten Slice in ein Array?

Mein Code:

Code: Alles auswählen

<?php

         if(!function_exists('HardfactSortBySliceValue'))
         {
            function HardfactSortBySliceValue( $artA, $artB) 
            {

             $sliceArtA = OOArticleSlice::getFirstSliceForArticle($artA->getId());
             $sliceArtB = OOArticleSlice::getFirstSliceForArticle($artB->getId());
               // REX_VALUE[1] abfragen            
             $numA = $sliceArtA->getValue(1);
             $numB = $sliceArtB->getValue(1);
                                              
               // Werte vergleichen
               if($numA == $numB)
               return 0;
               return $numA > $numB ? -1 : 1;
            }
         }

$cat = OOCategory::getCategoryById($this->getValue("category_id"));
$articles = $cat->getArticles( true);

if (is_array($articles)) 
{
         foreach ($articles as $article) {
         usort( $nums, "HardfactSortBySliceValue"); // sortieren
      }

         $slice = OOArticleSlice::getFirstSliceForArticle($article->getId());
         $num = $slice->getValue(1);
      
if (is_array($articles) && count( $articles) > 0) {
  echo '<ul>';
  foreach ($articles as $article) {
    // aktuellen Artikel nicht anzeigen
    if( $article->getId() == REX_ARTICLE_ID) continue;
    
    // keine Startartikel anzeigen
    if ($article->isStartPage()) continue; 
    
    echo '<li>' . $num . '</li>';
  }
  echo '</ul>';
}
}
?>
Ergibt:
Warning: usort() expects parameter 1 to be array, null given in .../redaxo/include/classes/class.rex_article_base.inc.php(388) : eval()'d code on line 27

Da ich kein PHP-Meister bin, stehe ich da leider komplett auf der Leitung und wäre für jeden Lösungsansatz dankbar.

lg meugel
LG Meugel

meugel
Beiträge: 38
Registriert: 9. Nov 2010, 21:12
Wohnort: suedtirol + wien
Kontaktdaten: Website

13. Okt 2011, 15:39

Ich habe das Problem nun folgender Maßen gelöst:

http://www.redaxo.org/de/doku/tutorials ... t-rex_sql/

Dank an miloezger, der mir den Tip gegeben hat.
LG Meugel

Zurück zu „Allgemeines [R4]“