За последние 24 часа нас посетили 18130 программистов и 1649 роботов. Сейчас ищут 1614 программистов ...

Примеры реализации корневых архитектур

Тема в разделе "Решения, алгоритмы", создана пользователем Mr.M.I.T., 9 июл 2009.

  1. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Костян
    минимализация =)
    чем меньше вызовов тем лучше
    Simpliest
    всётаки это было Е =)
     
  2. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    а вызовов чего RegisterAction или is_file ?
     
  3. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    и того и того
     
  4. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    даю итератор ))
     
  5. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    указатель кинул :D

    значит это, нужен ещё списочный vector и строковый string для полноты картины

    ааа string есть уже? =)))
     
  6. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    а то... В конце концов напишу, что бы не заморачивались )))
     
  7. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Костян
    http://php.net/arrayobject
    по скорости сопоставим с родным array() и много быстрее любых самопальных.
     
  8. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Simpliest
    ну я о нем тоже написал только не расписывал....
     
  9. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Костян (по секрету) от него можно наследоваться своими классами :)
     
  10. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Simpliest
    так блин, а что мне тогда писать, мануал??? )))
     
  11. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Просто не углубляйся в те мелочи, которые уже реализованы в самом языке. (если, конечно, ты не пишешь учебник по программированию)

    Того же контроллера - нет. Можешь описать свой DBAL, а можешь и ORM.
    Архитектуру модулей, плагинов - общее апи расширений.
    Точки входа или эвенты.

    Лично мне сейчас интересны кодогенераторы. Вобщем писать в мануал всегда есть что. Было бы желание :)
     
  12. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    ну так как я привел пример шаблона проектирования итератор как бы, то наверно я все же допишу в конце, что это всё может ArrayObject...
     
  13. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    !!!

    PHP:
    1. <?
    2.  
    3.  $cities_id=array(1,2,3,4,5,6);
    4.  $cities_name=array("MSK","SPB","NN","KZ","NOV","UFA");
    5.  
    6.  GHTML::Run(array("html_autoinsert_on"=>0,"html_method"=>"_POST"));
    7.  
    8.  print GHTML::Link("/test.php",null,GHTML::Link("/test.php")->Html("<b>[Главная]</b>"))->Html("[Главная]");
    9.  print " ";
    10.  print GHTML::Link("/test.php?act=reg",null,GHTML::Link("/test.php?act=reg")->Html("<b>[Регистрация]</b>"))->Html("[регистрация]");
    11.  
    12.  
    13.  print GHTML::Form("POST","")
    14.  ->HTML(
    15.      GHTML::Input("name","text","Имя пользователя",null,true)->Html(),
    16.      "<br>",
    17.      GHTML::Input("pass1","password","Пароль")->Html(),
    18.      "<br>",
    19.      GHTML::Input("pass2","password","Пароль ещё раз")->Html(),
    20.      "<br>",
    21.      GHTML::Select("city")->Html(
    22.            GHTML::Option("")->Html("Выберите город"),
    23.            GHTML::Option($cities_id,$_POST['city'])->Html($cities_name)
    24.      ),
    25.      "<br>",
    26.      GHTML::Textarea("resume",50,9,null,true)->Html("Ненмого о себе"),
    27.      "<br>",
    28.      GHTML::Input("","submit","Жми!")->Html()
    29.  );
    30.  
    31. ?>
    HTML:
    1. <a href='/test.php'  />[Главная]</a> <a href='/test.php?act=reg'  /><b>[Регистрация]</b></a>[регистрация]<form method='POST' action='' /><input type='text' name='name' value='Имя пользователя'  /><br><input type='password' name='pass1' value='Пароль'  /><br><input type='password' name='pass2' value='Пароль ещё раз'  /><br><select name='city'  /><option value=''  />Выберите город</option><option value='6'  />MSK</option><option value='5'  />SPB</option><option value='4'  />NN</option><option value='3'  />KZ</option><option value='2'  />NOV</option><option value='1'  />UFA</option></select><br><textarea name='resume' cols='50' rows='9'  />Ненмого о себе</textarea><br><input type='submit' name='' value='Жми!'  /></form>
    Костян
    бери на заметку :D
     
  14. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Mr.M.I.T.
    приколист ))
     
  15. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    А тесты есть какие-нибудь?
     
  16. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Я где-то давал на форуме.

    разница в пределах 20%
     
  17. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Профит какой от этого?
     
  18. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    $arr[0]=!empty($arr[0])?$arr[0]:null;
    =)
    я делал чтоб ссылочки рисовать
    а потом понесло =)

    ещё можно как кешер значений полей юзать. но у меня есть FormCacher с регулярками
     
  19. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Mr.M.I.T.
    это ViewHelper
     
  20. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Не.

    Вот например такое.
    PHP:
    1. <?php
    2.     /**
    3.      * Generate code for models
    4.      *
    5.      */
    6.     public function modelAction()
    7.     {
    8.         if ($this->_request->isPost()) {
    9.             $db = Zend_Db_Table_Abstract::getDefaultAdapter();
    10.             $generatedModels = array();
    11.  
    12.             $sqlTables = 'show tables';
    13.             $res = $db->query($sqlTables);
    14.             $tables = $res->fetchAll();
    15.  
    16.             /**
    17.              * Iterate tables
    18.              */
    19.             foreach($tables as $row) {
    20.                 $tableName = current($row);
    21.                 $modelFileName          = $this->_getModelFileNameByTableName($tableName);
    22.                 $modelMapperFileName    = $this->_getModelMapperFileNameByTableName($tableName);
    23.                 $modelClassName         = $this->_getModelClassNameByTableName($tableName);
    24.                 $modelMapperClassName   = $this->_getModelMapperClassNameByTableName($tableName);
    25.  
    26.                 /**
    27.                  * model
    28.                  */
    29.                 $modelFile          = new Zend_CodeGenerator_Php_File();
    30.                 $modelMapperFile    = new Zend_CodeGenerator_Php_File();
    31.                 $_fields            = new Zend_CodeGenerator_Php_Property();
    32.                 $_tableClass        = new Zend_CodeGenerator_Php_Property();
    33.                 $_constructor       = new Zend_CodeGenerator_Php_Method();
    34.  
    35.                 /**
    36.                  * mapper
    37.                  */
    38.                 $modelClass         = new Zend_CodeGenerator_Php_Class();
    39.                 $modelMapperClass   = new Zend_CodeGenerator_Php_Class();
    40.                 $_name              = new Zend_CodeGenerator_Php_Property();
    41.                 $_rowClass          = new Zend_CodeGenerator_Php_Property();
    42.  
    43.                 /**
    44.                  * docblocks
    45.                  */
    46.                 $modelMapperDocBlock = Zend_CodeGenerator_Php_Docblock::fromReflection(
    47.                         new Zend_Reflection_Docblock(
    48.                                 $this->_getClassDocBlock($modelMapperClassName)));
    49.                 $modelDocBlock = Zend_CodeGenerator_Php_Docblock::fromReflection(
    50.                         new Zend_Reflection_Docblock(
    51.                                 $this->_getClassDocBlock($modelClassName)));
    52.  
    53.  
    54.                 /**
    55.                  * $_name for MapperClass
    56.                  */
    57.                 $_name->setName('_name')
    58.                         ->setVisibility(Zend_CodeGenerator_Php_Member_Abstract::VISIBILITY_PROTECTED)
    59.                         ->setDefaultValue($tableName);
    60.  
    61.                 $sqlFields = 'SHOW COLUMNS FROM ' . $tableName;
    62.                 $resultFields = $db->query($sqlFields)->fetchAll();
    63.  
    64.                 /**
    65.                  * Get list of table fields
    66.                  */
    67.                 $fields = array();
    68.                 $fieldsDocBlock = array();
    69.                 foreach($resultFields as $fieldInfo) {
    70.                     $fields[$fieldInfo['Field']] = null;
    71.                     $fieldsDocBlock[] = Zend_CodeGenerator_Php_Docblock_Tag::factory(
    72.                             'property')->setDescription($fieldInfo['Type'] . ' $' . $fieldInfo['Field']);
    73.                 }
    74.  
    75.                 $modelDocBlock->setTags($fieldsDocBlock);
    76.                 $modelDocBlock->setSourceDirty();
    77.                
    78.                 $fileDocBlock = Zend_CodeGenerator_Php_Docblock::fromReflection(
    79.                         new Zend_Reflection_Docblock(
    80.                                 $this->_getFileDocBlock()));
    81.  
    82.                 $_fields->setName('_data')
    83.                         ->setVisibility(Zend_CodeGenerator_Php_Member_Abstract::VISIBILITY_PROTECTED)
    84.                         ->setDefaultValue($fields);
    85.  
    86.                 $_tableClass->setName('_tableClass')
    87.                         ->setVisibility(Zend_CodeGenerator_Php_Member_Abstract::VISIBILITY_PROTECTED)
    88.                         ->setDefaultValue($modelMapperClassName);
    89.  
    90. //                $constructorParam = new Zend_CodeGenerator_Php_Parameter();
    91. //                $constructorParam->setName('config')
    92. //                        ->setDefaultValue(array());
    93. //
    94. //                /**
    95. //                 * If no mapper passed then init model with standart Zend_Db_Table
    96. //                 */
    97. //                $constructorBody = 'if (!isset($config["table"])) {'
    98. //                        . PHP_EOL
    99. //                        . '    $this->setTable(new Zend_Db_Table(\'' . $name . '\'));'
    100. //                        . PHP_EOL
    101. //                        . '    $config["table"] = $this->_table;'
    102. //                        . PHP_EOL
    103. //                        . '}'
    104. //                        . PHP_EOL
    105. //                        . 'parent::__construct($config);';
    106. //
    107. //                $_constructor->setName('__construct')
    108. //                        ->setParameter($constructorParam)
    109. //                        ->setVisibility(Zend_CodeGenerator_Php_Member_Abstract::VISIBILITY_PUBLIC)
    110. //                        ->setBody($constructorBody);
    111.  
    112.                 $_rowClass->setName('_rowClass')
    113.                         ->setVisibility(Zend_CodeGenerator_Php_Member_Abstract::VISIBILITY_PROTECTED)
    114.                         ->setDefaultValue($modelClassName);
    115.  
    116.                 /**
    117.                  * build model mapper class
    118.                  */
    119.                 $modelMapperClass->setName($modelMapperClassName)
    120.                         ->setProperty($_name)
    121.                         ->setProperty($_rowClass)
    122.                         ->setExtendedClass(CodegenController::modelPrefix . 'Mapper_Abstract');
    123.                 $modelMapperClass->setDocblock($modelMapperDocBlock);
    124.                
    125.                 /**
    126.                  * build class with method and properties
    127.                  */
    128.                 $modelClass->setName($modelClassName)
    129.                         ->setProperty($_fields)
    130.                         ->setProperty($_tableClass)
    131.                         ->setExtendedClass(CodegenController::modelPrefix . 'Abstract');
    132. //                        ->setMethod($_constructor);
    133.                 $modelClass->setDocblock($modelDocBlock);
    134.  
    135.                 /**
    136.                  * build model
    137.                  */
    138.                 $modelFile->setFilename($modelFileName);
    139.                 $modelFile->setClass($modelClass);
    140.                 $modelFile->setDocblock($fileDocBlock);
    141.                 $modelFile->write();
    142.  
    143.                 /**
    144.                  * build model mapper
    145.                  */
    146.                 $modelMapperFile->setFilename($modelMapperFileName);
    147.                 $modelMapperFile->setClass($modelMapperClass);
    148.                 $modelMapperFile->setDocblock($fileDocBlock);
    149.                 $modelMapperFile->write();
    150.  
    151.                 $generatedModels[$modelClassName] = array($modelFileName, $modelMapperFileName);
    152.             }
    153.             $this->view->generatedModels = $generatedModels;
    154.         }
    155.     }
    156.  
    157.     /**
    158.      * Generate relations for models
    159.      *
    160.      */
    161.     public function relationAction()
    162.     {
    163.         if ($this->_request->isPost()) {
    164.             $db = Zend_Db_Table::getDefaultAdapter();
    165.             $generatedRelations = array();
    166.             foreach (glob($this->_modelsPath . 'mappers/*.php') as $fileName) {
    167.                 require_once $fileName;
    168.                 $reflection = new Zend_Reflection_File($fileName);
    169.  
    170.                 $class = $reflection->getClass();
    171.                 /**
    172.                  * Modify models except Final, Abstract and Interface
    173.                  */
    174.                 if (!  $class->isFinal()
    175.                         && $class->isInstantiable()
    176.                         && $class->isSubclassOf('Zend_Db_Table_Abstract') ) {
    177.  
    178.                     /* @var $codeGen Zend_CodeGenerator_Php_Class */
    179.                     $codeGen = Zend_CodeGenerator_Php_File::fromReflection($reflection);
    180.                     $codeGen->setFilename($fileName);
    181.  
    182.                     $codeGenClass = $codeGen->getClass();
    183.                     /* @var $doc Zend_Reflection_Docblock|ReflectionClass */
    184.                     $doc = $codeGenClass->getDocblock();
    185.  
    186.                     /* @var $rowObject Model_Abstract */
    187.                     $rowObject = $class->newInstance();
    188.                     $tableName = $rowObject->info('name');
    189.  
    190.                     $createTable = $db->query('SHOW CREATE TABLE ' . $db->quoteIdentifier($tableName))->fetchAll();
    191.                     $tmp = implode('', current($createTable));
    192.                     $result = array(); // no DB constraints
    193.                     $refMap = array();
    194.                     if (strpos($tmp, 'CONSTRAINT') === false) {
    195.                         // no DB constraints
    196.                     } else {
    197.                         $matches = array();
    198.                         $res = preg_match_all('~FOREIGN\s+KEY\s+(?:\(`(\w+)+`\))+\s+REFERENCES\s+(?:`(\w+)+`)+\s+(?:\(`(\w+)+`\))+~',
    199.                                 $tmp,
    200.                                 $matches);
    201.                         if ($res) {
    202.                             $result = array();
    203.                             /*
    204.                              * $matches[1] list of constraints
    205.                              * $matches[2] list of related tables
    206.                              * $matches[3] list of related fields
    207.                             */
    208.                             foreach($matches[1] as $mkey => $srcCol) {
    209.                                 $result[$srcCol] = array($matches[2][$mkey] => $matches[3][$mkey]);
    210.                                 $refMap[$srcCol] = array(
    211.                                         'columns' => $srcCol,
    212.                                         'refTableClass' => $this->_getModelMapperClassNameByTableName($matches[2][$mkey]),
    213.                                         'refColumns' => $matches[3][$mkey]
    214.                                 );
    215.                             }
    216.                         }
    217.                     }
    218.  
    219. //                $tags = $doc->getTags();
    220. //                /* @var $tag Zend_CodeGenerator_Php_Docblock_Tag */
    221. //                foreach($tags as $tag) {
    222. //                    if ($tag->getName() == 'property') {
    223. //                        $desc = $tag->getDescription();
    224. //                        list($type, $var) = explode(' ', $desc);
    225. //                        $key = substr($var, 1);
    226. //                        if (array_key_exists($key, $result)) {
    227. //                            $relatedModel = $this->_getModelClassNameByTableName(key($result[$key])) . '|';
    228. //                            $tag->setDescription($relatedModel . $type . ' ' . $var);
    229. //                        }
    230. //                    }
    231. //                }
    232. //                $doc->setSourceDirty();
    233.  
    234.                     $_referenceMap = $codeGenClass->getProperty('_referenceMap');
    235.                     if (!$_referenceMap) {
    236.                         $_referenceMap = new Zend_CodeGenerator_Php_Property();
    237.                         $codeGenClass->setProperty($_referenceMap);
    238.                     }
    239.                     $_referenceMap->setDefaultValue($refMap)
    240.                             ->setVisibility(Zend_CodeGenerator_Php_Member_Abstract::VISIBILITY_PROTECTED)
    241.                             ->setName('_referenceMap');
    242.                     $codeGenClass->setSourceDirty();
    243.  
    244.                     /* @var $codeGen Zend_CodeGenerator_Php_File */
    245.                     $codeGen->write();
    246.                     $generatedRelations[$codeGenClass->getName()] = $refMap;
    247.                 }
    248.             }
    249.             $this->view->generatedRelations = $generatedRelations;
    250.         }
    251.     }
    И на выходе 50 классов.

    Такого типа

    PHP:
    1. <?php
    2. /**
    3.  * Description of Model_Offer
    4.  *
    5.  * @property int(11) $id
    6.  * @property int(11) $type
    7.  * @property int(11) $source
    8.  * @property int(11) $target
    9.  * @property date $dates
    10.  * @property date $datee
    11.  * @property int(11) $subject
    12.  * @property int(11) $object
    13.  * @property varchar(200) $src_desc
    14.  * @property varchar(200) $trg_desc
    15.  * @property int(11) $status
    16.  * @property decimal(16,4) $price
    17.  * @property int(11) $currency
    18.  * @property int(11) $user_id
    19.  * @property datetime $created
    20.  */
    21. class Model_Offer extends Model_Abstract
    22. {
    23.  
    24.     protected $_data = array(
    25.         'id' => null,
    26.         'type' => null,
    27.         'source' => null,
    28.         'target' => null,
    29.         'dates' => null,
    30.         'datee' => null,
    31.         'subject' => null,
    32.         'object' => null,
    33.         'src_desc' => null,
    34.         'trg_desc' => null,
    35.         'status' => null,
    36.         'price' => null,
    37.         'currency' => null,
    38.         'user_id' => null,
    39.         'created' => null
    40.         );
    41.  
    42.     protected $_tableClass = 'Model_Mapper_Offer';
    43.  
    44.  
    45. }
    PHP:
    1. <?php
    2. /**
    3.  *
    4.  * Description of Model_Mapper_Offer
    5.  *
    6.  */
    7. class Model_Mapper_Offer extends Model_Mapper_Abstract
    8. {
    9.  
    10.     protected $_name = 'offer';
    11.  
    12.     protected $_rowClass = 'Model_Offer';
    13.  
    14.     protected $_referenceMap = array(
    15.         'source' => array(
    16.             'columns' => 'source',
    17.             'refTableClass' => 'Model_Mapper_City',
    18.             'refColumns' => 'id'
    19.             ),
    20.         'target' => array(
    21.             'columns' => 'target',
    22.             'refTableClass' => 'Model_Mapper_City',
    23.             'refColumns' => 'id'
    24.             ),
    25.         'subject' => array(
    26.             'columns' => 'subject',
    27.             'refTableClass' => 'Model_Mapper_Location',
    28.             'refColumns' => 'id'
    29.             ),
    30.         'status' => array(
    31.             'columns' => 'status',
    32.             'refTableClass' => 'Model_Mapper_OfferStatus',
    33.             'refColumns' => 'id'
    34.             ),
    35.         'currency' => array(
    36.             'columns' => 'currency',
    37.             'refTableClass' => 'Model_Mapper_Currency',
    38.             'refColumns' => 'id'
    39.             ),
    40.         'object' => array(
    41.             'columns' => 'object',
    42.             'refTableClass' => 'Model_Mapper_Item',
    43.             'refColumns' => 'id'
    44.             ),
    45.         'type' => array(
    46.             'columns' => 'type',
    47.             'refTableClass' => 'Model_Mapper_OfferType',
    48.             'refColumns' => 'id'
    49.             ),
    50.         'user_id' => array(
    51.             'columns' => 'user_id',
    52.             'refTableClass' => 'Model_Mapper_User',
    53.             'refColumns' => 'id'
    54.             )
    55.         );
    56. }
    И работать с ними можно потом вот так
    PHP:
    1. <?php
    2.         $table = new Model_Mapper_City();
    3.  
    4.         echo '<h1>Get city #1</h1>';
    5.         $city = $table->find(1)->current();
    6.         var_dump($mdl->toArray());
    7.  
    8.         echo '<hr/><h1>Get country by city</h1>';
    9.         /* @var $country Zend_Db_Table_Row_Abstract */
    10.         $country = $city->findParentModel_Mapper_CountryBycountry_id();
    11.         var_dump($country->toArray());
    12.         echo '<hr/><h1>Get cities by country</h1>';
    13.         var_dump($country->findDependentRowset('Model_Mapper_City')->toArray());
    [​IMG]
     
  21. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    провтыкал, не написал я о нём тогда когда цитируемое писал ))
     
  22. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Simpliest
    зря, надо было буквы Zend не писать... ))))
     
  23. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    аааааа
    срочно слазь с Зенда
     
  24. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    ? :)
    Я хомячков не боюсь :)

    Зачем?
    У меня было все тоже самое :) Только написанное без него :)
    Как результат - мы подумали, и я решил :) Что на этом уровне меня его реализация устраивает с небольшой оберткой.

    Мои модели работали примерно так

    PHP:
    1. <?php
    2. $mp = new Offer();
    3. $mdl = $mp->find(1);
    4.  
    5. print_r($mdl); // object(Offer) [123] protected _data => array( 'id' => 1, 'user_id' => 2, ...
    6. echo $mdl->id; // 1
    7. echo $mdl->user_id; // Vasya
    8. echo $mdl->user_id->id; // 2
    9. print_r($mdl->findOffer('user_id')); // array(1 => object(Offer) [124] ... , 17 => object(Offer) [125] ... )
    10. print_r($mdl->user_id->findOffer()); // array(1 => object(Offer) [126] ... , 17 => object(Offer) [127] ... )
    Только на их написание я угробил неделю, а на ZF практически такой же результат я получил за 1 день.
    Почувствуйте разницу.
     
  25. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ты сам знаешь что спорить о почутвуйте разницу, безполезно
    это как, я писал шаблонизатор 3 часа, а потом взял смарти и получил шаблонизатор и кучу всякого ненужного говна на одну минуту =)

    зачем? вот хотя бы поэтому =)
    PHP:
    1. class Model_Mapper_Offer extends Model_Mapper_Abstract
    2.  {
    3.  
    4.      protected $_name = 'offer';
    5.  
    6.      protected $_rowClass = 'Model_Offer';
    7.  
    8.      protected $_referenceMap = array(
    9.          'source' => array(
    10.              'columns' => 'source',
    11.              'refTableClass' => 'Model_Mapper_City',
    12.              'refColumns' => 'id'
    13.              ),
    14.          'target' => array(
    15.              'columns' => 'target',
    16.              'refTableClass' => 'Model_Mapper_City',
    17.              'refColumns' => 'id'
    18.              ),
    19.          'subject' => array(
    20.              'columns' => 'subject',
    21.              'refTableClass' => 'Model_Mapper_Location',
    22.              'refColumns' => 'id'
    23.              ),
    24.          'status' => array(
    25.              'columns' => 'status',
    26.              'refTableClass' => 'Model_Mapper_OfferStatus',
    27.              'refColumns' => 'id'
    28.              ),
    29.          'currency' => array(
    30.              'columns' => 'currency',
    31.              'refTableClass' => 'Model_Mapper_Currency',
    32.              'refColumns' => 'id'
    33.              ),
    34.          'object' => array(
    35.              'columns' => 'object',
    36.              'refTableClass' => 'Model_Mapper_Item',
    37.              'refColumns' => 'id'
    38.              ),
    39.          'type' => array(
    40.              'columns' => 'type',
    41.              'refTableClass' => 'Model_Mapper_OfferType',
    42.              'refColumns' => 'id'
    43.              ),
    44.          'user_id' => array(
    45.              'columns' => 'user_id',
    46.              'refTableClass' => 'Model_Mapper_User',
    47.              'refColumns' => 'id'
    48.              )
    49.          );
    50.  }
    я хз как ты там писал, но компов тебе понадобиться много =)