Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]link w kodzie
Forum PHP.pl > Forum > Przedszkole
kbilski
Witam

Jak to zamienić żeby fraza returns (lub exchange in store itd) lub zdjęcie (reinsurance-1-1.jpg) zrobić jako link?


  1. public function installFixtures()
  2. {
  3. $return = true;
  4. $tab_texts = array(
  5. array('text' => $this->l('Returns'), 'file_name' => 'reinsurance-1-1.jpg'),
  6. array('text' => $this->l('Exchange in-store'), 'file_name' => 'reinsurance-2-1.jpg'),
  7. array('text' => $this->l('Paypal & Credit Card'), 'file_name' => 'reinsurance-3-1.jpg'),
  8. array('text' => $this->l('Fast Delivery'), 'file_name' => 'reinsurance-4-1.jpg'),
  9. array('text' => $this->l('Paypal 100% secured payment'), 'file_name' => 'reinsurance-5-1.jpg')
  10. );
  11.  
  12. foreach($tab_texts as $tab)
  13. {
  14. $reinsurance = new reinsuranceClass();
  15. foreach (Language::getLanguages(false) as $lang)
  16. $reinsurance->text[$lang['id_lang']] = $tab['text'];
  17. $reinsurance->file_name = $tab['file_name'];
  18. $reinsurance->id_shop = $this->context->shop->id;
  19. $return &= $reinsurance->save();
  20. }
  21. return $return;
  22. }
  23. }
b4rt3kk
Ciężko powiedzieć na podstawie tego kodu co zamieściłeś. Na pewno nie w tej funkcji. Przedstaw kod klasy reinsuranceClass.
kbilski
  1. <?php
  2.  
  3.  
  4. class reinsuranceClass extends ObjectModel
  5. {
  6. /** @var integer reinsurance id*/
  7. public $id;
  8.  
  9. /** @var integer reinsurance id shop*/
  10. public $id_shop;
  11.  
  12. /** @var string reinsurance file name icon*/
  13. public $file_name;
  14.  
  15. /** @var string reinsurance text*/
  16. public $text;
  17.  
  18.  
  19. /**
  20. * @see ObjectModel::$definition
  21. */
  22. public static $definition = array(
  23. 'table' => 'reinsurance',
  24. 'primary' => 'id_reinsurance',
  25. 'multilang' => true,
  26. 'fields' => array(
  27. 'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isunsignedInt', 'required' => true),
  28. 'file_name' => array('type' => self::TYPE_STRING, 'validate' => 'isFileName'),
  29. // Lang fields
  30. 'text' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'required' => true),
  31. )
  32. );
  33.  
  34. public function copyFromPost()
  35. {
  36. /* Classical fields */
  37. foreach ($_POST AS $key => $value)
  38. if (key_exists($key, $this) AND $key != 'id_'.$this->table)
  39. $this->{$key} = $value;
  40.  
  41. /* Multilingual fields */
  42. if (sizeof($this->fieldsValidateLang))
  43. {
  44. $languages = Language::getLanguages(false);
  45. foreach ($languages AS $language)
  46. foreach ($this->fieldsValidateLang AS $field => $validation)
  47. if (isset($_POST[$field.'_'.(int)($language['id_lang'])]))
  48. $this->{$field}[(int)($language['id_lang'])] = $_POST[$field.'_'.(int)($language['id_lang'])];
  49. }
  50. }
  51. }
bostaf
Co to za framework? PrestaShop?
Tak czy inaczej musiałbyś jakoś tablicę $tab_texts przekazać z tego modelu do kontrolera (albo do widoku, w PrestoShop chyba templejta) i tam dopiero zintegrować w linku.
W linii 5, 6, 7, 8 i 9 funkcji installFixtures(), w kluczu "tekst" podstawiany jest odpowiedni tekst z pliku języka, w kluczu "file_name" wiadomo co.
Żeby to przerobić na link wystarczy na przykład:
  1. $link = '<a href=""><img src=" . $tab_texts['file_name'] . ">' . $tab_texts['text'] . '</a>';

ale skąd wziąć url? A może url jest przechowywany w "text"? Nie wiem.
Może chociaż trochę takie naprowadzenie Ci pomoże.
kbilski
tak, to presta chodzi o to menu na samym dole wraz z ikonkami returns...itd
Chodzi o to żeby zamienić te jpgi na klikalne lub tekst obok nich..
http://dm-components.com/
bostaf
aaaa, miodzio. A co, taki leniwy jesteś, że nie chce Ci się samemu prześledzić cyklu życia zmiennych i dotrzeć do widoku? smile.gif
15MB kodu? Hmmm, z ciekawości zajrzę tam.
kbilski
do leniwych raczej się nie zaliczam - poprostu nie wiem jak to zrobić..
bostaf
To będzie nieładny sposób, ale bez przeczytania ich poradnika dla deweloperów nic profesjonalnego nie wymyślę. Po upgradowaniu to zapewne zostanie nadpisane, albo i nie, nie wiem... Normalnie powinno się napisać jakieś rozszerzenie obecnej funkcjonalności.

