MODx क्रांति के लिए ऐड-ऑन विकास। भाग ३



यह पाठ के तीसरे भाग का अनुवाद है। जैसा कि मैंने पिछले लेख में लिखा था, दूसरे भाग का अनुवाद करने का बहुत मतलब नहीं है, क्योंकि एक घटक पृष्ठ बनाने पर रूसी में पहले से ही पर्याप्त जानकारी है। इसलिए मैं तीसरे पर कूद गया।

यह सबक आपको दिखाएगा कि ट्रांसपोर्ट पैकेज में एड-ऑन कैसे पैक किया जाए, जिसे बाद में पैकेज मैनेजमेंट के माध्यम से आसानी से स्थापित किया जा सकता है। हम सब कुछ पैक करेंगे जो हमारे द्वारा विकसित पूरक से संबंधित है: स्निपेट; कोर / घटकों / और परिसंपत्तियों / घटकों / से फाइलें; कार्रवाई; मेनू आइटम और हमारे सीएमपी के नाम स्थान (घटक पृष्ठ); अंतर्राष्ट्रीयकरण समर्थन (i18n) के साथ एक स्निपेट के लिए डिफ़ॉल्ट मान। और एक रिज़ॉल्वर भी जोड़ें जो डेटाबेस में उपयोगकर्ता तालिकाओं का निर्माण करेगा।

पूछे जाने वाले प्रश्न:
आप पैकमैन का उपयोग साधारण ऐड- ऑन पैक करने के लिए कर सकते हैं। लेकिन इस मामले में, हम अपने दम पर यह करना चाहते हैं और पूरी तरह से समझते हैं कि परिवहन पैकेज क्या है।

विधानसभा के लिए निर्देशिका सेट करना



पाठ के अंत में, _build निर्देशिका इस तरह दिखाई देगी:



हम पहले से ही build.config.php और build.schema.php फ़ाइलों के पाठ के पहले भाग से परिचित हैं, लेकिन अब अन्य भागों को देखें:

डेटा - यहां हम पैकेज डेटा को पैकेज करने के लिए अपनी सभी स्क्रिप्ट डालने जा रहे हैं।
रिज़ॉल्वर - फ़ोल्डर में ट्रांसपोर्ट पैकेट के लिए रिज़ॉल्वर होते हैं।
build.transport.php - यह पैकर की मुख्य स्क्रिप्ट है, जिसे पैकेज बनाने के लिए चलाने की आवश्यकता होगी।
setup.options.php - इंस्टॉलर सेटिंग्स। बाद में हम संक्षेप में विचार करेंगे कि यह किस लिए है।

पैकर स्क्रिप्ट बनाना



निम्नलिखित सामग्री के साथ फ़ाइल /www/doodles/_build/build.transport.php बनाएँ:

<?php $tstart = explode(' ', microtime()); $tstart = $tstart[1] + $tstart[0]; set_time_limit(0); /*    */ define('PKG_NAME','Doodles'); define('PKG_NAME_LOWER','doodles'); define('PKG_VERSION','1.0'); define('PKG_RELEASE','rc1'); /*     */ $root = dirname(dirname(__FILE__)).'/'; $sources = array( 'root' => $root, 'build' => $root . '_build/', 'data' => $root . '_build/data/', 'resolvers' => $root . '_build/resolvers/', 'chunks' => $root.'core/components/'.PKG_NAME_LOWER.'/chunks/', 'lexicon' => $root . 'core/components/'.PKG_NAME_LOWER.'/lexicon/', 'docs' => $root.'core/components/'.PKG_NAME_LOWER.'/docs/', 'elements' => $root.'core/components/'.PKG_NAME_LOWER.'/elements/', 'source_assets' => $root.'assets/components/'.PKG_NAME_LOWER, 'source_core' => $root.'core/components/'.PKG_NAME_LOWER, ); unset($root); /* override with your own defines here (see build.config.sample.php) */ require_once $sources['build'] . 'build.config.php'; require_once MODX_CORE_PATH . 'model/modx/modx.class.php'; $modx= new modX(); $modx->initialize('mgr'); echo '<pre>'; /* used for nice formatting of log messages */ $modx->setLogLevel(modX::LOG_LEVEL_INFO); $modx->setLogTarget('ECHO'); $modx->loadClass('transport.modPackageBuilder','',false, true); $builder = new modPackageBuilder($modx); $builder->createPackage(PKG_NAME_LOWER,PKG_VERSION,PKG_RELEASE); $builder->registerNamespace(PKG_NAME_LOWER,false,true,'{core_path}components/'.PKG_NAME_LOWER.'/'); /* zip up package */ $modx->log(modX::LOG_LEVEL_INFO,'Packing up transport package zip...'); $builder->pack(); $tend= explode(" ", microtime()); $tend= $tend[1] + $tend[0]; $totalTime= sprintf("%2.4f s",($tend - $tstart)); $modx->log(modX::LOG_LEVEL_INFO,"\n<br />Package Built.<br />\nExecution time: {$totalTime}\n"); exit (); 


यहां बहुत सारी चीजें हैं, लेकिन ध्यान दें कि यह सब हमारे नाम स्थान को पैक करने और "doodles-1.0-rc1.zip" परिवहन पैकेज फ़ाइल (केवल आधार) बनाने के लिए आवश्यक है। हम विस्तार से विश्लेषण करेंगे।

 $tstart = explode(' ', microtime()); $tstart = $tstart[1] + $tstart[0]; set_time_limit(0); /*    */ define('PKG_NAME','Doodles'); define('PKG_NAME_LOWER','doodles'); define('PKG_VERSION','1.0'); define('PKG_RELEASE','rc1'); 


सबसे पहले, हम विधानसभा का शुरुआती समय प्राप्त करने जा रहे हैं, ताकि अंत में हम यह पता लगा सकें कि इसे बनाने में कितना समय लगा। यह आवश्यक नहीं है, बस उपयोगी जानकारी है। फिर हम नाम, संस्करण और रिलीज़ के प्रकार को इंगित करते हैं। अगला:

 /*     */ $root = dirname(dirname(__FILE__)).'/'; $sources = array( 'root' => $root, 'build' => $root . '_build/', 'data' => $root . '_build/data/', 'resolvers' => $root . '_build/resolvers/', 'chunks' => $root.'core/components/'.PKG_NAME_LOWER.'/chunks/', 'lexicon' => $root . 'core/components/'.PKG_NAME_LOWER.'/lexicon/', 'docs' => $root.'core/components/'.PKG_NAME_LOWER.'/docs/', 'elements' => $root.'core/components/'.PKG_NAME_LOWER.'/elements/', 'source_assets' => $root.'assets/components/'.PKG_NAME_LOWER, 'source_core' => $root.'core/components/'.PKG_NAME_LOWER, ); unset($root); /* override with your own defines here (see build.config.sample.php) */ require_once $sources['build'] . 'build.config.php'; require_once MODX_CORE_PATH . 'model/modx/modx.class.php'; 


यहां हम उन रास्तों का निर्धारण करते हैं जहां हमारे पैकेजिंग पैकेज के सभी भागों को ढूंढना है।

अंत में, हमने build.config.php फ़ाइल और MODx वर्ग को शामिल किया। अब MODx ऑब्जेक्ट को लोड करने का समय है:

 $modx = new modX(); $modx->initialize('mgr'); echo '<pre>'; /* used for nice formatting of log messages */ $modx->setLogLevel(modX::LOG_LEVEL_INFO); $modx->setLogTarget('ECHO'); $modx->loadClass('transport.modPackageBuilder','',false, true); $builder = new modPackageBuilder($modx); $builder->createPackage(PKG_NAME_LOWER,PKG_VERSION,PKG_RELEASE); $builder->registerNamespace(PKG_NAME_LOWER,false,true,'{core_path}components/'.PKG_NAME_LOWER.'/'); 


यहाँ हम modX ऑब्जेक्ट बनाते हैं और "mgr" संदर्भ को इनिशियलाइज़ करते हैं। अगला, हम पूछते हैं कि MODX उसकी त्रुटि संदेशों में अधिक क्रिया है, जबकि हमारी स्क्रिप्ट चल रही है। कृपया स्क्रीन पर संदेश प्रदर्शित करें।

फिर हम "modPackageBuilder" क्लास को लोड करते हैं और दो उपयोगी तरीके createPackage और registerNamespace प्राप्त करते हैं।

 $modx->createPackage(key,version,release) 


