Friday, May 30, 2014

Liferay Search Form with Search Container

Introduction:

Liferay Search form is Liferay UI component to design search form in liferay portlet development. This is simple JSTL tag we can use in JPS pages. In real time when we want implement search feature to portlet application then we can use the tag.

Generally we will use Search From with Liferay search container. We will enclose liferay search form in search container so that when we search data the result can be displayed in the grid.

Go through following link for more about search container


Liferay Search Form:

Search form we can enclose in the search container and it initially display single text box and we can design many input elements inside search form so that it will be inside toggle. We can open toggle and close

When we open toggle then we can see all input elements enclosed by the tag.

The following is declaration and we need pass jsp path there we will defined all input elements.


<liferay-ui:search-form
page="/html/jsps/student_search.jsp"
servletContext="<%= application %>"
/>


Search form as follows (/html/jsps/student_search.jsp)


<%@ include file="init.jsp" %>
<%
SearchContainer searchContainer = (SearchContainer)request.getAttribute("liferay-ui:search:searchContainer");
DisplayTerms displayTerms = searchContainer.getDisplayTerms();
%>
<liferay-ui:search-toggle
buttonLabel="Student Search"
displayTerms="<%= displayTerms %>"
id="toggle_id_student_search">
<aui:input label="First Name" name="firstName" value="<%=firstName %>" />
<aui:input label="Last Name" name="lastName" value="<%=lastName %>" />
<aui:input label="studentAge" name="studentAge" value="<%= studentAge %>" />
<aui:select name="studentGender">
<aui:option label="Male" value="1"></aui:option>
<aui:option label="Female" value="0"></aui:option>
</aui:select>
<aui:input label="studentAddress" name="studentAddress" value="<%= studentAddress %>" />
</liferay-ui:search-toggle>


Note:

We use toggle tag which will wrap the all the input elements.

Implementing Search with Search container

Generally in the development we will use search form with liferay search container and this tag will be enclose by search container tag one more thing  search container tag should be within form tag.

The following syntax


<aui:form>
<liferay-ui:search-container/>
<liferay-ui:search-form>
<liferay-ui:search-container-results/>
<liferay-ui:search-container-row/>
<liferay-ui:search-container-column-text/>
</liferay-ui:search-container-row>
<liferay-ui:search-iterator/>
</liferay-ui:search-container>
</aui:form>


Steps to implementation:
  1. Declare from tag with form create search container and its child tags.
  2. Implement search logic in respective Service Implementation class
  3. Pass search terms to Service method and fetch the result and pass to search container.

Declare from tag with form create search container and its child tags.

<aui:form>
<liferay-ui:search-container/>
<liferay-ui:search-form>
<liferay-ui:search-container-results/>
<liferay-ui:search-container-row/>
<liferay-ui:search-container-column-text/>
</liferay-ui:search-container-row>
<liferay-ui:search-iterator/>
</liferay-ui:search-container>
</aui:form>


Implement search logic in respective Service Implementation class

Based on search key word we need to implement logic in respective service implementation class.

Assume we are using Student data so we need to implement search logic in StudentLocalServiceImpl.java and we need run the service builder.

In the search we have implemented the Liferay Dynamic Query API and you can have more knowledge in Liferay wikis or liferay documentation.

The following is search implementation logic in StudentLocalServiceImpl.java


