Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]Rozwiazanie budowy modułowej
Forum PHP.pl > Forum > PHP > Frameworki
quality
Witam
Jak rozwiazac sprawe modulow ?
Chcialbym zrobic cos takiego jak w Joomli, zeby moc miec dodatkowe proste moduly wyswietlane w odpowiednich miejscach na stronie.

Znacie jakis latwy sposob ?
ikssde
Też się nad tym zastanawiam i doszedłem do wniosku, że można to zrobić przy użyciu placeholderów i uzupełniania ich actionstackiem za pomocą plugina wywoływanego z routingiem, albo kontrolera głównego po którym pozostałe będą dziedziczyły. Co o tym myślisz?
quality
Ja poki co wstawialem je za pomoca view render do layoutu w odpowiedniej akcji. Jednak chcialbym zeby one byly oddzielone jakos od wartwy aplikacji. jak moduly to moduly.

  1. <?php
  2. $response->insert('right', $this->view->render('logon.phtml'));
  3. ?>


Chociaz wlasnie zastanawialem sie czy nie bedzie lepsze to co napisales, ale jak dotad nie sprawdzalem tego rozwiazania. Moze opiszesz dokladniej jak to dziala ?
ikssde
Też sie zastanawiałem nad renderem, ale troche to dla mnie nielogiczne.
W takim skrócie na czym polega mój sposób :

1. Plugin
CODE
class Application_Controller_Plugin_Render extends Zend_Controller_Plugin_Abstract
{
public function routeStartup(Zend_Controller_Request_Abstract $request)
{
$actionstack = Zend_Controller_Action_HelperBroker::getStaticHelper('ActionStack');

$content = array(
0 => array('controller' => 'user', 'action' => 'index', 'module' => 'default', 'position' => 'userpanel'),
);

foreach($content as $action)
{
$actionstack->actionToStack($action['action'], $action['controller'], $action['module'], array('position' => $action['position']));
}
}
}


2. Layout
CODE
placeholder('Zend_Layout')->userpanel ?>


3. Controller
CODE
function init() {
$this->_helper->viewRenderer->setResponseSegment('userpanel');
}


Dodatkowo pomiędzy akcjami przerzucam się przy pomocy $this->_forward(action)
Co o tym myślisz? snitch.gif
Elbacer
Odświeżam ten temat bo nie chce śmiecić forum. Czy od ostatniego posta, ma ktoś jakiś dobry sposób aby umieszczać moduły na stronie ?
seth-kk
sporo zalezy od budowy strony ale mysle ze sam framework nie stoi na przeszkodzie
np addModuleDirectory() + Error controller i dynamiczne menu
pgrzelka
wstawianie bloków mam trochę ściągnięte z jakiejś strony, ma jeszcze kilka niedociągnięć i małą funkcjonalność ale po woli dopracuje ten kod winksmiley.jpg,

na początek mamy tabelę z pozycjami bloków
  1. CREATE TABLE IF NOT EXISTS `block_positions` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `blockName` varchar(50) NOT NULL,
  4. PRIMARY KEY (`id`)
  5. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
  6.  
  7. --
  8. -- Zrzut danych tabeli `block_positions`
  9. --
  10.  
  11. INSERT INTO `block_positions` (`id`, `blockName`) VALUES
  12. (1, 'Left'),
  13. (2, 'Right'),
  14. (3, 'Top'),
  15. (4, 'Header'),
  16. (5, 'Footer');


następnie tabela z blokami
  1. CREATE TABLE IF NOT EXISTS `blocks` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `block_position_id` int(11) NOT NULL,
  4. `ClassFile` varchar(200) NOT NULL,
  5. `role` varchar(50) NOT NULL,
  6. `published` int(1) NOT NULL,
  7. `params` text NOT NULL,
  8. `ordering` int(11) NOT NULL DEFAULT '0',
  9. `block_title` varchar(200) NOT NULL,
  10. `show_title` int(1) NOT NULL DEFAULT '0',
  11. PRIMARY KEY (`id`)
  12. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
  13.  
  14. --
  15. -- Zrzut danych tabeli `blocks`
  16. --
  17.  
  18. INSERT INTO `blocks` (`id`, `block_position_id`, `ClassFile`, `role`, `published`, `params`, `ordering`, `block_title`, `show_title`) VALUES
  19. (1, 2, 'Profile_Block_Login', 'Guests', 1, '', 0, 'Logowanie', 1),
  20. (4, 3, 'Default_Block_Search', 'Quests', 1, '', 0, '', 0);


