Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] MetaTag -> title
Forum PHP.pl > Forum > PHP > Frameworki
d4ng
Witajcie mam mały problem z zendem... na początku dodam że totalnie raczkuje w temacie frameworków a przyszło mi dokonać małych zmian na stronie firmy... gdyż każda strona, podstrona itp ma ten sam tytuł "Sklep firmowy xyz". W panelu administracyjnym można określić tytuł, opis i słowa kluczowe dla sklepu niestety dzieje się to globalnie a nie dla np. strony głównej. Jeżeli jestem na stronie produktu xyz to chciałbym aby w tytule było "produkt xyz" a nie "Sklep firmowy xyz"...

tak wygląda layout.tpl

  1. <!DOCTYPE html><html>
  2. <head>
  3. <meta charset="utf-8">
  4. <base href="{$baseUrl}/" />
  5. <title>{$menuLoader->getMetaInfo('title')}</title>
  6. <link rel="stylesheet" href="public/style/style.css" type="text/css" />
  7. <link rel="stylesheet" href="public/style/lightbox.css" type="text/css" />
  8. <link rel="stylesheet" href="//code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />


a tak menuloader

  1. public function getMetaInfo($word)
  2. {
  3. /** @var $SL PublicHelper_SettingsLoader */
  4. $SL = Zend_Controller_Action_HelperBroker::getStaticHelper('SettingsLoader');
  5.  
  6. /** @var $alreadySet boolean */
  7. $alreadySet = false;
  8.  
  9. $preloadWorthStuff = array('preBody', 'preHead', 'postBody', 'postHead', 'title', 'meta_desc', 'meta_keywords');
  10. if(in_array($word, $preloadWorthStuff))
  11. {
  12. $SL->getSettings($preloadWorthStuff);
  13. }
  14.  
  15. $return = null;
  16.  
  17. if($this->menu && !$alreadySet) switch($word)
  18. {
  19. case 'postBody' : $return = $SL->$word . $this->menu->getExtraParam('post_body'); break;
  20. case 'postHead' : $return = $SL->$word . $this->menu->post_head; break;
  21. case 'title' : if($this->menu->page_title) $return = $this->menu->page_title; break;
  22. case 'meta_desc' : if($this->menu->meta_desc) $return = $this->menu->meta_desc; break;
  23. case 'meta_keywords' : if ($this->menu->meta_keywords) $return = $this->menu->meta_keywords; break;
  24. case 'search_keywords' : $return = $this->menu->getExtraParam('search_keywords'); break;
  25. case 'keywords_filter' : $return = $this->menu->getExtraParam('keywords_filter'); break;
  26. }
  27.  
  28. if($return === null) $return = $SL->$word;
  29.  
  30. return $return;
  31. }


Jak zrobie coś takiego

  1. <title>{$product->name}</title>


to dla stron które nie sa produktami robią się krzaki... bo pewnie $product->name ma wartość null?

Z góry dziękuje wszystkim za pomoc i życzę miłego dnia wink.gif
Sephirus
Ogólnie założenie jest takie, że na każdej ze stron powinien być tytuł ustawiany a taki sam sposób. Tutaj przyjąłeś założenie, że masz tytuł w jakiejś dodatkowej klasie, która wczytuje go z jakichś ustawień. Taki obiekt powinien być uzupełniany danymi danej podstrony a jeśli nie daje ona swoich danych to powinno być stosowane to co jest domyślnie w konfiguracji. Wzbogać tą klasę o taką funkcjonalność jak ustawianie tytułu w akcji kontrolera i będzie dobrze.
d4ng
Super dzięki za odpowiedz z tym że jak napisałem raczkuje.. bardziej mi jest znane programowanie strukturalne teraz wchodzę na obiektowe a taki zend to już wyższa szkoła jazdy i go totalnie nie ogarniam... póki co zrobiłem coś takiego

  1. <title>{if isset($product->name)}{$product->name}{else}{$menuLoader->getMetaInfo('title')}{/if}</title>


tylko zależy mi jeszcze na opisach...

Cytat
Wzbogać tą klasę o taką funkcjonalność jak ustawianie tytułu w akcji kontrolera i będzie dobrze.


mógłbym Cie prosić o jakis przykład?

Z góry dziękuje
Sephirus
W kawałku jaki zaprezentowałeś - z tą metodą getMetaInfo to co to za klasa do której należy ta metoda?

Czy jest dostępna w kontrolerze/akcji?

Chodzi o to, że jeśli tak, to nic nie stoi na przeszkodzie dodać do niej metody przykładowo setTitle, w której ustawiasz tytuł. Tytuł tak ustawiony przekazujesz do jakiejś własności w tej klasie, która standardowo/domyślnie jest pusta. Przy metodzie getMetaInfo sprawdzasz czy jest to ustawione i jeśli tak to zwracasz tą zmienną title jeśli nie robisz to co dotychczas:

  1. case 'title' : if($this->title) $return = $this->title; elseif($this->menu->page_title) $return = $this->menu->page_title; break;



Chodzi mi tu o idee. Tak samo można postąpić dla innych pól meta nagłówka. Dzięki temu w kontrolerze możesz ustawiać łatwo tytuł. Pobrać go z bazy dla danego artykułu i ustawić.

Ogólnie ja w Zendzie nie używam SMARTY i takie rzeczy załatwiam na helperach widoku z rodziny head*** (headTitle, headMeta, headScript itp) i obsługuje je odpowiednio w layoutach. Nie wiem jak to przełożyć na SMARTY w sumie więc nie chce pisać głupot.
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.