Modx document.class.inc.php

19 апреля 2011

В системе Modx evo нет API для создания документов (страниц) программным путем. С чем это связано - я не знаю. Потому как если посмотреть документацию на остальные компоненты системы, можно предположить что и программное создание документов (страниц) в этой системе легкое и простое. Но стандартного API в Modx evo нет или я так плохо искал (другие кстати тоже). Но свято место пусто не бывает, и поэтому появился класс ПХП для создания документов.

Docmanager, состоящий из одного файла document.class.inc.php. Спасибо автору ur001@mail.ru. Но у этой программки обнаружился небольшой и легко устраняемый дефектик, точнее, недочет. Все дело в том, что мне понадобилось для своего плагина знать ID только что созданного документа. В mysql можно воспользоваться функцией LAST_INSERT_ID(), а вот в системе Modx есть $modx->db->getInsertId(). Да и если для вставки воспользоваться функцией $modx->db->insert(), можно узнать ID последнего вставленного документа. Так как эта функция содержит внутри себя функцию $modx->db->getInsertId() и результат ее действия и есть этот самый ID.

И хотя в Docmanager для создания новых документов и для редактирования других используется стандартный API Modx EVO, автор почемуто упустил момент возврата ID только что созданного документа. А так как функция save отвечающея за создания документа создает и сохраняет так же TV-параметры, то возникают трудности при определении ID. Эту ситуацию разрешить можно несколькими путями.

1. Создать документ без TV-параметров. После этого сразу вызвать функцию $modx->db->insert(). И дальше, уже зная ID, отредактировать TV-параметры.

2. Создать уникальный TV-параметр. После сохранения документа отыскать ID по уникальному TV-параметру.

3. Еще как нибудь поколдовать.

4. Немного изменить функцию save в классе document.class.inc.php.

Четвертый пункт, наверно, самый правильный вариант. Смотрим функцию "SAVE":
function Save(){
global $modx;
$tablename=$modx->getFullTableName('site_content');
if($this->isNew){
$this->fields['id']=$modx->db->insert(&$this->fields, $tablename);
$this->isNew = false;
$myid = $this->fields['id'];
} else {
$id=$this->fields['id'];
$myid =$id;
$modx->db->update(&$this->fields, $tablename, "id=$id");
}
if(is_array($this->tvs)) $this->saveTVs();
return $myid;
}

 

Красным выделен код, который добавил я. Как видите, изменений совсем немного. Конечно, правильней предусмотреть появления ошибок и возвратить результат FALSE. Но мне пока достаточно этого.

Андрей Лебедев

,

, , , ,

Комментарий

Нет комментарий.

Комментировать: