Pagina 1 di 1

Posta Raccomandata (escludere categorie)

Inviato: 22/03/2010, 16:00
da Planet O
Salve gente,
Il mio non è un problema ma una soluzione.
La mia non è una vera e propria contrib (quindi spero che qui sia il posto giusto per parlarne).

La contrib per la Posta Raccomandata è utile ma manca di cose fondamentali.
Una di queste è l'esclusione di determinati articoli che non possono essere inviati tramite questo servizio (soprattutto perché eccedono i 5cm di spessore impostati come limite).

Così ho pensato di escludere direttamente alcune determinate categorie di prodotti. Si poteva eslcudere articolo per articolo ma la cosa era più complicata.
La modifica funziona per la versione osCommerce Online Merchant v2.2 RC2a Released. Per altre versioni non so.
Comunque in nessun modo mi ritengo responsabile di problemi che possono nascere inserendo tale codice. E' tutto a vostro rischio e pericolo :D (ma vi assicuro che sul mio funziona alla perfezione).
Soprattutto, prima di procedere, fatevi un backup del file catalog/checkout_process.php di modo da poterlo ripristinare in caso di problemi.

E' una beta, andrebbe migliorata inserendo la possibilità di scegliere le categorie da poter escludere direttamente scegliendole dal pannello di controllo. Ma per ora le categorie vanno inserite manualmente nel codice.

Per il momento prevede che si abbia un minimo di conoscenza di MySql, per poter visualizzare gli ID delle categorie. Ma, come ho detto, in uno sviluppo futuro non vi sarà bisogno di interagire con niente.

Aprite il file checkout_process.php sotto la cartella catalog.
Cercate il codice:

Codice: Seleziona tutto

$radio_buttons = 0;
      for ($i=0, $n=sizeof($quotes); $i<$n; $i++) {
Che dovrebbe trovarsi intorno alla riga 304.
Modificate il codice:

Codice: Seleziona tutto

?>
              <tr>
                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
                <td colspan="2"><table border="0" width="100%" cellspacing="0" cellpadding="2">
                  <tr>
                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
                    <td class="main" colspan="3"><b><?php echo $quotes[$i]['module']; ?></b> <?php if (isset($quotes[$i]['icon']) && tep_not_null($quotes[$i]['icon'])) { echo $quotes[$i]['icon']; } ?></td>
                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
                  </tr>
<?php
        if (isset($quotes[$i]['error'])) {
?>
                  <tr>
                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
                    <td class="main" colspan="3"><?php echo $quotes[$i]['error']; ?></td>
                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
                  </tr>
<?php
        } else {
          for ($j=0, $n2=sizeof($quotes[$i]['methods']); $j<$n2; $j++) {
// set the radio button to be checked if it is the method chosen
            $checked = (($quotes[$i]['id'] . '_' . $quotes[$i]['methods'][$j]['id'] == $shipping['id']) ? true : false);

            if ( ($checked == true) || ($n == 1 && $n2 == 1) ) {
              echo '                  <tr id="defaultSelected" class="moduleRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
            } else {
              echo '                  <tr class="moduleRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
            }
?>
                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
                    <td class="main" width="75%"><?php echo $quotes[$i]['methods'][$j]['title']; ?></td>
<?php
            if ( ($n > 1) || ($n2 > 1) ) {
?>
                    <td class="main"><?php echo $currencies->format(tep_add_tax($quotes[$i]['methods'][$j]['cost'], (isset($quotes[$i]['tax']) ? $quotes[$i]['tax'] : 0))); ?></td>
                    <td class="main" align="right"><?php echo tep_draw_radio_field('shipping', $quotes[$i]['id'] . '_' . $quotes[$i]['methods'][$j]['id'], $checked); ?></td>
<?php
            } else {
?>
                    <td class="main" align="right" colspan="2"><?php echo $currencies->format(tep_add_tax($quotes[$i]['methods'][$j]['cost'], $quotes[$i]['tax'])) . tep_draw_hidden_field('shipping', $quotes[$i]['id'] . '_' . $quotes[$i]['methods'][$j]['id']); ?></td>
<?php
            }
?>
                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
                  </tr>
<?php
            $radio_buttons++;
          }
        }
?>
                </table></td>
                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td> 
              </tr>
<?php
      }
