मेरे पास इसमें एक स्लाइड शो के साथ एक टेम्पलेट है। प्रत्येक स्लाइड में निम्न शामिल हैं:

  • छवि
  • शीर्षक
  • पाठ का एक पैराग्राफ
  • बटन

पहले 3 आइटम के लिए, मैंने अपने टेम्प्लेट में निम्नलिखित सेट किए हैं:

{repeater name="slideshow" prompt="Add another slide" tab="Slideshow"}
  {variable name="image" label="Image" type="mediafinder" mode="image"}{/variable}
  {variable name="caption" type="text" label="Caption"}Caption{/variable}
  {variable name="body" type="textarea" label="Body"}Body{/variable}
{/repeater}

हालांकि, मैं बटन के लिए किस फ़ील्ड प्रकार का उपयोग करना है, इस बारे में थोड़ा फंस गया हूं, जिसे साइट के भीतर एक स्थिर पृष्ठ से लिंक करने की आवश्यकता है।

मैं एक टेक्स्ट बॉक्स का उपयोग नहीं करना चाहता जहां उपयोगकर्ता यूआरएल दर्ज कर सके क्योंकि उपयोगकर्ता को समझना बहुत मुश्किल होगा। मेरे पास एक ड्रॉपडाउन मेनू होगा जो स्थिर मेनू प्लगइन के समान काम करता है (यानी: "टाइप" से "स्टेटिक पेज" चुनें और फिर दूसरे ड्रॉपडाउन मेनू में स्थिर पृष्ठों की एक सूची प्राप्त करें) लेकिन ऐसा नहीं है यह कैसे करना है स्पष्ट देखें।

1
Joseph 10 पद 2017, 15:16

3 जवाब

सबसे बढ़िया उत्तर

हाँ, आप वहाँ स्थिर पृष्ठों की सूची के साथ ड्रॉप-डाउन जोड़ सकते हैं।

ड्रॉप-डाउन में पृष्ठों की सूची दिखाने के लिए आपको पृष्ठों का विस्तार करने और इसमें गतिशील विधि जोड़ने की आवश्यकता है ताकि जब पुनरावर्तक ड्रॉप डाउन जोड़ दे तो उसे उस विधि से इसके मूल्य/विकल्प प्राप्त हो जाएंगे।

आपको अपने किसी भी प्लगइन के अंदर बूट विधि में कोड जोड़ने की आवश्यकता है, यह पेज क्लास का विस्तार करेगा जो आगे अजाक्स अनुरोध को संभाल सकता है।

    \RainLab\Pages\Classes\Page::extend(function($model) {
        $model->addDynamicMethod('getPageOptions', function() {
            $theme = \Cms\Classes\Theme::getEditTheme();
            $pageList = new \RainLab\Pages\Classes\PageList($theme);
            $pages = [];
            foreach ($pageList->listPages() as $name => $pageObject) {
                $pages[$pageObject->url] = $pageObject->title . ' (' . $pageObject->url . ')';
            }
            return $pages;
        });
    });

और अपने पुनरावर्तक के अंदर आप ड्रॉपडाउन जोड़ सकते हैं

    {repeater name="slideshow" prompt="Add another slide" tab="Slideshow"}
      {variable name="image" label="Image" type="mediafinder" mode="image"}{/variable}
      {variable name="caption" type="text" label="Caption"}Caption{/variable}
      {variable name="body" type="textarea" label="Body"}Body{/variable}
      {variable name="page" type="dropdown" label="Page"}{/variable}
    {/repeater}

ताकि आप देख सकें कि हमने गतिशील विधि getPageOptions को जोड़ा है, इसमें तीन भाग 1 शामिल हैं: प्राप्त करें दूसरा: फ़ील्डनाम तीसरा: विकल्प

तो हमारी विधि का नाम होगा get + Page + Options => getPageOptions

उस पृष्ठ के भीतर हम मूल्य के रूप में सरणी लौटा रहे हैं => लेबल जोड़ी आप अपनी आवश्यकता के अनुसार वहां अनुकूलित कर सकते हैं।

इसलिए जब ड्रॉप-डाउन बनाया गया तो यह इस विधि को खोजेगा और विकल्प के रूप में इसके वापसी मूल्य का उपयोग करेगा।

