Форум русской поддержки Joomla!® CMS
11.12.2016, 06:20:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1] 2  Все   Вниз
  Добавить закладку  |  Печать  
Автор

обработка нажатия cancel

 (Прочитано 645 раз)
0 Пользователей и 1 Гость смотрят эту тему.
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« : 27.02.2016, 22:27:40 »

пишу небольшой компонент.
суть такая, если в админке зайти в создание нового элемента компонента, а, затем, нажать "Отменить", то появляется ошибка
Цитировать
Null primary key not allowed.

функция Cancel
Код:
function cancel() {
$htmlmap = $this->getModel('htmlmap');
$htmlmap->setState('id', $this->_fields['id']);
$htmlmap->checkin();
$msg = JText::_('EDIT_HTMLMAP_CANCELLED');
$type = 'message';
$this->setRedirect(JRoute::_('index.php?option=com_htmlmap&controller=htmlmaps&view=htmlmaps'), $msg, $type);

функция checkin
Код:
function checkin() {
$map = $this->getMap();
$map->checkin();
}
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #1 : 28.02.2016, 02:12:17 »

В ошибке же прямо сказано: "Значение null первичного ключа недопустимо". Это, видимо, из-за тоео, что у несохраненного нового элемента еще нет id.
Вы скопировали эти функции откуда-то, да? Думаю, в cancel() нужно избавиться от checkin(), хотя нелишне будет понять, что она представляет собой. Приведенный вами код ничего не говорит: что такое $map и его метод checkin?
Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #2 : 04.03.2016, 13:11:16 »

Видимо $htmlmap->setState('id', $this->_fields['id']); не передаёт id в модель
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #3 : 07.03.2016, 12:59:31 »

В ошибке же прямо сказано: "Значение null первичного ключа недопустимо". Это, видимо, из-за тоео, что у несохраненного нового элемента еще нет id.
Вы скопировали эти функции откуда-то, да? Думаю, в cancel() нужно избавиться от checkin(), хотя нелишне будет понять, что она представляет собой. Приведенный вами код ничего не говорит: что такое $map и его метод checkin?
ну да, скопировал. так сказать, изучаю
код getMap
Код:
var $_map = null;
function getMap() {
if (empty($this->_map)) {
$this->_map = $this->getTable();
$this->_map->load($this->getState('id'));
}
return $this->_map;
}
Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #4 : 07.03.2016, 13:21:50 »

Проверьте $this->_fields['id'] - с ним что-то не то.
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #5 : 07.03.2016, 13:34:36 »

если я правильно понимаю логику работы, то получается так:
1. в таблице элементов нет.
2. я создаю новый элемент и вместо того, чтобы сохранить, отменяю его создание
3. вот эта строка: $htmlmap->setState('id', $this->_fields['id']); в поле ID пытается записать значение 0, что недопустимо, поэтому, вываливается ошибка.

добавил в функцию проверку id на 0

Цитировать
function cancel() {
      $htmlmap = $this->getModel('htmlmap');
      $htmlmap->setState('id', $this->_fields['id']);
      if ($this->_fields['id'] != 0) {
         $htmlmap->checkin();
      }
      $msg = JText::_('EDIT_HTMLMAP_CANCELLED');
      $type = 'message';
      $this->setRedirect(JRoute::_('index.php?option=com_htmlmap&controller=htmlmaps&view=htmlmaps'), $msg, $type);
}

теперь ошибка пропала.
Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #6 : 07.03.2016, 13:39:36 »

$htmlmap->setState('id', $this->_fields['id']); тоже нужно вызывать, когда есть ID. Зачем 0 передавать?

Код
public function cancel()
{
     if ($this->_fields['id'] > 0)
     {
        $htmlmap = $this->getModel('htmlmap');
        $htmlmap->setState('id', $this->_fields['id']);
        $htmlmap->checkin();
     }
 
     $msg = JText::_('EDIT_HTMLMAP_CANCELLED');
     $type = 'message';
     $this->setRedirect(JRoute::_('index.php?option=com_htmlmap&controller=htmlmaps&view=htmlmaps'), $msg, $type);
}
« Последнее редактирование: 07.03.2016, 13:44:46 от b2z » Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #7 : 07.03.2016, 13:43:02 »

Код
if(!($this->_fields['id']===null)){
$htmlmap->checkin();
}
 
P.S.
Уже ответили.
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #8 : 07.03.2016, 19:07:27 »

Теперь возникла проблема с обработкой Save
Появляется такая ошибка: HTMLMapTableHTMLMap::bind(*NULL*)
Я так понимаю, что она говорит, что параметры для записи не передаются. А почему - не понимаю. Уже полдня убил на курение мануалов.

В общем, куски кода, как у меня реализовано. Большинство кода - копипаста из различных примеров, но основной принцип работы этого я улавливаю.
/tables/htmlmap.php
Код
jimport('joomla.database.table');
class HTMLMapTableHTMLMap extends JTable {
/* Constructor */
function __construct(&$db) {
parent::__construct('#__htmlmap', 'id', $db);
}
 
public function bind($array, $ignore = array()) {
if (isset($array['params']) && is_array($array['params'])) {
$registry = new JRegistry;
$registry->loadArray($array['params']);
$array['params'] = (string) $parameter;
}
return parent::bind($array, $ignore);
}
} ?>

/controllers/htmlmap.php
Код
jimport('joomla.application.component.controller');
class HTMLMapControllerHTMLMap extends JControllerLegacy {
var $_id = null;
var $_fields = null;
function __construct($config = array()) {
if (array_key_exists('id', $config)) {
$this->_id = $config['id'];
} else {
$this->_id = JRequest::getInt('id', 0);
}
if (array_key_exists('fields', $config)) {
$this->_fields = $config['fields'];
} else {
$this->_fields = JRequest::getVar('param');
}
parent::__construct($config);
}
function save() {
$var = $this->input->get('fields');
$htmlmap = $this->getModel($name = 'HTMLMap', $prefix = 'HTMLMapModel', $config = array());
$htmlmap->setState('fields', $this->_fields);
if ($htmlmap->save()) {
$msg = JText::_('HTMLMAP_SAVED');
$type = 'message';
} else {
$msg = JText::_('ERROR_SAVING_HTMLMAP'). ": " . $htmlmap->getError();
$type = 'error';
}
$this->setRedirect(JRoute::_('index.php?option=com_htmlmap&controller=htmlmaps&view=htmlmaps'), $msg, $type);
}
} ?>

/models/htmlmap.php
Код
jimport('joomla.application.component.model');
class HTMLMapModelHTMLMap extends JModelLegacy {
var $_map = null;
function __construct($config) {
if (!array_key_exists('table_path', $config)) {
$config['table_path'] = JPATH_ADMINISTRATOR . DS . 'components' . DS . 'com_htmlmap' . DS . 'tables';
}
parent::__construct($config);
}
function save() {
$map = $this->getTable($name='HTMLMap', $prefix='HTMLMapTable', $options = array());
$fields = $this->getState('fields');
if ($map->save($this->getState('fields'))) {
$this->setState('id', $map->id);
return true;
} else {
$this->setError($map->getError());
return false;
}
}
} ?>
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #9 : 07.03.2016, 20:31:56 »

Код
			$array['params'] = (string) $parameter;
 
Код
		$var = $this->input->get('fields');
$htmlmap->setState('fields', $this->_fields);
 
$parameter,$this->input,$this->_fields откуда взялись?
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #10 : 08.03.2016, 13:51:03 »

$parameter,$this->input,$this->_fields откуда взялись?
вместо $parameter должно быть $registry, тут я напутал.

_fields берется отсюда:
Код
var $_id = null;
var $_fields = null;
function __construct($config = array()) {
if (array_key_exists('id', $config)) {
$this->_id = $config['id'];
} else {
$this->_id = JRequest::getInt('id', 0);
}
if (array_key_exists('fields', $config)) {
$this->_fields = $config['fields'];
} else {
$this->_fields = JRequest::getVar('param');
}
parent::__construct($config);
}
Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #11 : 08.03.2016, 14:37:35 »

$htmlmap->setState('fields', $this->_fields);

Здесь свойство $this->_fields не пустое?

Откуда Вы брали эти примеры? Какая-то запутанный код, куча лишних строк. Зачем использовать state модели для передачи данных их формы? Зачем в конструкторе контроллера данные из реквеста получать?
У MVC Joomla вообще всё по дефу работает для метода save(), да и много ещё для чего. Лишнего особо писать не надо.

Вы примеры случаем не из Joomla 1.5 брали?
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #12 : 08.03.2016, 16:33:59 »

$htmlmap->setState('fields', $this->_fields);

Здесь свойство $this->_fields не пустое?

Откуда Вы брали эти примеры? Какая-то запутанный код, куча лишних строк. Зачем использовать state модели для передачи данных их формы? Зачем в конструкторе контроллера данные из реквеста получать?
У MVC Joomla вообще всё по дефу работает для метода save(), да и много ещё для чего. Лишнего особо писать не надо.

Вы примеры случаем не из Joomla 1.5 брали?
основную часть кода я брал из Ваших статей по созданию компонента с сайта cmscafe
обработчики save, cancel, да, из примеров доя J1.5, т.к. в Ваших статьях я не нашел реализации этого.
Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #13 : 08.03.2016, 17:23:15 »

А в материалах на cmscafe нет реализации, потому что Joomla всё это по дефолту хорошо обрабатывает - нет нужды писать лишний код.
По сути самый лучший пример - это взять com_content. Если пример попроще, то com_newsfeeds.
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #14 : 08.03.2016, 18:02:18 »

В принципе, если вам не нужно никаких особых манипуляций делать с данными, то нет необходимости создавать свои методы - JControllerForm() все за вас сделает: такие функции, как edit(), cancel(), save() там уже есть.
Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #15 : 08.03.2016, 18:08:48 »

В принципе, если вам не нужно никаких особых манипуляций делать с данными, то нет необходимости создавать свои методы - JControllerForm() все за вас сделает: такие функции, как edit(), cancel(), save() там уже есть.
И я о том же.
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #16 : 10.03.2016, 22:20:04 »

взял контроллер из com_content, подправил под свои нужды. теперь при нажатии на любую на сохранить, сохранить и закрыть или отмена выдает такую ошибку:
Цитировать
Последний запрос был отклонён, поскольку он содержит неправильный параметр безопасности (security token). Пожалуйста, обновите страницу и попробуйте ещё раз.
Код получился такой:
Код
<?php defined('_JEXEC') or die('Restricted access');
 
class HTMLMapControllerHTMLMap extends JControllerForm {
public function __construct($config = array()) {
parent::__construct($config);
if ($this->input->get('return') == 'htmlmaps') {
$this->view_list = 'htmlmaps';
$this->view_item = 'com_htmlmap&view=htmlmaps';
}
}
 
public function batch($model = null) {
JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));
$model = $this->getModel($name = 'HTMLMap', $prefix = 'HTMLMapModel', $config = array());
$this->setRedirect(JRoute::_('index.php?option=com_htmlmap&view=htmlmap' . $this->getRedirectToListAppend(), false));
return parent::batch($model);
}
 
