Не зарегистрирован
Вход
Забыли пароль?
Регистрация
Подписаться
Сэкономьте время — перед вопросом на форуме узнайте, как найти ответ быстрее
По техническим проблемам необходимо обращаться в Консультационный центр

Поиск по форуму: 

Приглашаем в блог Amiro.CMS. Регулярные обзоры, опыт, решения, практикумы.

Форум  ->   Разработка плагинов, вопросы по API  ->  Автозаполняемое при добавлении записи поле

Раздел для разработчиков. Обсуждение создания плагинов, вопросы и пожелания по API Amiro.CMS

Добавлено: 02.05.12 11:08:48 #1



Регистрация: 09.04.12
Сообщений: 8


Обратиться по имени

В базе есть поле name, которое заполняется в зависимости от того, что введено в поле title. Пробовал сделать через setFieldCallback, но в обработчике события set поле title всегда оказывается пустым, хотя реально в базу заносится. С обработчиком get все нормально.



Добавлено: 02.05.12 12:18:51 #2

Амиро



Регистрация: 21.03.07
Сообщений: 258


Обратиться по имени

Приведите SQL-запрос создания вашей таблицы, полный код моделей, код, задающий данные модели и сохраняющий её.



Добавлено: 02.05.12 14:29:35 #3



Регистрация: 09.04.12
Сообщений: 8


Обратиться по имени

DROP TABLE IF EXISTS `actions_plugin`;
CREATE TABLE `actions_plugin` (
	`id` int(11) NOT NULL auto_increment,
	`date_create` TIMESTAMP NOT NULL default CURRENT_TIMESTAMP,
	`public` int NOT NULL default 1,
	`title` varchar(255) NOT NULL default '',
	`place` varchar(255) NOT NULL default '',
	`announcement` varchar(255) NOT NULL default '',
	`name` varchar(255) NOT NULL default '',
	`content` varchar(255) NOT NULL default '', 
	PRIMARY KEY  (`id`)
) ENGINE=MyISAM; 


<?php

function translitIt($str) 
{
    $tr = array(
        "А"=>"a","Б"=>"b","В"=>"v","Г"=>"g",
        "Д"=>"d","Е"=>"e","Ж"=>"j","З"=>"z","И"=>"i",
        "Й"=>"y","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
        "О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
        "У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"ts","Ч"=>"ch",
        "Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"yi","Ь"=>"",
        "Э"=>"e","Ю"=>"yu","Я"=>"ya","а"=>"a","б"=>"b",
        "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"j",
        "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
        "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
        "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
        "ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
        "ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya", 
        " "=> "_", "."=> "", "/"=> "_", "?" => "_", "!" => "_"
    );
    return strtr($str,$tr);
}

function cropstr($string, $limit){
	$substring_limited = substr($string, 0, $limit);
	$a = substr($substring_limited, 0, strrpos($substring_limited, ' '));
	if(!empty($a)) $a = $a;
	else $a = $substring_limited;

	return $a;
}

class Actions_Table extends AMI_ModTable{
    protected $tableName = 'actions_plugin';
}

class Actions_TableItem extends AMI_ModTableItem{
    public function __construct(AMI_ModTable $oTable, DB_Query $oQuery = null){
        parent::__construct($oTable, $oQuery);

        $this->oTable->addValidators(
            array(
                'title' => array('filled')
            )
        );

        $this->setFieldCallback('name', array($this, 'fcbName'));
    }

	protected function fcbName(array $aData){
        if($aData['action'] === 'set'){
			$aData['value'] = cropstr($this->aData['title'], 50);
			$uid = uniqid();
			$aData['value'] = translitIt($aData['value'])."_".substr($uid, strlen($uid) - 5);
        }else{
            $aData['_skip'] = true;
        }
	}
}

class Actions_TableList extends AMI_ModTableList{
}





Добавлено: 02.05.12 14:51:26 #4

Амиро



Регистрация: 21.03.07
Сообщений: 258


Обратиться по имени