अगर आपको और कोई कठिनाई आती है तो कृपया टिप्पणी करें।

अपडेट करें

ठीक है तो अब हम अंततः सशर्त ड्रॉप-डाउन जोड़ सकते हैं, यह अब तक अजाक्स अपडेट करने योग्य नहीं है, लेकिन हां हम इसे शर्त के आधार पर छुपा और दिखा सकते हैं।

आप इस मार्क-अप को लेआउट में जोड़ सकते हैं।

    {repeater name="slideshow" prompt="Add another slide" tab="Slideshow"}
      {variable name="type" type="dropdown" label="Link Type"}{/variable}
      {variable name="cms-page" type="dropdown" label="Cms Page" trigger="action:show|field:type|condition:value[cms-page]" }{/variable}
      {variable name="static-page" type="dropdown" label="Static Page" trigger="action:show|field:type|condition:value[static-page]"}{/variable}
      {variable name="blog-post" type="dropdown" label="Post" trigger="action:show|field:type|condition:value[blog-post]"}{/variable}
    {/repeater}

फिर प्लगइन के अंदर आपको कुछ अतिरिक्त तरीके जोड़ने होंगे।

आपकी plugin.php की बूट विधि इस तरह दिखती है

public function boot()
{

    $pluginSelf = $this;
    \RainLab\Pages\Classes\Page::extend(function($model) {
            $model->addDynamicMethod('getTypeOptions', function() {

            return [
                '' => 'Select Type',
                'cms-page' => 'CMS page',
                'static-page' => 'Static Page',
                'blog-post' => 'Blog post'
            ];

        });
    });

    \RainLab\Pages\Classes\Page::extend(function($model) use ($pluginSelf) {
        $model->addDynamicMethod('getStaticPageOptions', function() use ($pluginSelf) {
            $result =  $pluginSelf::getTypeInfo('static-page');
            return $result['references'];
        });
    });

    \RainLab\Pages\Classes\Page::extend(function($model) use ($pluginSelf) {
        $model->addDynamicMethod('getCmsPageOptions', function() use ($pluginSelf) {
            $result =  $pluginSelf::getTypeInfo('cms-page');
            return $result['references'];
        });
    });

    \RainLab\Pages\Classes\Page::extend(function($model) use ($pluginSelf) {
        $model->addDynamicMethod('getBlogPostOptions', function() use ($pluginSelf) {
            $result = $pluginSelf::getTypeInfo('blog-post'); 
            return $result['references'];
        });
    });

}

और एक अतिरिक्त विधि आपको plugin.php . के अंदर जोड़ने की आवश्यकता है

public static function getTypeInfo($type)
{
    $result = [];
    $apiResult = \Event::fire('pages.menuitem.getTypeInfo', [$type]);

    if (is_array($apiResult)) {
        foreach ($apiResult as $typeInfo) {
            if (!is_array($typeInfo)) {
                continue;
            }

            foreach ($typeInfo as $name => $value) {
                if ($name == 'cmsPages') {
                    $cmsPages = [];

                    foreach ($value as $page) {
                        $baseName = $page->getBaseFileName();
                        $pos = strrpos($baseName, '/');

                        $dir = $pos !== false ? substr($baseName, 0, $pos).' / ' : null;
                        $cmsPages[$baseName] = strlen($page->title)
                            ? $dir.$page->title
                            : $baseName;
                    }

                    $value = $cmsPages;
                }

                $result[$name] = $value;
            }
        }
    }

    return $result;
}

परिणामस्वरूप आप पहली ड्रॉप डाउन में देख सकते हैं कि हमारे पास 'cms-page', 'static-page' और 'Blog post' विकल्प हो सकते हैं, जिसके आधार पर हम अन्य ड्रॉप डाउन दिखा सकते हैं।

और परिणाम दिखाने या उपयोग करने के दौरान पहले आपको उस फ़ील्ड मान के आधार पर प्रकार फ़ील्ड के मान की जांच करनी होगी, आप आगे यह चुन सकते हैं कि आपको किस ड्रॉपडाउन मान का उपयोग करने की आवश्यकता है उदाहरण के लिए type=cms-page मजबूत> तो आपको cms-पृष्ठ फ़ील्ड देखने की आवश्यकता है।