Inserendo il codice:

Codice: Seleziona tutto

if ($quotes[$i]['module']=='PostaRaccomandata') { 
			$products = $cart->get_products();
			for ($x=0, $y=sizeof($products); $x<$y; $x++) {
				if ($y>1) {
					$continua = false;
					break;
				}
				$sql = "select categories_id from products_to_categories where products_id = " . (int)$products[$x]['id'];
				$categories = tep_db_query($sql);
				$categories_id = tep_db_fetch_array($categories);
				$cat_id = $categories_id['categories_id'];
				if ((int)$cat_id==2 || (int)$cat_id==10 || (int)$cat_id==11|| (int)$cat_id==12 || (int)$cat_id==13 || (int)$cat_id==14 || (int)$cat_id==15 || (int)$cat_id==16) {
					$continua = false;
				}
				else $continua = true;
			}
		}
		else {
			$continua = true;
		}
		
		if ($continua) {
?>
              <tr>
                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
                <td colspan="2"><table border="0" width="100%" cellspacing="0" cellpadding="2">
                  <tr>
                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
                    <td class="main" colspan="3"><b><?php echo $quotes[$i]['module']; ?></b> <?php if (isset($quotes[$i]['icon']) && tep_not_null($quotes[$i]['icon'])) { echo $quotes[$i]['icon']; } ?></td>
                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
                  </tr>
<?php
        if (isset($quotes[$i]['error'])) {
?>
                  <tr>
                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
                    <td class="main" colspan="3"><?php echo $quotes[$i]['error']; ?></td>
                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
                  </tr>
<?php
        } else {
          for ($j=0, $n2=sizeof($quotes[$i]['methods']); $j<$n2; $j++) {
// set the radio button to be checked if it is the method chosen
            $checked = (($quotes[$i]['id'] . '_' . $quotes[$i]['methods'][$j]['id'] == $shipping['id']) ? true : false);

            if ( ($checked == true) || ($n == 1 && $n2 == 1) ) {
              echo '                  <tr id="defaultSelected" class="moduleRowSelected" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
            } else {
              echo '                  <tr class="moduleRow" onmouseover="rowOverEffect(this)" onmouseout="rowOutEffect(this)" onclick="selectRowEffect(this, ' . $radio_buttons . ')">' . "\n";
            }
?>
                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
                    <td class="main" width="75%"><?php echo $quotes[$i]['methods'][$j]['title']; ?></td>
<?php
            if ( ($n > 1) || ($n2 > 1) ) {
?>
                    <td class="main"><?php echo $currencies->format(tep_add_tax($quotes[$i]['methods'][$j]['cost'], (isset($quotes[$i]['tax']) ? $quotes[$i]['tax'] : 0))); ?></td>
                    <td class="main" align="right"><?php echo tep_draw_radio_field('shipping', $quotes[$i]['id'] . '_' . $quotes[$i]['methods'][$j]['id'], $checked); ?></td>
<?php
            } else {
?>
                    <td class="main" align="right" colspan="2"><?php echo $currencies->format(tep_add_tax($quotes[$i]['methods'][$j]['cost'], $quotes[$i]['tax'])) . tep_draw_hidden_field('shipping', $quotes[$i]['id'] . '_' . $quotes[$i]['methods'][$j]['id']); ?></td>
<?php
            }
?>
                    <td width="10"><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td>
                  </tr>
<?php
            $radio_buttons++;
          }
        }
?>
                </table></td>
                <td><?php echo tep_draw_separator('pixel_trans.gif', '10', '1'); ?></td> 
              </tr>
<?php
	  }
	  }