public class StudentLocalServiceImpl extends StudentLocalServiceBaseImpl {
public List getSerachStudents(String firstName,String lastName,int studentAge,int studentGender,String studentAddress,boolean andSearch, int start, int end, OrderByComparator orderByComparator)
throws SystemException
{
DynamicQuery dynamicQuery = buildStudentDynamicQuery(firstName, lastName, studentAge, studentGender, studentAddress, andSearch);
return StudentLocalServiceUtil.dynamicQuery(dynamicQuery, start, end, orderByComparator);
}

public int getSearchStudentsCount(String firstName,String lastName,int studentAge,int studentGender,String studentAddress,boolean andSearch)
throws SystemException
{
DynamicQuery dynamicQuery = buildStudentDynamicQuery(firstName, lastName, studentAge, studentGender, studentAddress, andSearch);
return (int)StudentLocalServiceUtil.dynamicQueryCount(dynamicQuery);
}

protected DynamicQuery buildStudentDynamicQuery(String firstName,String lastName,int studentAge,int studentGender,String studentAddress,boolean andSearch)
{
Junction junction = null;
if(andSearch)
junction = RestrictionsFactoryUtil.conjunction();
else
junction = RestrictionsFactoryUtil.disjunction();

if(Validator.isNotNull(firstName))
{
Property property = PropertyFactoryUtil.forName("firstName");
String value = (new StringBuilder("%")).append(firstName).append("%").toString();
junction.add(property.like(value));
}
if(Validator.isNotNull(lastName))
{
Property property = PropertyFactoryUtil.forName("lastName");
String value = (new StringBuilder("%")).append(lastName).append("%").toString();
junction.add(property.like(value));
}
if(studentAge > 0)
{
Property property = PropertyFactoryUtil.forName("studentAge");
junction.add(property.eq(Integer.valueOf(studentAge)));
}
if(studentGender > 0)
{
Property property = PropertyFactoryUtil.forName("studentGender");
junction.add(property.eq(Integer.valueOf(studentGender)));
}
if(Validator.isNotNull(studentAddress))
{
Property property = PropertyFactoryUtil.forName("studentAddress");
String value = (new StringBuilder("%")).append(studentAddress).append("%").toString();
junction.add(property.like(value));
}
DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Student.class, getClassLoader());
return dynamicQuery.add(junction);
}
}


Pass search terms to Service method and fetch the result and pass to search container

Search URL:

We need search URL and it should carry search container JSP page otherwise it will navigate portlet default view page after search button click and it is simple liferay render URL.


<liferay-portlet:renderURL varImpl="studentSearchURL">
<portlet:param name="mvcPath" value="/html/jsps/student_search_container.jsp" />
</liferay-portlet:renderURL>


In the search form we have toggle open and close when we open toggle then we will input all search values so that our search logic fetch the result based on search terms.

We have two kind of search option in toggle one for match any key word and match all keywords.

Match ANY we will use OR operator in the search logic

Match ALL we will use AND operator in search logic

When we open toggle then it wills treats as Advance search and the result should be fetch based on all columns and its values with operators like AND/OR based on user input.

If the toggle off then there only input box so that user can give anything in the box then we will use this key word to search data on behalf of all columns in the table.

Calling of search method and fetch the data all the logic should be present inside search-container-result tag.

The following example code you can understand


<liferay-ui:search-container-results>
<%
DisplayTerms displayTerms =searchContainer.getDisplayTerms();
if (displayTerms.isAdvancedSearch()) {

total = StudentLocalServiceUtil.getSearchStudentsCount(firstName, lastName, 
 studentAge, studentGender, studentAddress,displayTerms.isAndOperator());
searchContainer.setTotal(total);
searchContainer.setResults(StudentLocalServiceUtil.getSerachStudents(firstName,
lastName,studentAge,studentGender,studentAddress,displayTerms.isAndOperator(), searchContainer.getStart(), searchContainer.getEnd(), new StudentNameComparator()));

}else {

String searchkeywords = displayTerms.getKeywords();
String numbesearchkeywords = 
Validator.isNumber(searchkeywords) ? searchkeywords : String.valueOf(0);

total = StudentLocalServiceUtil.getSearchStudentsCount
(firstName,lastName, studentAge, studentGender, studentAddress,displayTerms.isAndOperator());
searchContainer.setResults(StudentLocalServiceUtil.getSerachStudents
(searchkeywords,searchkeywords,Integer.parseInt(numbesearchkeywords),
Integer.parseInt(numbesearchkeywords), searchkeywords,false,
 searchContainer.getStart(), searchContainer.getEnd(), new StudentNameComparator()));
}

%>
</liferay-ui:search-container-results>


Iterator URL

We already know search container need iterator URL so that when we change the page it will use Iterator URL.

When we apply search we need to maintain all search keywords and its values as URL parameters otherwise search result will be changes.

For each page change it will get the search key words values from Iterator URL so that it can pass to respective search methods which are written inside search-container-result tag.


<liferay-portlet:renderURL varImpl="iteratorURL">
<portlet:param name="firstName" value="<%= firstName %>" />
<portlet:param name="lastName" value="<%= lastName %>" />
<portlet:param name="studentAge" value="<%= String.valueOf(studentAge) %>" />
<portlet:param name="studentGender" value="<%= String.valueOf(studentGender) %>" />
<portlet:param name="studentAddress" value="<%= String.valueOf(studentAddress) %>" />
<portlet:param name="mvcPath" value="/html/jsps/student_search_container.jsp" />
</liferay-portlet:renderURL>


