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

Wie verwendet man Module oder Aktion und passt diese an.

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

Beitragvon cukabeka » 17. Jan 2010, 23: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
cukabeka
 
Beiträge: 653
Registriert: 30. Mai 2006, 23:01
Wohnort: Aschaffenburg

Beitragvon Xong » 17. Jan 2010, 23: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

Bild Määääääääääääääääääääääääh!
Benutzeravatar
Xong
 
Beiträge: 1560
Registriert: 5. Jun 2008, 07:30
Wohnort: Hohndorf in Sachsen

Beitragvon cukabeka » 18. Jan 2010, 17: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
cukabeka
 
Beiträge: 653
Registriert: 30. Mai 2006, 23:01
Wohnort: Aschaffenburg

Beitragvon Xong » 18. Jan 2010, 18: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

Bild Määääääääääääääääääääääääh!
Benutzeravatar
Xong
 
Beiträge: 1560
Registriert: 5. Jun 2008, 07:30
Wohnort: Hohndorf in Sachsen

Beitragvon cukabeka » 18. Jan 2010, 18:51

xong, du bist der held! danke!

:D
Benutzeravatar
cukabeka
 
Beiträge: 653
Registriert: 30. Mai 2006, 23:01
Wohnort: Aschaffenburg

Sortieren nach slice value

Beitragvon miloezger » 17. Apr 2010, 15: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="" />';
}
}
}
}
?>




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

Beitragvon cukabeka » 19. Apr 2010, 11: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.
Benutzeravatar
cukabeka
 
Beiträge: 653
Registriert: 30. Mai 2006, 23:01
Wohnort: Aschaffenburg

Beitragvon miloezger » 19. Apr 2010, 21: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, 09:46

Beitragvon miloezger » 19. Apr 2010, 21: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:
miloezger
 
Beiträge: 29
Registriert: 20. Mai 2009, 09:46

Re: Sortieren nach slice value

Beitragvon meugel » 13. Okt 2011, 09: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
meugel
 
Beiträge: 10
Registriert: 9. Nov 2010, 20:12
Wohnort: suedtirol + wien

Beitragvon meugel » 13. Okt 2011, 14: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.
meugel
 
Beiträge: 10
Registriert: 9. Nov 2010, 20:12
Wohnort: suedtirol + wien


Zurück zu Module/Aktionen [R4]

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast