> For the complete documentation index, see [llms.txt](https://chatgpt-seo.gitbook.io/chatgpt-seo-dokumentaciya-i-osnovye-voprosy/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://chatgpt-seo.gitbook.io/chatgpt-seo-dokumentaciya-i-osnovye-voprosy/group-1/rabota-s-konfigom-i-osnovnye-nastroiki-modulya/kak-dobavit-massovuyu-generaciyu-v-svoi-razdel.md).

# Как добавить массовую генерацию в свой раздел?

Внимание данный раздел предназначен только для разработчиков! Вы должны понимать что делаете. Техническая поддержка для данного раздела оказывается только в качестве отдельной, платной услуги.

Прежде чем начать работу, рекомендую прочитать данную инструкцию полностью.

1. Для того чтобы добавить кнопку массовой генерации на нужную вам страницу админки, вы сначала должны выполнить \
   добавление кнопки в форму, которое описано в [предыдущем разделе](/chatgpt-seo-dokumentaciya-i-osnovye-voprosy/group-1/rabota-s-konfigom-i-osnovnye-nastroiki-modulya/kak-dobavit-knopku-gpt-v-novyi-razdel.md) (**Обязательно**)
2. Далее, в файле `admin/model/extension/module/chatgptseo.php` в классе `OpenEditor` вам сначала нужно будет создать публичную функцию которая будет отвечать за получение элемента (Getter function) из вашей базы данных и последующую передачу этих данных модулю GPT. Функция может иметь любое название, она должна иметь строго два аргумента на входе `($item_id; $language_id)` и на выходе возвращать массив со всеми полями элемента полученного с помощью вашего SQL-запроса.\
   Ниже представлен пример такой  функции: <br>

   <pre class="language-php"><code class="lang-php">/**
    * @param int $article_id The ID of the news article to retrieve.
    * @param int $language_id The ID of the language to retrieve the article in.
    *
    * @return array|null The news article row or null
    */
   <strong> public function getNewsArticle($article_id , $language_id) { 
   </strong>	$query = $this->db->query("SELECT DISTINCT *, (SELECT keyword FROM " . DB_PREFIX . "url_alias WHERE query = 'news_article_id=" . (int)$article_id . "') AS keyword
   	FROM " . DB_PREFIX . "news_article p
   	LEFT JOIN " . DB_PREFIX . "news_article_description pd ON (p.article_id = pd.article_id)
   	WHERE p.article_id = '" . (int)$article_id . "' AND
   	pd.language_id = '" . (int)$language_id . "'");

   	return $query->row;
    }
   </code></pre>

P.S. Если вы используете мультиязычность на сайте, то вы можете передавать сразу данные о нескольких языках, для этого в массиве который возвращает функция, в поле `'`**`description`**`'` должен содержаться массив, где ключ элемента это **`$language_id`**, а значение это массив со всеми полями для данного языка. Аналогично как это реализовано в стандартном методе **`getProduct`** в модели  `admin/model/catalog/product.php`

3. Необходимо в том же файле создать еще одну публичную функцию, которая будет отвечать за внесение отредактированной записи в базу данных (Setter function). Функция должна иметь строго три аргумента: **`$item_id`** - id элемента , **`$data`** - массив содержащий отредактированные значения записи (имеет тот же формат что был отдан функцией из предыдущего пункта), **$language\_id** - id языка\
   Ниже представлен пример такой функции:<br>

   ```php
   /**
    * @param int $article_id The ID of the news article to update.
    * @param array &$data An array containing the new values for the article's columns.
    *                     The array keys should match the column names in the
    *                     'news_article_description' table.
    * @param int $language_id The ID of the language in which to update the article.
    *
    * @return void This function does not return a value.
    */
   public function editNewsArticle($article_id , &$data , $language_id){
   	$query = $this->db->query("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '".DB_DATABASE."' AND TABLE_NAME = '".DB_PREFIX."news_article_description'");
   	$description_columns = array_map(function($i){return $i['COLUMN_NAME'];} , $query->rows);
   	$fields = [];
   	foreach ($description_columns as $column){
   		if( isset($data[$column]) )
   			$fields[] = " `$column` = '". $this->db->escape($data[$column]) ."'";
   	}
   	$this->db->query("UPDATE " . DB_PREFIX . "news_article_description SET ". implode(',' , $fields ) ." WHERE language_id = '" . (int) $language_id . "' AND article_id = '" . (int) $article_id . "'");
   } 
   ```
4. В заключительном шаге необходимо задекларировать ранее созданные функций для использования по определенному `route`. Для этого необходимо объявить статическую функцию \``custom`\`, если она еще не объявлена. Данная функция должна возвращать массив элементов. Где ключом является `route` для которого была добавлена массовая генерация, а значение является массивом содержащий названия функций, созданных в пунктах 2 и 3.\
   Пример представлен ниже:

   ```php
   /**
    * Returns a mapping of custom routes to their corresponding controller methods.
    *
    * This function returns an associative array where the keys are custom routes
    * and the values are arrays of controller methods that should be executed when
    * the corresponding route is accessed.
    *
    * In this case, the function maps the 'blog/article' route to the 'getNewsArticle'
    * and 'editNewsArticle' methods.
    *
    * @return array An associative array mapping custom routes to their corresponding controller methods.
    */

   public static function custom(){
   	return [
   		'blog/article' => ['getNewsArticle', 'editNewsArticle'],
   		//'blog/blog' => ['getterBlog' , 'setterBlog'] ,
   		// etc
   	];
   }
   ```

   **Внимание!** 'blog/article' -  в данном примере это тот же самый `route` что был указан в [предыдущем разделе ](/chatgpt-seo-dokumentaciya-i-osnovye-voprosy/group-1/rabota-s-konfigom-i-osnovnye-nastroiki-modulya/kak-dobavit-knopku-gpt-v-novyi-razdel.md)!\
   \
   5\. Готово, теперь вы можете использовать GPT-кнопку для массовой генерации записей в вашем разделе, но для того чтобы при обновлении модуля, ваши кастомизации не были стерты рекомендую вынести ваши изменения в отдельный модификатор.\
   \
   Пример модификатора, содержащего код из всех пунктов на странице:<br>

```xml
<?xml version="1.0" encoding="utf-8"?>
<modification>
  <name>ChatGPT SEO - CUSTOM ROUTES UPDATES</name>
  <code>chatgptseo_custom</code>
  <version>1.0</version>
  <author>d1medrol</author>
  <link>https://t.me/d1medrol</link>
  <file path="admin/model/extension/module/chatgptseo.php">
    <operation>
      <search><![CDATA[function __construct]]></search>
      <add position="before"><![CDATA[
      
		/**
		 * Returns a mapping of custom routes to their corresponding controller methods.
		 *
		 * This function returns an associative array where the keys are custom routes
		 * and the values are arrays of controller methods that should be executed when
		 * the corresponding route is accessed.
		 *
		 * In this case, the function maps the 'blog/article' route to the 'getNewsArticle'
		 * and 'editNewsArticle' methods.
		 *
		 * @return array An associative array mapping custom routes to their corresponding controller methods.
		*/
		
		public static function custom(){
			return [
				'blog/article' => ['getNewsArticle', 'editNewsArticle'],
				//'blog/blog' => ['getterBlog' , 'setterBlog'] ,
				// etc
			];
		}
		
		/**
		 * @param int $article_id The ID of the news article to retrieve.
		 * @param int $language_id The ID of the language to retrieve the article in.
		 *
		 * @return array|null The news article row or null
		 */
		public function getNewsArticle($article_id , $language_id) { 
			$query = $this->db->query("SELECT DISTINCT *, (SELECT keyword FROM " . DB_PREFIX . "url_alias WHERE query = 'news_article_id=" . (int)$article_id . "') AS keyword
			FROM " . DB_PREFIX . "news_article p
			LEFT JOIN " . DB_PREFIX . "news_article_description pd ON (p.article_id = pd.article_id)
			WHERE p.article_id = '" . (int)$article_id . "' AND
			pd.language_id = '" . (int)$language_id . "'");

			return $query->row;
		}
		
		/**
		 * @param int $article_id The ID of the news article to update.
		 * @param array &$data An array containing the new values for the article's columns.
		 *                     The array keys should match the column names in the
		 *                     'news_article_description' table.
		 * @param int $language_id The ID of the language in which to update the article.
		 *
		 * @return void This function does not return a value.
		 */
		public function editNewsArticle($article_id , &$data , $language_id){
			$query = $this->db->query("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '".DB_DATABASE."' AND TABLE_NAME = '".DB_PREFIX."news_article_description'");
			$description_columns = array_map(function($i){return $i['COLUMN_NAME'];} , $query->rows);
			$fields = [];
			foreach ($description_columns as $column){
				if( isset($data[$column]) )
					$fields[] = " `$column` = '". $this->db->escape($data[$column]) ."'";
			}
			$this->db->query("UPDATE " . DB_PREFIX . "news_article_description SET ". implode(',' , $fields ) ." WHERE language_id = '" . (int) $language_id . "' AND article_id = '" . (int) $article_id . "'");
		} 
		
		
      ]]></add>
    </operation>
  </file>
</modification>
```
