nowe dwa pola w bazie danych

malavva

Avatar: malavva

2011-10-14 07:46

Witam,
Potrzebuję powiększyć db o dwa nowe pola zawierające informację o
1) początkowym roku produktu
2) końcowym roku produktu.

Koncepcję mam taką, że na głównej stronie pod menu4 mam dwa pola tekstowe z przyciskiem, w których określa się przedział lat min i max. Przycisk powoduje wyświetlenie produktów spełniających kryteria min&max zawarte w bazie w nowych polach.

Oto co zmodyfikowałem i jake mam kłopoty:

Powiększyłem DB_PRODUCTS_EXT o dwa dodatkowe pola.

pl_products_ext.def.php
...'sDescriptionFull' => 6, 'sStartYear' => 7, 'sStopYear' => 8 );
...'sDescriptionFull' => $aExp[6], 'sStartYear' => $aExp[7], 'sStopYear' => $aExp[8] );

pl_product_ext.php
[uzupełniona baza danych o nowe dwa pola z latami, pooddzielane $]

templates/themes/default.php
[dodana nowa linia; założyłem że wyniki wyświetlania będą korzystały z szablonu strony wyszukiwania]
if( isset( $config['page_search'] ) && is_numeric( $config['page_search'] ) && isset( $oPage->aPages[$config['page_search']] ) ){
$sLinkSearch = $oPage->aPages[$config['page_search']]['sLinkName'];
$dropDownList = $oTpl->tbHtml( 'container.tpl', 'SEARCH2_FORM' );
}

container.tpl
[pierwsza zmiana]
<div id="column">
$sSearchForm
$sMenu3
$sMenu4
$dropDownList
</div>

[druga zmiana - dodane]
<!-- BEGIN SEARCH2_FORM -->
<form method="post" action="$sLinkSearch" id="searchFormA">
<fieldset>
<input type="text" size="5" name="dDList1" class="input" maxlength="4" />
<input type="text" size="5" name="dDList2" class="input" maxlength="4" />
<em><input type="submit" class="submit" /></em>
</fieldset>
</form>
<!-- END SEARCH2_FORM -->

products.php
[przeróbka funkcji listProducts tak, żeby w chwili gdy $GLOBALS['sPhrase'] jest puste był sprawdzany warunek na niepuste pola dDList1 i dDList2. Jeżeli wszystkie są puste, to wykonuj dalej funkcję niezmienioną, a jeżeli dwa ostatnie pola są niepuste, to wykonaj nową funkcję. Próbuję to robić jako zmienną $GLOBAL, nie wiem czy dobrze. Warunek może też nienajszczęśliwiej napisany, ale to narazie nie jest największe moje zmartwienie.]
if( !isset( $aProducts ) ){
if( isset( $GLOBALS['sPhrase'] ) && (!empty( $GLOBALS['sPhrase'] ) ) ){
$aProducts = $this->generateProductsSearchListArray( $GLOBALS['sPhrase'] );
$sUrlExt .= '&amp;sPhrase='.$GLOBALS['sPhrase'];
}
else{
if ((empty($GLOBALS['sPhrase'])) && (!empty($GLOBALS['dDList1'])) && (!empty($GLOBALS['dDList2']))){
$aProducts = $this->mmgenerateProductsSearchListArray( $GLOBALS['dDList1'], $GLOBALS['dDList2'] );
}
else{
....[tu dalej funkcja oryginalna bez zmian]
}
}
}

[jest nowa funkcja mmgenerateProductsSearchListArray, która przekazuje dwie zmienne ?globalne? dDList1 i dDList2]

function mmgenerateProductsSearchListArray( $dDList1, $dDList2 ){
if( isset( $this->aProducts ) ){
foreach( $this->aProducts as $iProduct => $aData ){
$aFound[$iProduct] = false;
}
$rFile = fopen( DB_PRODUCTS_EXT, 'r' );
$dDList1 = trim( $dDList1 );
$dDList2 = trim( $dDList2 );
while( ( $aFile = fgetcsv( $rFile, 100000, '$' ) ) !== FALSE ){
//podstawowy warunek decydujący o wyświetleniu zasobu
if (( $aFile[7] > $dDList1 ) && ($aFile[8] < $dDList2 )){
$aFound[$aFile[0]] = true;
}
} // end while
fclose( $rFile );

if( isset( $aFound ) ){
foreach( $this->aProducts as $iProduct => $aData ){
if(( $aFound[$iProduct] == true )) $aReturn[] = $iProduct;
} // end foreach

if( isset( $aReturn ) ) return $aReturn;
} // end if
} // end if
} // end function mmgenerateProductsSearchListArray


A teraz z czym mam problem:
- Undefined index: dDList1 i dDList2 w przerobionej funkcji listProducts [jak przekazać dane z nowych pól tekstowych do products.php?]
- Undefined offset: 7 i 8 w nowej funkcji mmgenerateProductsSearchListArray [wyświetla ten komunikat błędu na stronie, pomimo że gdy podstawię stałe wartości w miejsce $dDList1 i $dDList2 (np 1995 i 2011) to wyniki na stronie wyświetla prawidłowe. Co źle zrobiłem z deklaracją nowych pól w db? albo raczej czego brakuje?]
- po wciśnięciu nowego przycisku na stronie nie są przekazywane dane z formularza (tych dwóch pól tekstowych) do php
- po wciśnięciu nowego przycisku z uzupełnionymi polami o daty, strona się przeładowuje i nie są pamiętane wpisane wartości.