सूचना: निश्चित रूप से उपयोग नहीं किया गया - (डैश) चर में इसलिए यदि मूल्य बाहर नहीं है तो आप चर को cmsPage ऊंट के मामले में परिवर्तित कर सकते हैं यदि आवश्यक हो तो इस सामान के बारे में निश्चित नहीं है

एक अतिरिक्त परिवर्तन आपको इस परिवर्तन को जोड़ने की आवश्यकता है क्योंकि इसकी कोर फ़ाइल को बदलने की आवश्यकता है, मैंने इसके लिए पुल अनुरोध भी बनाया है ताकि वे अगले रिलीज में उस बदलाव को भी शामिल कर सकें, जबकि हमें इसे मैन्युअल रूप से करने की आवश्यकता है। इसके काम करने के लिए यह आवश्यक है
कृपया यह पीआर अनुरोध देखें: https://github.com/octobercms/library/pull/ 292/फ़ाइलें

3
Hardik Satasiya 14 जिंदा 2018, 22:29

यदि आपको CMS पृष्ठों से लिंक करने की आवश्यकता नहीं है, तो आप staticpagepicker विजेट का उपयोग कर सकते हैं। https://github.com/rainlab/pages-plugin#backend-forms

यदि आपको अपने स्वयं के बैकएंड रूपों में स्थिर पृष्ठों की सूची से चयन करने की आवश्यकता है, तो आप staticpagepicker विजेट का उपयोग कर सकते हैं:

fields:
    field_name:
        label: Static Page
        type: staticpagepicker

फ़ील्ड का असाइन किया गया मान स्थिर पृष्ठ का फ़ाइल नाम होगा, जिसका उपयोग ऊपर वर्णित पृष्ठ से लिंक करने के लिए किया जा सकता है।

आपकी लेआउट फ़ाइल में:

{variable name="button_page" label="Button URL" type="staticpagepicker"}{/variable}

<a href="{{ button_page | staticPage }}">Button</a>

चूंकि सीएमएस पेज इस विजेट में सूचीबद्ध नहीं हैं, आप उपयोगकर्ता को अधिक लचीलापन प्रदान करने के लिए हमेशा एक वैकल्पिक फ़ील्ड सेट कर सकते हैं।

{variable name="button_url" label="Button (URL)" type="text" span="left" comment="Leave empty if using Button (Page) instead" placeholder="http://"}{/variable}
{variable name="button_page" label="Button (Page)" type="staticpagepicker" span="right" comment="Used if Button (URL) is left empty"}{/variable}

<a href="{{ button_url ? button_url : (button_page | staticPage) }}">Button</a>
0
Jeremy M 26 जून 2018, 10:38

मुझे पैनागियोटिस कौरसारिस जैसी ही समस्या है। मैंने पुनरावर्तक के बिना टेम्पलेट चर का उपयोग किया। मैंने विकल्पों को निर्दिष्ट करके और प्लगइन बूट विधि में एक उपनाम जोड़कर समस्या को ठीक किया। उदाहरण:

{variable name="type" type="dropdown" options="StaticPage | getTypeOptions" label="Link Type" tab="Text Image Header (dark)"}{/variable}

\Illuminate\Foundation\AliasLoader::getInstance()->alias('StaticPage','RainLab\\Pages\\Classes\\Page');

लेकिन ट्रिगर काम नहीं करता, सभी ड्रॉपडाउन प्रदर्शित किए गए। इसे ठीक करने का कोई विचार?

अगली समस्या यह है कि सभी सीएमएस पृष्ठ निम्नानुसार प्रदर्शित होते हैं:

परियोजनाओं [परियोजनाओं]

मैं दूसरे लूप में कोड को निम्नानुसार बदलता हूं:

if ($type == 'cms-page') {
            $cmsPages = [];

            if (!is_array($value)) {
              continue;
            }

            foreach ($value as $url => $pageArray) {
              $page = \Cms\Classes\Page::find($url);
              if ($page) {
                $baseName = $page->getBaseFileName();
                $pos = strrpos($baseName, '/');

                $dir = $pos !== false ? substr($baseName, 0, $pos) . ' / ' : null;
                $cmsPages[$baseName] = strlen($page->title) ? $dir . $page->title : $baseName;
              }
            }

            $value = $cmsPages;
          }
0
Hacko 4 जून 2020, 14:21