লেআউট আপডেটের জন্য সিএমএস এক্সএমএল হ্যান্ডলগুলি


13

আমার কয়েকটি পরিস্থিতি ছিল যেখানে আমি সিমস পৃষ্ঠার লেআউটটি আপডেট করতে সেমি হ্যান্ডলগুলি ব্যবহার করার চেষ্টা করেছি। উদাহরণস্বরূপ আমি cms_index_index হ্যান্ডেল রেফারেন্সিং রুটটি ব্যবহার করার এবং পৃষ্ঠা টেম্পলেটটি সেট করার চেষ্টা করছিলাম। এটি ব্যর্থ হয়েছিল এবং আমাকে সরাসরি হোমপেজে সেমি পৃষ্ঠা পৃষ্ঠা সেটিংসে অ্যাডমিন সিস্টেমের মাধ্যমে এই লেআউট আপডেটটি করতে হয়েছিল।

আমি সিএমএস_পেজ হ্যান্ডেলটি ব্যবহার করে বামে রেফারেন্সে একটি ব্লক যুক্ত করার চেষ্টা করেছি। আবার এটি ব্যর্থ হয়েছিল এবং আমাকে অ্যাডমিন সিস্টেমের মাধ্যমে লেআউট আপডেটটি প্রয়োগ করতে হয়েছিল।

আমি পড়েছি যে আপনি সেমি পৃষ্ঠাতে কোনও মূল টেমপ্লেট বরাদ্দ করতে পারবেন না। এটি কি সঠিক এবং কেন কেউ ব্যাখ্যা করতে পারে?

আমি আরও ভাবলাম যে বাম, ডান, রুট ইত্যাদির মতো স্ট্যান্ডার্ড রেফারেন্স ব্যবহারের জন্য কি কি হ্যান্ডলগুলি সক্ষম করার কোনও উপায় ছিল? আমি মনে করি মাথা এবং কন্টেন্টের মতো জিনিসগুলি ঠিক ঠিক আছে।

উত্তর:


20

রুট টেম্পলেট পরিবর্তন করা কেন কাজ করে না

উভয়

Mage_Cms_IndexController::indexAction()

এবং

Mage_Cms_IndexController::viewAction()

যা যথাক্রমে ডিফল্ট হোমপেজ এবং একটি সিএমএস পৃষ্ঠা প্রদর্শনের জন্য দায়ী যারা কোনও সহায়ককে কল করুন:

Mage::helper('cms/page')->renderPage($this, $pageId)

আপনি যদি সহায়তায় ঝাঁপিয়ে পড়ে থাকেন (অ্যাপ্লিকেশন / কোড / কোর / ম্যাজ / সেমি / হেল্পার / পেজ.এফপিতে অবস্থিত) এবং renderPage()সুরক্ষিত পদ্ধতি অনুসরণ করেন তবে _renderPage()আপনি দেখতে পাবেন ম্যাগেন্টো রুট টেম্পলেটটির জন্য দুবার পরীক্ষা করছে (ম্যাজেন্টো সিই 1.7। 0.2):