helper z katalogu 'library' który rysuje bloki z określonej pozycji
  1. <?php
  2.  
  3. class Zadoo_View_Helper_DrawBlock extends Zend_View_Helper_Abstract
  4. {
  5. public $params;
  6.  
  7. public function __construct()
  8. {
  9. $front = Zend_Controller_Front::getInstance();
  10. $modules = $front->getControllerDirectory();
  11. if (empty($modules))
  12. {
  13. require_once 'Zend/View/Exception.php';
  14. throw new Zend_View_Exception('DrawBlock helper depends on valid front controller instance');
  15. }
  16.  
  17. $request = $front->getRequest();
  18. $response = $front->getResponse();
  19.  
  20. if (empty($request) || empty($response)) {
  21. require_once 'Zend/View/Exception.php';
  22. throw new Zend_View_Exception('DrawBlock view helper requires both a registered request and response object in the front controller instance');
  23. }
  24.  
  25. $auth = Zend_Auth::getInstance();
  26.  
  27.  
  28. $this->params->request = clone $request;
  29. $this->params->response = clone $response;
  30. $this->params->dispatcher = clone $front->getDispatcher();
  31. $this->params->defaultModule = $front->getDefaultModule();
  32. $this->params->acl = Zend_Registry::get("ACL");
  33. $this->params->user = $auth->getIdentity();
  34. $this->db = Zend_Registry::get("db");
  35.  
  36. }
  37.  
  38. function drawBlock($pos, $tags = array() ,$getCount = false)
  39. {
  40. $blocks = $this->db->fetchAll("
  41. SELECT b.*
  42. FROM blocks AS b
  43. LEFT JOIN block_positions AS bp ON b.block_position_id = bp.id
  44. WHERE bp.blockName = '$pos' AND b.published = 1
  45. ORDER BY ordering ASC
  46. ");
  47.  
  48. if($getCount)
  49. {
  50. return count($blocks);
  51. }
  52. if(!isset($tags[0])) $tags = array(0=>'',1=>'');
  53.  
  54. $xhtml = '<div id="' . strtolower($pos) . '_block_container">';
  55. foreach($blocks as $block)
  56. {
  57. $xhtml .= $tags[0];
  58. if($block->show_title == 1) {
  59. $xhtml .= '<h2>' . $block->block_title . '</h2>';
  60. }
  61. $params = $this->params;
  62. $params->params = $block->params;
  63. $class = new $block->ClassFile();
  64. $xhtml .= $class->drawBlock($params, $pos);
  65. $xhtml .= $tags[1];
  66. }
  67. $xhtml .= '</div>';
  68.  
  69. return $xhtml;
  70. }
  71. }


przykładowy mało dopracowany blok
  1. <?php
  2.  
  3. class Profile_Block_Login
  4. {
  5.  
  6. public function __construct()
  7. {
  8. }
  9.  
  10. public function drawBlock($params, $block)
  11. {
  12. if( ! Zend_Auth::getInstance()->hasIdentity() )
  13. {
  14. return $this->drawLogin($params, $block);
  15. }
  16. else
  17. {
  18. return $this->drawLogout($params, $block);
  19. }
  20. }
  21.  
  22. public function drawLogout($params, $block)
  23. {
  24. $user = $params->user;
  25. $html = '';
  26. $html .= '<div class="' . strtolower($block) . '_block"><ul>
  27. Witaj ' . $user->username . '</li>
  28. <li><a href="/profile/edit">Edytuj profil</a></li>
  29. <li><A href="/profile/logout" >Wyloguj się</a></li></ul></div>';
  30. return $html;
  31. }
  32.  
  33. public function drawLogin($params, $block)
  34. {
  35. $html = '';
  36. $html .= '<div class="' . strtolower($block) . '_block">
  37. <form action="/profile/login/" method="post">
  38. Login:
  39. <input type="text" name="username" size="5" />
  40. Haslo:
  41. <input type="password" name="password" size="5" />
  42. <input type="submit" value="OK">
  43. </form>
  44. &nbsp;&nbsp;&nbsp;<a href="/profile/forgot">Przypomnij haslo</a> &nbsp;&nbsp;&nbsp;
  45. <a href="/profile/register">Rejestracja</a>
  46. </div>';
  47. return $html;
  48. }
  49. }


wyświetlenie wszystkich bloków z pozycji 'Right'
  1. echo $this->drawBlock('Right');



to co jest do poprawienia
- przy każdym wywołaniu $this->drawBlock('pozycja'); skrypt pobiera dane z bazy
- brak opcji wyświetlenia konkretnego bloku
- będzie możliwość wyświetlenia bloku z czystym tekstem
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.