Przy ostatniej naszej realizacji wyszła potrzeba wydzielenia pola z obrazkiem przy konkretnej stronie CMS. Domyślnie nie posiada ona takiej funkcjonalności. Chodzi nam o analogiczne rozwiązanie jak np. w przypadku kategorii lub producentów. Możemy w ten sposób np. stworzyć prosty system aktualności bazujący na CMS, gdzie taki obrazek będzie reprezentował dany news.

Przedstawiamy maksymalnie uproszczone rozwiązanie. Nie posiada ono dodatkowych funkcji jak np. usuwanie takiego obrazka lub zapisywanie go do bazy. Efektem załadowania obrazka będzie po prostu wgranie jego do folderu:


/img/cms

Pod nazwą opartą na ID danej strony CMS, np:


/img/cms/cms_1.jpg

I tyle.

Potem w szablonie cms.tpl albo w module który pobiera dane z CMS możemy wyświetlić ten obrazek bazując na ID strony CMS. Np poprzez:


<img src="/img/cms/cms_{$cmspages.id_cms}.jpg" alt="Mój sklep" />

Poniżej informacje co zmienić w CMS aby to osiągnąć.

Metoda 1 – nadpisanie kontrolera.

Możemy to zrobić „po bożemu” i tak jak zalecają twórcy Presta Shop – nadpisać cały plik kontrolera. Musimy:

  1. Pobrać spakowany plik PHP: AdminCmsController.txt
  2. Rozpakować archiwum
  3. Zmienić rozszerzenie pliku na z TXT na PHP, aby nazwa pliku była taka jak nazwa domyślnego kontrolera: AdminCmsController.php
  4. Wgrać przez FTP plik do lokalizacji: override/controllers/admin/ UWAGA! Jesli już znajduje się tam plik o tej nazwie – należy ręcznie połączyć zmiany w obu plikach nadpisujących kontroler (prosimy o kontakt w takim wypadku)
  5. Usunąć automatycznie generujący się plik w cache sklepu: /cache/class_index.php
  6. Zalogować się do admina i przeedytować lub stworzyć nową stronę CMS. Pole z obrazkiem powinno już się pojawić.

Metoda 2 – przeprogramowanie kontrolera.

Możemy także dopisać co trzeba w samym kontrolerze. Takie rozwiązanie nie jest pozbawione wad. Teoretycznie podczas aktualizacji stracimy te zmiany. Chociaż takie aktualizacje przeważnie nie dotyczą tego pliku – i tak je robi się ręcznie poprzez nadpisanie pliku a nie „wyklikanie” w adminie. Jak w przypadku np. modułów. W każdym razie ta metoda działa – i możliwe że przy odrobinie modyfikacji zadziała także w wersjach innych niż nasza podana w tytule tego artykułu. Zawsze radzimy wykonać kopię bezpieczeństwa starego pliku, który edytujemy przed podjęciem zmian. Lub zachęcamy do korzystania z systemu zarządzania wersją kodu np. SVN lub GIT.

Modyfikacja ogranicza się do jednego pliku PHP:


controllers/admin/AdminCmsController.php

1. Pozyskanie pliku obrazka

znajdujemy metodę (tzw. funkcję obiektową PHP) o nazwie: renderForm() i zamieniamy kod:


$this->initToolbar();
$this->initPageHeaderToolbar();

na:


$this->initToolbar();
$this->initPageHeaderToolbar();
$image = _PS_IMG_DIR_.'cms'.DIRECTORY_SEPARATOR.'cms_'.$this->object->id.'.jpg';
$image_url = ImageManager::thumbnail($image, $this->table.'_'.(int)$obj->id.'.'.$this->imageType, 350, $this->imageType, true, true);

(okolica 110 linii)

2. Dodanie pola z obrazkiem w formularzu

zamieniamy kod:


array(
'type' => 'textarea',
'label' => $this->l('Page content'),
'name' => 'content',
'autoload_rte' => true,
'lang' => true,
'rows' => 5,
'cols' => 40,
'hint' => $this->l('Invalid characters:').' <>;=#{}'
),

na:


array(
'type' => 'textarea',
'label' => $this->l('Page content'),
'name' => 'content',
'autoload_rte' => true,
'lang' => true,
'rows' => 5,
'cols' => 40,
'hint' => $this->l('Invalid characters:').' <>;=#{}'
),
array(
'type' => 'file',
'label' => $this->l('Image'),
'name' => 'cms_img',
'desc' => $this->l('Upload an image for this page.'),
'lang' => true,
'display_image' => true,
'image' => $image_url ? $image_url : false,
),

(okolice 180 linii)

3. Obsługa wgrania pliku przez PHP

Na początku metody postProcess() wklejamy kod:


if (($id_category = (int)Tools::getValue('id_cms')) && isset($_FILES) && count($_FILES)) {

$languages = Language::getLanguages(false);
$update_images_values = false;

foreach ($languages as $lang)
{
if (isset($_FILES['cms_img'])
&& isset($_FILES['cms_img']['tmp_name'])
&& !empty($_FILES['cms_img']['tmp_name']))
{
$ext = substr($_FILES['cms_img']['name'], strrpos($_FILES['cms_img']['name'], '.') + 1);

if (!move_uploaded_file($_FILES['cms_img']['tmp_name'],
_PS_IMG_DIR_ .'cms'.DIRECTORY_SEPARATOR.'cms_'.$id_category.'.'.$ext)) {

} else {

}

}
}

}

(okolice 293 linii)

Gotowe!

Jak widać nie jest to zbyt „eleganckie” programistycznie rozwiązanie. Jednak co najważniejsze działa.

Jeśli nam zależy na usuwaniu obrazka lub zapisywania go do bazy MySQL pod inną nazwą takie funkcje zawsze można do programować. Do czego zapraszamy jak i do dzielenia się innymi rozwiązaniami na ten temat 😉

Share This:

Zostaw komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *