Wylistowanie wszystkich produktów

LiderBudowlany

Avatar: LiderBudowlany

2016-03-29 14:27

Witam kolejny raz. Chciałbym utworzyć podpowiedzi w wyszukiwarce na podstawie nazw produktów z bazy produktów. Chciałbym to zrobić za pomocą jQuery UI Autocomplete, w którym muszę podać źródło sugerowanych fraz, powinien to być plik PHP, ewentualnie XML. W związku z tym jak stworzyć plik np. search-suggestion.php, który wypisze nazwy wszystkich produktów z naszej bazy. Kombinuję z uproszczonym kodem od funckji listProducts w pliku products.php, obecnie mam coś takiego:

 public function listAutocomplete(){

      for( 
$i $aKeys['iStart']; $i $aKeys['iEnd']; $i++ ){
        
$aData $this->aProducts[$aProducts[$i]];
        
$sDescription null;
        
$sImage null;

        
$content .= '<li class="l'.( ( $i == ( $aKeys['iEnd'] - ) ) ? 'L'$i2 ).' i'.( ( $i ) ? 0).'">
          <h2>'
.$aData['sName'].'</h2>';


        
$content .= '</li>';
        
$i2++;
      } 
// end for

  
}



Ale nie mam pojęcia jak się do tego odwołać aby po wejściu np. na adresstrony.pl/folder/search-suggestions.php była wypisana lista fraz. Ze sposobem listowania tak aby to przyjął moduł jQuery autocomplete sobie poradzę, chodzi mi tylko o podpowiedź jak w dowolny sposób wypisać produkty z bazy quickcarta?

» Quick.Cart v6.x

Lider Budowlany

LiderBudowlany

Avatar: LiderBudowlany

2016-03-30 10:58

Częściowo sobie poradziłem z moim pytaniem. Utworzyłem funkcję listAutocomplete w pliku products.php:

public function listAutocomplete$mData$iList null$bPagination true ){
    global 
$config$lang;

    
$oPage Pages::getInstance( );
    
$contentnull;
    
$sUrlExtnull;
    
$this->aPages null;

    if( 
is_numeric$mData ) ){
      
$iPage $mData;
      if( isset( 
$GLOBALS['sPhrase'] ) && !empty( $GLOBALS['sPhrase'] ) ){
        
$aProducts $this->generateProductsSearchListArray$GLOBALS['sPhrase'] );
        
$aUrlExt['sPhrase'] = 'sPhrase='.$GLOBALS['sPhrase'];
      }
      else if( isset( 
$GLOBALS['sPhraseAlt'] ) && !empty( $GLOBALS['sPhraseAlt'] ) ){
        
$aProducts $this->generateProductsSearchList2$GLOBALS['sPhraseAlt'] );
        
$aUrlExt['sPhraseAlt'] = 'sPhraseAlt='.$GLOBALS['sPhraseAlt'];
      }
      else{
        if( 
DISPLAY_SUBCATEGORY_PRODUCTS === true ){
          
// return all pages and subpages
          
$oPage->mData null;
          
$aData $oPage->throwAllChildrens$iPage );
          if( isset( 
$aData ) ){
            foreach( 
$aData as $iValue ){
              
$this->aPages[$iValue] = $iValue;
            }
          }
        }
        
$this->aPages[$iPage] = $iPage;
        
$aProducts $this->generateProductsListArray( );
      }
    }
    else{
      
$aProducts $mData;
    }

    if( isset( 
$aProducts ) && is_array$aProducts ) ){
      
$sSort = isset( $_GET['sSort'] ) ? $_GET['sSort'] : null;
      
$aSortLinks $this->throwSortLinks( );
      if( isset( 
$aSortLinks[$sSort] ) ){
        
$aProducts $this->sortProducts$aProducts$sSort );
        
$aUrlExt['sSort'] = 'sSort='.$sSort;
      }
      else
        
$sSort null;

      
$sBasketPage = ( !empty( $config['basket_page'] ) && isset( $oPage->aPages[$config['basket_page']] ) ) ? $oPage->aPages[$config['basket_page']]['sLinkName'] : null;

      
$iCount count$aProducts );
      if( !isset( 
$iList ) ){
        
$iList $config['products_list'];
      }

      
$aKeys countPageNumber$iCount, ( isset( $GLOBALS['aActions']['o2'] ) ? $GLOBALS['aActions']['o2'] : null ), $iList );
      
$this->mData null;
      
