Платформа зенда модульное приложение, не может загрузить модели для каждого модуля, модели с автозагрузкой?

Если Вы захотите заменить целый стиль (а не просто элементы его) тогда, то Вы будете, вероятно, хранить те стили в ресурсах. Необходимо быть в состоянии сделать что-то вроде:

<Button>
    <Button.Style>
        <MultiBinding Converter="{StaticResource StyleConverter}">
            <MultiBinding.Bindings>
                <Binding RelativeSource="{RelativeSource Self}"/>
                <Binding Path="MyStyleString"/>
            </MultiBinding.Bindings>
        </MultiBinding>
    </Button.Style>
</Button>

При помощи MultiBinding и использующий Сам как первая привязка мы можем тогда ресурсы поиска в нашем преобразователе. Преобразователь должен реализовать IMultiValueConverter (а не IValueConverter) и может выглядеть примерно так:

class StyleConverter : IMultiValueConverter 
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        FrameworkElement targetElement = values[0] as FrameworkElement; 
        string styleName = values[1] as string;

        if (styleName == null)
            return null;

        Style newStyle = (Style)targetElement.TryFindResource(styleName);

        if (newStyle == null)
            newStyle = (Style)targetElement.TryFindResource("MyDefaultStyleName");

        return newStyle;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Это не что-то, что я делаю очень часто, но это должно работать из памяти:)

6
задан EricP 6 October 2009 в 11:51
поделиться

3 ответа

Вы должны зарегистрировать пространство имен «Контакты_» в автозагрузчике. Для этого вы можете использовать Zend_Application_Module_Autoloader.

$autoloader = new Zend_Application_Module_Autoloader(array(
        'namespace' => 'Contacts_',
        'basePath'  => dirname(__FILE__) . '/modules/cotacts',
    ));

Это создаст следующие сопоставления для вашего модуля внутри указанного вами basePath.

api/         => Api
forms/       => Form
models/      => Model
    DbTable/ => Model_DbTable
plugins/     => Plugin

Если вы используете Zend_Application для ускорения работы вашего приложения и его модулей, вам это не понадобится, потому что в документации говорится что:

При использовании начальной загрузки модулей с Zend_Application, экземпляр Zend_Application_Module_Autoloader будет создан по умолчанию для каждого дискретного модуля, что позволит вам автоматически загружать ресурсы модуля.

5
ответ дан 8 December 2019 в 02:30
поделиться

Я использую версию 1.9. Это часть моей начальной загрузки:

protected function _initAutoload() {
    $modelLoader = new Zend_Application_Module_Autoloader(array(
                  'namespace' => '',
                   'basePath' => APPLICATION_PATH.'/modules/default')

        );
}

    protected function _initAutoloaders()
    {
        $this->getApplication()->setAutoloaderNamespaces(array('Eric_'));
        return $this;
    }

    protected function _initPlugins()
    {
        $this->bootstrap('autoloaders');
        $this->bootstrap('frontController');

        // register the plugin for setting layouts per module
        $plugin = new Eric_Plugin_Modularlayout();
        $this->frontController->registerPlugin($plugin);
            return $modelLoader;
    }

Плагин Eric_Plugin_Modularlayout устанавливает правильный макет для каждого модуля.

У меня есть 3 модуля: default, ez, contacts. Самое забавное, что в действии контактов я могу вызывать модели в каталоге ez / models. без проблем.

2
ответ дан 8 December 2019 в 02:30
поделиться

Я обнаружил проблему. Я забыл вставить файл начальной загрузки с моим модулем контактов. Теперь все работает, и мои модули могут использовать свои собственные модели.

class Contacts_Bootstrap extends Zend_Application_Module_Bootstrap
{

}
18
ответ дан 8 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: