Dodanie nowych metadanych w sekcji HEAD bez modyfikacji istniejących baz danych

malavva

Avatar: malavva

2018-12-14 09:48

Cześć wszystkim,
ostatnio stanąłem przed tematem dodania metadanych do starej wersji quick.cart w wersji 4.0 zakładając, że nie trzeba będzie przerabiać istniejących baz danych. Metadane trzeba dodać zarówno będąc na stronie (page) jak i na stronie produktu (products) dla każdego ID osobno. Poniżej pokazuję, jak sobie z tym poradziłem. Tak, wiem, że to jest stara wersja, ale może komuś się jeszcze przyda :)

Założenie 1:
Ta przeróbka nie daje możliwości edycji nowych plików z poziomu panelu administracyjnego.

Założenie 2:
do istniejącej bazy danych dochodzą dwa komplety nowych plików (dla każdej wersji językowej):
pl_pages_meta.php
pl_pages_meta.def.php
pl_products_meta.php
pl_products_meta.def.php

Założenie 3:
Przykład pokazuję dla dwóch zmiennych metadanych, żeby było bardziej przejrzyste.

Struktura plików:
pl_pages_meta.def.php
- definiujemy nowe pola metadanych:


<?php
$aFieldsNames 
= Array( 'iPage' => 0'sMetadata1' => 1'sMetadata2' => );

function 
pl_pages_meta$aExp ){
  return Array( 
'iPage' => $aExp[0], 'sMetadata1' => $aExp[1], 'sMetadata2' => $aExp[2] );
}
?>



pl_pages_meta.php


<?php exit; ?>
9010$treść metadanej nr 1$treść metadanej nr 2$
9011$treść metadanej nr 1$treść metadanej nr 2$



Pliki
pl_products_meta.php
pl_products_meta.def.php
są identyczne, różnica jest tylko w nazwie funkcji. Zamiast

pl_pages_meta$aExp )

powinno być

pl_products_meta$aExp )

.

ZMIANY W ISTNIEJĄCYCH PLIKACH:
\config\general.php
dochodzą nowe linie:


$config_db
['pages_meta'] = $config['dir_db'].LANGUAGE.'_pages_meta.php';
$config_db['products_meta']    = $config['dir_db'].LANGUAGE.'_products_meta.php';
define'DB_PAGES_META',   $config_db['pages_meta'] );
define'DB_PRODUCTS_META',   $config_db['products_meta'] );



\core\products.php
W funkcji "throwProduct" trzeba dodać odczyt z pliku nowej bazy danych, zaraz pod odczytem DB_PRODUCTS_EXT:


$bFile      
fileDB_PRODUCTS_META );
$bCount     count$bFile );
$bFunction  LANGUAGE.'_products_meta';
      for( 
$b 1$b $bCount$b++ ){
        
$bExp explode'$'$bFile[$b] );
        if( 
$bExp[0] == $iProduct ){
          
$bData3 $bFunction$bExp );
          break;
        }
      } 
// end for



W warunku

if( isset( $aData ) ){[/php], który dotyczy bazy DB_PRODUCTS_EXT dodajemy niejako kontynuację czytania bazy z nowego pliku:
[
php]
if( isset( 
$aData ) ){
    ....
    ....
    ....
    if( isset( 
$bData3 ) ){
        if( !empty( 
$bExp[1] ) ) /* metadana PRODUCTS_META nr 1 */
            
$aData['$sMetadata1'] = $bExp[1];
        if( !empty( 
$bExp[2] ) ) /* metadana PRODUCTS_META nr 2 */
            
$aData['$sMetadata1'] = $bExp[2];
    }
    ....
    ....
}



Zwróć uwagę, że dane przekazywane są do wspólnej zmiennej aData, a nie do bData3.

\actions_client\products.php
Dane, które odczytane zostały w poprzednim pliku, tutaj trzeba odczytać i przekazać do nowych zmiennych.


if( isset( $aActions['a'] ) && is_numeric$aActions['a'] ) ){
    ....
    ....
    ....
    if( isset( 
$aData ) ){
        if( !empty( 
$aData['$sMetadata1'] ) )    /* metadana nr 1 */
            
$sMetadata1 $aData['$sMetadata1'];
        if( !empty( 
$aData['$sMetadata2'] ) )    /* metadana nr 2 */
            
$sMetadata2 $aData['$sMetadata2'];      
    }
}



\templates\themes\default.php
W tym pliku zaczynamy zbierać już wszystkie informacje i przekazywać je na wyświetlaną stronę. Na samym końcu, przed wywołaniem

echo $oTpl->tbHtml'container.tpl''HEAD' ).....



dodajemy część, która zepnie metadane z PAGE LUB PRODUCTS:


....
....
if( isset( 
$content ) ){
    
/* w tym miejscu pobierane są dane z pliku "pages_meta.php" */ 
    /* i porównywane są z numerem ID strony wywoływanej. */
    
$aFile      fileDB_PAGES_META );
    
$iCount1     count$aFile );
    
$sFunction  LANGUAGE.'_pages_meta';
        for( 
$i 1$i $iCount1$i++ ){
            
$aExp explode'$'$aFile[$i] );
            if( 
$aExp[0] == $iContent ){
                
$aData $sFunction$aExp );
                break;
            }
        } 
// end for
        
if( isset( $aData ) ){
            
/* jeżeli numer ID strony istnieje, */
            /* to następuje bezpośrednie przekazanie metadanych */
            /* do zmiennej aData, która trafia do HEAD */
            
$aFile null;
            if( isset( 
$aExp[0] ) ){
                if( !empty( 
$aExp[1] ) )                         /* metadana PAGE_META nr 1 */
                    
$aData['$sMetadata1'] = $aExp[1];
                if( !empty( 
$aExp[2] ) )                         /* metadana PAGE_META nr 2 */
                    
$aData['$sMetadata2'] = $aExp[2];
                
//$oTpl->setVariables( 'aData', $aData );
            
}
        }
        else{
            
/* numer strony nie istnieje, więc jest strona produktu. */
            /* Pobierane są dane z pliku: */
            /* \actions_client\products.php */
            /* gdzie zdefiniowane są zmienne poszczególnych metadanych */
            
if( !empty( $sMetadata1 ) )                     /* metadana PRODUCTS_META nr 1 */
                
$aData['sMetadata1'] = $sMetadata1;
            if( !empty( 
$sMetadata2 ) )                     /* metadana PRODUCTS_META nr 2 */
                
$aData['sMetadata2'] = $sMetadata2;    
            
//$oTpl->setVariables( 'aData', $aData );
        
}
}
echo 
$oTpl->tbHtml'container.tpl''HEAD' ).....



\templates\container.tpl
Tutaj w części <head> dodajemy już finalną wersję składni nowych metadanych, wszystko wedle własnych potrzeb:


....
<
head>
  <
title>$sTitle$config[title]</title>
  ....
  ....
  <
meta property="article:modified_time" content="$aData[sMetadata1]" />
  <
meta itemprop="image" content="$aData[sMetadata2]" />
  ....
</
head>
....



U mnie zadziałało :)

» Quick.Cart v4.x

malavva

Do góry
o nas | kontakt