За последние 24 часа нас посетил 18281 программист и 1634 робота. Сейчас ищут 1685 программистов ...

API форума

Тема в разделе "Решения, алгоритмы", создана пользователем Alost, 29 сен 2009.

  1. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Гораздо легче натянуть шаблон на готовые данные, чем подгонять дизайн на готовый html.

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

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Тут я бы наверно сказал легче натянуть данные на готовый дизайн, чем подгонять шаблон под дизайн
     
  3. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Я планирую начать с простой гостевой.На ней проще будет заложить скелет аритектуры,и опробовать методы абстрагирования от БД.
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Кстати, API форума - штука полезная. Особенно, если оно является частью форума, (т.е. весь форум внутри работает через это API), а не как отдельная прибамбасина. Тогда можно было бы легко совмещать администрирование портала с администрированием форума.
     
  5. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    форум - довольно сложная штука сама по себе. У меня еще не было задач сделать форум, хоть для себя хоть для заказчика. Если с получением сообщений/тем все более-менее ясно, то как быть с записью оных? С модерированием и тд? + потребуются разные сортировки, фильтры. Опять же прочитанные/непрочитанные (новые сообщения).


    вообще для всех таких апи и их отладки удобно б сделать консоль. Как в пыхе открыть консоль, которая б не закрывалась после каждой команды и сохраняла все загруженные библиотеки во время работы?
     
  6. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Я для таких фишек использую усправление скриптом через mysql или файлы.Тоесть скрипт гоняеться по циклу с set_time_limit(0) проверяя с задержками базу на наличие команд.
     
  7. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Кто какие спобы абстрагирования от БД знает?
     
  8. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Нам не нужна абстракция на данном этапе. Хватит того, что выделить работу с SQL в отдельный класс. Использовать MySQLi как базовый класс для абстракции, слегка его расширив обработкой ошибок - для остальных баз потом легко сделать обёртку.
     
  9. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    я вот в последнем своём проекте использовал самописный QueryBuilder. Оказалось достаточно удобно
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Я вот тоже как-то писал подобное, сделал условия всякие и т.п., потом плюнул и сделал два метода - select_array и просто query :)
     
  11. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    я тоже делал... самое смешное что 2-х методов тоже хватило за глаза :)
     
  12. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    а я — закончил более-менее. да еще и с Join'ами работает так охуенно:
    PHP:
    1. <?php
    2.  
    3. /**
    4.  * Результат, выполнения запроса
    5.  * @author Shock
    6.  */
    7. interface Db_IResult
    8. {
    9.     /**
    10.      * Определяет, есть ли следующая строка запроса и переходит на неё, либо возвращает false
    11.      * Использование: while ($result->row()) { }
    12.      * @return bool
    13.      */
    14.     function row ();
    15.  
    16.     /**
    17.      * Возвращает определённую строку, или массив, или двумерный массив результата из бд. Примеры:
    18.      * "field"   — получить значение последнего поля с таким названием
    19.      * "*.field" — возвращает одномерный массив, где ключём будет имя таблицы, а значением — значения поля field в соответствующей таблице
    20.      * "table.*" — получить ассоциативный массив, где ключ — имя поля в таблице table
    21.      * "*.*"     — получить массив, в котором ключи — имена таблиц, а значение — массивы, в которых ключи — имена полей
    22.      * "*"       — получить массив, в котором ключи — имена полей
    23.      * ".field"  — получить значение группового поля, например "COUNT(*)"
    24.      * @param string $field
    25.      * @return string|array
    26.      */
    27.     function get ($field);
    28.  
    29.     /**
    30.      * Возвращает autoincrement ID последней вставленной записи
    31.      * @return int
    32.      */
    33.     function getId ();
    34.  
    35.     /**
    36.      * Возвращает количество затронутых, или полученных select'ом строк
    37.      * @return int
    38.      */
    39.     function getNum ();
    40.  
    41.     /**
    42.      * Получить ошибку, или null, если ошибок не было
    43.      * @return string|null
    44.      */
    45.     function getError ();
    46. }
    47. ?>
    и получается что-то типа такого:
    PHP:
    1. <?php
    2. $result = Registry::get('Db')
    3.   ->query()
    4.   ->select('*')
    5.   ->from('Posts as Post')
    6.   ->join('Users as User', 'Post.UserID = User.ID')
    7.   ->where('Post.TopicID = %d', $this->argv['TopicID'])
    8.   ->compile()->run();
    9. $posts = array();
    10. while ($result->row()) {
    11.   $post = new Instance_Post($result->get('Posts.*'));
    12.   $post->author = new Instance_User($result->get('User.*'));
    13.   $posts[] = $post;
    14. }
    15. return $posts;
    Грубо, конечно, но суть понятна
     
  13. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Вообще, конечно, мне больше был важен именно Db_IResult, а не Db_IQueryBuilder, так как нормальной работы с джоинами в пхп я так и не нашёл))
     
  14. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Заранее прошу прощения за "простыню" кода.
    попытался написать то о чем тут велось обсуждение на примере гостевой книги, получился вот такой набросок класса.
    Все обработки на правильность отдаються пока основному коду,тут описан функционал с учетом что все данные верны(экранированы даные для запросов и т.п.)
    не стал писать оболочку для содания гостевой книги, так как каждый знает что там будет, сейчас интересней всего услышать комментарии о самом классе.
    [sql]
    CREATE TABLE `guestbook` (
    `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Primary key',
    `moment` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Record timestamp',
    `name` VARCHAR( 128 ) DEFAULT 'Anonymous' NOT NULL COMMENT 'Guest name',
    `email` VARCHAR( 128 ) NOT NULL COMMENT 'Guest e-mail',
    `text` LONGTEXT NOT NULL COMMENT 'Guest book record',
    PRIMARY KEY ( `id` )
    ) CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT = 'Guestbook records'
    [/sql]


    PHP:
    1.  
    2. <?php
    3.  
    4. $mysql_database = 'test';       # База данных (может быть false если выбирать не надо)
    5. $mysql_host     = 'localhost';  # Хост
    6. $mysql_user     = 'root';       # Пользователь
    7. $mysql_pass     = '123';       # Пароль
    8. $mysql_charset  = 'utf8';       # Кодировка
    9. $tableName      = 'guestbook';  # Имя таблицы для гостевой книги
    10. $postPerPage    = 10;
    11. include('classes.php');
    12. $Guest = new questBook();
    13. $Guest->setDbParams($mysql_host,$mysql_user,$mysql_pass,$mysql_database,$mysql_charset,$tableName);
    14. $Guest->setGuestBookParams($postPerPage);
    15. foreach($Guest->getAllPosts() as $post)
    16. {
    17.     echo $post->id.' '.$post->moment.' '.$post->name.' '.$post->email.' '.$post->text.'<br>';
    18. }
    19. ?>
    20.  
    21. [/code]
    22.  
    23. [code]
    24. <?php
    25. // Класс работы с mysql
    26. class class_mysql
    27.     {
    28.     private $mysql_resource; # Идентификатор ресурса подключения
    29.    private $errors = array();
    30.     function __construct($mysql_host,$mysql_user,$mysql_pass,$mysql_database,$mysql_charset)
    31.         {
    32.         // Подключаемся
    33.         if(!($this->mysql_resource=mysql_connect($mysql_host,$mysql_user,$mysql_pass))){
    34.             $this->errors[] = ("<pre>Ошибка подключения к БД!\nТекст ошибки:\n".mysql_error()."в class_mysql::__construct</pre>");
    35.             die(("<pre>Ошибка подключения к БД!\nТекст ошибки:\n".mysql_error()."в class_mysql::__construct</pre>"));
    36.             }
    37.         // Выбираем БД (если надо)
    38.         if($mysql_database!==false){
    39.             if(!(@mysql_select_db($mysql_database,$this->mysql_resource)))
    40.                 $this->errors[] = ("<pre>Ошибка выбора БД!\nТекст ошибки:\n".mysql_error()."в class_mysql::__construct</pre>");
    41.             return false;}
    42.         // Сообщаем кодировку
    43.         if(!(@mysql_query('SET CHARACTER SET '.$mysql_charset,$this->mysql_resource)))
    44.             $this->errors[] = ("<pre>Ошибка выбора кодировки БД!\nТекст ошибки: \n".mysql_error()."\nКодировка:\n".$mysql_charset."в class_mysql::__construct</pre>");
    45.             return false;
    46.         }
    47.  
    48.     // Возвращает ассоциативный массив из SQL запроса
    49.     public function query($mysql_query)
    50.         {
    51.         // Выполняем запрос
    52.         if ($this->mysql_resource == false) {// Проверяем установлена ли связь с БД
    53.             $this->errors[] = "<pre>Не установлено соедедение с БД в class_mysql::query</pre>";
    54.             return false;
    55.         }
    56.         ($mysql_result=mysql_query($mysql_query,$this->mysql_resource));
    57.         if ($mysql_result == false) {
    58.             $this->errors[] = "<pre>Ошибка выполнения запроса к БД!\nТекст ошибки:\n".mysql_error()."\nЗапрос:\n".htmlspecialchars($mysql_query)." в class_mysql::query</pre>";
    59.             return false;
    60.         }
    61.         $mysql_return=array(); # Возвращаемый функцией массив
    62.         // Если был запрос не на получение данных
    63.         if($mysql_result==1)
    64.             // Если запрос вставки - возвращаем id новой записи
    65.             if (($mysql_return=mysql_insert_id($this->mysql_resource))!=0)
    66.                 return $mysql_return;
    67.             // Иначе - количество затронутых рядов в результате выполнения запроса
    68.             else
    69.                 return mysql_affected_rows($this->mysql_resource);
    70.         // Если выполнен запрос на получение данных
    71.         else
    72.             {
    73.             while($line=mysql_fetch_array($mysql_result,MYSQL_ASSOC))
    74.                 $mysql_return[]=array_change_key_case($line); # Возвращаем ассоциативным массивом то что получили из запроса
    75.             mysql_free_result($mysql_result); # Освобождаем Результат Запроса Чтобы Не Жрал Память
    76.             }
    77.         return $mysql_return;
    78.         }
    79.     //возвращает последнюю ошибку
    80.     public function getLastError(){
    81.         if ($this->errors != null) {
    82.             return $this->errors[count($this->errors)-1];
    83.         }
    84.     }
    85.     //Возвращает все ошибки за всемя работы
    86.     public function getAllErrors(){
    87.         if ($this->errors != null) {
    88.             return $this->errors;
    89.         }
    90.     }
    91.     }
    92.  
    93. /**
    94.  *Класс для работы с гостевой книгой
    95.  *
    96.  */
    97.  
    98. class questBook{
    99.     /**
    100.      * Constructor
    101.      */
    102.     private $tableName      = null; //Имя таблицы для гостевой книги
    103.     private $mysql_database = null; // База данных (может быть false если выбирать не надо)
    104.     private $mysql_host     = null; // Хост
    105.     private $mysql_user     = null; // Пользователь
    106.     private $mysql_pass     = null; // Пароль
    107.     private $mysql_charset  = null; // Кодировка
    108.     public  $db = null;             // База данных
    109.     private $postPerPage    = 10;   //Кол-во сообщений на страницу
    110.     private $posts          = null;
    111.     private $postCounts     = null;
    112.     private $pageCount      = null;
    113.     function __construct(){
    114.     }
    115.     function initDb(){ //Функция для инициализации БД вызываеться перед каждой попыткой сделать запрос в БД
    116.         if ($this->db === null) { //Если база не проинициализирована - инициализируем
    117.             $this->db = new class_mysql($this->mysql_host,
    118.                                         $this->mysql_user,
    119.                                         $this->mysql_pass,
    120.                                         $this->mysql_database,
    121.                                         $this->mysql_charset);
    122.         }
    123.     }
    124.     function setDbParams($mysql_host,$mysql_user,$mysql_pass,
    125.                          $mysql_database,$mysql_charset,$tableName){//Устанавливаем параметры БД
    126.         $this->mysql_host     = $mysql_host;
    127.         $this->mysql_user     = $mysql_user;
    128.         $this->mysql_pass     = $mysql_pass;
    129.         $this->mysql_database = $mysql_database;
    130.         $this->mysql_charset  = $mysql_charset;
    131.         $this->tableName      = $tableName;
    132.     }
    133.     function setGuestBookParams($postPerPage){ //устанавлием параметры гостевой
    134.         $this->postPerPage    = $postPerPage;
    135.     }
    136.     function addPost($name,$email,$text){ //Добавлени поста  вбазу
    137.         $this->initDb();
    138.         $result = $this->db->query("INSERT INTO `".$this->tableName."` (`name`,`email`,`text`)
    139.                                     VALUES ('".$name."', '".$email."', '".$text."');");
    140.         if ($result != false) {
    141.             $this->posts[$result] = $this->getPostById($result); //берем из БД потомучто не знает поле moment
    142.             if ($this->postCounts = null) {
    143.                 $this->postCounts++;   //вписываем что добавился еще один пост
    144.                 $this->getPageCount(); //пересчитываем кол-во страниц
    145.             }
    146.  
    147.         }
    148.         return $result;
    149.     }
    150.     function getPostById($id){ //возвращает пост по его id
    151.         if (!isset($this->posts[$id])) {
    152.             $this->initDb();
    153.             $result = $this->db->query('SELELECT * FROM `'.$this->tableName.'` WHERE `id`='.$id);
    154.             if ($result != false) {
    155.                 $this->posts[$id] = new Post($id,$result['momtnt'],$result['name'],
    156.                                              $result['email'],$result['text']);
    157.             }
    158.         }
    159.     }
    160.     function loadAllPosts(){ //Загружает из базы все посты
    161.         if ($this->posts == null) {
    162.             $this->initDb();
    163.             $result = $this->db->query("SELECT * FROM `".$this->tableName."` WHERE 1;");
    164.             if (is_array($result)) {
    165.                 foreach ($result as $post){
    166.                     $this->posts[$post['id']] = new Post($post['id'],$post['moment'],$post['name'],
    167.                                                          $post['email'],$post['text']);
    168.                 }
    169.             }
    170.         }
    171.     }
    172.     function getAllPosts(){ //возращает все посты в базе
    173.         if ($this->posts == null) $this->loadAllPosts();
    174.         return $this->posts;
    175.     }
    176.     function getLastPost(){ //Возвращает последний пост
    177.         if ($this->posts == null) $this->loadAllPosts();
    178.         return $this->posts[count($this->posts)-1];
    179.     }
    180.    
    181.     function getAllBdErrors(){ //Выводил все ошибки связаные с БД
    182.         $this->initDb();
    183.         return $this->db->getAllErrors();
    184.     }
    185.     function getPostsCount(){ //Кол-во постов  в базе
    186.         $this->initDb();
    187.         if ($this->postCounts == null) {
    188.             $countsArray = $this->db->query('SELECT COUNT(*) as counts FROM `'.$this->tableName.'`');
    189.             $this->postCounts= intval($countsArray[0]['counts']);
    190.         }
    191.         return $this->postCounts;
    192.     }
    193.     function getPageCount(){ //Колво страниц с учетом параматра кол-во костов на страницу и все постов в базе
    194.         $this->initDb();
    195.         $this->getPostsCount();
    196.         if ($this->postCounts == 0 ) {
    197.             return 0;
    198.         }
    199.         else {
    200.             return intval($this->postCounts/$this->postPerPage)+1;
    201.         }
    202.     }
    203.     function getPostsByPage($pageNum){
    204.     }
    205. }
    206. /**
    207.  *
    208.  *
    209.  */
    210. class Post{
    211.     /**
    212.      * Constructor
    213.      */
    214.     public $id;
    215.     public $moment;
    216.     public $name;
    217.     public $email;
    218.     public $text;
    219.    
    220.     function __construct($id,$moment,$name,$email,$text){
    221.         $this->id     = $id;
    222.         $this->moment = $moment;
    223.         $this->name   = $name;
    224.         $this->email  = $email;
    225.         $this->text   = $text;
    226.     }
    227. }
    228. ?>
    229.  
     
  15. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    PHP:
    1.  
    2. loadAllPosts()
    3.  
    убил бы.
     
  16. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    А по существу?
     
  17. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    пока что — так себе.
    1. если уж выкладываешь тут, а не ка каком-то pastebin.ru, то обрамляй в тег
    PHP:
    1. <?php ?>
    а не
    Код (Text):
    1. <?php ?>
    .
    2. Во вторых — такой апи подразумевает порядок и закономерность, интерфейсы, вылизанный код. А ты не смог и один класс вылизать. Получилось ужасно. неразборчиво и труднорасширяемо.

    это неправильно. суть апи в том, что я не хочу ебатся с этими всеми деталями. я хочу сделать так:
    PHP:
    1. <?php
    2. $guest = new Api_Guest ($guestConfig);
    3.  
    4. $post = $guest->createPost(array(
    5.   'author'  => Session::get('User')->id,
    6.   'text'    => Request::get('text')
    7. ))->save();
    8. // Или так:
    9. $posts = $guest->getPage(Request::getInt('page'));
    10. // Или так:
    11. $topic = $forum->getTopic(array(
    12.   'id'    => Request::getInt('topic'),
    13.   'page'  => Request::getInt('page')
    14. ));
    15.  
    Я понимаю, что посидеть с ручкой и продумать структуру — впадлу, гараздо интереснее сразу же кинуться в бой и написать крутую АПИ, но пока получилось лажово. Даже на такой примитивной штуке, как гостевая.

    Потренируйся еще именно в планировании и написании интерфейсов. Напиши интерфейсы, напиши тесты. Именно они интересны нам, конечным пользователям.А как оно там работает внутри — нас не должно интересовать. Абы не тормозило и было безопасно
     
  18. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    PHP:
    1. <?php
    2. /***************/
    3.  
    4. $this->posts[$id] = new Post($id,$result['momtnt'],$result['name'], $result['email'],$result['text']);
    5.  
    6. /***************/
    7.  
    8.    function __construct($id,$moment,$name,$email,$text){
    9.       $this->id     = $id;
    10.       $this->moment = $moment;
    11.       $this->name   = $name;
    12.       $this->email  = $email;
    13.       $this->text   = $text;
    14.    }
    Момент вообще лажовый. Добавлось у тебя еще в базе поле "Useragent". Тебе надо его дописать в 4 ! места: в $this->posts[$id] =, в параметры конструктора, в конструктор и в свойства класса. При этом ты порядок должен в уме помнить. Ппц просто. Почему бы не сделать хотя бы так:

    в классе Post сделать метод dbRow (array $row), которому передаётся результат строка с бд, это уменьшит количество мест, где надо дублировать до двух — только свойство класса и тело метода дбРов
     
  19. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    и посмотри, какой у тебя распухший класс, несмотря на всю примитивность задания:
    в нём и настройки бд хранятся и информация о структуре сообщений и всё-всё-всё!

    Это — в отдельный класс вообще:
    Код (Text):
    1.    private $tableName      = null; //Имя таблицы для гостевой книги
    2.    private $mysql_database = null; // База данных (может быть false если выбирать не надо)
    3.    private $mysql_host     = null; // Хост
    4.    private $mysql_user     = null; // Пользователь
    5.    private $mysql_pass     = null; // Пароль
    6.    private $mysql_charset  = null; // Кодировка
    Код (Text):
    1.  function setDbParams
    а если я хочу гостевой передать уже открытое соединение? или обязательно для неё создавать отдельное соединение?

    а вообще, это ужасный подход:
    PHP:
    1. <?php
    2. function setDbParams($mysql_host,$mysql_user,$mysql_pass, $mysql_database,$mysql_charset, $tableName)
    3. // Лучше:
    4. function dbConfig(array $config) // Где $config — ассоциативный массив
    Почему не указываешь область видимости метода (паблик, приват, протектед)?

    Почему не написал интерфейсов, чтобы я мог, не глядя в код, работать с Апи?
     
  20. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    в тег php не стал обрамлять так он убил все двойные знаки равно.

    Код бы написал как раз для таких комментариев как твой, рассуждать о существуешем, даже очень говеном коде продуктивней,чем рассуждать о нужно ли это API или нет.Я специально показал внутриности,а не внешнюю оболочку чтобы люди высказали что правильно, а что заблуждение.

    PS:Не отрицаю своего очень плохого понимания ООП, и как в частности ООП в php.
     
  21. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    У меня ничего не убивает:
    PHP:
    1. <?php
    2.    function getPostsCount(){ //Кол-во постов  в базе
    3.       $this->initDb();
    4.       if ($this->postCounts == null) {
    5.          $countsArray = $this->db->query('SELECT COUNT(*) as counts FROM `'.$this->tableName.'`');
    6.          $this->postCounts= intval($countsArray[0]['counts']);
    7.       }
    8.       return $this->postCounts;
    9.    }
    Я тебе рассказал: подход неправильный. Надо начать с тестов (интерфейсов), а потом под тесты уже писать начинку. Я тебе написал уже пару примеров. Могу еще пример написать:

    PHP:
    1. <? $posts = $forum->search(array(
    2.   'catId'   => $_GET['cat'],
    3.   'query'   => $_GET['q'],
    4.   'author'  => $_GET['user']
    5. ));
    Найдёт все сообщения пользователя с айди $_GET['user'] в категории $_GET['cat'], в которых есть текст $_GET['q'].

    И когда напишешь удобные тесты на все действия — вот тогда и обсудим, удобно оно, или нет.
    Но не забудь ничего: удаление и редактирование админом сообщений, добавление сообщений, пейджер (это только гостевая, для форума их намного больше). При чем конфиг апи должен быть внешним. Я не должен лезть в класс, чтобы поменять количество сообщений на странице. Это должно выглядеть как-то так (минимум):
    [/php]<?php
    $guest = new Api_Guest (array(
    'postsPerPage' => 15,
    'maxPostLength' => 4096,
    'enableBBCode' => true,
    'db' => array (
    'engine' => 'mysql',
    'host' => 'localhost',
    'user' => 'Shock',
    'pass' => 'qwerty',
    'table' => 'mysite',
    'prefix' => 'api_guest',
    'charset' => 'utf-8',
    )
    ));[/php]

    В качестве альтернативы настроки должны быть такие, чтобы я мог подключить уже существующее соединение:
    PHP:
    1. <?php
    2.   'db' => array (
    3.     'resourse' => $dbResourse,
    4.     'table' => 'mysite',
    5.     'prefix' => 'api_guest'
    6.   )
    Пишешь список таких тестов, красиво оформляешь, пишешь _интерфейсы_ — тогда выкладываешь на общий розсуд.
    Если интерфейс нам понравится — можешь начинать писать под него код.

    Но не надо нас больше просить оценить core-код, пока не согласуешь интерфейс с нами

    Как я уже сказал — я прекрасно понимаю, что планировать — оно нифига неинтересно, а гараздо интереснее сразу сесть и писать, но так ­— нихрена не получится, увы.
     
  22. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    оки.Разрешите приступить к работе!
     
  23. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Alost
    Ты форум чтоле пишешь??
     
  24. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Нет, я пока пытаюсь понять как правильно реализоать механизм API.Для начала на гостевой книге.
     
  25. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    разрешаю, приступай. а, чтобы больше не подъёбывал, объясняю:

    мне лично совершенно неинтересно смотреть непонятно какой код. покажи удобный интерфейс и если он мне понравится, то я помогу и буду комментировать сообственно код. а смотреть на то, как ты балуешься, ни у меня ни, я думаю, у кого-либо другого на этом форуме желания нету.