protected function postSaveHook(JModelLegacy $model, $validData = array()) {
return;
}
} ?>
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #17 : 10.03.2016, 22:23:39 »

А вы token в форму добавили?
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #18 : 31.03.2016, 22:46:48 »

возникла такая проблема.
необходимо, чтобы при установке компонента создавалась папка в папке images.

сделал так:
в установочный файл XML добавил строку
Код
<installfile>install.php</installfile>

и создал файл install.php с таким кодом
Код
<?php defined('_JEXEC') or die('Restricted access');
 
jimport('joomla.application.component.model');
 
defined('DS') or define('DS', DIRECTORY_SEPARATOR);
 
function com_install() {
jimport('joomla.filesystem.folder');
$folder = JPATH_SITE . DS . 'images' . DS . 'htmlmaps';
if (@JFolder::create($folder)===false)
JError :: raiseWarning(1, JText :: _('FAILED TO CREATE DIRECTORY'). ' "' . $folder . '"');
return false;
}
} ?>

но не работает. точнее, компонент устанавливается, все ок, но папка не создается. в чем проблема?
права на папку есть, все это крутится на локалке под openserver
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #19 : 31.03.2016, 23:56:20 »

Joomla 1.5, что ли?
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #20 : 31.03.2016, 23:59:46 »