Ten nagłówek stopki z dużymi ikonami, wyświetlany jest z templatki modules/blockreinsurance/blockreinsurance.tpl, linia 30:
[SMARTY] pobierz, plaintext
  1. {foreach from=$infos item=info}
  2. <li><img src="{$module_dir}img/{$info.file_name}" alt="{$info.text|escape:html:'UTF-8'}" /> <span>{$info.text|escape:html:'UTF-8'}</span></li>
[SMARTY] pobierz, plaintext

Żeby przerobić statyczne obrazki i tekst wystarczy dołożyć tam tag A:
[SMARTY] pobierz, plaintext
  1. {foreach from=$infos item=info}
  2. <li><a href="???"><img src="{$module_dir}img/{$info.file_name}" alt="{$info.text|escape:html:'UTF-8'}" /> <span>{$info.text|escape:html:'UTF-8'}</span></a></li>
[SMARTY] pobierz, plaintext

Jaki url do "href"? Na pewno trzeba go przekazać do zmiennej $infos, bo w niej jest tablica po której iteruje foreach.
No i tutaj sprawa się komplikuje, bo wartości w tej zmiennej pobierane są z bazy (Blockreinsurance::getListContent()) (funkcja Blockreinsurance::installFixtures() od której zacząłeś ten temat używana jest chyba tylko podczas instalacji, do ustawienia domyślnych wartości w bazie). Żeby to porządnie zrobić trzeba by zacząć od rozszerzenia tabeli w bazie i kolejnych metod różnych klas operujących na tych danych. To zbyt zaawansowane jak dla mnie bo to moja pierwsza styczność z PrestaShop i nie mam pojęcia jak profesjonalnie zrobić takie rozszerzenie. Ale po macoszemu...

Zmienne przekazywane są do templatki w Blockreinsurance::hookFooter(). Dwia wiersze z tej metody:
  1. $infos = $this->getListContent($this->context->language->id);
  2. $this->context->smarty->assign(array('infos' => $infos, 'nbblocks' => count($infos)));

Pierwszy wiersz - pobranie listy elementów z bazy. Drugi - przekazanie do templatki.
No to spróbujmy między tymi dwoma wierszami dodać do tablicy $infos url'e. Ale jak wygląda teraz tablica $infos? (gdyby mi się udało to zainstalować to dałbym var_dump, ale że się nie udało...) Tam w metodzie getListContent zwracany jest wynik funkcji executeS z klasy DbCore. Po przeanalizowaniu tego, co się dzieje ze zmienną $result_array zwracaną przez tą funkcję, widać, że zwracana tablica jest autonumerowaną listą kluczy (0, 1, 2, ...) zawierających tablicę nazw kolumn z wartościami. Nazwy kluczy w naszej $infos są w Blockreinsurance::getListContent() (SELECT r.`id_reinsurance`, r.`id_shop`, r.`file_name`, rl.`text`), czyli po świeżej instalacji, tablica infos powinna wyglądać dokładnie tak:
Kod
$infos = array(
    0 = array(
        'id_reinsurance' => 1,
        'id_shop' => 1,
        'file_name' => 'reinsurance-1-1.jpg',
        'text' => 'Money back'
    ),
    1 = array(
        'id_reinsurance' => 2,
        'id_shop' => 1,
        'file_name' => 'reinsurance-2-1.jpg',
        'text' => 'Exchange in-store'
    ),
    2 = array(
        'id_reinsurance' => 3,
        'id_shop' => 1,
        'file_name' => 'reinsurance-3-1.jpg',
        'text' => 'Payment upon shipment'
    ),
    3 = array(
        'id_reinsurance' => 4,
        'id_shop' => 1,
        'file_name' => 'reinsurance-4-1.jpg',
        'text' => 'Free Shipping'
    ),
    4 = array(
        'id_reinsurance' => 5,
        'id_shop' => 1,
        'file_name' => 'reinsurance-5-1.jpg',
        'text' => '100% secured payment'
    )
)

No to dodajmy tam wpisy dotyczące url'i:
  1. $infos = $this->getListContent($this->context->language->id);
  2.  
  3. // oczywiście zmień te url'e na takie jakie Ci odpowiadają
  4. $infos[0]['url'] = '/index.php?controller=history';
  5. $infos[1]['url'] = '/index.php?controller=contact';
  6. $infos[2]['url'] = '/';
  7. $infos[3]['url'] = '/whatever/';
  8. $infos[4]['url'] = '/index.php?controller=sitemap';
  9.  
  10. $this->context->smarty->assign(array('infos' => $infos, 'nbblocks' => count($infos)));


Teraz pozostało uaktualnić templatke, żeby url'e wpisywały się w atrybut "href":
[SMARTY] pobierz, plaintext
  1. {foreach from=$infos item=info}
  2. <li><a href="{$info.url}"><img src="{$module_dir}img/{$info.file_name}" alt="{$info.text|escape:html:'UTF-8'}" /> <span>{$info.text|escape:html:'UTF-8'}</span></a></li>
[SMARTY] pobierz, plaintext

Tak jak już chyba pisałem, to nieładna metoda - url'e są niekonfigurowalne, na stałe wpisane w kod źródłowy, metody rdzenia są zmodyfikowane "na chama" a nie rozszerzone... ale może wystarczy.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.