Note:

We already implement search logic in respective service implementation class.

Complete code for Example

Search container JSP page (/html/jsps/student_search_container.jsp)


<%@page import="com.meera.dbservice.model.Student"%>
<%@page import="com.meera.liferaymvc.StudentNameComparator"%>
<%@page import="com.meera.dbservice.service.StudentLocalServiceUtil"%>
<%@ include file="init.jsp" %>
<a href="<portlet:renderURL />">&laquo;Home</a>
<div class="separator"></div>
<liferay-portlet:renderURL varImpl="studentSearchURL">
<portlet:param name="mvcPath" 
value="/html/jsps/student_search_container.jsp" />
</liferay-portlet:renderURL>
<aui:form action="<%=studentSearchURL %>"
method="get" name="studentForm">
<liferay-portlet:renderURLParams varImpl="studentSearchURL" />
<liferay-portlet:renderURL varImpl="iteratorURL">
<portlet:param name="firstName" value="<%= firstName %>" />
<portlet:param name="lastName" value="<%= lastName %>" />
<portlet:param name="studentAge"
value="<%= String.valueOf(studentAge) %>" />
<portlet:param name="studentGender" 
value="<%= String.valueOf(studentGender) %>" />
<portlet:param name="studentAddress"
value="<%= String.valueOf(studentAddress) %>" />
<portlet:param name="mvcPath" 
value="/html/jsps/student_search_container.jsp" />
</liferay-portlet:renderURL>
<liferay-ui:search-container
displayTerms="<%= new DisplayTerms(renderRequest) %>"
emptyResultsMessage="there-are-no-students"
headerNames="firstName,lastName,studentAge,
studentGender,studentAddress"
iteratorURL="<%= iteratorURL %>"
> 
<liferay-ui:search-form
page="/html/jsps/student_search.jsp"
servletContext="<%= application %>"
/>
<liferay-ui:search-container-results>
<%
DisplayTerms displayTerms =searchContainer.getDisplayTerms();
if (displayTerms.isAdvancedSearch()) {
total = StudentLocalServiceUtil.getSearchStudentsCount(firstName, 
lastName, studentAge, studentGender, 
studentAddress,displayTerms.isAndOperator());
searchContainer.setTotal(total);
searchContainer.
setResults(StudentLocalServiceUtil.getSerachStudents(firstName,
lastName,studentAge,studentGender,
studentAddress,displayTerms.isAndOperator(),
 searchContainer.getStart(), 
searchContainer.getEnd(), new StudentNameComparator()));
}else {
String searchkeywords = displayTerms.getKeywords();
String numbesearchkeywords = 
Validator.isNumber(searchkeywords) ? searchkeywords : String.valueOf(0);
total = StudentLocalServiceUtil.getSearchStudentsCount(firstName,lastName, 
 studentAge, studentGender, studentAddress,displayTerms.isAndOperator());
searchContainer.setResults(StudentLocalServiceUtil.
getSerachStudents(searchkeywords,
searchkeywords,Integer.parseInt(numbesearchkeywords),
Integer.parseInt(numbesearchkeywords), searchkeywords,false,
 searchContainer.getStart(), searchContainer.getEnd(),
new StudentNameComparator()));
}

%>
</liferay-ui:search-container-results>
<liferay-ui:search-container-row
className="Student"
keyProperty="studentId"
modelVar="currentStudent">
<liferay-portlet:renderURL varImpl="rowURL">
<portlet:param name="backURL" value="<%= currentURL %>" />
<portlet:param name="mvcPath" 
value="/html/jsps/display_student.jsp" />
<portlet:param name="redirect" value="<%= currentURL %>" />
<portlet:param name="studentId"
value="<%= String.valueOf(currentStudent.getStudentId()) %>" />
</liferay-portlet:renderURL>
<liferay-ui:search-container-column-text
href="<%= rowURL %>"
name="firstName"
property="firstName"
/>

<liferay-ui:search-container-column-text
href="<%= rowURL %>"
name="lastName"
property="lastName"
/>

<liferay-ui:search-container-column-text
href="<%= rowURL %>"
name="studentAge"
property="studentAge"
/>

<liferay-ui:search-container-column-text
href="<%= rowURL %>"
name="studentGender"
value='<%=currentStudent.getStudentGender()==1?"Male":"Female"%>'
/>