Andiamo ora ad analizzare il codice inserito:

Codice: Seleziona tutto

if ($quotes[$i]['module']=='PostaRaccomandata') { 
Controlla che il modulo di pagamento sia PostaRaccomandata.
Attenzione! Se il modulo si chiama in maniera leggermente diversa, come Posta Raccomandata, il codice non funziona, pertanto modificate il valore nella condizione della if con il nome effettivo del modulo.

Codice: Seleziona tutto

			$products = $cart->get_products();
Permette di recuperare tutti i prodotti presenti nel carrello dell'utente, mettendoli dentro l'array $products.

Codice: Seleziona tutto

			for ($x=0, $y=sizeof($products); $x<$y; $x++) {
Per tutti i prodotti presenti.

Codice: Seleziona tutto

				if ($y>1) {
					$continua = false;
					break;
				}
Questa è una limitazione che ho imposto io. Ossia il modulo di spedizione compare soltanto quando vi è solo un prodotto nel carrello.
Si può togliere o modificare in base alle proprie esigenze.
Questo per evitare che vi ordino troppi prodotti che insieme facciano uno spessore superiore a 5cm.
Per modificarlo, in modo, ad esempio, di accettare fino a tre prodotti, invece di $y>1 mettere $y>3.

Codice: Seleziona tutto

				$sql = "select categories_id from products_to_categories where products_id = " . (int)$products[$x]['id'];
				$categories = tep_db_query($sql);
				$categories_id = tep_db_fetch_array($categories);
				$cat_id = $categories_id['categories_id'];
				if ((int)$cat_id==2 || (int)$cat_id==10 || (int)$cat_id==11|| (int)$cat_id==12 || (int)$cat_id==13 || (int)$cat_id==14 || (int)$cat_id==15 || (int)$cat_id==16) {
					$continua = false;
				}
				else $continua = true;
			}
		}
		else {
			$continua = true;
		}
Ed ecco il codice che esclude le categorie. Attraverso una select ci tiriamo fuori la categoria del prodotto che si sta processando.

Codice: Seleziona tutto

if ((int)$cat_id==2 || (int)$cat_id==10 || (int)$cat_id==11|| (int)$cat_id==12 || (int)$cat_id==13 || (int)$cat_id==14 || (int)$cat_id==15 || (int)$cat_id==16) {
					$continua = false;
				}
				else $continua = true;
Questo codice controlla che la categoria del prodotto sia uguale ad una delle categorie che non devono utilizzare il tipo di spedizione.
Se è una categoria che non può usufruire del servizio, allora la variabile $continua viene impostata a false. Altrimenti viene impostata a true.
Come dicevo, ho inserito manualmente l'ID delle categorie, mentre si potrebbe fare in modo di creare una tabella di configurazione, inserire i valori lì, e tirarseli fuori con una query.
Di modo anche da poter permettere di modificare i valori nella tabella direttamente dal pannello di controllo di os-commerce.

Mettiamo che avete tre categorie da escludere, e che i relativi ID sono 5, 7 e 9. Il codice cambierebbe così:

Codice: Seleziona tutto

if ((int)$cat_id==5 || (int)$cat_id==7 || (int)$cat_id==9) {
Se avete una sola categoria con ID 10:

Codice: Seleziona tutto

if ((int)$cat_id==10) {

Codice: Seleziona tutto

		if ($continua) {
E infine se la variabile è impostata a true allora stampa a video il modulo di spedizioni di PostaRaccomandata, altrimenti non lo visualizza.

Spero che vi sia stato utile.
Cercherò al più presto di migliorarlo come vi ho detto.

Re: Posta Raccomandata (escludere categorie)

Inviato: 22/03/2010, 21:25
da hsg26
c'è anche la contribution individual shipping methods, che ti permette per ogni articolo di scegliere con quali metodi di spedizione può essere spedito.