यहां हम अपने पैकेज का नाम निर्दिष्ट करते हैं (यह लोअरकेस में होना चाहिए और इसमें एक अवधि या हाइफ़न नहीं होना चाहिए), संस्करण और रिलीज़ का प्रकार। ModPackageBuilder अब स्वचालित रूप से हमारे नामस्थान को पैकेज करेगी:

 $builder->registerNamespace(namespace_name,autoincludes,packageNamespace,namespacePath) 


पहला पैरामीटर नाम स्थान का नाम ("डूडल" हमारे मामले में) है। दूसरा हमारे नाम स्थान से जुड़ी कक्षाओं की एक सरणी है (हमें इसकी आवश्यकता नहीं है, इसलिए इसे गलत पर सेट करें)। तीसरा पैरामीटर, हम कहते हैं कि हम पैकेज में नेमस्पेस पैक करना चाहते हैं (सही पर सेट करें)। और तीसरा पैरामीटर हमारे नाम स्थान पर पथ सेट करता है। यह अंतिम पैरामीटर कुंजी है। प्लेसहोल्डर "{core_path}" पर ध्यान दें, इसे पैकेज की स्थापना के दौरान वास्तविक पथ से बदल दिया जाएगा, जिससे पैकेज अधिक लचीला हो जाएगा। पथ को निर्दिष्ट करने की आवश्यकता नहीं है।

और यहाँ हमारे पैकर की अंतिम कुछ पंक्तियाँ हैं:

 /* zip up package */ $modx->log(modX::LOG_LEVEL_INFO,'Packing up transport package zip...'); $builder->pack(); $tend= explode(" ", microtime()); $tend= $tend[1] + $tend[0]; $totalTime= sprintf("%2.4f s",($tend - $tstart)); $modx->log(modX::LOG_LEVEL_INFO,"\n<br />Package Built.<br />\nExecution time: {$totalTime}\n"); exit (); 