В методе Actions_TableItem::fcbName() используйте $aData['oItem'] (в вашем случае $aData['oItem']->title) для доступа к другим полям модели.



Добавлено: 02.05.12 15:10:21 #5



Регистрация: 09.04.12
Сообщений: 8


Обратиться по имени

Спасибо, все заработало.



Добавлено: 02.05.12 19:06:13 #6



Регистрация: 09.04.12
Сообщений: 8


Обратиться по имени

Я ошибся, проблему это не решило, все равно возвращается пустое значение.



Добавлено: 03.05.12 08:29:35 #7

Амиро



Регистрация: 21.03.07
Сообщений: 258


Обратиться по имени

Антон:
Приведите ... код, задающий данные модели и сохраняющий её.

Ждём ответа.



Добавлено: 03.05.12 17:03:29 #8



Регистрация: 09.04.12
Сообщений: 8


Обратиться по имени

<?php

class Actions_FormAdm extends AMI_ModFormAdm{
    protected function _save(array &$aEvent){
        parent::_save($aEvent);
        if(is_object($this->oModelItem)){
            AMI::getSingleton('response')->addStatusMessage('origin_data', array('data' => d::getDumpAsString($this->oModelItem->getOriginData())));
            AMI::getSingleton('response')->addStatusMessage('difference_from_origin', array('data' => d::getDumpAsString($this->oModelItem->getDiffFromOrigin())));
        }
    }
}


class Actions_FormViewAdm extends AMI_ModFormViewAdm{

    public function __construct(){
        parent::__construct();
    }

    public function init(){

        $this->addTemplate($this->getModTemplatePath() . 'fields.tpl');

        $this->addField(array('name' => 'id', 'type' => 'hidden'));
		$this->addField(array('name' => 'name', 'type' => 'hidden'));

        $this->addField(array('name' => 'mod_action', 'value' => 'form_save', 'type' => 'hidden'));

        $this->addField(array('name' => 'public', 'type' => 'checkbox', 'default_checked' => true));
        $this->addField(array('name' => 'title'));
        $this->addField(array('name' => 'place'));


        $this->addTabContainer('tabset');
        $this->addTab('announcement_tab', 'tabset', self::TAB_STATE_ACTIVE);
		$this->addTab('content_tab', 'tabset', self::TAB_STATE_ACTIVE);

        $this->addField(array('name' => 'announcement', 'type' => 'htmleditor', 'cols' => 80, 'rows' => 10, 'position' => 'announcement_tab.end', 'modes' => array('editor', 'bb')));
		$this->addField(array('name' => 'content', 'type' => 'htmleditor', 'cols' => 80, 'rows' => 10, 'position' => 'content_tab.end', 'modes' => array('visual', 'editor', 'bb')));
		
        return parent::init();
    }

    protected function getModLocalePath(){
        return $this->getModTemplatePath() . 'form.lng';
    }

    protected function getModTemplatePath(){
        return '_local/plugins_distr/' . $this->getModId() .  '/templates/';
    }
}



Добавлено: 03.05.12 17:19:19 #9

Амиро



Регистрация: 21.03.07
Сообщений: 258


Обратиться по имени

Не могли бы вы оформить код, воспроизводящий проблему, через отдельный скрипт, использующий точку входа и задающий данные модели из кода в виде

$oItem->var1 = '...';
$oItem->var2 = '...';
$oItem->save();



Добавлено: 08.05.12 13:21:32 #10



Регистрация: 09.04.12
Сообщений: 8


Обратиться по имени

я не знаю как это сделать.



Добавлено: 10.05.12 09:00:05 #11

Амиро



Регистрация: 21.03.07
Сообщений: 258


Обратиться по имени

Пришлите полный код модуля и описание последовательности действий, воспроизводящих ошибку, в СП.





Создать новую тему

Всего тем: 6630
Всего сообщений: 27746
Всего зарегистрированных пользователей: 48912
Последний зарегистрированный пользователь: user33269596