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

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

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

  1. Для того чтобы добавить кнопку массовой генерации на нужную вам страницу админки, вы сначала должны выполнить добавление кнопки в форму, которое описано в предыдущем разделе (Обязательно)

  2. Далее, в файле admin/model/extension/module/chatgptseo.php в классе OpenEditor вам сначала нужно будет создать публичную функцию которая будет отвечать за получение элемента (Getter function) из вашей базы данных и последующую передачу этих данных модулю GPT. Функция может иметь любое название, она должна иметь строго два аргумента на входе ($item_id; $language_id) и на выходе возвращать массив со всеми полями элемента полученного с помощью вашего SQL-запроса. Ниже представлен пример такой функции:

    /**
     * @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;
     }

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

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

    /**
     * @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 . "'");
    } 
  2. В заключительном шаге необходимо задекларировать ранее созданные функций для использования по определенному route. Для этого необходимо объявить статическую функцию `custom`, если она еще не объявлена. Данная функция должна возвращать массив элементов. Где ключом является route для которого была добавлена массовая генерация, а значение является массивом содержащий названия функций, созданных в пунктах 2 и 3. Пример представлен ниже:

    /**
     * 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 что был указан в предыдущем разделе ! 5. Готово, теперь вы можете использовать GPT-кнопку для массовой генерации записей в вашем разделе, но для того чтобы при обновлении модуля, ваши кастомизации не были стерты рекомендую вынести ваши изменения в отдельный модификатор. Пример модификатора, содержащего код из всех пунктов на странице:

<?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>

Last updated