पैक () विधि MODX को बताती है कि आपको ट्रांसपोर्टर पैकेज ज़िप फ़ाइल बनाने की आवश्यकता है। शेष रेखाएँ बस उस समय को प्रदर्शित करती हैं, जिसके निर्माण में समय लगा था। बस इतना ही। अगर तुम दौड़ते हो
यह ब्राउज़र में है (मेरे पास पता http: //localhost/doodles/_build/build.transport.php है), आपको डिबगिंग जानकारी मिल जाएगी और फ़ोल्डर कोर / संकुल / में :



यह हमारा परिवहन पैकेज है! हालांकि, यह विशेष रूप से हमारे पूरक के लिए पर्याप्त नहीं है।

डेटा जोड़ना



हम अपने स्निपेट को एक अलग श्रेणी "डूडल" में पैकेज में जोड़ना चाहते हैं। Build.transport.php फ़ाइल में , नीचे दिए गए कोड को दर्ज करें registerNamespace:

 <?php $category= $modx->newObject('modCategory'); $category->set('id',1); $category->set('category',PKG_NAME); /*   */ //$modx->log(modX::LOG_LEVEL_INFO,'Packaging in snippets...'); //$snippets = include $sources['data'].'transport.snippets.php'; //if (empty($snippets)) $modx->log(modX::LOG_LEVEL_ERROR,'Could not package in snippets.'); //$category->addMany($snippets); /* create category vehicle */ $attr = array( xPDOTransport::UNIQUE_KEY => 'category', xPDOTransport::PRESERVE_KEYS => false, xPDOTransport::UPDATE_OBJECT => true, xPDOTransport::RELATED_OBJECTS => true, xPDOTransport::RELATED_OBJECT_ATTRIBUTES => array ( 'Snippets' => array( xPDOTransport::PRESERVE_KEYS => false, xPDOTransport::UPDATE_OBJECT => true, xPDOTransport::UNIQUE_KEY => 'name', ), ), ); $vehicle = $builder->createVehicle($category,$attr); $builder->putVehicle($vehicle); 


सबसे पहले, हम "डूडल" नाम से एक modCategory ऑब्जेक्ट (श्रेणी) बनाते हैं। कृपया ध्यान दें कि हम नहीं बचा -> बचा (), लेकिन केवल एक वस्तु बनाते हैं। अगला, हमारे पास स्निपेट पैक करने के लिए एक कोड है, लेकिन अभी के लिए, इसे अनदेखा करें, हम बाद में इसे वापस कर देंगे।

फिर हमने विशेषताओं का एक बड़ा सरणी बनाया - वाहन श्रेणी की विशेषताएं। किस तरह का वाहन? खैर, यह एक वाहन है जो एक परिवहन पैकेज के लिए एक वस्तु ले जाता है। प्रत्येक ऑब्जेक्ट (स्निपेट, मेनू आइटम, श्रेणी, आदि) के पास परिवहन पैकेज के लिए "परिवहन" के लिए एक वाहन होना चाहिए। इस प्रकार, हमने उनमें से एक बनाया, लेकिन पहले कई विशेषताओं को असाइन किया जो MODX को बताता है कि जब उपयोगकर्ता पैकेज को स्थापित करता है तो इस वाहन को कैसे व्यवहार करना चाहिए।



स्निपेट ऑब्जेक्ट के लिए गुण सेट करें:

 'Snippets' => array( xPDOTransport::PRESERVE_KEYS => false, xPDOTransport::UPDATE_OBJECT => true, xPDOTransport::UNIQUE_KEY => 'name', ), 


यहां हम कहते हैं कि प्राथमिक कुंजी को सहेजना आवश्यक नहीं है (श्रेणी के समान)। तब हम ऑब्जेक्ट को अपडेट करना चाहते हैं यदि यह पहले से मौजूद है। और अंत में, हम MODX को बताते हैं कि "नाम" फ़ील्ड प्राथमिक कुंजी है।

अगला, यह करें:

 $vehicle = $builder->createVehicle($category,$attr); $builder->putVehicle($vehicle); 


यह हमारी श्रेणी की वस्तु को हमारे द्वारा परिभाषित विशेषताओं के साथ एक छोटे वाहन में पैक करता है। यह इसे परिवहन पैकेज में जोड़ता है। हो गया! हमारी श्रेणी पैक की गई है। अब इसमें एक स्निपेट मिलाएं।

एक स्निपेट जोड़ना



आगे बढ़ें और फ़ोल्डर / www / डूडल / _build / डेटा / बनाएँ । अब इसमें फाइल /www/doodles/_build/data/transport.snippets.php बनाएं। इसमें निम्नलिखित कोड डालें:

 <?php function getSnippetContent($filename) { $o = file_get_contents($filename); $o = trim(str_replace(array('<?php','?>'),'',$o)); return $o; } $snippets = array(); $snippets[1]= $modx->newObject('modSnippet'); $snippets[1]->fromArray(array( 'id' => 1, 'name' => 'Doodles', 'description' => 'Displays a list of Doodles.', 'snippet' => getSnippetContent($sources['elements'].'snippets/snippet.doodles.php'), ),'',true,true); $properties = include $sources['data'].'properties/properties.doodles.php'; $snippets[1]->setProperties($properties); unset($properties); return $snippets; 


सबसे पहले, हमने एक छोटी सहायक विधि बनाई जो फाइलों से हमारे कोड के टुकड़े को पकड़ लेगी और उसमें से "<? Php" टैग हटा देगी। फिर हम स्निपेट ऑब्जेक्ट बनाते हैं। याद रखें: बचत करने की आवश्यकता नहीं है, बस बनाएं। यह $ स्निपेट्स सरणी में वापस आने का समय है। बिल्ड . transport.php फ़ाइल से टिप्पणी किए गए भाग को याद रखें? यहाँ यह हिस्सा है:

 /*   */ $modx->log(modX::LOG_LEVEL_INFO,'Packaging in snippets...'); $snippets = include $sources['data'].'transport.snippets.php'; if (empty($snippets)) $modx->log(modX::LOG_LEVEL_ERROR,'Could not package in snippets.'); $category->addMany($snippets); 


हम टिप्पणी करना हटा दें। अब हमारे स्निपेट को वाहन श्रेणी में लोड किया गया है। अब उन गुणों को जोड़ें जो हमने पहले उल्लेख किया था।

स्निपेट गुण जोड़ना



निम्नलिखित सामग्री के साथ फ़ाइल /www/doodles/_build/data/properties/properties.doodles.php बनाएं:

 <?php $properties = array( array( 'name' => 'tpl', 'desc' => 'prop_doodles.tpl_desc', 'type' => 'textfield', 'options' => '', 'value' => 'rowTpl', 'lexicon' => 'doodles:properties', ), array( 'name' => 'sort', 'desc' => 'prop_doodles.sort_desc', 'type' => 'textfield', 'options' => '', 'value' => 'name', 'lexicon' => 'doodles:properties', ), array( 'name' => 'dir', 'desc' => 'prop_doodles.dir_desc', 'type' => 'list', 'options' => array( array('text' => 'prop_doodles.ascending','value' => 'ASC'), array('text' => 'prop_doodles.descending','value' => 'DESC'), ), 'value' => 'DESC', 'lexicon' => 'doodles:properties', ), ); return $properties; 


यह स्निपेट गुणों (पैरामीटर) का डिफ़ॉल्ट PHP प्रतिनिधित्व है। आइए उनकी सभी चाबियों को देखें:



इसलिए, हमारे पास गुण हैं। लेकिन जैसा कि आप देख सकते हैं, हमने लेक्सिकॉन के नए खंड "डूडल: गुण" के लिए एक लिंक बनाया है। आइए निम्नलिखित सामग्री के साथ एक lexicon फ़ाइल /www/doodles/core/compenders/doodles/lexicon/en/properties.inc.php बनाएं:

 <?php $_lang['prop_doodles.ascending'] = 'Ascending'; $_lang['prop_doodles.descending'] = 'Descending'; $_lang['prop_doodles.dir_desc'] = 'The direction to sort by.'; $_lang['prop_doodles.sort_desc'] = 'The field to sort by.'; $_lang['prop_doodles.tpl_desc'] = 'The chunk for displaying each row.'; 


जैसा कि आप यहां देख सकते हैं, सामग्री डिफ़ॉल्ट अनुभाग के समान है।

यदि आप अभी स्क्रिप्ट चलाते हैं, तो हमारी श्रेणी और उसके गुणों के साथ स्निपेट को एक बैग में पैक किया जाएगा। बहुत बढ़िया! लेकिन हमने अपने ऐड की फाइलों को छोड़ दिया। चलो इसे ठीक करते हैं।

फ़ाइल रिज़ॉल्वर जोड़ना



आइए पैकेज को फोल्डर में जोड़ें , हमारे ऐड-ऑन की फाइलों / www / डूडल / कोर / घटकों / डूडल / और / www / डूडल / परिसंपत्तियों / घटकों / डूडल / के साथ फ़ोल्डर्स। हम तथाकथित का उपयोग करके अपने वाहन श्रेणी में फाइलें जोड़ेंगे फ़ाइल रिज़ॉल्वर।

इसलिए, वाहन श्रेणी जोड़ने के तुरंत बाद build.transport.php में:

 $vehicle = $builder->createVehicle($category,$attr); 


इसे जोड़ें:

 $modx->log(modX::LOG_LEVEL_INFO,'Adding file resolvers to category...'); $vehicle->resolve('file',array( 'source' => $sources['source_assets'], 'target' => "return MODX_ASSETS_PATH . 'components/';", )); $vehicle->resolve('file',array( 'source' => $sources['source_core'], 'target' => "return MODX_CORE_PATH . 'components/';", )); 


यह दो विशेषताओं को पार्स करने के लायक है:

source वह पथ है जिसके द्वारा फ़ाइलें मिल सकती हैं। हम अपने source_assets और source_core का उपयोग करते हैं, जिन्हें पहले हमारे द्वारा परिभाषित किया गया था।

लक्ष्य एक स्पष्ट स्ट्रिंग है जो उस रास्ते को लौटाती है जहां हमारी ऐड-ऑन फाइलें स्थित होंगी।

समाधान में पहला पैरामीटर () MODX को बताता है कि यह एक फ़ाइल रिज़ॉल्वर है। हम इस पाठ में बाद में रिज़ॉल्वरों पर करीब से नज़र डालेंगे।

यदि आप अभी पैकर चलाते हैं, तो यह डूडल / कोर / और डूडल / एसेट / फोल्डर को पैक करेगा।

एक मेनू आइटम और कार्रवाई जोड़ना



अब हम उस घटक पृष्ठ के लिए एक मेनू आइटम और क्रिया जोड़ें जो हमने पहले किया था

निम्नलिखित कोड जोड़ें:

 $modx->log(modX::LOG_LEVEL_INFO,'Packaging in menu...'); $menu = include $sources['data'].'transport.menu.php'; if (empty($menu)) $modx->log(modX::LOG_LEVEL_ERROR,'Could not package in menu.'); $vehicle= $builder->createVehicle($menu,array ( xPDOTransport::PRESERVE_KEYS => true, xPDOTransport::UPDATE_OBJECT => true, xPDOTransport::UNIQUE_KEY => 'text', xPDOTransport::RELATED_OBJECTS => true, xPDOTransport::RELATED_OBJECT_ATTRIBUTES => array ( 'Action' => array ( xPDOTransport::PRESERVE_KEYS => false, xPDOTransport::UPDATE_OBJECT => true, xPDOTransport::UNIQUE_KEY => array ('namespace','controller'), ), ), )); $modx->log(modX::LOG_LEVEL_INFO,'Adding in PHP resolvers...'); $builder->putVehicle($vehicle); unset($vehicle,$menu); 


यहां, सब कुछ वाहन श्रेणी के समान है। एक मेनू ऑब्जेक्ट और संबंधित एक्शन ऑब्जेक्ट बनाया जाता है।


जैसा कि आपने शायद अनुमान लगाया था, हमें transport.menu.php फ़ाइल को जोड़ना चाहिए। इसे /www/doodles/_build/data/transport.menu.php बनाएं:

 <?php $action= $modx->newObject('modAction'); $action->fromArray(array( 'id' => 1, 'namespace' => 'doodles', 'parent' => 0, 'controller' => 'controllers/index', 'haslayout' => true, 'lang_topics' => 'doodles:default', 'assets' => '', ),'',true,true); $menu= $modx->newObject('modMenu'); $menu->fromArray(array( 'text' => 'doodles', 'parent' => 'components', 'description' => 'doodles.desc', 'icon' => 'images/icons/plugin.gif', 'menuindex' => 0, 'params' => '', 'handler' => '', ),'',true,true); $menu->addOne($action); unset($menus); return $menu; 


यहाँ सब कुछ transport.snippets.php के समान है, सिवाय इसके कि मेनू ऑब्जेक्ट का AddOne () विधि कहा जाता था। कृपया ध्यान दें कि fromArray () सरणी के सभी तत्व डेटाबेस तालिकाओं में फ़ील्ड के अनुरूप हैं।

तो, मेनू आइटम और कार्रवाई पैक किए जाते हैं।

एक रिज़ॉल्वर जोड़ना



जब हम सिस्टम में अपना ऐड-ऑन इंस्टॉल करते हैं, तो हमें एक समस्या का सामना करना पड़ेगा - modx_doodles डेटाबेस टेबल मौजूद नहीं होगी। आइए एक PHP रिज़ॉल्वर लिखते हैं जो ट्रांसपोर्ट टूल के बाद चलेगा। इस रिज़ॉल्वर को हमारे मेनू वाहन में जोड़ें। $ वाहन के तुरंत बाद = $ बिल्डर-> createVehicle ($ मेनू) में निम्न कोड जोड़ें:

 $modx->log(modX::LOG_LEVEL_INFO,'Adding in PHP resolvers...'); $vehicle->resolve('php',array( 'source' => $sources['resolvers'] . 'resolve.tables.php', )); 


निम्नलिखित सामग्री के साथ एक फ़ाइल /www/doodles/_build/resolvers/resolve.tables.php बनाएं:

 <?php if ($object->xpdo) { switch ($options[xPDOTransport::PACKAGE_ACTION]) { case xPDOTransport::ACTION_INSTALL: $modx =& $object->xpdo; $modelPath = $modx->getOption('doodles.core_path',null,$modx->getOption('core_path').'components/doodles/').'model/'; $modx->addPackage('doodles',$modelPath); $manager = $modx->getManager(); $manager->createObjectContainer('Doodle'); break; case xPDOTransport::ACTION_UPGRADE: break; } } return true; 


बहुत बढ़िया। मुझे लगता है कि यहां सब कुछ स्पष्ट है। हमारे पास एक स्विच निर्माण है, जिसके लिए हम वर्तमान कार्रवाई के आधार पर कार्य कर सकते हैं। हम अपने मॉडल के लिए पथ को इंगित करते हैं और addPackage () विधि को कॉल करते हैं, जो हमारी xpdo योजना को जोड़ता है (पहला पाठ याद रखें?)। अंत में हम $ modx-> getManager () और फिर $ manager-> createObjectContainer ('डूडल)' चलाते हैं । यह विधि MODX को SQL चलाने और हमारे डूडल वर्ग के लिए डेटाबेस में एक टेबल बनाने की आज्ञा देती है। अब आप डेटाबेस तालिका के अस्तित्व के लिए चेक को हटा सकते हैं, जैसा कि हमने पहले भाग में किया था (एक रिज़ॉल्वर का उपयोग करना आवश्यक नहीं है, लेकिन यह सुविधाजनक है)। और अंत में, हम सही लौटेंगे ताकि MODX जानता है कि सब कुछ आसानी से हो गया।

अब पैकेज स्थापित करते समय, डेटाबेस में हमारे अतिरिक्त की एक तालिका बनाई जाएगी।

कैनगेल, रीडमी, लाइसेंस और इंस्टॉलेशन विकल्प फ़ाइलों को जोड़ना



आइए निम्नलिखित सामग्रियों के साथ डॉक्स / फ़ोल्डर में एक रीडमे.टेक्स फ़ाइल बनाएँ:

 -------------------- Extra: Doodles -------------------- Version: 1.0 A simple demo extra for creating robust 3rd-Party Components in MODx Revolution. 


यदि वे पहले से ही नहीं हैं, तो भी लाइसेंस.txt फाइलें ( लाइसेंस का विवरण शामिल है) और changelog.txt (परिवर्तन लॉग) बनाएं।

अब हम build.transport.php स्क्रिप्ट पर वापस जाते हैं और $ बिल्डर-> पैक () से पहले निम्न पंक्तियाँ जोड़ते हैं:

 $modx->log(modX::LOG_LEVEL_INFO,'Adding package attributes and setup options...'); $builder->setPackageAttributes(array( 'license' => file_get_contents($sources['docs'] . 'license.txt'), 'readme' => file_get_contents($sources['docs'] . 'readme.txt'), 'changelog' => file_get_contents($sources['docs'] . 'changelog.txt'), 'setup-options' => array( 'source' => $sources['build'].'setup.options.php', ), )); 


जैसा कि आप देख सकते हैं, setPackageAttributes () विधि कहा जाता है , जो हमारे पैकर के लिए विशेषता निर्धारित करता है। हमारे लिए 'सेटअप-विकल्प' नामक एक नई सरणी भी है। इस सरणी में कुंजी 'स्रोत' के साथ एक तत्व है - PHP फ़ाइल का पथ (एक रिज़ॉल्वर की तरह)।

निम्नलिखित सामग्री के साथ फ़ाइल /www/doodles/_build/setup.options.php बनाएँ:

 <?php $output = ''; switch ($options[xPDOTransport::PACKAGE_ACTION]) { case xPDOTransport::ACTION_INSTALL: $output = '<h2>Doodles Installer</h2> <p>Thanks for installing Doodles! Please review the setup options below before proceeding.</p><br />'; break; case xPDOTransport::ACTION_UPGRADE: case xPDOTransport::ACTION_UNINSTALL: break; } return $output; 


परिचित लगता है, है ना? जब उपयोगकर्ता पैकेज स्थापित करता है तो कोड का यह टुकड़ा हमें "इंस्टॉलेशन विकल्प" प्रदर्शित करने की अनुमति देता है। अब हम केवल अपना ऐड लगाने के लिए लोगों को धन्यवाद कहने के लिए एक संदेश प्रदर्शित कर रहे हैं।

यहां आप प्रपत्र तत्व जोड़ सकते हैं जो पैकेज को स्थापित करते समय प्रदर्शित होंगे और इंस्टॉलर द्वारा आगे संसाधित किए जाएंगे। क्विप घटक में एक उदाहरण देखा जा सकता है: github.com/splittingred/Quip/blob/develop/_build/resolvers/setupoptions.resolver.php

वह सब है। पैकर चलाएँ (http: //localhost/doodles/_build/build.transport.php) और ट्रांसपोर्ट पैकेज फ़ाइल "doodles-1.0-rc1.zip" कोर / पैकेज / फ़ोल्डर में दिखाई देगा। इस फाइल को MODX ऐड-ऑन रिपॉजिटरी में डाउनलोड किया जा सकता है और फिर आप इसे "पैकेज मैनेजमेंट" के जरिए इंस्टॉल कर सकते हैं।



हमारे द्वारा बनाई गई पैकर की सभी फाइलें यहां पाई जा सकती हैं: github.com/splittingred/Doodles/tree/develop/_build

Source: https://habr.com/ru/post/In132709/


All Articles