if ($page->getRootTemplate()) {
    $handle = ($page->getCustomRootTemplate()
                && $page->getCustomRootTemplate() != 'empty'
                && $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
    $action->getLayout()->helper('page/layout')->applyHandle($handle);     
}

এবং

if ($page->getRootTemplate()) {
    $action->getLayout()->helper('page/layout')
        ->applyTemplate($page->getRootTemplate());
}

উভয় কলগুলি "সিএমএস_পেজ" এবং এর মতো লেআউট হ্যান্ডলগুলির পরে ঘটে, সুতরাং আপনার ভাগ্য এখানে নেই।

মূল টেম্পলেটটি পরিবর্তন করতে আপনি যা করতে পারেন

একটি ইভেন্ট রয়েছে cms_page_renderযা আপনি সিএমএস পৃষ্ঠাগুলিতে আপনার নিজস্ব এক্সএমএল লেআউট হ্যান্ডেল যুক্ত করার জন্য ব্যবহার করতে পারেন। আপনার নিজস্ব এক্সটেনশন তৈরি করুন (আমি এখানে কিছু বিশদ ছাড়ব) এবং ইভেন্ট পর্যবেক্ষককে আপনারটিতে কনফিগার করুন config.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <Emzee_Cms>
            <version>0.0.1</version>
        </Emzee_Cms>
    </modules>

    <global>
        <events>
            <cms_page_render>
                <observers>
                    <emzee_cms_page_render>
                        <class>emzee_cms/observer</class>
                        <method>cms_page_render</method>
                    </emzee_cms_page_render>
                </observers>
            </cms_page_render>
        </events>
        <models>
            <emzee_cms>
                <class>Emzee_Cms_Model</class>
            </emzee_cms>
        </models>
    </global>
</config>

আপনার ইভেন্ট পর্যবেক্ষক যুক্ত করুন:

<?php

class Emzee_Cms_Model_Observer
{
    public function cms_page_render(Varien_Event_Observer $observer)
    {
        $action = $observer->getEvent()->getControllerAction();

        $actionName = strtolower($action->getFullActionName());
        $action->getLayout()->getUpdate()
            ->addHandle($actionName . '_after');
        return $this;
    }
}

শেষ পর্যন্ত, আপনার নতুন লেআউটটি এক্সএমএল হ্যান্ডেল যুক্ত করুন (যেমন আপনার মধ্যে local.xml):

<?xml version="1.0"?>
<layout version="0.1.0">
    <cms_index_index_after>
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </cms_index_index_after>
</layout>

আপনি একটি যোগ করার জন্য ভাল হিসাবে এই পদ্ধতি ব্যবহার করতে পারেন cms_page_view_afterহাতল অথবা পৃষ্ঠার নির্দিষ্ট হ্যান্ডলগুলি তৈরি হিসাবে cms_page_renderপাসের $pageআপনার পর্যবেক্ষক থেকে অবজেক্ট।

কেন আপনি 'রেফারেন্স বামে' একটি ব্লক যুক্ত করতে পারবেন না

আপনি কি নিশ্চিত যে আপনি যে টেম্পলেটটি ব্যবহার করছেন তাতে একটি বাম কলাম রয়েছে? এই প্রশ্নটি বোকা লাগতে পারে তবে উদাহরণস্বরূপ ডিফল্ট "ডান বারের সাথে 2 টি কলাম" লেআউট কেবল একটি 'সামগ্রী' এবং 'ডান' অঞ্চল সরবরাহ করে। আমি cms_pageসমস্যা ছাড়াই ডান কলামে ব্লকগুলি যুক্ত করতে পারি যাতে এটি সমস্যা হতে পারে।

সাধারণভাবে, আপনি কেবলমাত্র রেফারেন্সগুলিতে সহজেই ব্লকগুলি যুক্ত করতে পারেন এবং যদি এটি প্রতিধ্বনি করে

  • নির্বাচিত রুট টেম্পলেটটি আপনি যে ব্লকটি উল্লেখ করছেন তা ব্যবহার করে (দেখুন app/design/frontend/base/default/template/page/*.phtml) এবং
  • আপনি যে ব্লকটি উল্লেখ করছেন তা প্রকারভেদ core/text_list, $this->getChildhtml()যুক্তি ছাড়াই কলগুলি বা সমস্ত শিশু ব্লক প্রতিধ্বনিত করার জন্য অন্য কিছু করে।

আরও বিশদ ছাড়াই, আমি আপনাকে বলতে পারি না যে কেন আপনার ব্লকগুলি বাম বা ডান কলামে প্রতিধ্বনিত হচ্ছে না।


হাই ম্যাথিয়াস ইভেন্ট পর্যবেক্ষক যুক্ত করার পরামর্শের জন্য ধন্যবাদ, আমি আমাদের একটি ডেভস এর সাথে নজর দেব এবং দেখুন এটি কার্যকর হয় কিনা। এই উত্তর হতে পারে! @ অ্যালানও সিমিএস পৃষ্ঠাগুলির জন্য সঠিক ডিফল্ট টেম্পলেট সেট করার বিষয়ে এবং হ্যান্ডলগুলি ওভাররেড হওয়ার বিষয়টি সম্পর্কে একইরকম বক্তব্য রেখেছিল। পাশাপাশি তথ্যের জন্য ধন্যবাদ, আমি মনে করি আমি এখন এটি সন্ধান করেছি।
ওয়েস্টন

ওহে. এটি পরীক্ষিত এবং এটি কাজ করে। এটি পৃষ্ঠা সুনির্দিষ্ট হ্যান্ডলগুলির জন্য এটি পরীক্ষা করেছে এবং এটি কাজ করছে, তবে এটি পৃষ্ঠাগুলির জন্য একটি শনাক্তকারী প্রয়োজন বলে এটি সর্বোত্তম সমাধান নয় that একটি পরীক্ষা হিসাবে আমি পৃষ্ঠা শনাক্তকারী ব্যবহার করেছি $cmsPageId = '_' . str_replace('-', '_', $observer->getEvent()->getPage()->getIdentifier()); যদি কেউ সিমস পৃষ্ঠার ইউআরএল পরিবর্তন করে তবে হ্যান্ডেলটি কাজ করবে না। আদর্শভাবে অ্যাডমিন সিস্টেমে সিএমএস পৃষ্ঠায় 'পৃষ্ঠা কী'র জন্য একটি ক্ষেত্র উপস্থিত থাকবে, তারপরে পৃষ্ঠা url, নাম ইত্যাদি পরিবর্তন করা যেতে পারে এবং কীটি একই রাখা যেতে পারে।
ওয়েস্টন

14

আপনার " <reference name="left/> ব্যবহার করে কোনও ব্লক যুক্ত করা যায় না" সম্পর্কিত আপনি কি নিশ্চিত যে আপনার সিএমএস পৃষ্ঠায় বাম নামে একটি ব্লক রয়েছে? উদাহরণস্বরূপ, আপনি যদি ডিফল্ট হোম পৃষ্ঠাটি বিবেচনা করেন যা ম্যাগেন্টো নমুনা ডেটা সহ জাহাজে আসে, তবে এটিতে একটি ব্লক নামের নাম রয়েছে বলে মনে হয় পড়ে থাকবে।

এটা কি একটি বাম কলাম?

তবে, আপনি যদি ব্যাকএন্ডে পৃষ্ঠাটি দেখে থাকেন তবে দেখতে পাবেন এটি রুট টেম্পলেটটি ব্যবহার করার জন্য সেট করেছে

`2 columns with right bar`    

এবং তার সামগ্রীর ক্ষেত্রে, বাম কলামটি এইচটিএমএল মার্কআপ ব্যবহার করে যুক্ত করা হয়েছে (উত্স দর্শনে ডাব্লুওয়াইএসআইওয়াইওয়াইজি টগল করুন)

<div class="col-left side-col">
<p class="home-callout"><a href="{{store direct_url="apparel/shoes/womens/anashria-womens-premier-leather-sandal.html"}}"><img src="{{skin url='images/ph_callout_left_top.gif'}}" alt="" border="0" /></a></p>
<p class="home-callout"><img src="{{skin url='images/ph_callout_left_rebel.jpg'}}" alt="" border="0" /></p>
{{block type="tag/popular" template="tag/popular.phtml"}}</div>

এই নির্দেশিত গ্রাফটি পরিষ্কার করে দেয় যে leftহুক করার জন্য কোনও ব্লকের নাম নেই ( পূর্ণ আকারের চিত্রের জন্য ক্লিক করুন )

বাণিজ্য বাগের সাহায্যে পরিচালিত গ্রাফ

কোনও টেম্পলেট সেট করার বিষয়ে, যদি আপনি "লেআউট" ড্রপ ডাউনের উত্সটি দেখেন

<select id="page_root_template" name="root_template" class=" required-entry select">
    <option value="empty">Empty</option>
    <option value="one_column">1 column</option>
    <option value="two_columns_left">2 columns with left bar</option>
    <option value="two_columns_right" selected="selected">2 columns with right bar</option>
    <option value="three_columns">3 columns</option>
</select>

যখন আপনি এই ক্ষেত্র সেটিং করছি আপনি দেখতে পারেন, প্রকৃত মূল্য সংরক্ষিত পেয়ে ভালো কিছু হয় one_column, two_columns_leftইত্যাদি একই নামের বিন্যাস হ্যান্ডলগুলি এইসব মান corespond।

#File: app/design/frontend/default/modern/layout/page.xml
<page_one_column translate="label">
    <label>All One-Column Layout Pages</label>
    <reference name="root">
        <action method="setTemplate"><template>page/1column.phtml</template></action>
        <!-- Mark root page block that template is applied -->
        <action method="setIsHandle"><applied>1</applied></action>
        <action method="setLayoutCode"><name>one_column</name></action>
    </reference>
</page_one_column>
...
<page_two_columns_left translate="label">
    <label>All Two-Column Layout Pages (Left Column)</label>
    <reference name="root">
        <action method="setTemplate"><template>page/2columns-left.phtml</template></action>
        <!-- Mark root page block that template is applied -->
        <action method="setIsHandle"><applied>1</applied></action>
        <action method="setLayoutCode"><name>two_columns_left</name></action>
    </reference>
</page_two_columns_left>

যখন ম্যাজেন্টো একটি সিএমএস পৃষ্ঠা রেন্ডার করে, তখন এটি সংরক্ষিত মানগুলিকে উল্লেখ করে এবং পৃষ্ঠায় উপযুক্ত লেআউট হ্যান্ডেল যুক্ত করে। যদিও এটি প্রশ্নের স্পর্শকাতর, সেই হ্যান্ডেলটি এখানে যুক্ত করা হয়েছে

#File: app/code/core/Mage/Cms/Helper/Page.php
protected function _renderPage(Mage_Core_Controller_Varien_Action  $action, $pageId = null, $renderLayout = true)
{
    //...
    $action->addActionLayoutHandles();        
    if ($page->getRootTemplate()) {
        $handle = ($page->getCustomRootTemplate()
                    && $page->getCustomRootTemplate() != 'empty'
                    && $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
        $action->getLayout()->helper('page/layout')->applyHandle($handle);
    }  
    //...
}

আরও গুরুত্বপূর্ণভাবে যদিও লেআউট হ্যান্ডলগুলি ক্রম হিসাবে যুক্ত করা হয় in

বাণিজ্য বাগের ট্যাব পরিচালনা করে

আপনি উপরের স্ক্রিনশট দেখতে পারেন, page_two_columns_rightহাতল যোগ করা হয় পরেcms_index_index হাতল। এর অর্থ আপনি যদি cms_index_indexআপনার কোডের টেমপ্লেটটি পরিবর্তন করতে লেআউট এক্সএমএল আপডেট কোড যুক্ত করেন তবে page_two_columns_rightএটির পরে লেআউট আপডেট এক্সএমএল কোড চলবে।

ইউজার ইন্টারফেসে থাকা টেম্পলেটটি সর্বদা সঠিক কিনা তা নিশ্চিত করার জন্য আমি সবসময়ই এটি নকশা করে সন্দেহ করি । Magento এর পূর্ববর্তী সংস্করণে <action method="setIsHandle"><applied>1</applied></action>পদ্ধতি কলটি একই কারণে বিদ্যমান বলে মনে হচ্ছে।

সুতরাং, খাঁটি বিন্যাসের এক্সএমএল কোড ব্যবহার করে আপনি যা চান তা করার কোনও উপায় নেই। আপনি যদি কাস্টম মডিউল এবং পর্যবেক্ষক কোড তৈরি করতে স্বাচ্ছন্দ্য বোধ করেন তবে cms_page_renderইভেন্টটি দেখুন। এই আগুনের ঠিক আগে loadLayoutUpdatesডাকা হয় এবং এটি আপনাকে একটি অতিরিক্ত হ্যান্ডেল নাম স্লাইড করতে দেয় বা বিদ্যমান হ্যান্ডেলের নামগুলি সরিয়ে দেয়।


ধন্যবাদ অ্যালান, একটি সেন্টিমিটার পৃষ্ঠায় ব্লক যুক্ত করার বিষয়ে আপনার মন্তব্যগুলি পুরো অর্থবোধ করে। আমি সাধারণত বিভিন্ন XML হ্যান্ডেলগুলি Magento সরবরাহ করে বিভিন্ন পৃষ্ঠাগুলির জন্য টেম্পলেট সেট করি। সেন্টিমিটার পৃষ্ঠাগুলি সম্পর্কে আমার কিছুটা আরও ভাল বোঝার ফলে এটি পরিষ্কার হয়ে গেছে যে আমি কেন সিমেস পৃষ্ঠাগুলির জন্য রেফারেন্স ব্যবহার করে সমস্যা করেছি। আমাকে নিশ্চিত করতে হবে যে আমার পৃষ্ঠায় ডিফল্ট হ্যান্ডেলটি রয়েছে x xML এর সেমি পৃষ্ঠাগুলির জন্য সঠিক বিন্যাস রয়েছে। মনে হচ্ছে আমি সেই হ্যান্ডেলটি দেখেছি, কারণ আমি সাধারণত এটি অন্য কোথাও অতিরিক্ত চাপ দিচ্ছি। এটা কি ঠিক? আমি কী জিজ্ঞাসা করতে পারি আপনি কীভাবে গ্রাফটি উত্পাদন করেছিলেন এবং কোন নির্দিষ্ট অনুরোধের জন্য হ্যান্ডলগুলি দেখতে আপনি কোন সরঞ্জামটি ব্যবহার করছেন?
মার্ক ওয়েস্টন

2
@ মারকওয়েস্টন ডায়াগ্রামগুলি কমার্স বাগ থেকে বানানো ইউআই হ্যান্ডেল করে, একটি বাণিজ্যিক ডিবাগিং সরঞ্জাম যা আমি তৈরি করেছি এবং বিক্রি করি। ( বিশদগুলির জন্য অ্যালানস্টর্ম.com/find_magento_ block_name দেখুন) আমি নিশ্চিত নই যে হ্যান্ডলগুলি সম্পর্কে আপনার প্রশ্নটি আমি বুঝতে পেরেছি তবে আপনি যদি defaultহ্যান্ডেলটিতে কোনও টেম্পলেট সেট করে থাকেন তবে অ্যাডমিনে সেট করা বিন্যাসটি এখনও জিতে যাবে (অর্থাত্ page_two_columns_rightচলবে পরে)। এছাড়াও, পুনরায়: পরিভাষা - আপনি হ্যান্ডলগুলিকে ওভাররাইড করবেন না, আপনার হ্যান্ডলগুলি সর্বদা অন্যের সাথে সহাবস্থান করে - এটি কেবলমাত্র পরিণতিতে কার্যকরভাবে চালানো তার ক্রম।
অ্যালান ঝড়

চিয়ার্স অ্যালান। আমি দেখতে পাচ্ছি যে কোনও টেমপ্লেটকে ওভাররাইড না করে সেট করতে হ্যান্ডেলের ব্যবহারকে কল করার বিষয়ে আপনি কী বলছেন - ভাল পয়েন্ট। কমার্স বাগ সম্পর্কিত তথ্যের জন্য ধন্যবাদ।
ওয়েস্টন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.