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

  • 31 Ответов
  • 1063 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

Оффлайн denism300

обработка нажатия cancel
« : 27.02.2016, 23: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

Re: обработка нажатия cancel
« Ответ #1 : 28.02.2016, 03:12:17 »
В ошибке же прямо сказано: "Значение null первичного ключа недопустимо". Это, видимо, из-за тоео, что у несохраненного нового элемента еще нет id.
Вы скопировали эти функции откуда-то, да? Думаю, в cancel() нужно избавиться от checkin(), хотя нелишне будет понять, что она представляет собой. Приведенный вами код ничего не говорит: что такое $map и его метод checkin?
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.


*

Оффлайн denism300

Re: обработка нажатия cancel
« Ответ #3 : 07.03.2016, 13: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;
}


*

Оффлайн denism300

Re: обработка нажатия cancel
« Ответ #5 : 07.03.2016, 14: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

  • *****
  • 7449
  • [+]739 / [-]0
  • Разраблю понемногу
    • Просмотр профиля
    • NorrNext - расширения для Joomla! и Pagekit
Re: обработка нажатия cancel
« Ответ #6 : 07.03.2016, 14:39:36 »
$htmlmap->setState('id', $this->_fields['id']); тоже нужно вызывать, когда есть ID. Зачем 0 передавать?

Код: (php) [Выделить]
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);
}

*

Оффлайн robert

Re: обработка нажатия cancel
« Ответ #7 : 07.03.2016, 14:43:02 »
Код: (php-brief) [Выделить]
if(!($this->_fields['id']===null)){
$htmlmap->checkin();
}
P.S.
Уже ответили.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

Оффлайн denism300

Re: обработка нажатия cancel
« Ответ #8 : 07.03.2016, 20:07:27 »
Теперь возникла проблема с обработкой Save
Появляется такая ошибка: HTMLMapTableHTMLMap::bind(*NULL*)
Я так понимаю, что она говорит, что параметры для записи не передаются. А почему - не понимаю. Уже полдня убил на курение мануалов.