нет, 3.4
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #21 : 01.04.2016, 00:06:01 »

Используете устаревшие методы. Откройте какой-нибудь компонент 3.4-версии и посмотрите.
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #22 : 01.04.2016, 00:29:36 »

сделал так:
Код
jimport('joomla.filesystem.folder');
if(!(JFolder::create(JPATH_ROOT . DS . 'images' . DS . 'htmlmaps'))) {
echo "FAILED TO CREATE DIRECTORY";
return false;
}

ничего не поменялось.
Записан
AlekVolsk
Профи
********

Репутация: +317/-3
Offline Offline

Пол: Мужской
Сообщений: 6461



« Ответ #23 : 01.04.2016, 08:55:04 »

Код
jimport('joomla.filesystem.folder');
 
function CF($name)
{
$result = JFolder::create(JPATH_ROOT . $name);
if (!$result)
JError::raiseWarning('', JText::_('FAILED TO CREATE DIRECTORY'));
return $result;
}

использовать:
Код
if (!CF('/images/htmlmaps'))
return false;
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #24 : 01.04.2016, 09:56:35 »

Вы примеры случаем не из Joomla 1.5 брали?
да, из примеров доя J1.5
Еще раз: вы используете устаревшие методы J!1.5 для работы с версией 3.4 и удивляетесь, почему они не работают.
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #25 : 01.04.2016, 12:20:53 »