<liferay-ui:search-container-column-text
href="<%= rowURL %>"
name="studentAddress"
property="studentAddress"/>
</liferay-ui:search-container-row>
<liferay-ui:search-iterator searchContainer="<%=searchContainer %>" />
</liferay-ui:search-container>
</aui:form>


Search from JSP(/html/jsps/student_search.jsp)


<%@ include file="init.jsp" %>
<%
SearchContainer searchContainer = (SearchContainer)request.getAttribute("liferay-ui:search:searchContainer");
DisplayTerms displayTerms = searchContainer.getDisplayTerms();
%>
<liferay-ui:search-toggle
buttonLabel="Student Search"
displayTerms="<%= displayTerms %>"
id="toggle_id_student_search">
<aui:input label="First Name" name="firstName" value="<%=firstName %>" />
<aui:input label="Last Name" name="lastName" value="<%=lastName %>" />
<aui:input label="studentAge" name="studentAge" value="<%= studentAge %>" />
<aui:select name="studentGender">
<aui:option label="Male" value="1"></aui:option>
<aui:option label="Female" value="0"></aui:option>
</aui:select>
<aui:input label="studentAddress" name="studentAddress" value="<%= studentAddress %>" />
</liferay-ui:search-toggle>


Init.jsp page maintain all Tag lib URL declarations, Common Imports and Common Variables for all JSP pages

Init.jsp (html/jsps/init.jsp)


<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %><%@
taglib uri="http://liferay.com/tld/portlet" prefix="liferay-portlet" %><%@
taglib uri="http://liferay.com/tld/security" prefix="liferay-security" %><%@
taglib uri="http://liferay.com/tld/theme" prefix="liferay-theme" %><%@
taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui" %><%@
taglib uri="http://liferay.com/tld/util" prefix="liferay-util" %>
<portlet:defineObjects />
<liferay-theme:defineObjects />
<%
String currentURL = PortalUtil.getCurrentURL(request);
String firstName = ParamUtil.getString(request, "firstName");
String lastName = ParamUtil.getString(request, "lastName");
int studentAge = ParamUtil.getInteger(request, "studentAge");
int studentGender = ParamUtil.getInteger(request, "studentGender");
String studentAddress = ParamUtil.getString(request, "studentAddress");%>


Search Implementation service class (StudentLocalServiceImpl.java)


package com.meera.dbservice.service.impl;
import java.util.List;
import com.liferay.portal.kernel.dao.orm.DynamicQuery;
import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
import com.liferay.portal.kernel.dao.orm.Junction;
import com.liferay.portal.kernel.dao.orm.Property;
import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.Validator;
import com.meera.dbservice.model.Student;
import com.meera.dbservice.service.StudentLocalServiceUtil;
import com.meera.dbservice.service.base.StudentLocalServiceBaseImpl;
public class StudentLocalServiceImpl extends StudentLocalServiceBaseImpl {
public List getSerachStudents(String firstName,String lastName,int studentAge,int studentGender,String studentAddress,boolean andSearch, int start, int end, OrderByComparator orderByComparator)
throws SystemException
{
DynamicQuery dynamicQuery = buildStudentDynamicQuery(firstName, lastName, studentAge, studentGender, studentAddress, andSearch);
return StudentLocalServiceUtil.dynamicQuery(dynamicQuery, start, end, orderByComparator);
}

public int getSearchStudentsCount(String firstName,String lastName,int studentAge,int studentGender,String studentAddress,boolean andSearch)
throws SystemException
{
DynamicQuery dynamicQuery = buildStudentDynamicQuery(firstName, lastName, studentAge, studentGender, studentAddress, andSearch);
return (int)StudentLocalServiceUtil.dynamicQueryCount(dynamicQuery);
}

protected DynamicQuery buildStudentDynamicQuery(String firstName,String lastName,int studentAge,int studentGender,String studentAddress,boolean andSearch)
{
Junction junction = null;
if(andSearch)
junction = RestrictionsFactoryUtil.conjunction();
else
junction = RestrictionsFactoryUtil.disjunction();

if(Validator.isNotNull(firstName))
{
Property property = PropertyFactoryUtil.forName("firstName");
String value = (new StringBuilder("%")).append(firstName).append("%").toString();
junction.add(property.like(value));
}
if(Validator.isNotNull(lastName))
{
Property property = PropertyFactoryUtil.forName("lastName");
String value = (new StringBuilder("%")).append(lastName).append("%").toString();
junction.add(property.like(value));
}
if(studentAge > 0)
{
Property property = PropertyFactoryUtil.forName("studentAge");
junction.add(property.eq(Integer.valueOf(studentAge)));
}
if(studentGender > 0)
{
Property property = PropertyFactoryUtil.forName("studentGender");
junction.add(property.eq(Integer.valueOf(studentGender)));
}
if(Validator.isNotNull(studentAddress))
{
Property property = PropertyFactoryUtil.forName("studentAddress");
String value = (new StringBuilder("%")).append(studentAddress).append("%").toString();
junction.add(property.like(value));
}
DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(Student.class, getClassLoader());
return dynamicQuery.add(junction);
}
}