В общем, куски кода, как у меня реализовано. Большинство кода - копипаста из различных примеров, но основной принцип работы этого я улавливаю.
/tables/htmlmap.php
Код: (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
Код: (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
Код: (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

Re: обработка нажатия cancel
« Ответ #9 : 07.03.2016, 21:31:56 »
Код: (php) [Выделить]
$array['params'] = (string) $parameter;
Код: (php) [Выделить]
$var = $this->input->get('fields');
$htmlmap->setState('fields', $this->_fields);
$parameter,$this->input,$this->_fields откуда взялись?
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

Оффлайн denism300

Re: обработка нажатия cancel
« Ответ #10 : 08.03.2016, 14:51:03 »
$parameter,$this->input,$this->_fields откуда взялись?
вместо $parameter должно быть $registry, тут я напутал.

_fields берется отсюда:
Код: (php) [Выделить]
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

  • *****
  • 7449
  • [+]739 / [-]0
  • Разраблю понемногу
    • Просмотр профиля
    • NorrNext - расширения для Joomla! и Pagekit
Re: обработка нажатия cancel
« Ответ #11 : 08.03.2016, 15:37:35 »
$htmlmap->setState('fields', $this->_fields);

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

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

Вы примеры случаем не из Joomla 1.5 брали?

*

Оффлайн denism300

Re: обработка нажатия cancel
« Ответ #12 : 08.03.2016, 17:33:59 »
$htmlmap->setState('fields', $this->_fields);

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

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

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

*

Оффлайн b2z

  • *****
  • 7449
  • [+]739 / [-]0
  • Разраблю понемногу
    • Просмотр профиля
    • NorrNext - расширения для Joomla! и Pagekit
Re: обработка нажатия cancel
« Ответ #13 : 08.03.2016, 18:23:15 »
А в материалах на cmscafe нет реализации, потому что Joomla всё это по дефолту хорошо обрабатывает - нет нужды писать лишний код.
По сути самый лучший пример - это взять com_content. Если пример попроще, то com_newsfeeds.

*

Оффлайн robert

Re: обработка нажатия cancel
« Ответ #14 : 08.03.2016, 19:02:18 »
В принципе, если вам не нужно никаких особых манипуляций делать с данными, то нет необходимости создавать свои методы - JControllerForm() все за вас сделает: такие функции, как edit(), cancel(), save() там уже есть.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

Оффлайн b2z

  • *****
  • 7449
  • [+]739 / [-]0
  • Разраблю понемногу
    • Просмотр профиля
    • NorrNext - расширения для Joomla! и Pagekit
Re: обработка нажатия cancel
« Ответ #15 : 08.03.2016, 19:08:48 »
В принципе, если вам не нужно никаких особых манипуляций делать с данными, то нет необходимости создавать свои методы - JControllerForm() все за вас сделает: такие функции, как edit(), cancel(), save() там уже есть.
И я о том же.

*

Оффлайн denism300

Re: обработка нажатия cancel
« Ответ #16 : 10.03.2016, 23:20:04 »
взял контроллер из com_content, подправил под свои нужды. теперь при нажатии на любую на сохранить, сохранить и закрыть или отмена выдает такую ошибку:
Цитировать
Последний запрос был отклонён, поскольку он содержит неправильный параметр безопасности (security token). Пожалуйста, обновите страницу и попробуйте ещё раз.
Код получился такой:
Код: (php) [Выделить]
<?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

Re: обработка нажатия cancel
« Ответ #17 : 10.03.2016, 23:23:39 »
А вы token в форму добавили?
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

Оффлайн denism300

Re: обработка нажатия cancel
« Ответ #18 : 31.03.2016, 23:46:48 »
возникла такая проблема.
необходимо, чтобы при установке компонента создавалась папка в папке images.

сделал так:
в установочный файл XML добавил строку
Код: (php) [Выделить]
<installfile>install.php</installfile>
и создал файл install.php с таким кодом
Код: (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(1JText :: _('FAILED TO CREATE DIRECTORY'). ' "' $folder '"');
return false;
}
?>

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

*

Оффлайн robert

Re: обработка нажатия cancel
« Ответ #19 : 01.04.2016, 00:56:20 »
Joomla 1.5, что ли?
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

Оффлайн denism300

Re: обработка нажатия cancel
« Ответ #20 : 01.04.2016, 00:59:46 »
нет, 3.4

*

Оффлайн robert

Re: обработка нажатия cancel
« Ответ #21 : 01.04.2016, 01:06:01 »
Используете устаревшие методы. Откройте какой-нибудь компонент 3.4-версии и посмотрите.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

Оффлайн denism300

Re: обработка нажатия cancel
« Ответ #22 : 01.04.2016, 01:29:36 »
сделал так:
Код: (php) [Выделить]
jimport('joomla.filesystem.folder');
if(!(JFolder::create(JPATH_ROOT . DS . 'images' . DS . 'htmlmaps'))) {
echo "FAILED TO CREATE DIRECTORY";
return false;
}

ничего не поменялось.

*

Оффлайн AlekVolsk

Re: обработка нажатия cancel
« Ответ #23 : 01.04.2016, 09:55:04 »
Код: (php) [Выделить]
jimport('joomla.filesystem.folder');

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

использовать:
Код: (php) [Выделить]
if (!CF('/images/htmlmaps'))
return false;

*

Оффлайн robert

Re: обработка нажатия cancel
« Ответ #24 : 01.04.2016, 10:56:35 »
Вы примеры случаем не из Joomla 1.5 брали?
да, из примеров доя J1.5
Еще раз: вы используете устаревшие методы J!1.5 для работы с версией 3.4 и удивляетесь, почему они не работают.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

Оффлайн denism300

Re: обработка нажатия cancel
« Ответ #25 : 01.04.2016, 13:20:53 »
Код: (php) [Выделить]
jimport('joomla.filesystem.folder');

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

все равно не работает.
использовать:
Код: (php) [Выделить]
if (!CF('/images/htmlmaps'))
return false;

*

Оффлайн denism300

Re: обработка нажатия cancel
« Ответ #26 : 01.04.2016, 13:21:53 »
Еще раз: вы используете устаревшие методы J!1.5 для работы с версией 3.4 и удивляетесь, почему они не работают.
последний мой вариант был взят из установочного файла VirtueMart 3

*

Оффлайн robert

Re: обработка нажатия cancel
« Ответ #27 : 01.04.2016, 13:27:51 »
последний мой вариант был взят из установочного файла VirtueMart 3
И что там написано в функции com_install, включая коммент?
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

Оффлайн b2z

  • *****
  • 7449
  • [+]739 / [-]0
  • Разраблю понемногу
    • Просмотр профиля
    • NorrNext - расширения для Joomla! и Pagekit
Re: обработка нажатия cancel
« Ответ #28 : 01.04.2016, 13:37:45 »
Ну по идее код был верный. По крайней мере у меня срабатывает в скрипте установки компонента:

Код: (php) [Выделить]
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

Re: обработка нажатия cancel
« Ответ #29 : 01.04.2016, 18:02:17 »
И что там написано в функции com_install, включая коммент?
com_install это название моей функции. в VM функция, создающая папки при установке называется по другому.

Код: (php) [Выделить]
/**
* 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 умышленную синтаксическую ошибку - во время попытки установка мне было на нее указано, т.е. файл при установке подключается и срабатывает.
однако, ни папка не создается, ни ошибка не вываливается никакая...