Jump to content

bebe cash 59

Members
  • Content count

    22
  • Joined

  • Last visited

Everything posted by bebe cash 59

  1. :D Hi! I wrote this for those that have the same problem as me! Please try and check the posted name of threads before wasting your time answering questions. (w00t) all good for you !! Jean
  2. For all that are with SAFE_MODE at their server: You can replace previous function mk_dir by this version: <?php function mk_dir($str, $mode=0777) { // Check for safe mode if( ini_get('safe_mode') ){ // Do it the safe mode way // init connect $conn_id = ftp_connect(FTP_SERVER); // Identifie with login & password $login_result = ftp_login($conn_id, DB_SERVER_USERNAME, FTP_SERVER_PASSWORD); if($login_result){ // Set in root directory if (!ftp_chdir($conn_id, "<root_name>")) { echo "no success for root setting\n"; } // Create directory $str if (ftp_mkdir($conn_id, $str)) { echo "Success creating $str\n"; } else { echo "Problem with creating $str\n"; } $command = 'chmod ' . $mode .$str; if (ftp_site($conn_id, $command)) { echo "Success for $command\n"; } else { echo "Not possible to execute : $command\n"; } // close ftp_close($conn_id); }else{ echo 'Bad login or password'; } }else{ // Do it the regular way if(!(is_dir($str) || @mkdir($str, $mode))) { mk_dir(dirname($str)); mk_dir($str); } } } ?> and add in catalog/admin/includes/configure.php define('FTP_SERVER', '<your ftp server>'); define('FTP_SERVER_PASSWORD', '<your ftp password>'); assuming your ftp username is the same as your db username. Jean
  3. bebe cash 59

    Faster Page Loads

    Hi ! Many worry to adapt this addon to multishop addon. Finally, i have tested the to-be-cached query into catalog/application_top.php: select configuration_key as cfgKey, configuration_value as cfgValue from configuration On the server that i use, this give me 388 lines in 0.0003 s. This is unsignifiant for a page during 0.500 s begin to end ! I dont have necessity to use this addon! Please, make this test before to use this addon !! J.D
  4. bebe cash 59

    Header Tags SEO

    :blush: Oh! I had not seen this new line. THanks for your gently reply !! Very confused to have you disturbed with this bad question bebe cash 59
  5. bebe cash 59

    Header Tags SEO

    HI! I have trouble with HeaderTags_SEO_V_3.3.2_1\Use_if_version_lessthan_2.3\catalog_only_new_files\includes\modules\header_tags_opengraph.php : The initial request is and i read into HeaderTags_SEO_V_3.3.2_1\Database_Files\headertags_seo_update.php : so section is 'socialicons' and never 'twitter' ==> the request result is : nothing ! Have I not anything understanded ?? Thanks to explain me ! bebe cash 59
  6. Hi ! I have some problems with function mk_dir. function mk_dir($str, $mode=0777) { if(!(is_dir($str) || @mkdir($str, $mode))) { mk_dir(dirname($str)); mk_dir($str); } I have a shared environnement. Also PHP MANUAL predict problems with umask. The code given by PHP MANUAL #6 seems inoperant. I have manually by FTP renamed/copied/deleted old/renamed/chmoded the new created directory AND similary for transmitted images. But it's not very cool ! Have you some better function ? Jean
  7. bebe cash 59

    Multi-Stores Multiple Shops Support

    Yes ! I had this problem.too !! I simply solve it by creating a configuration_group for each store. Same method for the caches All with automatic naming in the code: store A: 3 specific tables: configuration_0, cache_0 & configuration_group_0 store B: 3 specific tables: configuration_1, cache_1 & configuration_group_1 & so on Clearly, you must modify the SQL commands from the adds-on by changing configuration_group in configuration_group_n .... That'all folks ! Jean
  8. bebe cash 59

    Multi-Stores Multiple Shops Support

    HI Header Tags SEO V3 http://addons.oscommerce.com/info/5851/v,22 give small problems of query's modifications, particulary in admin/manufacturers.php Ultimate SEO URI http://addons.oscommerce.com/info/2823/v,22 give another difficulty with the TABLE_CONFIGURATION_GROUP: when a configuration is given into one shop, this delete the actual SEO_URL line and insert a new one, with a new id so that the others stores know no more seo url & so on. Sure the rewriting remain good, but any modifigation give a new garbadge Has anyone some light about this ? Jean
  9. bebe cash 59

    Multi-Stores Multiple Shops Support

    Hi ! Please, i had make a mistake and given in admin a WS directory adress and not a FS directory adress. Now, all is OK ! Excuse me ! Jean
  10. bebe cash 59

    Multi-Stores Multiple Shops Support

    He ! I experiment this contrib. I see that it is possible to give differente cache adress -cache_0, cache_1, cache_2) , one per site. and this is OK BUT, but, in admin/tools/cache_verify (i don't have his english name) - admin/cache.php, DIR_FS_CACHE is inaoperant for cache resetting ! No solution found in this forum about this problem : cache_0 contains a file manufacturers-box-french-cache and cache_2 another.These files don't contain same information, namely http adresses. How do ? Jean
  11. bebe cash 59

    CONTRIBUTION Product Quick Edit

    Hi ! Into catalog/admin/includes/filesnames.php must be added define('FILENAME_QUICK_EDIT_INFO', 'product_quickedit_info.php'); (new version 2.3.1) No ? Cheers ! bebe cash 59 Thanks to apologize my language ---------------------------------- Français Un bout de code manque dans la version pour 2.3.1 (& 2.3.2) Merci de corriger le zip - pour les autres... Belle journée à vous bebe cash 59
  12. bebe cash 59

    Get 1 Free

  13. bebe cash 59

    Get 1 Free

    Hi All! Hey ! my memory dump give errors ! Table get_1_free must be modified to have some place for sheduled_date: in your base execute SQL: ALTER TABLE `get_1_free` ADD `get_1_free_sheduled_date` DATETIME NULL DEFAULT NULL AFTER `get_1_free_last_modified` Sorry one more time ! The end
  14. bebe cash 59

    Get 1 Free

    YES ! Modify catalog/product_info.php to obtain: <?php // start Get 1 Free // Is this product gratos somewhere ? $get_1_free_query = tep_db_query("select products_id, products_free_id, get_1_free_sheduled_date, get_1_free_expires_date from " . TABLE_GET_1_FREE . " where products_free_id = '" . (int)$product_info['products_id'] . "' and get_1_free_sheduled_date < now() and (get_1_free_expires_date > now() or get_1_free_expires_date = 0 ) and status = '1'" ); // Yes ? give his name if (tep_db_num_rows($get_1_free_query) > 0) { $free_product = tep_db_fetch_array($get_1_free_query); $query_gratos= tep_db_query("select products_name from " . TABLE_PRODUCTS_DESCRIPTION . " where products_id='".$free_product['products_id']."' and language_id = '" . (int)$languages_id . "'"); $genere_gratos=tep_db_fetch_array($query_gratos); echo TEXT_GET_1_FREE_GRATOS.$genere_gratos['products_name'].'<br>'; } // Display promotional text if this product qualifies for free product(s) $get_1_free_query = tep_db_query("select pd.products_name, and catalog/includes/languages/<your language>/product_info.php define ('TEXT_GET_1_FREE_GRATOS','Voyez notre offre avec : '); ?> 2 problems remain: What happens when more that one product is offered with this one ? How make a link to the promoted product: rewriting causes an infinite loop when i use echo'<a href="'.tep_href_link( PRODUCT_INFO, $free_product['products_id']).'">'.TEXT_GET_1_FREE_GRATOS.$genere_gratos['products_name'].'</a><br>'; ( code by memory - verify) I wait your anserws ! bebe cash 59
  15. bebe cash 59

    Get 1 Free

    Sorry ! in post #299, i have forgotten a modification into catalog/admin/get_1_free.php: ?> <tr><form name="new_get_1_free" <?php echo 'action="' . tep_href_link(FILENAME_GET_1_FREE, tep_get_all_get_params(array('action', 'info', 'fID')) . 'action=' . $form_action, 'NONSSL') . '"'; ?> method="POST" ,enctype="multipart/form-data"> <?php if ($form_action == 'update') echo tep_draw_hidden_field('get_1_free_id', $_GET['fID']); ?> editing is now forbidden --> new post ! Good night !
  16. bebe cash 59

    Get 1 Free

    Hi ! Another problem: When we edit a product in admin get_1_free, the offer becomes the first in alphabetical order !!! Whet a garbage if we sleep a little ! Here are modifications to preselect the previous choice into the drop list: modify the files to obtain: catalog/admin/includes/functions/general.php function tep_draw_products_pull_down($name, $parameters = '', $exclude = '',$selected_id='') { global $currencies, $languages_id; if ($exclude == '') { $exclude = array(); } $select_string = '<select name="' . $name . '"'; if ($parameters) { $select_string .= ' ' . $parameters; } $select_string .= '>'; $products_query = tep_db_query("select p.products_id, pd.products_name, p.products_price from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' order by products_name"); while ($products = tep_db_fetch_array($products_query)) { if (!in_array($products['products_id'], $exclude)) { $select_string .= '<option value="' . $products['products_id'].'"'. ($selected_id==$products['products_id'] ? 'selected="selected"':'').'>' . $products['products_name'] . ' (' . $currencies->format($products['products_price']) . ')</option>'; } } $select_string .= '</select>'; return $select_string; } and catalog/admin/get_1_free.php <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td> </tr> <tr> <td class="main"><?php echo TEXT_GET_1_FREE_PRODUCTS_FREE; ?> </td> <td class="main"><?php echo tep_draw_products_pull_down('products_free_id','style="font-size:10px"','',(isset($fInfo->products_free_id) ? $fInfo->products_free_id : '')); ?></td> </tr> <tr> <td class="main"><?php echo TEXT_GET_1_FREE_PRODUCTS_FREE_QUANTITY; ?> </td> That's all Folks bebe cash 59
  17. bebe cash 59

    Get 1 Free

    Hi ! I don't see too ! Why give that customer buy directly ! I have worked another way. So, why can we not prepare this promotions ? There is no begining date. But admin/banner.php has ! This give that: Calendar for shedule & expiration dates for get_1_free Modified files to obtain: admin/get_1_free.php case 'insert': $products_id = tep_db_prepare_input($_POST['products_id']); $products_free_id = tep_db_prepare_input($_POST['products_free_id']); $products_free_quantity = tep_db_prepare_input($_POST['products_free_quantity']); $products_qualify_quantity = tep_db_prepare_input($_POST['products_qualify_quantity']); $products_multiple = tep_db_prepare_input($_POST['products_multiple']); $get_1_free_sheduled_date = tep_db_prepare_input($_POST['get_1_free_sheduled_date']); $get_1_free_expires_date = tep_db_prepare_input($_POST['get_1_free_expires_date']); tep_db_query("insert into " . TABLE_GET_1_FREE . " (products_id, products_free_id, products_free_quantity, products_qualify_quantity, products_multiple, get_1_free_date_added, get_1_free_sheduled_date, get_1_free_expires_date, status) values ('" . (int)$products_id . "', '" . tep_db_input($products_free_id) . "', '" . tep_db_input($products_free_quantity) . "', '" . tep_db_input($products_qualify_quantity) . "', '" . tep_db_input($products_multiple) . "', now(), '" . tep_db_input($get_1_free_sheduled_date) . "', '" . tep_db_input($get_1_free_expires_date) . "', '1')" ); case 'update': $get_1_free_id = tep_db_prepare_input($_POST['get_1_free_id']); $products_id = tep_db_prepare_input($_POST['products_id']); $products_free_id = tep_db_prepare_input($_POST['products_free_id']); $products_free_quantity = tep_db_prepare_input($_POST['products_free_quantity']); $products_qualify_quantity = tep_db_prepare_input($_POST['products_qualify_quantity']); $products_multiple = tep_db_prepare_input($_POST['products_multiple']); $get_1_free_sheduled_date = tep_db_prepare_input($_POST['get_1_free_sheduled_date']); $get_1_free_expires_date = tep_db_prepare_input($_POST['get_1_free_expires_date']); tep_db_query("update " . TABLE_GET_1_FREE . " set products_free_id = '" . tep_db_input($products_free_id) . "', products_free_quantity = '" . tep_db_input($products_free_quantity) . "', products_free_quantity = '" . tep_db_input($products_free_quantity) . "', products_qualify_quantity = '" . tep_db_input($products_qualify_quantity) . "', products_multiple = '" . tep_db_input($products_multiple) . "', get_1_free_last_modified = now(), get_1_free_sheduled_date = '" . $get_1_free_sheduled_date . "', get_1_free_expires_date = '" . $get_1_free_expires_date . "' where get_1_free_id = '" . (int)$get_1_free_id . "'" ); <title><?php echo TITLE; ?></title> <link rel="stylesheet" type="text/css" href="includes/stylesheet.css"> <script language="javascript" src="includes/general.js"></script> <script language="javascript" src="includes/javascript/spiffyCal/spiffyCal_v2_1.js"></script> <script language="javascript"><!-- var dateSheduled = new ctlSpiffyCalendarBox("dateSheduled", "new_get_1_free", "get_1_free_sheduled_date","btnDate","<?php echo $fInfo->get_1_free_sheduled_date; ?>",scBTNMODE_CUSTOMBLUE); var dateExpires = new ctlSpiffyCalendarBox("dateExpires", "new_get_1_free", "get_1_free_expires_date","btnDate","<?php echo $fInfo->get_1_free_expires_date; ?>",scBTNMODE_CUSTOMBLUE); //--> </script> <link rel="stylesheet" type="text/css" href="includes/javascript/spiffyCal/spiffyCal_v2_1.css"> </head> <body marginwidth="0" marginheight="0" topmargin="0" bottommargin="0" leftmargin="0" rightmargin="0" bgcolor="#FFFFFF" onload="SetFocus();"> <div id="spiffycalendar" class="text"></div> <!-- header //--> $form_action = 'update'; $product_qualify_query = tep_db_query("select p.products_id, pd.products_name, g1f.products_free_id, g1f.products_free_quantity, g1f.products_qualify_quantity, g1f.products_multiple, g1f.status, g1f.get_1_free_sheduled_date, g1f.get_1_free_expires_date from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_GET_1_FREE . " g1f where p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' and p.products_id = g1f.products_id and g1f.get_1_free_id = '" . (int)$_GET['fID'] . "'" ); <td class="main"><?php echo tep_draw_input_field('products_free_quantity', (isset($fInfo->products_free_quantity) ? $fInfo->products_free_quantity : '')); ?></td> <tr> <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td> </tr> <tr> <td class="main"><?php echo TEXT_INFO_SHEDULED_DATE; ?><br><small>(dd/mm/yyyy)</small></td> <td valign="top" class="main"><script language="javascript">dateSheduled.writeControl(); dateSheduled.dateFormat="yyyy-MM-dd";</script></td> </tr> <tr> <td colspan="2"><?php echo tep_draw_separator('pixel_trans.gif', '1', '10'); ?></td> </tr> <tr> <td valign="top" class="main"><?php echo TEXT_INFO_EXPIRES_DATE; ?><br><small>(dd/mm/yyyy)</small></td> <td class="main"><script language="javascript">dateExpires.writeControl(); dateExpires.dateFormat="yyyy-MM-dd";</script></td> </tr> </table></td> </tr> <tr> <td><table border="0" width="100%" cellspacing="0" cellpadding="2"> <tr> <td class="main"><br><?php echo TEXT_GET_1_FREE_PRICE_TIP; ?></td> <td class="main" align="right" valign="top"><br><?php echo (($form_action == 'insert') ? tep_image_submit('button_insert.gif', IMAGE_INSERT) : tep_image_submit('button_update.gif', IMAGE_UPDATE)). ' <a href="' . tep_href_link(FILENAME_GET_1_FREE, 'page=' . $_GET['page'] . (isset($_GET['fID']) ? '&fID=' . $_GET['fID'] : '')) . '">' . tep_image_button('button_cancel.gif', IMAGE_CANCEL) . '</a>'; ?></td> </tr> </table></td> </form></tr> TABLE_HEADING_ACTION; ?> </td> </tr> <?php $get_1_free_query_raw = "select p.products_id, pd.products_name, p.products_price, g1f.get_1_free_id, g1f.products_free_id, g1f.products_free_quantity, g1f.products_qualify_quantity, g1f.products_multiple, g1f.get_1_free_date_added, g1f.get_1_free_last_modified, g1f.get_1_free_sheduled_date, g1f.get_1_free_expires_date, g1f.date_status_change, g1f.status from " . TABLE_PRODUCTS . " p, " . TABLE_GET_1_FREE . " g1f, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' and p.products_id = g1f.products_id order by pd.products_name"; $get_1_free_split = new splitPageResults($_GET['page'], fInfo->products_multiple); $contents[] = array('text' => '<br>' . TEXT_INFO_PRODUCTS_FREE . ' ' . $product_free['products_name']); $contents[] = array('text' => '' . TEXT_INFO_PRODUCTS_FREE_QUANTITY . ' ' . $fInfo->products_free_quantity); $contents[] = array('text' => '<br>' . TEXT_INFO_SHEDULED_DATE . ' <b>' . tep_date_short($fInfo->get_1_free_sheduled_date) . '</b>'); $contents[] = array('text' => '<br>' . TEXT_INFO_EXPIRES_DATE . ' <b>' . tep_date_short($fInfo->get_1_free_expires_date) . '</b>'); $contents[] = array('text' => '' . TEXT_INFO_STATUS_CHANGE . ' ' . tep_date_short($fInfo->date_status_change)); } break; } if ( (tep_not_null($heading)) && (tep_not_null($contents)) ) { admin/includes/languages/<your language>/get_1_free.php define('TEXT_INFO_SHEDULED_DATE', 'Begins At:'); define('TEXT_INFO_EXPIRES_DATE', 'Expires At:'); catalog/product_info.php // start Get 1 Free // Display promotional text if this product qualifies for free product(s) $get_1_free_query = tep_db_query("select pd.products_name, g1f.products_free_quantity, g1f.products_qualify_quantity, g1f.get_1_free_sheduled_date, g1f.get_1_free_expires_date from " . TABLE_GET_1_FREE . " g1f, " . TABLE_PRODUCTS_DESCRIPTION . " pd where g1f.products_id = '" . (int)$product_info['products_id'] . "' and pd.products_id = g1f. products_free_id and g1f.get_1_free_sheduled_date < now() and (g1f.get_1_free_expires_date > now() or g1f.get_1_free_expires_date = 0 ) and pd.language_id = '" . (int)$languages_id . "' and status = '1'" ); if (tep_db_num_rows($get_1_free_query) > 0) { $free_product = tep_db_fetch_array($get_1_free_query); $exp=explode('-',substr($free_product['get_1_free_expires_date'], 0, strpos($free_product['get_1_free_expires_date'], ' '))); $jour=$exp['2']; $mois=$exp['1']; $an=$exp['0']; echo '<p>' . sprintf (TEXT_GET_1_FREE_PROMOTION, $free_product['products_qualify_quantity'], $product_info['products_name'], $free_product['products_free_quantity'], $free_product['products_name'],$jour,$mois,$an) . '</p>'; } // end Get 1 Free?> <?php echo stripslashes($product_info['products_description']); ?> catalog/includes/modules/product_listing.php if(tep_db_num_rows(tep_db_query("select products_id, get_1_free_sheduled_date, get_1_free_expires_date, status from " . TABLE_GET_1_FREE . " where products_id = '" . (int)$listing['products_id'] . "' and get_1_free_sheduled_date < now() and (get_1_free_expires_date > now() or get_1_free_expires_date = 0 ) and status = '1'"))) { $lc_text .= '<span style="color:#ee5500; font-weight:bold;">'.TEXT_GET_1_FREE_PUB.'</span>'; } break; case 'PRODUCT_LIST_MANUFACTURER': catalog/includes/application_top.php // auto activate and expire banners require(DIR_WS_FUNCTIONS . 'banner.php'); tep_activate_banners(); tep_expire_banners(); // auto expire special products require(DIR_WS_FUNCTIONS . 'specials.php'); tep_expire_specials(); // auto activeta & expire get_1_free products require(DIR_WS_FUNCTIONS . 'get_1_free.php'); tep_activate_get_1_free(); tep_expire_get_1_free(); // calculate category path if (isset($_GET['cPath'])) { and finally: catalog/includes/functions/get_1_free.php } // Auto activate get_1_free function tep_activate_get_1_free() { $get_1_free_query = tep_db_query("select get_1_free_id, get_1_free_sheduled_date from " . TABLE_GET_1_FREE . " where get_1_free_sheduled_date != ''"); if (tep_db_num_rows($get_1_free_query)) { while ($get_1_free = tep_db_fetch_array($get_1_free_query)) { if (date('Y-m-d H:i:s') >= $get_1_free['get_1_free_sheduled_date']) { tep_set_get_1_free_status($get_1_free['get_1_free_id'], '1'); } } } } //// ?> This works, etablish automatically pubs & wipes when obsoletes. Enjoy ! bebe cash 59
  18. bebe cash 59

    Get 1 Free

    Hello ! I think that it's better to say the customer that it's an offer for this item, that into all listings. So i have this script into catalog/product_listing.php: if(tep_db_num_rows(tep_db_query("select products_id, get_1_free_expires_date, status from " . TABLE_GET_1_FREE . " where products_id = '" . (int)$listing['products_id'] . "' and get_1_free_expires_date>now() and status = '1'"))) { $lc_text .= '<span style="color:#ee5500; font-weight:bold;">'.TEXT_GET_1_FREE_PUB.'</span>'; } break; and a similar into catalog/products_new.php with adaptation for the variables names ($products_new['products_id'] & $products_new['name'] instead $listing['products_id'] & $lc_text respectively I have put TEXT_GET_1_FREE_PUB define into catalog/includes/languages/french/index.php : define('TEXT_GET_1_FREE_PUB', '<br>En ce moment, un Cadeau !'); that you can translate easely into your language & put it into catalog/includes/languages/<your language>/index.php In the same way, i have modified catalog/product_info.php & catalog/includes/languages/french/product_info.php to give last date: if (tep_db_num_rows($get_1_free_query) > 0) { $free_product = tep_db_fetch_array($get_1_free_query); $exp=explode('-',substr($free_product['get_1_free_expires_date'], 0, strpos($free_product['get_1_free_expires_date'], ' '))); $jour=$exp['2']; $mois=$exp['1']; $an=$exp['0']; echo '<p>' . sprintf (TEXT_GET_1_FREE_PROMOTION, $free_product['products_qualify_quantity'], $product_info['products_name'], $free_product['products_free_quantity'], $free_product['products_name'],$jour,$mois,$an) . '</p>'; } // end Get 1 Free french define: // Get 1 Free define('TEXT_GET_1_FREE_PROMOTION', '<span style="color:#ee5500; font-weight:bold;">Offre Spéciale limitée:<br>Acheté : %u %s<br>Cadeau : %u %s Gratis ! <br></span><span style="text-decoration:underline;">ATTENTION </span>: Offre valable jusqu\'au <span style="font-weight:bold;">%s/%s/%s !</span>'); that you can translate easely into your language & put it into catalog/includes/languages/<your language>/index.php. Keep care to the %s for the dates (Y/m/d in english, d/m/Y in french usw. Had anyone something better, it's interessing to read. A pretty day to all ! Chti poupon
  19. Hello ! sort_order_1_2_3_1 is a good contribution. I have some products that are put into various categories. And same products may have same description & price ! So, they must be linked. BUT The select order in one category has a very little chance to be the same in another one. SO I must choose where is garbadge order .... Some idea ... to read you ! chti_poupon =============== En français Je viens d'implanter sort_order_1_2_3_1 qui fonctionne bien, et du premier coup ! Cependant J'ai quelques articles qui figurent dans plusieurs catégories (j'ai des catégiries imbriquées jusqu'à 4 niveaux). Ne désirant pas présenter le même article avec des caractéristiques, ou même un prix différent d'un endroit à l'autre, j'ai choisi de les implanter par copie liée. MAIS Le numéro d'ordre dans une catégorie a peu de chances d'être le même dans une autre. J'en suis donc réduit à choisir quelle catégorie trier et lesquelles abandonner à un joyeux désordre. Quelque amélioration existe-elle ? A vous lire ! Chti poupon
×