Download Search Container Portlet



Environment:

Liferay IDE 2.x+Eclipse (Kepler) +Liferay Plugins SDK 6.2+Tomcat 7.x Liferay Portal Bundle

Deployment and its Working.

Download portlet you can source or war file to deploy into liferay portal as your convenient.

Once portlet successfully deployed drag the portlet in any desired page. Portlet is available in sample category.

In the portlet page you can click on Student Search link then you can see the search container with search from.

Portlet Screens:

Default Page


Search Page



Search with toggle advanced search


Reference Links




Author

25 comments :

  1. Can these search work for all values in next pagination too.

    ReplyDelete
  2. It can be easy to lose sight of the very reasons why you wanted to open your business startup. You can get wrapped up in the day-to-day operations, leaving little time to focus on what makes your business startup standout in the market. Having a strategy in place that allows you to keep you motivated can ensure your business stays on a path of success Business Listing New York

    ReplyDelete
  3. I am impressed. I don't think Ive met anyone who knows as much about this subject as you do. You are truly well informed and very intelligent. You wrote something that people could understand and made the subject intriguing for everyone. Really, great blog you have got here. Europa-Road vasúti szállítmányozás

    ReplyDelete
  4. Starting a small business or a home-based business is not something that should be entered into lightly. More often than not you'll go through a long period languishing while trying to make your business viable best public adjusters

    ReplyDelete
  5. Business coaching can actually bring the much-desired changes to your business. Coach is a word which is derived from "kocsi", a Hungarian name that means "carriage". Today, however, the word has a wider use and it basically means transportation of people from one point to the other where they desire to be مصور فوتوغرافي

    ReplyDelete
  6. It can be easy to lose sight of the very reasons why you wanted to open your business startup. You can get wrapped up in the day-to-day operations, leaving little time to focus on what makes your business startup standout in the market. Having a strategy in place that allows you to keep you motivated can ensure your business stays on a path of success Carbon dioxide

    ReplyDelete
  7. This ought to be close to 60 letters and it doesn't need to bode well. For instance the landing page of a website architecture organizations meta title may peruse "Website composition Nottingham - Web Design | Web Designers" or something along that impact. It isn't exactly justifiable or a sentence yet a search engine would see this and comprehend they are expressions of significance and what is the issue here. Wat is leadgeneratie

    ReplyDelete
  8. I have recently started a blog, and the info you offer on this website has helped me greatly. Thanx for all of your time & work. 온라인바카라

    ReplyDelete
  9. Building a business requires considerable time and effort, and how do you maintain your business legacy? Read on to learn how you can help protect your business in the future through business succession planning Personal assistant services

    ReplyDelete
  10. I loved as much as you will receive carried out right here. The sketch is tasteful, your authored subject matter stylish. nonetheless, you command get got an nervousness over that you wish be delivering the following. unwell unquestionably come more formerly again as exactly the same nearly very often inside case you shield this hike. 파워볼 알고리즘

    ReplyDelete
  11. This design is steller! You most certainly know how to keep a reader entertained. Between your wit and your videos, I was almost moved to start my own blog (well, almost…HaHa!) Wonderful job. I really loved what you had to say, and more than that, how you presented it. Too cool! 오토 파워볼

    ReplyDelete
  12. What is the truth about owning, starting, and building a home-based business? In this review we will examine the advantages and disadvantages in addition to some tips and hints. Success in this type of business requires self-discipline and self-motivation, you are your own boss. Is owning a home-based business worth the stress and challenges of working for yourself and making a significant amount of residual and passive income? Freedom Insurance

    ReplyDelete
  13. A business blueprint provides vision, structure and general form. It's a useful framework, providing structure, direction and purpose, while leaving plenty of room to shift and create over time. Here are some key components of a business blueprint that can serve as the foundation for your developing business. 101 Bio

    ReplyDelete
  14. Do you want to improve the performance of your business? Of course you do! Maybe you're unsure where to start, or how to go about it. This checklist of questions will give you a good overview of your business's strengths, weaknesses and areas that need improvement. You may find some of them tough - or a little confronting - but be honest! The path to improving your business performance starts today. DUI Attorney Vancouver WA

    ReplyDelete
  15. https://dynamichealthstaff.com/nursing-jobs-in-canada-for-indian-nurses In this contemporary world, it has become liable to access each and everything with modern technologies; therefore, gaming peripherals are the best gaming devices which comfort the gamers who love to play the ideal games with easy and accessible device to play their skills. Similarly I would like to enhance my gaming skills with the best gaming devices in the future as well. However, there are innumerable gaming devices but some of the most colossal of them I have spotlighted below which can enhance the best gaming skills in the 2018 without any atoms of doubt.

    ReplyDelete
  16. When you think of starting a business, the first thing that comes to mind is money/capital. Of course, you need money to start a business, even if it is very little considering the fact how easy it is to start a business in the digital age a course in miracles

    ReplyDelete
  17. So you have an affiliate business but it's not really delivering. You persist anyway out of stubbornness to all those people who told you to give up! In the back of your mind you catch yourself thinking "Am I wasting my time with this?". landscape supplies

    ReplyDelete
  18. A business blueprint provides vision, structure and general form. It's a useful framework, providing structure, direction and purpose, while leaving plenty of room to shift and create over time. Here are some key components of a business blueprint that can serve as the foundation for your developing business. cek resi jnt

    ReplyDelete
  19. https://onohosting.com What Is SEO? This is a common question that most people especially those who are either new or not familiar with online marketing might be asking. SEO stands for search engine optimization.

    ReplyDelete
  20. اذا كنت تبحث عن ماكينات تعبئة بقوليات فلن تجد ماكينات افضل من المصنعة لدي شركة ماستر تك فستجد ان جميع مكن التعبئة والتغليف مصنع بالكامل من الاستانلس ستيل القوي المقاوم للصداء

    ReplyDelete
  21. عملية علاج الدوالي بالليزر من اشهر العمليات لعلاج الدوالي حيث انها لا يتم استخدام فيها اي ادوات جراحية ولهذا لا يشعر المريض ب الم او اثر علي الجلد نتيجة العملية

    ReplyDelete
  22. تساعدكبسولة المعدة في مصر المريض علي فقد 15- 20 كيلو جرام من الوزن فى خلال أربعه أشهر والجدير بالذكر انها تتم بدون منظار او جراحة أو تخدير وبذلك لن يحتاج المريض الي المكوث فى المشفى او حتي يتبع نظام غذائى قاسي

    ReplyDelete
  23. عتقد البعض أن استخدام نوع واحد من الاضاءة في المنزل او المكتب أمر كافي ، وهذا أمر غير صحيح بالمرة، فأكد خبراء الاضاءة حول العالم علي أن لكل نوع منهم استخدام وغرض مختلف عن الاخر.لذلك يهتم مصنع المصرية السعودية باعتباره واحد من افضل مصانع لمبات ليد في مصر بامداد العملاء بالمعلومات اللازمة عن انواع الاضاءة المختلفة وكيفية استخدامها في البيت بشكل صحيح

    ReplyDelete
  24. Amr Helmy Company is a major kitchen companies in sheikh zayed offering the latest modern kitchen design ideas, different shapes of units and shelves made of the latest anti-moisture and scratch-resistant kitchen materials, distinctive kitchen decorations harmonious with kitchen floor materials, innovative designs for small, medium and large spaces.

    ReplyDelete
  25. يوجد أنواع كثيره من المبيدات التي يمكن ان نساخدمها للفضاء علي الصراصير، منها ما هو على شكل طعوم، والبعض الآخر يكون بشكل سائل، يتم توزيعها على المناطق التي تتواجد فيها الصراصير في المطبخ، كمنطقة خلف الثلاجة، وتحتها، وفي خزائن المطبخ وزواياها، وخلف الغسالة، فتأتي الصراصير لحمل الطعم إلى أعشاشها، مما يتسبب بإصابة بقية الحشرات الأخرى ومن الافضل الاعتماد علي المركز الالماني لانه يستخدم طرق التخلص من الحشرات المنزلية.

    ReplyDelete

Recent Posts

Recent Posts Widget

Popular Posts