Le 5 migliori domande e risposte di PrestaShop del 2016 Parte 1
![](/img/uploads/Top Prestashop Questions and Ansers.png)
È stato sempre abbastanza occupato qui a FMModules, come stavamo sviluppando un sacco di nuovi plugin e anche l'aggiornamento per le caratteristiche Multi-store. La maggior parte dei nostri visitatori del sito ci chiede le soluzioni dei loro problemi riguardanti PrestaShop e ci sentiamo felici di aiutarli gratuitamente. Tuttavia in alcuni casi, dove la soluzione dei problemi ha bisogno di tempo, dobbiamo far pagare i visitatori di conseguenza.
Questo articolo comporta la serie di domande e risposte di PrestaShop sul blog di FMM. Prendiamo le ultime domande e risposte calde del 2016.
Domanda n. 1
Prestashop - AuthController.php non riceve i valori di input
Sto cercando di includere google reCaptcha nella pagina di iscrizione a prestashop, ho la configurazione della casella di controllo e sta funzionando, tuttavia il file php non sta ricevendo la risposta captcha. Lasciami chiarire. Ecco cosa ho fatto finora: Nel mio header .tpl ho messo
In order-opc-new-account.tpl, ho aggiunto
<div classe="g-recaptcha"data-sitekey="[my_public_key]">
Nel mio AuthController.php ho aggiunto
se (Strumenti::isSubmit('submitAccount') OR Strumenti::isSubmit('submitGuestAccount')) //se la dichiarazione era già presente
{
// codice captcha che ho aggiunto
$reCaptchaUrl='https://www.google.com/recaptcha/api/siteverify';
$reCaptchaSecret = '[my_secret_key]';
$reCaptchaResponse = $_POST['g-recaptcha-response'];
$ip = $_SERVER['REMOTE_ADDR'];
$verifyCaptcha = file_get_contents($reCaptchaUrl."?secret=".$reCaptchaSecret."&response=".$reCaptchaResponse."&remoteip=".$ip);
$captchaReply = json_decode($verifyCaptcha);
se(isset($captchaReply->success) AND $captchaReply->success == true){
$logger = nuovoFileLogger(0);
$logger->setFilename(_PS_ROOT_DIR_."/log/debug.log");
$logger->logDebug("Il captcha ha avuto successo: ".$reCaptchaResponse);
} else {
//captcha fallito
$logger = nuovoFileLogger(0);
$logger->setFilename(_PS_ROOT_DIR_."/log/debug.log");
$logger->logDebug("Captcha fallito: ".$reCaptchaResponse);
}
// ... codice di registrazione prestashop
}
Ho imparato con i messaggi di debug che$reCaptchaResponsesta effettivamente arrivando vuoto ogni volta, anche se il captcha è stato controllato. Qualche idea sul perché?
Modifica: Il modulo invia effettivamente i dati aautenticazione.phpche ha le seguenti linee
richiedere(dirname(__FILE__).'/config/config.inc.php');
ControllerFactory::getController('AuthController')->run();
Il mio pensiero è che questa parte di codice inoltra i dati del modulo ad AuthController .php tuttavia inoltra solo i campi che gli è stato detto di inoltrare. Non conosce il nuovo campo recaptcha e non inoltra questa informazione al file. Quindi ho bisogno di trovare chi sceglie quali dati vengono inoltrati.
Risposta n. 1
Assicurati che
è nell'elemento FORM.
Domanda n. 2
Come impostare il valore del campo nascosto o di testo quando l'utente clicca su salva in prestashop1.6
Voglio cambiare il valore di un campo in $this->fields_form quando si clicca su submit cioè prima che il valore entri nella tabella voglio cambiare il valore del modulo in cui sto per inserire
// Questo form è popolato quando si clicca su add o edit pubblico funzione renderForm() { $anni = Strumenti::dateYears(); $mesi = Strumenti::dateMonths(); $days = Strumenti::dateDays(); $ticketSeries = Vincitori::getTicketSeries(); $prdtCategoria = Vincitori::getProductCategory(); $nazionalità = Vincitori::getNationality(); $primoArray = array(array( 'tipo' => 'testo', 'label' => $this->l('Nome'), 'nome' => 'nome', 'required' => true, 'col' => '4', 'hint' => $this->l('Caratteri non validi:').' 0-9!<>,;?=+()@#"°{}_$%:' ), array( 'tipo' => 'file', 'label' => $this->l('Immagine del vincitore'), 'nome' => 'immagine_vincitore', 'display_image' => true, 'required' => falso ), array( 'tipo' => 'testo', 'label' => $this->l('Biglietto No'), 'nome' => 'ticket_no', 'required' => true, 'col' => '4', 'hint' => $this->l('Caratteri non validi:').' 0-9!<>,;?=+()@#"°{}_$%:' ), array( 'tipo' => 'select', 'label' => $this->l('Serie di biglietti'), 'nome' => 'serie', 'required' => true, 'options' => array( 'query' => $ticketSeries, 'id' => 'ticket_series_name', 'name' => 'ticket_series_name' ), 'col' => '4', 'hint' => array( $this->l('La serie di biglietti di ogni estrazione !!!') ) ), array( 'tipo' => 'select', 'label' => $this->l('Categoria'), 'nome' => 'categoria', 'required' => true, 'options' => array( 'query' => $prdtCategoria, 'id' => 'nome', 'nome' => 'nome' ), 'col' => '4', 'hint' => array( $this->l('Categoria del prodotto') ) ), array( 'tipo' => 'data', 'label' => $this->l('Data di estrazione:'), 'nome' => 'draw_date', 'size' => 10, 'required' => true, 'desc' => $this->l('La data di estrazione di questa serie'), ), array( 'tipo' => 'select', 'label' => $this->l('Nazionalità'), 'nome' => 'nazionalità', 'required' => true, 'options' => array( 'query' => $nazionalità, 'id' => 'nome', 'nome' => 'nome' ), 'col' => '4', 'hint' => array( $this->l('Nazionalità a cui appartiene il vincitore') ) ), array( 'tipo' => 'textarea', 'label' => $this->l('Testimonianza'), 'nome' => 'testimonial', 'required' => true, 'autoload_rte' => true, 'rows' => 7, 'cols' => 40, 'hint' => $this->l('Caratteri non validi:').' <>;=#{}' ), // aggiungi il tag 'autoload_rte' => true, 'lang' => true, --> lang i rimosso // poiché il valore dell'editor non ha presentato l'editor ); se (Strumenti::getIsset('addkits_winners') ){ $secondoArray = array( array( 'tipo' => 'nascosto', 'label' => $this->l('Aggiungi Data'), 'nome' => 'data_add', 'col' => '4', 'values'=>data("Y-m-d H:i:s"), 'hint' => $this->l('Caratteri non validi:').' 0-9!<>,;?=+()@#"°{}_$%:' ), array( 'tipo' => 'hidden', 'label' => $this->l('Nome immagine del vincitore'), 'nome' => 'nome_immagine_vincitore', 'col' => '4', 'values'=>"defalt_value" ) ); $mainArray = fusione di array($primoArray,$secondoArray); } se (Strumenti::getIsset('updatekits_winners') ){ $thirdArray = array( array( 'tipo' => 'nascosto', 'label' => $this->l('Data di aggiornamento'), 'nome' => 'data_upd', 'col' => '4', 'values'=>data("Y-m-d H:i:s"), 'hint' => $this->l('Caratteri non validi:').' 0-9!<>,;?=+()@#"°{}_$%:' ), array( 'tipo' => 'testo', 'label' => $this->l('Nome immagine del vincitore'), 'nome' => 'nome_immagine_vincitore', 'col' => '4', 'values'=>"defalt_value" )); $mainArray = fusione di array($primoArray,$terzoArray); } $this->campi_form = array( 'tinymce' => true, 'leggenda' => array( 'titolo' => $this->l('Configura il tuo vincitore'), 'icona' => 'icona-utente' ), 'input' => $mainArray ); //Assegnare il valore a hidden $this->campi_valore['data_add'] = $data = data("Y-m-d H:i:s"); $this->campi_valore['nome_immagine_vincitore'] ="default_image.jpg"; $this->campi_form['submit'] = array( 'titolo' => $this->l('Salva'), ); $data = data("Y-m-d H:i:s"); $this->addJqueryUI('ui.datepicker'); ritorna genitore::renderForm(); } pubblico funzione postProcess() { $this->getContent(); nome_immagine_vincitore = (stringa) Strumenti::getValue('nome_immagine_vincitore'); // d($winner_image_name); genitore::postProcess(); }
penso che dovreste usare postProcess invece O un altro modo è anche possibile con Init() ma l'esempio seguente è per postProcess
pubblico funzione getContent() { $output = null; se( Strumenti::isSubmit('submitAddkits_winners') ) { // d("rechaed here") immagine_vincitore = $_FILE['immagine_vincitore']; $ticket_no = (stringa) Strumenti::getValue('ticket_no'); //d($ticket_no); se( immagine_vincitore['nome'] != "" ) { //Formato consentito i $consentito = array('immagine/gif', 'image/jpeg', 'image/jpg', 'image/png'); //controlla i formati consentiti se( in_array(immagine_vincitore['tipo'], $consentito) ) { $path = '../moduli/addwinners/'; $ext = pathinfo(immagine_vincitore['nome'], ESTENSIONE_PATHINFO); $newfilename = round(microtime(vero)) . '_'.$ticket_no; $this->valori dei campi['nome_immagine_vincitore']=$newfilename.".".$ext; $helper->campi_valore['nome_immagine_vincitore'] = ""; se( ! spostare il file caricato(immagine vincente['tmp_name'], $path.$newfilename.".".$ext) ) { $output .= $this->displayError( $path.$stilogo_immagine['nome'] ); ritorna $output.$this->displayForm(); } } else { $output .= $this->displayError( $this->l('Immagine formattata non supportata') ); ritorna $output.$this->displayForm(); } } //Se arrivo qui è perché tutti i campi obbligatori sono stati riempiti quindi aggiorno i valori //Configurazione::updateValue('STILOGOPOPUP_IMAGE', $winner_image['name']); // $output .= $this->displayConfirmation( $this->l('Impostazioni salvate') ) } return $output.$this->html;; }
Risposta n. 2
penso che dovreste usare postProcess invece O un altro modo è anche possibile con Init() ma l'esempio seguente è per postProcess
pubblico funzione postProcess() { genitore::postProcess(); $id = (int)Strumenti::getValue('id_blahblah'); $file = Strumenti::fileAttachment('img_any'); se (!empty($file['nome']) && $id > 0) { se (ImageManager::validateUpload($file, Strumenti::convertBytes(ini_get('upload_max_filesize')))) die('La dimensione dell'immagine supera il limite nelle impostazioni di PrestaShop'); se (!è_dir(_PS_IMG_DIR_.'blah')) @mkdir(_PS_IMG_DIR_.'blah', 0777, true); se (!è_dir(_PS_IMG_DIR_.'blah/'.$id)) @mkdir(_PS_IMG_DIR_.'blah/'.$id, 0777, true); $path = _PS_IMG_DIR_.'blah/'.$id.'/'; $absolute_path = $path.$file['nome']; spostare il file caricato($file['tmp_name'], $percorso_assoluto); $imgPath = 'blah/'.$id.'/'.$file['nome']; //Salva nel DB se necessario Db::getInstance()->eseguire('UPDATE `'._DB_PREFIX_.'blah` SET `img` = ".pSQL($imgPath).'" WHERE `id` = '.(int)$id); } }
Domanda n. 3
Sovrascrivere e usare le caratteristiche del front controller in un modulo PrestaShop [1.6.x.x]
Ho bisogno di modificare e includere funzioni alla pagina PrestaShop Store Locator. Il manuale utente di PrestaShop non è molto chiaro, e voglio sapere se è possibile applicare un Controller in un modulo personalizzato. Voglio sviluppare un modulo che è in grado di ottimizzare StoreFrontController e le sue caratteristiche senza iniziare da zero. È fattibile? Avete qualche informazione per me?
Risposta n. 3
Si può iniziare sovrascrivendo il front controller come
`"/modules/mymodule/override/controllers/front/StoresController.php" e in questo fine aggiungere la classe "class StoresControllerCore extends FrontController { public function initContent() { parent::initContent(); //h qui fai quello che vuoi } }"
anche se è necessario conoscere la codifica per procedere oltre.
Domanda n. 4
URL di reindirizzamento Oauth validi?
Sto facendo funzionare un modulo su PrestaShop per includere il login con facebook sul mio sito ma ho bisogno degli URL Oauth per la mia applicazione facebook. ho sentito che è facebook che ti dà questi URL ma esattamente dove. Qualcuno può assistermi?
Risposta n. 4
Hai solo bisogno di questi url in App per procedere con i login di Facebook che sarà il tuo "mydomain.com" vedi immagine
Domanda n. 5
PrestaShop Due azioni per due condizioni per la stessa regola del carrello
Sto usando PrestaShop 1.6.1
Un cliente si sta informando per fare un singolo buono che fa una tariffa scontata di 5€ se il carrello ha due articoli e 7€ se ha 3 articoli (o anche di più).
Sono un principiante nello sviluppo di PrestaShop e ho provato per 2 giorni senza risultati.
Qualche trucco specifico da seguire? Esattamente quale gancio dovrei utilizzare? O forse dovrei modificare i file di base.
Qualsiasi tipo di suggerimento è molto apprezzato.
Grazie
Risposta n. 5
Purtroppo PrestaShop non ha uno sconto di base sulla quantità, quindi è necessario modificare i file di base per ottenere questo risultato. Modifica"/controllers/admin/AdminCartRulesController.php"
per aggiungere il campo per la quantità e per la modifica anteriore"/controllers/front/OrderController.php"
.