MVC в Drupal. Новый подход.

Главные вкладки

Аватар пользователя Hinikato Hinikato 14 февраля 2012 в 1:52

Была такая тема и она получила продолжение в виде развития модуля controller.

Если раньше надо было объявлять каждый action в отдельном элементе в hook_menu(), то теперь можно объявлять эти же элементы в самих контроллерах. Например:


<?php
namespace MyakShop;

class 

CartController {
  
/**
   * path => 'shop/cart/add-product'
   * title => 'Моя корзина с товарами:',
   * access arguments => array('access content'),
   * type => MENU_CALLBACK
   */
  
function addProductAction($productId null) {
    if (!
instance('\MyakShop\Cart\CartRepo')->isValidProductId($productId)) {
      return 
MENU_ACCESS_DENIED;
    }

    

myak_shop_create_cart()->addProduct($productId);

    

drupal_goto(MYAK_SHOP_CART_CONTENT_PATH);
  }

  

/**
   * path => 'shop/cart/delete-product',
   * title' => 'Моя корзина с товарами:',
   * access arguments => array('access content'),
   * type => MENU_CALLBACK,
   */
  
function deleteProductAction($productId) {
    
$manager instance('\MyakShop\Cart\CartRepo');
    if (!
$manager->isValidProductId($productId)) {
      return 
MENU_NOT_FOUND;
    }

    

myak_shop_create_cart()->deleteProduct($productId);

    

$product $manager->getProductById($productId);
    
drupal_set_message('Товар ' theme_placeholder(\Myak\String::surround($product->name)) . ' был успешно удален(а) из корзины.');

    

drupal_goto(MYAK_SHOP_CART_CONTENT_PATH);
  }
}
?>

Модуль controller автоматически найдет такие объявления и сам их добавит в hook_menu(). Чтобы это было возможно ваш модуль, который использует контроллеры должен объявить новый хук hook_controller_api(). Нужно просто, чтобы эта функция была, она может ничего не возвращать. По-моему это избавляет от рутины. Однако была сохранена (должна была сохраниться) и старая возможность - регистрировать action вручную.

Доступны в комментах все те же элементы, которые были доступны в hook_menu(), только введен еще один элемент path. Формат каждого элемента такой:

<?php
@ключ => код_php
?>

Каждая строка может заканчиваться на запятую или точку с запятой, они должны вырезаться, это может удобно тем, кто привык перечислять элементы массива или просто ставить ; в конце строки. Список доступных ключей смотрите в описании hook_menu(). Пример я уже показал выше, но вы можете найти еще один пример в самом модуле controller - это класс ControllerSettingsController.

Нейспейсы можно отключить в админке: 'admin/settings/controller'.

Скачать модуль: http://drupal.org/project/controller

Комментарии

Аватар пользователя cosmos cosmos 14 февраля 2012 в 13:13

можно узнать
-раньше на каком фреймворке кодили?
-зачем на drupal перешли?

смысл переделывать базовый функционал под MVC ?
Для отдельного модуля пожалуйста а так это можно назвать баловство просто )

Аватар пользователя ihappy ihappy 14 февраля 2012 в 16:03

"Hinikato" wrote:
Многозначительно...

да как бы четкий вопрос, нахуя? Как понима, просто чтобы было?

"Hinikato" wrote:
А ноды чем вам не модели?

Маладэц.

В общем все понятно.

Аватар пользователя Hinikato Hinikato 14 февраля 2012 в 20:58

Вопрос всем ответившим выше, вы программировали что-нибудь серъезнее сайта-визитки с богатой бизнес логикой?

Мне кажется нет. Расскажу непонимающим - я затачиваю систему, чтобы можно было писать сайты в том числе и для предприятий. Если у предприятия есть бизнес процессы, такие модули как views, ctools и прочие (не все) модули тут могут не помочь. Они облегчают жизнь в некоторой степени для простых действий. Бизнес логика и бизнес процессы это то, что нужно программировать. Что такое бизнес процесс - это процесс какой-то на предприятии, который нужно вначале смоделировать, а потом реализовать логику взаимодействия моделей.

Тут хорошо подходят др. фреймворки, не Друпал, такие Zend Framework, Yii и др. Я считаю, что Друпал не уступает им, но его нужно допилить, что я и сделал и продолжаю делать.

Аватар пользователя xxandeadxx xxandeadxx 14 февраля 2012 в 20:48

"Hinikato" wrote:
а потом реализовать логику взаимодействия моделей.

ты наверное хотел сказать "логику взаимодействия нод" xD

Аватар пользователя Hinikato Hinikato 15 февраля 2012 в 6:34

"cosmos" wrote:
можно узнать
-раньше на каком фреймворке кодили?
-зачем на drupal перешли?

смысл переделывать базовый функционал под MVC ?
Для отдельного модуля пожалуйста а так это можно назвать баловство просто )

Вы о чем? Какой базовый функционал, что переделывать, ничего не понял... Первый пост прочтите.