$i2 0;

      for( 
$i $aKeys['iStart']; $i $aKeys['iEnd']; $i++ ){
        
$aData $this->aProducts[$aProducts[$i]];
        
$sDescription null;
        
$sImage null;

        
$content .= '"'.$aData['sName'].'"';
        
        if (
$i $aKeys['iEnd']) {
        
$content .= ', '
        } 
        
$i2++;
      } 
// end for

      
if( isset( $content ) ){
        
$sSortingLink null;
        if( isset( 
$iPage ) && isset( $oPage->aPages[$iPage] ) ){
          if( isset( 
$GLOBALS['bViewAll'] ) )
            
$aUrlExt['bViewAll'] = 'bViewAll=true';
          
$sUrl = ( isset( $oPage->aPages[$iPage]['sLinkNameRaw'] ) ? $oPage->aPages[$iPage]['sLinkNameRaw'] : $oPage->aPages[$iPage]['sLinkName'] );
          if( 
$iCount $iList && isset( $bPagination ) ){
            
$sPages '<span class="title">'.$lang['Pages'].':</span><ul>'.countPages$iCount$iList$aKeys['iPageNumber'], $sUrl, ( isset( $aUrlExt ) ? '&amp;'.implode'&amp;'$aUrlExt ) : null ) ).'</ul>';
            
$sViewAllLink '<span class="viewAll"><a href="'.$sUrl.( isset( $aUrlExt ) ? ( isset( $config['before_amp'] ) ? '?' '&amp;' ).implode'&amp;'$aUrlExt ) : null ).'&amp;bViewAll=true#s">'.$lang['View_all'].'</a></span>';
          }

         
        }
  
        return 
'['.$sSortingLink.( isset( $sPages ) ? ''.$sViewAllLink.$sPages.'' null ).''.$content.''.( isset( $sPages ) ? ''.$sViewAllLink.$sPages.'' null ).']';
      }
    }
    else{
      if( 
$iPage == $config['page_search'] )
        echo 
'<div class="message" id="error"><h2>'.$lang['Data_not_found'].'</h2></div>';
    }
  }


Do tego utworzyłem plik search.php w templates/default i ustawiłem jedną podstronę sklepu na ten plik. W efekcie mam utworzoną białą podstronę na której pojawia się czysty tekst:

["nazwa produktu 1", "nazwa produktu 2", "nazwa produktu 3", ]

Który już mógłby praktycznie zostać przyjęty przez skrypt jQuery UI autocomplete, ale za ostatnim produktem wstawia mi przecinek, przez który skrypt nie działa. W tym celu próbowałem w pętli for dodać funkcję if, która wstawiała by przecinki za każdym produktem oprócz ostatniego:

for( $i $aKeys['iStart']; $i $aKeys['iEnd']; $i++ ){
        
$aData $this->aProducts[$aProducts[$i]];
        
$sDescription null;
        
$sImage null;

        
$content .= '"'.$aData['sName'].'"';
        
        if (
$i $aKeys['iEnd']) {
        
$content .= ', '
        } 
        
$i2++;


Niestety przecinek nadal jest wstawiany, jak skonstruować if w tej pętli aby przecinek nie był dostawiony do ostatniego produktu?

Lider Budowlany

LiderBudowlany

Avatar: LiderBudowlany

2016-03-30 11:19

Problem rozwiązany, wystarczyło zmienić: if ($i < $aKeys['iEnd'] - 1)

Teraz rodzi się kolejne pytanie, a raczej chęć uproszczenia działania całości. Ponieważ teraz w tej liście pojawiają mi się nazwy produktów które zostały dopisane do podstrony odpowiedzialnej za tą listę. Chciałbym nie musieć w każdym produkcie zaznaczać tej strony, tylko aby ta lista zwracała WSZYSTKIE produkty ze sklepu, bez względu na przypisaną stronę. Wiem, że tutaj:

echo $oProduct->listAutocomplete( $aData['iPage'], isset( $bViewAll ) ? 999 : null ); // displaying products

ta zmienna: $aData['iPage'] odpowiada za numer strony z której pobierane będą produkty - a jak mogę zapisać aby pobierało wszystkie produkty?

Lider Budowlany

selekcjoner

Avatar: selekcjoner

2016-03-30 16:27

Skrypt pokaże produkty przypisane do danej podstrony $aData['iPage'] lub możesz przesłać tablicę ID produktów
Nie chcesz pierwszego i nie masz drugiego.
Musisz pobrać wszystkie produkty z pl_products.php

Do góry
o nas | kontakt