Wiem, że trochę to zawiło napisałem, ale siedzę nad tym już kawał czasu i nic mądrego nie przychodzi mi do głowy. Próbowałem z $_POST ale to chyba nie da się tak..

» Quick.Cart v3.x

malavva

boboo

Avatar: boboo

2011-10-14 08:35

Taka porada, pomocna w szukaniu bugów:
Używaj "echo" albo "print_r"podczas bawienia się kodem.
Sprawdzaj w ten sposób, czy w tych zmiennych jest w ogóle coś przekazywane
echo $dDList1
przy ich przekazywaniu.
Poza tym z formularza weźmiesz je "POST"em.
($_POST['dDList1'])
ale musisz to zrobić tam, gdzie jest brana sPhrase (index.php).
Następnie wrzucić jako $_GET w header i powinno 'zabanglać'.

strzelectwo.kimla.de

malavva

Avatar: malavva

2011-10-14 10:02

w zasadzie się udało, ale do połowy. Dziwna sprawa, bo pobiera dane tylko z jednego pola. A to z którego, to zależy od ustawienia kolejności linii w index.php. Takie coś wstawiłem, nie do końca rozumiem tutaj zasadę działania funkcji "header", która mam wrażenie odgrywa tu dość istotną rolę:

if( isset( $_POST['dDList1'] ) && isset( $_POST['dDList2'] ) ){
header( 'Location: '.$_SERVER['REQUEST_URI'].'&dDList1='.urlencode( $_POST['dDList1'] ) );
header( 'Location: '.$_SERVER['REQUEST_URI'].'&dDList2='.urlencode( $_POST['dDList2'] ) );
exit;}

i tu w zależności którą linię się da pierwszą to wtedy ta zmienna jest elegancko przetwarzana. Ale jak zrobić żeby obydwie naraz były przetwarzane? Nie wiem jak ten header przygotować dla dwóch zmiennych.

malavva

Avatar: malavva

2011-10-14 10:34

okej, sam sobie rozwiązałem problem :)

if( isset( $_POST['dDList1'] ) && isset( $_POST['dDList2'] ) ){
header( 'Location: '.$_SERVER['REQUEST_URI'].'&dDList1='.urlencode( $_POST['dDList1'] ).'&dDList2='.urlencode( $_POST['dDList2'] ) );
exit;}

malavva

boboo

Avatar: boboo

2011-10-14 13:24

I o to chodzi.
Wędkę dać, a nie rybę ;-)

Good work, malavva.

strzelectwo.kimla.de

malavva

Avatar: malavva

2011-10-14 15:49

to dodam jeszcze dla uzupełnienia, gdyby ktoś chciał w pełni skorzystać. Konieczna jest zmiana w pliku actions_client/p.php:

// display products in page
$iProductsList = isset( $bViewAll ) ? 999 : null;

if ( !isset( $_GET['dDList1'] ) && !isset( $_GET['dDList2'] ) ){
$sProductsList = ( $aData['iProducts'] == 1 || ( isset( $sPhrase ) && $config['page_search'] == $iContent ) ) ? $oProduct->listProducts( $aData['sTemplate'], $iContent, $iProductsList ) : null;
if( isset( $sPhrase ) && $config['page_search'] == $iContent && empty( $sProductsList ) )
$sProductsList = $oTpl->tbHtml( 'messages.tpl', 'ERROR' );
}
else{
$sProductsList = ( $aData['iProducts'] == 1 || (( isset($_GET['dDList1'] ) && (isset($_GET['dDList2']))) && $config['page_search_B'] == $iContent ) ) ? $oProduct->listProducts( $aData['sTemplate'], $iContent, $iProductsList ) : null;
if( isset( $_GET['dDList1'] ) && isset( $_GET['dDList2'] ) && $config['page_search_B'] == $iContent && empty( $sProductsList ) )
$sProductsList = $oTpl->tbHtml( 'messages.tpl', 'ERROR' );
}

I dzięki temu nasze wyniki wyświetlą się na stronie. No i oczywiście wszędzie wcześniej trzeba wywołać dDList1 i 2 za pomocą $_GET tak jak pisał Boboo..
Wielkie dzięki! szafa gra.

malavva

malavva

Avatar: malavva

2011-10-14 16:24

teraz druga część. Czy mógłbym prosić o podpowiedzenie od czego zacząć, żeby w panelu admina, na stronie edycji produktu dodać dwa nowe pola edycyjne, w których będzie można wprowadzić dane. W momencie kliknięcia przycisku "zapisz" wartości z tych dwóch pól będą zapisywane do bazy danych. No i oczywiście w chwili otwarcia strony edycji produktu te wartości będą odczytywane z bazy danych.

malavva

boboo

Avatar: boboo

2011-10-14 22:45

Dla odczytu w adminie wystarczy pole (input type=text) o nazwie takiej samej, jak w bazie (name="sStartYear" i sStopYear).
Trzeba to włożyć w templates/admin/products.tpl
w bloku FORM_MAIN.
i/lub w LIST. W liście jednak musisz operować arrayami.

Dla zapisu:
Jeśli tylko z poziomu edycji szczegółowej, to zerknij jak jest w funkcji saveProduct
a jeśli też z poziomu listy, to: saveProducts

Czyli przyjrzyj się jak są zapisywane inne dane, np. mPrice, czy iPosition.
Możesz też ustawić wartości startowe (czyli tworząc nowy produkt, pola będą wypełnione jakimś defaultem).
To akurat jest w actions_admin/products.php
w bloku "else"
$aData[xxx]=null;
$aData[yyy]=null;
itp.

strzelectwo.kimla.de

Do góry
o nas | kontakt