Код
jimport('joomla.filesystem.folder');
 
function CF($name)
{
$result = JFolder::create(JPATH_ROOT . $name);
if (!$result)
JError::raiseWarning('', JText::_('FAILED TO CREATE DIRECTORY'));
return $result;
}

все равно не работает.
использовать:
Код
if (!CF('/images/htmlmaps'))
return false;
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #26 : 01.04.2016, 12:21:53 »

Еще раз: вы используете устаревшие методы J!1.5 для работы с версией 3.4 и удивляетесь, почему они не работают.
последний мой вариант был взят из установочного файла VirtueMart 3
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3595


« Ответ #27 : 01.04.2016, 12:27:51 »

последний мой вариант был взят из установочного файла VirtueMart 3
И что там написано в функции com_install, включая коммент?
Записан
b2z
Support Team
*****

Репутация: +710/-0
Offline Offline

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #28 : 01.04.2016, 12:37:45 »

Ну по идее код был верный. По крайней мере у меня срабатывает в скрипте установки компонента:

Код
jimport('joomla.filesystem.folder');
...
 
/**
* Method to create the necessary directories
*
* @return  boolean  True on success, false otherwise.
*
* @since   1.0
*/

private function createDirectories()
{
$result = JFolder::create(JPATH_SITE . '/ncuploads');
 
if (false === $result)
{
JLog::add(sprintf('Unable to create uploads folder %s', JPATH_SITE . '/ncuploads'), JLog::ERROR, 'jerror');
}
 
return $result;
}
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Offline Offline

Сообщений: 103


« Ответ #29 : 01.04.2016, 17:02:17 »

И что там написано в функции com_install, включая коммент?
com_install это название моей функции. в VM функция, создающая папки при установке называется по другому.

Код
		/**
* creates a folder with empty HTML file
*
* @author Max Milbers
*
*/

public function createIndexFolder($path){
 
if(JFolder::create($path)) {
/*if(!JFile::exists($path .DS. 'index.html')){
JFile::copy(VMPATH_ROOT.DS.'components'.DS.'index.html', $path .DS. 'index.html');
}*/

return true;
}
return false;
}

b2z, все равно не работает. попробовал сделать в файле install.php умышленную синтаксическую ошибку - во время попытки установка мне было на нее указано, т.е. файл при установке подключается и срабатывает.
однако, ни папка не создается, ни ошибка не вываливается никакая...
Записан
Страниц: [1] 2  Все   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet