Форум Joomla! Україна
  • Головна
  • Пошук
  • Користувачі
  • Команда форуму
  • Реєстрація
  • Увійти
    Увійти
    Ім’я користувача
    Пароль: Забули пароль?
     
  • Реєстрація
  • Увійти
Форум Joomla! Україна Старі версії Joomla Joomla! 2.5 v
« Попереднє 1 … 3 4 5 6 7 Наступне »
MVC, добавлення ще одного переглядача, контролера, та моделі


 
  • 0 голос(ів) - 0 у середньому
MVC, добавлення ще одного переглядача, контролера, та моделі
alexdevelop
Не в мережі

Junior Member

Дописів: 2
Тем: 1
Приєднався: 12.01.2012, 05:30 PM
Репутація: 0
#1
12.01.2012, 06:29 PM
Мої вітання вам на цьому форумі. Зараз займаюся розробкою компонента для Joomla 1.7 (по факту вчусь їх писати для джумли). Написав схожий компонент до HelloWorld, який наведено в документації до Joomla 1.7. Розібрався що куди вписувати в моделі, в переглядачі і в шаблоні, щоб необхідні дані з БД та операції з ними можна було вивести у фронтальній частині. Але зтикнувся з наступною проблемою, не знаю як (і не зміг знайти) як обробляти дані із форми (фронтальна частина). Знаю як ще одну модель добавити, переглядач із шаблоном (надіюся що знаю), але чи то контролер правильно написати не можу, чи що. Для прикладу взяв завантажити файл на сервер. Простий php-код працює, а от спробував побудувати згідно моделі MVC і файл не завантажує, і помилок не вибиває.

erosion/view.html.php
Код:
class ErosionViewErosion extends JView
{
    function display($tpl = null)
    {
        $this->head = $this->get('Head');
        $this->val = $this->get('Val');
        $this->valls = $this->get('ValLS');
        $this->valfls = $this->get('ValFLS');
        $this->arrls = $this->get('ArrLS');
        $this->arrfls = $this->get('ArrFLS');

            if (count($errors = $this->get('Errors')))
            {
                JError::raiseError(500, implode('<br />', $errors));
                return false;
            }
        parent::display($tpl);
    }
}

Код форми в шаблоні (erosion/tmpl/default.php) наступний:
Код:
<h1><?php echo $this->head; ?></h1>
<div class="data">
    <br /><?php echo $this->val; ?>
    <br /><?php echo 'LS=((L/'.$this->valls[0].')^m)*('.$this->valls[1].'*sinS*sinS+'.$this->valls[2].'*sinS+'.$this->valls[3].')'; ?>
    <br /><?php echo $this->arrls;?>
    <br /><?php echo 'F(LS)='.$this->valfls[0].'*('.$this->valfls[1].'/('.$this->valfls[2].'+exp('.$this->valfls[3].'-'.$this->valfls[4].'LS))-'.$this->valfls[5].')'; ?>
    <br /><?php echo $this->arrfls;?>
</div>
<div class="loadForm">
    <h2><p><b> Форма для завантаження файлу </b></p></h2>
      <form action="<?php JRoute::_( 'index.php?option=com_erosion&controller=upload&task=upload')?>" method="post" enctype="multipart/form-data">
      <input type="file" name="filename"><br>
      <input type="submit" value="Завантажити"><br>
      </form>
</div>

upload/view.html.php
class ErosionViewUpload extends JView
Код:
{
    function display($tpl = null)
    {
        $this->upload = $this->get('Upload');
        
            // Check for errors.
            if (count($errors = $this->get('Errors')))
            {
                JError::raiseError(500, implode('<br />', $errors));
                return false;
            }
        parent::display($tpl);
    }
}

Код форми в шаблоні (upload/tmpl/default.php) наступний:
Код:
<div class="data">
    <h1><?php echo $this->upload; ?></h1>
</div>

Код із моделі наступний (models/upload/upload.php):
Код:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import Joomla modelitem library
jimport('joomla.application.component.modelitem');

/**
* Erosion Model
*/
class ErosionModelUpload extends JModelItem
{
    protected $upload;

    public function getUpload()
    {
        if (!isset($this->upload))
        {
                if(copy($_FILES["filename"]["tmp_name"],JURI::base().'tmp/input.txt'))
                   {
                     $this->upload = JText::_("Файл завантажено <br>");
                   } else {
                      $this->upload = JText::_("Помилка при завантаженні файлу");
                   }
        }
        return $this->upload;
    }
}

в папку controllers добавив файл upload.php із кодом:
Код:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import Joomla controller library
jimport('joomla.application.component.controller');

class UploadController extends JController
{
        function upload()  
        {
            $model = $this->getModel('upload');
            if(!$model->action() ) {    
                $upload = JText::_( 'Error: Could not perform action' );
            } else {
                $upload = JText::_( 'Action executed' );
            }
        
            $this->setRedirect( 'index.php?option=com_erosion&view=erosion', $upload );
        }
}

Підкажіть будь-ласка, що я не так написав, або що не дописав. Бо сильно хочу розібратися як використовувати кілька контролерів, моделей, шаблонів, як і коли їх вибирати, які посилання робити на них у формах (поле action), буду радий любому матеріалу, де це буде описано. Бо треба зробити компонент, який реагує на дії користувача, зокрема файл треба буде завантажувати на сервер, а розібратися на прикладах, які є вже реалізовані в Joomla 1.7 не зміг, а відходити від MVC не хочу.
Дякую! Smile
alexdevelop
Не в мережі

Junior Member

Дописів: 2
Тем: 1
Приєднався: 12.01.2012, 05:30 PM
Репутація: 0
#2
13.01.2012, 11:31 AM
Розібрався як створювати кілька моделей, надіюся що правильно, правда залишилось одне питання по завантаженні файлу (задам його в кінці). Опишу детальніше як це зробив, може кому пригодиться.
Для початку потрібно створити файл upload.php (там само де мститься helloword.php в папці com_helloworld) в корені папки компонента, який відрізняється від helloworld.php одним рядком коду:
Код:
$controller = JController::getInstance('upload');

Далі необхідно створити модель (папка models) upload.php, в мому випадку цей файл містить наступний код:
Код:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import Joomla modelitem library
jimport('joomla.application.component.modelitem');

class HelloWorldModelUpload extends JModelItem
{

    protected $upload;

    public function getUpload()
    {
        if (!isset($this->upload))
        {
            $file = JRequest::getVar('filename', null, 'files', 'array');
            jimport('joomla.filesystem.file');
            if (JFile::upload($file['tmp_name'], $file['filepath'])) {
                $this->upload = JText::_("Файл завантажений");
            } else {
                $this->upload = JText::_("Файл не завантажено");
            }    
        }
        return $this->upload;
    }
}

В переглядачі views/upload/view.html.php міститься наступний код:
Код:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// import Joomla view library
jimport('joomla.application.component.view');

class HelloWorldViewUpload extends JView
{
    function display($tpl = null)
    {
        $this->upload = $this->get('Upload');
            if (count($errors = $this->get('Errors')))
            {
                JError::raiseError(500, implode('<br />', $errors));
                return false;
            }
        parent::display($tpl);
    }
}


І в самому шаблоні views/upload/tmpl/default.php міститься наступний код:
Код:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');

$document = JFactory::getDocument();
$document->addStyleSheet ( JURI::base().'media/com_erosion/css/style.css' );
?>
    <h1><?php echo $this->upload; ?></h1>

Виклик цієї моделі проходить із шаблону views/helloworld/tmpl/default.php:
Код:
<form action="<?php echo JRoute::_('index.php?option=com_helloworld&view=upload'); ?>" method="post" enctype="multipart/form-data">
          <input class="input-area" type="file" name="filename"><br>
          <input type="submit" value="Завантажити"><br>
      </form>
В цій формі в action вказується посилання на переглядач, при виклику якого також обробляється дані з форми. Щоб дані з форми передались необхідно в папку models/forms додати файл erosion.xml:
Код:
<?xml version="1.0" encoding="UTF-8"?>
<form name="upload">
    <fieldset name="upload">
        <field
            name="filename"
            type="file"
            description="COM_HELLOWORLD_UPLOAD_FILE"
            label="COM_HELLOWORLD_UPLOAD_FILE"
            required="true"
            size="200"
        />
    </fieldset>
</form>

В результаті завантаження файла видає наступну помилку (рішення із увімкненням ftp, яке було описано на цьому форумі не допомогло):
Увага! Помилка переміщення файлу!


Warning: move_uploaded_file(S:homegeowww) [function.move-uploaded-file]: failed to open stream: Permission denied in S:homegeowwwlibrariesjoomlafilesystemfile.php on line 419

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move 'S:tmpphpCD92.tmp' to 'S:homegeowww' in S:homegeowwwlibrariesjoomlafilesystemfile.php on line 419

Працюю на локальному хостингу (денвер). Допоможіть розібратися що ще не дописав, чи що неправильно написав. Дякую! Smile
« Попередня | Наступна »

Переглядають цю тему: Гості: 1



Можливо схожі теми...
Тема Автор Відповіді Перегляди Останній допис
  Перенос сайта с одного компа на другой. не соединяет с б.д. doomal 3 4,366 15.10.2015, 02:17 PM
Останній допис: darkghost

  • Версію для друку
  • Підписатися на цю тему
Швидкий перехід:

  • Команда форуму
  • Зв’яжіться з нами
  • Joomla! Україна
  • Повернутись на початок
  • Легкий режим
  • Позначити всі форуми прочитаними
  • RSS канал
Лінійний режим
Каскадний режим